diff options
Diffstat (limited to 'indra/newview')
155 files changed, 2652 insertions, 1403 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 99f99834f3..88e8bb49b4 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -275,6 +275,7 @@ set(viewer_SOURCE_FILES llfloatermemleak.cpp llfloatermodelpreview.cpp llfloatermodeluploadbase.cpp + llfloatermyscripts.cpp llfloaternamedesc.cpp llfloaternotificationsconsole.cpp llfloaternotificationstabbed.cpp @@ -542,6 +543,7 @@ set(viewer_SOURCE_FILES llscrollingpanelparam.cpp llscrollingpanelparambase.cpp llsculptidsize.cpp + llsearchableui.cpp llsearchcombobox.cpp llsearchhistory.cpp llsecapi.cpp @@ -902,6 +904,7 @@ set(viewer_HEADER_FILES llfloatermemleak.h llfloatermodelpreview.h llfloatermodeluploadbase.h + llfloatermyscripts.h llfloaternamedesc.h llfloaternotificationsconsole.h llfloaternotificationstabbed.h @@ -1158,6 +1161,7 @@ set(viewer_HEADER_FILES llscrollingpanelparam.h llscrollingpanelparambase.h llsculptidsize.h + llsearchableui.h llsearchcombobox.h llsearchhistory.h llsecapi.h @@ -1618,6 +1622,7 @@ endif (WINDOWS) # from within the IDE. set(viewer_XUI_FILES skins/default/colors.xml + skins/default/default_languages.xml skins/default/textures/textures.xml ) file(GLOB DEFAULT_XUI_FILE_GLOB_LIST @@ -1872,6 +1877,15 @@ if (WINDOWS) windows-crash-logger ) + # sets the 'working directory' for debugging from visual studio. + # Condition for version can be moved to requirements once build agents will be updated (see TOOL-3865) + if (NOT UNATTENDED) + set_property( + TARGET ${VIEWER_BINARY_NAME} + PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + ) + endif (NOT UNATTENDED) + if (PACKAGE) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 @@ -2103,7 +2117,7 @@ if (DARWIN) set(MACOSX_BUNDLE_BUNDLE_NAME "SecondLife") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}") set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}") - set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2007") + set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2018") set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "SecondLife.nib") set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "NSApplication") diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 1173abf18e..09d7845567 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11362,6 +11362,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>MenuSearch</key> + <map> + <key>Comment</key> + <string>Show/hide 'Search menus' field</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>GroupListShowIcons</key> <map> <key>Comment</key> @@ -14090,6 +14101,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>RegionCrossingInterpolationTime</key> + <map> + <key>Comment</key> + <string>How long to extrapolate object motion after crossing regions</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>1</integer> + </map> <key>VertexShaderEnable</key> <map> <key>Comment</key> diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 4f9a1b7804..d1d5301efe 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -720,9 +720,7 @@ RMDir "$INSTDIR" IfFileExists "$INSTDIR" FOLDERFOUND NOFOLDER
FOLDERFOUND:
-# Silent uninstall always removes all files (/SD IDYES)
- MessageBox MB_YESNO $(DeleteProgramFilesMB) /SD IDYES IDNO NOFOLDER
- RMDir /r "$INSTDIR"
+ MessageBox MB_OK $(DeleteProgramFilesMB) /SD IDOK IDOK NOFOLDER
NOFOLDER:
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index ba250fa471..4bd3ca9157 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -742,7 +742,7 @@ BOOL LLAgent::getFlying() const //----------------------------------------------------------------------------- // setFlying() //----------------------------------------------------------------------------- -void LLAgent::setFlying(BOOL fly) +void LLAgent::setFlying(BOOL fly, BOOL fail_sound) { if (isAgentAvatarValid()) { @@ -771,7 +771,10 @@ void LLAgent::setFlying(BOOL fly) // parcel doesn't let you start fly // gods can always fly // and it's OK if you're already flying - make_ui_sound("UISndBadKeystroke"); + if (fail_sound) + { + make_ui_sound("UISndBadKeystroke"); + } return; } if( !was_flying ) diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index b1b39b637e..ea6f68c482 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -337,7 +337,7 @@ private: //-------------------------------------------------------------------- public: BOOL getFlying() const; - void setFlying(BOOL fly); + void setFlying(BOOL fly, BOOL fail_sound = FALSE); static void toggleFlying(); static bool enableFlying(); BOOL canFly(); // Does this parcel allow you to fly? diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 08daeb0f59..22bcbad7da 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1865,7 +1865,6 @@ bool LLAppearanceMgr::getCanRemoveOutfit(const LLUUID& outfit_cat_id) LLFindNonRemovableObjects filter_non_removable; LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; - LLInventoryModel::item_array_t::const_iterator it; gInventory.collectDescendentsIf(outfit_cat_id, cats, items, false, filter_non_removable); if (!cats.empty() || !items.empty()) { diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 1bc21ec469..577082f01f 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -572,12 +572,12 @@ static void settings_to_globals() LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO"); LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic"); LLImageGL::sCompressTextures = gSavedSettings.getBOOL("RenderCompressTextures"); - LLVOVolume::sLODFactor = gSavedSettings.getF32("RenderVolumeLODFactor"); + LLVOVolume::sLODFactor = llclamp(gSavedSettings.getF32("RenderVolumeLODFactor"), 0.01f, MAX_LOD_FACTOR); LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f; LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor"); LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor"); - LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor"); - LLVOAvatar::sPhysicsLODFactor = gSavedSettings.getF32("RenderAvatarPhysicsLODFactor"); + LLVOAvatar::sLODFactor = llclamp(gSavedSettings.getF32("RenderAvatarLODFactor"), 0.f, MAX_AVATAR_LOD_FACTOR); + LLVOAvatar::sPhysicsLODFactor = llclamp(gSavedSettings.getF32("RenderAvatarPhysicsLODFactor"), 0.f, MAX_AVATAR_LOD_FACTOR); LLVOAvatar::updateImpostorRendering(gSavedSettings.getU32("RenderAvatarMaxNonImpostors")); LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible"); // clamp auto-open time to some minimum usable value @@ -1168,7 +1168,10 @@ bool LLAppViewer::init() updater.args.add(stringize(gSavedSettings.getU32("ForceAddressSize"))); // Run the updater. An exception from launching the updater should bother us. - LLLeap::create(updater, true); + if (!beingDebugged()) + { + LLLeap::create(updater, true); + } // Iterate over --leap command-line options. But this is a bit tricky: if // there's only one, it won't be an array at all. @@ -2168,7 +2171,7 @@ bool LLAppViewer::initThreads() if (LLTrace::BlockTimer::sLog || LLTrace::BlockTimer::sMetricLog) { - LLTrace::BlockTimer::setLogLock(new LLMutex(NULL)); + LLTrace::BlockTimer::setLogLock(new LLMutex()); mFastTimerLogThread = new LLFastTimerLogThread(LLTrace::BlockTimer::sLogName); mFastTimerLogThread->start(); } @@ -5462,7 +5465,8 @@ void LLAppViewer::resumeMainloopTimeout(const std::string& state, F32 secs) { if(secs < 0.0f) { - secs = gSavedSettings.getF32("MainloopTimeoutDefault"); + static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60); + secs = mainloop_timeout; } mMainloopTimeout->setTimeout(secs); @@ -5489,7 +5493,8 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs) { if(secs < 0.0f) { - secs = gSavedSettings.getF32("MainloopTimeoutDefault"); + static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60); + secs = mainloop_timeout; } mMainloopTimeout->setTimeout(secs); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index e607b4a994..788fe6a19b 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -43,6 +43,7 @@ #define LL_LLAPPVIEWER_H #include "llallocator.h" +#include "llapr.h" #include "llcontrol.h" #include "llsys.h" // for LLOSInfo #include "lltimer.h" diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 81f04744f8..3111540a13 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -411,68 +411,6 @@ std::string LLAppViewerMacOSX::generateSerialNumber() return serial_md5; } -static AudioDeviceID get_default_audio_output_device(void) -{ - AudioDeviceID device = 0; - UInt32 size = sizeof(device); - AudioObjectPropertyAddress device_address = { kAudioHardwarePropertyDefaultOutputDevice, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster }; - - OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &device_address, 0, NULL, &size, &device); - if(err != noErr) - { - LL_DEBUGS("SystemMute") << "Couldn't get default audio output device (0x" << std::hex << err << ")" << LL_ENDL; - } - - return device; -} - -//virtual -void LLAppViewerMacOSX::setMasterSystemAudioMute(bool new_mute) -{ - AudioDeviceID device = get_default_audio_output_device(); - - if(device != 0) - { - UInt32 mute = new_mute; - AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute, - kAudioDevicePropertyScopeOutput, - kAudioObjectPropertyElementMaster }; - - OSStatus err = AudioObjectSetPropertyData(device, &device_address, 0, NULL, sizeof(mute), &mute); - if(err != noErr) - { - LL_INFOS("SystemMute") << "Couldn't set audio mute property (0x" << std::hex << err << ")" << LL_ENDL; - } - } -} - -//virtual -bool LLAppViewerMacOSX::getMasterSystemAudioMute() -{ - // Assume the system isn't muted - UInt32 mute = 0; - - AudioDeviceID device = get_default_audio_output_device(); - - if(device != 0) - { - UInt32 size = sizeof(mute); - AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute, - kAudioDevicePropertyScopeOutput, - kAudioObjectPropertyElementMaster }; - - OSStatus err = AudioObjectGetPropertyData(device, &device_address, 0, NULL, &size, &mute); - if(err != noErr) - { - LL_DEBUGS("SystemMute") << "Couldn't get audio mute property (0x" << std::hex << err << ")" << LL_ENDL; - } - } - - return (mute != 0); -} - void handleUrl(const char* url_utf8) { if (url_utf8 && gViewerAppPtr) diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index ebb41a495c..d5a80864be 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -42,10 +42,6 @@ public: // virtual bool init(); // Override to do application initialization - // mute/unmute the system's master audio - virtual void setMasterSystemAudioMute(bool mute); - virtual bool getMasterSystemAudioMute(); - protected: virtual bool restoreErrorTrap(); virtual void initCrashReporting(bool reportFreeze); diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp index dd9354fe3a..0516520c56 100644 --- a/indra/newview/llautoreplace.cpp +++ b/indra/newview/llautoreplace.cpp @@ -68,8 +68,8 @@ void LLAutoReplace::autoreplaceCallback(S32& replacement_start, S32& replacement word_start--; // walk word_start back to the beginning of the word } LL_DEBUGS("AutoReplace") << "word_start: " << word_start << " word_end: " << word_end << LL_ENDL; - std::string str_text = std::string(input_text.begin(), input_text.end()); - std::string last_word = str_text.substr(word_start, word_end - word_start + 1); + LLWString old_string = input_text.substr(word_start, word_end - word_start + 1); + std::string last_word = wstring_to_utf8str(old_string); std::string replacement_word(mSettings.replaceWord(last_word)); if (replacement_word != last_word) @@ -79,9 +79,8 @@ void LLAutoReplace::autoreplaceCallback(S32& replacement_start, S32& replacement { // return the replacement string replacement_start = word_start; - replacement_length = last_word.length(); + replacement_length = word_end - word_start + 1; replacement_string = utf8str_to_wstring(replacement_word); - LLWString old_string = utf8str_to_wstring(last_word); S32 size_change = replacement_string.size() - old_string.size(); cursor_pos += size_change; } diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index af3fac91bc..396b69ae3a 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -119,6 +119,7 @@ BOOL LLAvatarListItem::postBuild() mIconPermissionEditTheirs->setVisible(false); mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator"); + mSpeakingIndicator->setChannelState(LLOutputMonitorCtrl::UNDEFINED_CHANNEL); mInfoBtn = getChild<LLButton>("info_btn"); mProfileBtn = getChild<LLButton>("profile_btn"); diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index eddc87efcd..4f42868f1a 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -29,6 +29,7 @@ #include "llchatitemscontainerctrl.h" #include "lltextbox.h" +#include "llavataractions.h" #include "llavatariconctrl.h" #include "llcommandhandler.h" #include "llfloaterreg.h" @@ -204,6 +205,7 @@ void LLFloaterIMNearbyChatToastPanel::init(LLSD& notification) mMsgText = getChild<LLChatMsgBox>("msg_text", false); mMsgText->setContentTrusted(false); + mMsgText->setIsFriendCallback(LLAvatarActions::isFriend); mMsgText->setText(std::string("")); diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp index d3fd5813a0..0f02c23cb0 100644 --- a/indra/newview/llcontrolavatar.cpp +++ b/indra/newview/llcontrolavatar.cpp @@ -60,6 +60,8 @@ LLControlAvatar::LLControlAvatar(const LLUUID& id, const LLPCode pcode, LLViewer // virtual LLControlAvatar::~LLControlAvatar() { + // Should already have been unlinked before destruction + llassert(!mRootVolp); } // virtual diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index ebbbf23dee..c258136889 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -351,7 +351,7 @@ void LLConversationItemSession::setParticipantIsMuted(const LLUUID& participant_ LLConversationItemParticipant* participant = findParticipant(participant_id); if (participant) { - participant->muteVoice(is_muted); + participant->moderateVoice(is_muted); } } @@ -498,6 +498,7 @@ void LLConversationItemSession::onAvatarNameCache(const LLAvatarName& av_name) LLConversationItemParticipant::LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) : LLConversationItem(display_name,uuid,root_view_model), + mIsModeratorMuted(false), mIsModerator(false), mDisplayModeratorLabel(false), mDistToAgent(-1.0) @@ -508,6 +509,7 @@ LLConversationItemParticipant::LLConversationItemParticipant(std::string display LLConversationItemParticipant::LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) : LLConversationItem(uuid,root_view_model), + mIsModeratorMuted(false), mIsModerator(false), mDisplayModeratorLabel(false), mDistToAgent(-1.0) @@ -597,25 +599,7 @@ void LLConversationItemParticipant::setDisplayModeratorRole(bool displayRole) bool LLConversationItemParticipant::isVoiceMuted() { - return LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat); -} - -void LLConversationItemParticipant::muteVoice(bool mute_voice) -{ - LLAvatarName av_name; - LLAvatarNameCache::get(mUUID, &av_name); - LLMuteList * mute_listp = LLMuteList::getInstance(); - bool voice_already_muted = mute_listp->isMuted(mUUID, av_name.getUserName()); - - LLMute mute(mUUID, av_name.getUserName(), LLMute::AGENT); - if (voice_already_muted && !mute_voice) - { - mute_listp->remove(mute); - } - else if (!voice_already_muted && mute_voice) - { - mute_listp->add(mute); - } + return mIsModeratorMuted || LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat); } // diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index 3868bafae4..80385fad5f 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -194,8 +194,9 @@ public: virtual const std::string& getDisplayName() const { return mDisplayName; } bool isVoiceMuted(); + bool isModeratorMuted() { return mIsModeratorMuted; } bool isModerator() const { return mIsModerator; } - void muteVoice(bool mute_voice); + void moderateVoice(bool mute_voice) { mIsModeratorMuted = mute_voice; } void setIsModerator(bool is_moderator) { mIsModerator = is_moderator; mNeedsRefresh = true; } void setTimeNow() { mLastActiveTime = LLFrameTimer::getElapsedSeconds(); mNeedsRefresh = true; } void setDistance(F64 dist) { mDistToAgent = dist; mNeedsRefresh = true; } @@ -216,6 +217,7 @@ private: void onAvatarNameCache(const LLAvatarName& av_name); // callback used by fetchAvatarName void updateName(const LLAvatarName& av_name); + bool mIsModeratorMuted; // default is false bool mIsModerator; // default is false bool mDisplayModeratorLabel; // default is false std::string mDisplayName; diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 15a8aacd37..0075b62100 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -234,6 +234,8 @@ void LLConversationViewSession::draw() // Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap. bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen(); + // Todo/fix this: arrange hides children 'out of bonds', session 'slowly' adjusts container size, unhides children + // this process repeats until children fit for (folders_t::iterator iter = mFolders.begin(); iter != mFolders.end();) { @@ -254,9 +256,6 @@ void LLConversationViewSession::draw() updateLabelRotation(); drawOpenFolderArrow(default_params, sFgColor); } - - refresh(); - LLView::draw(); } @@ -441,28 +440,23 @@ void LLConversationViewSession::refresh() LLSpeakingIndicatorManager::updateSpeakingIndicators(); // we should show indicator for specified voice session only if this is current channel. EXT-5562. - if (!mIsInActiveVoiceChannel) + if (mSpeakingIndicator) { - if (mSpeakingIndicator) - { - mSpeakingIndicator->setVisible(false); - } - LLConversationViewParticipant* participant = NULL; - items_t::const_iterator iter; - for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) + mSpeakingIndicator->setIsActiveChannel(mIsInActiveVoiceChannel); + mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel); + } + + LLConversationViewParticipant* participant = NULL; + items_t::const_iterator iter; + for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) + { + participant = dynamic_cast<LLConversationViewParticipant*>(*iter); + if (participant) { - participant = dynamic_cast<LLConversationViewParticipant*>(*iter); - if (participant) - { - participant->hideSpeakingIndicator(); - } + participant->allowSpeakingIndicator(mIsInActiveVoiceChannel); } } - - if (mSpeakingIndicator) - { - mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel); - } + requestArrange(); // Do the regular upstream refresh LLFolderViewFolder::refresh(); @@ -474,8 +468,13 @@ void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& sessi if (vmi) { + bool old_value = mIsInActiveVoiceChannel; mIsInActiveVoiceChannel = vmi->getUUID() == session_id; mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel); + if (old_value != mIsInActiveVoiceChannel) + { + refresh(); + } } } @@ -568,6 +567,7 @@ void LLConversationViewParticipant::draw() F32 text_left = (F32)getLabelXPos(); LLColor4 color; + LLLocalSpeakerMgr *speakerMgr = LLLocalSpeakerMgr::getInstance(); if (speakerMgr && speakerMgr->isSpeakerToBeRemoved(mUUID)) @@ -579,9 +579,14 @@ void LLConversationViewParticipant::draw() color = mIsSelected ? sHighlightFgColor : sFgColor; } + LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem()); + if (participant_model) + { + mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); + } + drawHighlight(show_context, mIsSelected, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor); drawLabel(font, text_left, y, color, right_x); - refresh(); LLView::draw(); } @@ -605,16 +610,39 @@ S32 LLConversationViewParticipant::arrange(S32* width, S32* height) return arranged; } +// virtual +void LLConversationViewParticipant::refresh() +{ + // Refresh the participant view from its model data + LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem()); + participant_model->resetRefresh(); + + // *TODO: We should also do something with vmi->isModerator() to echo that state in the UI somewhat + mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); + + // Do the regular upstream refresh + LLFolderViewItem::refresh(); +} + void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder) { // Add the item to the folder (conversation) LLFolderViewItem::addToFolder(folder); // Retrieve the folder (conversation) UUID, which is also the speaker session UUID - LLConversationItem* vmi = getParentFolder() ? dynamic_cast<LLConversationItem*>(getParentFolder()->getViewModelItem()) : NULL; - if (vmi) + LLFolderViewFolder *prnt = getParentFolder(); + if (prnt) { - addToSession(vmi->getUUID()); + LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(prnt->getViewModelItem()); + if (vmi) + { + addToSession(vmi->getUUID()); + } + LLConversationViewSession* session = dynamic_cast<LLConversationViewSession*>(prnt); + if (session) + { + allowSpeakingIndicator(session->isInActiveVoiceChannel()); + } } } @@ -744,9 +772,9 @@ LLView* LLConversationViewParticipant::getItemChildView(EAvatarListItemChildInde return child_view; } -void LLConversationViewParticipant::hideSpeakingIndicator() +void LLConversationViewParticipant::allowSpeakingIndicator(bool val) { - mSpeakingIndicator->setVisible(false); + mSpeakingIndicator->setIsActiveChannel(val); } // EOF diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h index 5a74974302..420c250dfe 100644 --- a/indra/newview/llconversationview.h +++ b/indra/newview/llconversationview.h @@ -90,6 +90,7 @@ public: void setHighlightState(bool hihglight_state); LLFloater* getSessionFloater(); + bool isInActiveVoiceChannel() { return mIsInActiveVoiceChannel; } private: @@ -136,6 +137,7 @@ public: virtual ~LLConversationViewParticipant( void ); bool hasSameValue(const LLUUID& uuid) { return (uuid == mUUID); } + /*virtual*/ void refresh(); void addToFolder(LLFolderViewFolder* folder); void addToSession(const LLUUID& session_id); @@ -144,7 +146,7 @@ public: /*virtual*/ S32 getLabelXPos(); /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask ); - void hideSpeakingIndicator(); + void allowSpeakingIndicator(bool val); protected: friend class LLUICtrlFactory; diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index 5443afe60c..b8e6e81ee6 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -315,7 +315,7 @@ void LLDirPickerThread::run() //static void LLDirPickerThread::initClass() { - sMutex = new LLMutex(NULL); + sMutex = new LLMutex(); } //static diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 0f22b6200f..b6fd70452e 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -101,6 +101,8 @@ LLFilePicker::LLFilePicker() mOFN.lpfnHook = NULL; mOFN.lpTemplateName = NULL; mFilesW[0] = '\0'; +#elif LL_DARWIN + mPickOptions = 0; #endif } diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index c5561fe011..33099db1b9 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -812,7 +812,7 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled() { bool ret_val = visibleItemsSelected(); - if ( ret_val ) + if ( ret_val && !isMinimized()) { std::string acvtive_panel_name; LLScrollListCtrl* list = NULL; diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index b48ecc8f31..66198b3bf6 100644 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -46,7 +46,7 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")), mAccountName(session_id[LL_FCP_ACCOUNT_NAME]), mCompleteName(session_id[LL_FCP_COMPLETE_NAME]), - mMutex(NULL), + mMutex(), mShowHistory(false), mMessages(NULL), mHistoryThreadsBusy(false), diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 3cfa1133df..30d05ae287 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -269,6 +269,9 @@ BOOL LLFloaterIMContainer::postBuild() // When display name option change, we need to reload all participant names LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLFloaterIMContainer::processParticipantsStyleUpdate, this)); + mParticipantRefreshTimer.setTimerExpirySec(0); + mParticipantRefreshTimer.start(); + return TRUE; } @@ -420,14 +423,66 @@ void LLFloaterIMContainer::processParticipantsStyleUpdate() void LLFloaterIMContainer::idle(void* user_data) { LLFloaterIMContainer* self = static_cast<LLFloaterIMContainer*>(user_data); - - // Update the distance to agent in the nearby chat session if required - // Note: it makes no sense of course to update the distance in other session - if (self->mConversationViewModel.getSorter().getSortOrderParticipants() == LLConversationFilter::SO_DISTANCE) - { - self->setNearbyDistances(); - } - self->mConversationsRoot->update(); + + if (!self->getVisible() || self->isMinimized()) + { + return; + } + self->idleUpdate(); +} + +void LLFloaterIMContainer::idleUpdate() +{ + if (mTabContainer->getTabCount() == 0) + { + // Do not close the container when every conversation is torn off because the user + // still needs the conversation list. Simply collapse the message pane in that case. + collapseMessagesPane(true); + } + + U32 sort_order = mConversationViewModel.getSorter().getSortOrderParticipants(); + + if (mParticipantRefreshTimer.hasExpired()) + { + const LLConversationItem *current_session = getCurSelectedViewModelItem(); + if (current_session) + { + // Update moderator options visibility + LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin(); + LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd(); + bool is_moderator = isGroupModerator(); + bool can_ban = haveAbilityToBan(); + while (current_participant_model != end_participant_model) + { + LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); + participant_model->setModeratorOptionsVisible(is_moderator && participant_model->getUUID() != gAgentID); + participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID); + + current_participant_model++; + } + // Update floater's title as required by the currently selected session or use the default title + LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID()); + setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle); + } + + mParticipantRefreshTimer.setTimerExpirySec(1.0f); + } + + // Update the distance to agent in the nearby chat session if required + // Note: it makes no sense of course to update the distance in other session + if (sort_order == LLConversationFilter::SO_DISTANCE) + { + // almost real-time updates + setNearbyDistances(); //calls arrange all + } + mConversationsRoot->update(); //arranges, resizes, heavy + + // "Manually" resize of mConversationsPane: same as temporarity cancellation of the flag "auto_resize=false" for it + if (!mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed()) + { + LLRect stack_rect = mConversationsStack->getRect(); + mConversationsPane->reshape(stack_rect.getWidth(), stack_rect.getHeight(), true); + } } bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event) @@ -526,39 +581,6 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event) void LLFloaterIMContainer::draw() { - if (mTabContainer->getTabCount() == 0) - { - // Do not close the container when every conversation is torn off because the user - // still needs the conversation list. Simply collapse the message pane in that case. - collapseMessagesPane(true); - } - - const LLConversationItem *current_session = getCurSelectedViewModelItem(); - if (current_session) - { - // Update moderator options visibility - LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin(); - LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd(); - while (current_participant_model != end_participant_model) - { - LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); - participant_model->setModeratorOptionsVisible(isGroupModerator() && participant_model->getUUID() != gAgentID); - participant_model->setGroupBanVisible(haveAbilityToBan() && participant_model->getUUID() != gAgentID); - - current_participant_model++; - } - // Update floater's title as required by the currently selected session or use the default title - LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID()); - setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle); - } - - // "Manually" resize of mConversationsPane: same as temporarity cancellation of the flag "auto_resize=false" for it - if (!mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed()) - { - LLRect stack_rect = mConversationsStack->getRect(); - mConversationsPane->reshape(stack_rect.getWidth(), stack_rect.getHeight(), true); - } - LLFloater::draw(); } diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 90fc0c2bdd..78b3572111 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -180,6 +180,8 @@ private: void openNearbyChat(); bool isParticipantListExpanded(); + void idleUpdate(); // for convenience (self) from static idle + LLButton* mExpandCollapseBtn; LLButton* mStubCollapseBtn; LLButton* mSpeakBtn; @@ -226,6 +228,8 @@ private: LLConversationViewModel mConversationViewModel; LLFolderView* mConversationsRoot; LLEventStream mConversationsEventStream; + + LLTimer mParticipantRefreshTimer; }; #endif // LL_LLFLOATERIMCONTAINER_H diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 88b3fb7b96..a462f391ca 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -415,6 +415,7 @@ BOOL LLPanelLandGeneral::postBuild() mTextSalePending = getChild<LLTextBox>("SalePending"); mTextOwnerLabel = getChild<LLTextBox>("Owner:"); mTextOwner = getChild<LLTextBox>("OwnerText"); + mTextOwner->setIsFriendCallback(LLAvatarActions::isFriend); mContentRating = getChild<LLTextBox>("ContentRatingText"); mLandType = getChild<LLTextBox>("LandTypeText"); @@ -1191,6 +1192,7 @@ BOOL LLPanelLandObjects::postBuild() mIconGroup = LLUIImageList::getInstance()->getUIImage("icon_group.tga", 0); mOwnerList = getChild<LLNameListCtrl>("owner list"); + mOwnerList->setIsFriendCallback(LLAvatarActions::isFriend); mOwnerList->sortByColumnIndex(3, FALSE); childSetCommitCallback("owner list", onCommitList, this); mOwnerList->setDoubleClickCallback(onDoubleClickOwner, this); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 268c646719..4f1ea4a89e 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -266,7 +266,7 @@ mCalculateBtn(NULL) sInstance = this; mLastMouseX = 0; mLastMouseY = 0; - mStatusLock = new LLMutex(NULL); + mStatusLock = new LLMutex(); mModelPreview = NULL; mLODMode[LLModel::LOD_HIGH] = 0; @@ -1208,7 +1208,7 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl //----------------------------------------------------------------------------- LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) -: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL) +: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex() , mLodsQuery() , mLodsWithParsingError() , mPelvisZOffset( 0.0f ) @@ -1418,8 +1418,6 @@ void LLModelPreview::rebuildUploadData() std::string requested_name = mFMP->getChild<LLUICtrl>("description_form")->getValue().asString(); - std::string metric = mFMP->getChild<LLUICtrl>("model_category_combo")->getValue().asString(); - LLSpinCtrl* scale_spinner = mFMP->getChild<LLSpinCtrl>("import_scale"); F32 scale = scale_spinner->getValue().asReal(); @@ -1460,7 +1458,6 @@ void LLModelPreview::rebuildUploadData() if (base_model && !requested_name.empty()) { base_model->mRequestedLabel = requested_name; - base_model->mMetric = metric; } for (int i = LLModel::NUM_LODS - 1; i >= LLModel::LOD_IMPOSTOR; i--) diff --git a/indra/newview/llfloatermyscripts.cpp b/indra/newview/llfloatermyscripts.cpp new file mode 100644 index 0000000000..fa2de21a8f --- /dev/null +++ b/indra/newview/llfloatermyscripts.cpp @@ -0,0 +1,294 @@ +/** + * @file llfloatermyscripts.cpp + * @brief LLFloaterMyScripts class implementation. + * + * $LicenseInfo:firstyear=2004&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2019, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llfloatermyscripts.h" + +#include "llagent.h" +#include "llcorehttputil.h" +#include "llcoros.h" +#include "lleventcoro.h" +#include "llfloaterreg.h" +#include "llscrolllistctrl.h" +#include "lltrans.h" +#include "llviewerregion.h" + +const S32 SIZE_OF_ONE_KB = 1024; + +LLFloaterMyScripts::LLFloaterMyScripts(const LLSD& seed) + : LLFloater(seed), + mGotAttachmentMemoryUsed(false), + mAttachmentMemoryMax(0), + mAttachmentMemoryUsed(0), + mGotAttachmentURLsUsed(false), + mAttachmentURLsMax(0), + mAttachmentURLsUsed(0) +{ +} + +BOOL LLFloaterMyScripts::postBuild() +{ + childSetAction("refresh_list_btn", onClickRefresh, this); + + std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); + getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting)); + return requestAttachmentDetails(); +} + +BOOL LLFloaterMyScripts::requestAttachmentDetails() +{ + if (!gAgent.getRegion()) return FALSE; + + LLSD body; + std::string url = gAgent.getRegion()->getCapability("AttachmentResources"); + if (!url.empty()) + { + LLCoros::instance().launch("LLFloaterMyScripts::getAttachmentLimitsCoro", + boost::bind(&LLFloaterMyScripts::getAttachmentLimitsCoro, this, url)); + return TRUE; + } + else + { + return FALSE; + } +} + +void LLFloaterMyScripts::getAttachmentLimitsCoro(std::string url) +{ + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t + httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getAttachmentLimitsCoro", httpPolicy)); + LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + + LLSD result = httpAdapter->getAndSuspend(httpRequest, url); + + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + + if (!status) + { + LL_WARNS() << "Unable to retrieve attachment limits." << LL_ENDL; + return; + } + + LLFloaterMyScripts* instance = LLFloaterReg::getTypedInstance<LLFloaterMyScripts>("my_scripts"); + + if (!instance) + { + LL_WARNS() << "Failed to get LLFloaterMyScripts instance" << LL_ENDL; + return; + } + + instance->getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string(""))); + + LLButton* btn = instance->getChild<LLButton>("refresh_list_btn"); + if (btn) + { + btn->setEnabled(true); + } + + result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); + instance->setAttachmentDetails(result); +} + + +void LLFloaterMyScripts::setAttachmentDetails(LLSD content) +{ + LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list"); + + if(!list) + { + return; + } + + S32 number_attachments = content["attachments"].size(); + + for(int i = 0; i < number_attachments; i++) + { + std::string humanReadableLocation = ""; + if(content["attachments"][i].has("location")) + { + std::string actualLocation = content["attachments"][i]["location"]; + humanReadableLocation = LLTrans::getString(actualLocation.c_str()); + } + + S32 number_objects = content["attachments"][i]["objects"].size(); + for(int j = 0; j < number_objects; j++) + { + LLUUID task_id = content["attachments"][i]["objects"][j]["id"].asUUID(); + S32 size = 0; + if(content["attachments"][i]["objects"][j]["resources"].has("memory")) + { + size = content["attachments"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB; + } + S32 urls = 0; + if(content["attachments"][i]["objects"][j]["resources"].has("urls")) + { + urls = content["attachments"][i]["objects"][j]["resources"]["urls"].asInteger(); + } + std::string name = content["attachments"][i]["objects"][j]["name"].asString(); + + LLSD element; + + element["id"] = task_id; + element["columns"][0]["column"] = "size"; + element["columns"][0]["value"] = llformat("%d", size); + element["columns"][0]["font"] = "SANSSERIF"; + element["columns"][0]["halign"] = LLFontGL::RIGHT; + + element["columns"][1]["column"] = "urls"; + element["columns"][1]["value"] = llformat("%d", urls); + element["columns"][1]["font"] = "SANSSERIF"; + element["columns"][1]["halign"] = LLFontGL::RIGHT; + + element["columns"][2]["column"] = "name"; + element["columns"][2]["value"] = name; + element["columns"][2]["font"] = "SANSSERIF"; + + element["columns"][3]["column"] = "location"; + element["columns"][3]["value"] = humanReadableLocation; + element["columns"][3]["font"] = "SANSSERIF"; + + list->addElement(element); + } + } + + setAttachmentSummary(content); + + getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string(""))); + + LLButton* btn = getChild<LLButton>("refresh_list_btn"); + if(btn) + { + btn->setEnabled(true); + } +} + +void LLFloaterMyScripts::clearList() +{ + LLCtrlListInterface *list = childGetListInterface("scripts_list"); + + if (list) + { + list->operateOnAll(LLCtrlListInterface::OP_DELETE); + } + + std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); + getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting)); +} + +void LLFloaterMyScripts::setAttachmentSummary(LLSD content) +{ + if(content["summary"]["used"][0]["type"].asString() == std::string("memory")) + { + mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; + mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; + mGotAttachmentMemoryUsed = true; + } + else if(content["summary"]["used"][1]["type"].asString() == std::string("memory")) + { + mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; + mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; + mGotAttachmentMemoryUsed = true; + } + else + { + LL_WARNS() << "attachment details don't contain memory summary info" << LL_ENDL; + return; + } + + if(content["summary"]["used"][0]["type"].asString() == std::string("urls")) + { + mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger(); + mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger(); + mGotAttachmentURLsUsed = true; + } + else if(content["summary"]["used"][1]["type"].asString() == std::string("urls")) + { + mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger(); + mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger(); + mGotAttachmentURLsUsed = true; + } + else + { + LL_WARNS() << "attachment details don't contain urls summary info" << LL_ENDL; + return; + } + + if((mAttachmentMemoryUsed >= 0) && (mAttachmentMemoryMax >= 0)) + { + LLStringUtil::format_map_t args_attachment_memory; + args_attachment_memory["[COUNT]"] = llformat ("%d", mAttachmentMemoryUsed); + std::string translate_message = "ScriptLimitsMemoryUsedSimple"; + + if (0 < mAttachmentMemoryMax) + { + S32 attachment_memory_available = mAttachmentMemoryMax - mAttachmentMemoryUsed; + + args_attachment_memory["[MAX]"] = llformat ("%d", mAttachmentMemoryMax); + args_attachment_memory["[AVAILABLE]"] = llformat ("%d", attachment_memory_available); + translate_message = "ScriptLimitsMemoryUsed"; + } + + getChild<LLUICtrl>("memory_used")->setValue(LLTrans::getString(translate_message, args_attachment_memory)); + } + + if((mAttachmentURLsUsed >= 0) && (mAttachmentURLsMax >= 0)) + { + S32 attachment_urls_available = mAttachmentURLsMax - mAttachmentURLsUsed; + + LLStringUtil::format_map_t args_attachment_urls; + args_attachment_urls["[COUNT]"] = llformat ("%d", mAttachmentURLsUsed); + args_attachment_urls["[MAX]"] = llformat ("%d", mAttachmentURLsMax); + args_attachment_urls["[AVAILABLE]"] = llformat ("%d", attachment_urls_available); + std::string msg_attachment_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_attachment_urls); + getChild<LLUICtrl>("urls_used")->setValue(LLSD(msg_attachment_urls)); + } +} + +// static +void LLFloaterMyScripts::onClickRefresh(void* userdata) +{ + LLFloaterMyScripts* instance = LLFloaterReg::getTypedInstance<LLFloaterMyScripts>("my_scripts"); + if(instance) + { + LLButton* btn = instance->getChild<LLButton>("refresh_list_btn"); + + //To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer! + //turn the button off, then turn it on when we get a response + if(btn) + { + btn->setEnabled(false); + } + instance->clearList(); + instance->requestAttachmentDetails(); + } + else + { + LL_WARNS() << "could not find LLFloaterMyScripts instance after refresh button clicked" << LL_ENDL; + } +} + diff --git a/indra/newview/llfloatermyscripts.h b/indra/newview/llfloatermyscripts.h new file mode 100644 index 0000000000..fe33ab90ae --- /dev/null +++ b/indra/newview/llfloatermyscripts.h @@ -0,0 +1,60 @@ +/** + * @file llfloatermyscripts.h + * @brief LLFloaterMyScripts class definition. + * + * $LicenseInfo:firstyear=2004&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2019, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATERMYSCRIPTS_H +#define LL_LLFLOATERMYSCRIPTS_H + +#include "llfloater.h" +#include "llpanel.h" + +class LLFloaterMyScripts : public LLFloater +{ +public: + LLFloaterMyScripts(const LLSD& seed); + + BOOL postBuild(); + void setAttachmentDetails(LLSD content); + void setAttachmentSummary(LLSD content); + BOOL requestAttachmentDetails(); + void clearList(); + +private: + void getAttachmentLimitsCoro(std::string url); + + bool mGotAttachmentMemoryUsed; + S32 mAttachmentMemoryMax; + S32 mAttachmentMemoryUsed; + + bool mGotAttachmentURLsUsed; + S32 mAttachmentURLsMax; + S32 mAttachmentURLsUsed; + +protected: + + static void onClickRefresh(void* userdata); +}; + +#endif diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 3853ca1822..64961fc99c 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -117,6 +117,8 @@ #include "llfeaturemanager.h" #include "llviewertexturelist.h" +#include "llsearchableui.h" + const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f; char const* const VISIBILITY_DEFAULT = "default"; char const* const VISIBILITY_HIDDEN = "hidden"; @@ -136,6 +138,25 @@ static const F32 MIN_ARC_LOG = log(MIN_ARC_LIMIT); static const F32 MAX_ARC_LOG = log(MAX_ARC_LIMIT); static const F32 ARC_LIMIT_MAP_SCALE = (MAX_ARC_LOG - MIN_ARC_LOG) / (MAX_INDIRECT_ARC_LIMIT - MIN_INDIRECT_ARC_LIMIT); +struct LabelDef : public LLInitParam::Block<LabelDef> +{ + Mandatory<std::string> name; + Mandatory<std::string> value; + + LabelDef() + : name("name"), + value("value") + {} +}; + +struct LabelTable : public LLInitParam::Block<LabelTable> +{ + Multiple<LabelDef> labels; + LabelTable() + : labels("label") + {} +}; + class LLVoiceSetKeyDialog : public LLModalDialog { public: @@ -393,6 +414,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.ClearLog", boost::bind(&LLConversationLog::onClearLog, &LLConversationLog::instance())); mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this)); + mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering } void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type ) @@ -506,7 +528,33 @@ BOOL LLFloaterPreference::postBuild() LLSliderCtrl* fov_slider = getChild<LLSliderCtrl>("camera_fov"); fov_slider->setMinValue(LLViewerCamera::getInstance()->getMinView()); fov_slider->setMaxValue(LLViewerCamera::getInstance()->getMaxView()); - + + // Hook up and init for filtering + mFilterEdit = getChild<LLSearchEditor>("search_prefs_edit"); + mFilterEdit->setKeystrokeCallback(boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); + + // Load and assign label for 'default language' + std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "default_languages.xml"); + std::map<std::string, std::string> labels; + if (loadFromFilename(user_filename, labels)) + { + std::string system_lang = gSavedSettings.getString("SystemLanguage"); + std::map<std::string, std::string>::iterator iter = labels.find(system_lang); + if (iter != labels.end()) + { + getChild<LLComboBox>("language_combobox")->add(iter->second, LLSD("default"), ADD_TOP, true); + } + else + { + LL_WARNS() << "Language \"" << system_lang << "\" is not in default_languages.xml" << LL_ENDL; + getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true); + } + } + else + { + LL_WARNS() << "Failed to load labels from " << user_filename << ". Using default." << LL_ENDL; + getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true); + } return TRUE; } @@ -786,6 +834,13 @@ void LLFloaterPreference::onOpen(const LLSD& key) save_btn->setEnabled(started); delete_btn->setEnabled(started); exceptions_btn->setEnabled(started); + + collectSearchableItems(); + if (!mFilterEdit->getText().empty()) + { + mFilterEdit->setText(LLStringExplicit("")); + onUpdateFilterTerm(true); + } } void LLFloaterPreference::onVertexShaderEnable() @@ -1966,6 +2021,45 @@ void LLFloaterPreference::updateMaxComplexity() getChild<LLTextBox>("IndirectMaxComplexityText")); } +bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map) +{ + LLXMLNodePtr root; + + if (!LLXMLNode::parseFile(filename, root, NULL)) + { + LL_WARNS() << "Unable to parse file " << filename << LL_ENDL; + return false; + } + + if (!root->hasName("labels")) + { + LL_WARNS() << filename << " is not a valid definition file" << LL_ENDL; + return false; + } + + LabelTable params; + LLXUIParser parser; + parser.readXUI(root, params, filename); + + if (params.validateBlock()) + { + for (LLInitParam::ParamIterator<LabelDef>::const_iterator it = params.labels.begin(); + it != params.labels.end(); + ++it) + { + LabelDef label_entry = *it; + label_map[label_entry.name] = label_entry.value; + } + } + else + { + LL_WARNS() << filename << " failed to load" << LL_ENDL; + return false; + } + + return true; +} + void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity() { // Called when the IndirectMaxComplexity control changes @@ -2329,6 +2423,7 @@ BOOL LLPanelPreference::postBuild() if (hasChild("mute_chb_label", TRUE)) { getChild<LLTextBox>("mute_chb_label")->setShowCursorHand(false); + getChild<LLTextBox>("mute_chb_label")->setSoundFlags(LLView::MOUSE_UP); getChild<LLTextBox>("mute_chb_label")->setClickedCallback(boost::bind(&toggleMuteWhenMinimized)); } @@ -2452,6 +2547,11 @@ void LLPanelPreference::toggleMuteWhenMinimized() { std::string mute("MuteWhenMinimized"); gSavedSettings.setBOOL(mute, !gSavedSettings.getBOOL(mute)); + LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); + if (instance) + { + instance->getChild<LLCheckBoxCtrl>("mute_when_minimized")->setBtnFocus(); + } } void LLPanelPreference::cancel() @@ -2600,6 +2700,11 @@ void LLPanelPreferenceGraphics::onPresetsListChange() { instance->saveSettings(); //make cancel work correctly after changing the preset } + else + { + std::string dummy; + instance->saveGraphicsPreset(dummy); + } } void LLPanelPreferenceGraphics::setPresetText() @@ -2977,3 +3082,109 @@ void LLFloaterPreferenceProxy::onChangeSocksSettings() } +void LLFloaterPreference::onUpdateFilterTerm(bool force) +{ + LLWString seachValue = utf8str_to_wstring( mFilterEdit->getValue() ); + LLWStringUtil::toLower( seachValue ); + + if( !mSearchData || (mSearchData->mLastFilter == seachValue && !force)) + return; + + mSearchData->mLastFilter = seachValue; + + if( !mSearchData->mRootTab ) + return; + + mSearchData->mRootTab->hightlightAndHide( seachValue ); + LLTabContainer *pRoot = getChild< LLTabContainer >( "pref core" ); + if( pRoot ) + pRoot->selectFirstTab(); +} + +void collectChildren( LLView const *aView, ll::prefs::PanelDataPtr aParentPanel, ll::prefs::TabContainerDataPtr aParentTabContainer ) +{ + if( !aView ) + return; + + llassert_always( aParentPanel || aParentTabContainer ); + + LLView::child_list_const_iter_t itr = aView->beginChild(); + LLView::child_list_const_iter_t itrEnd = aView->endChild(); + + while( itr != itrEnd ) + { + LLView *pView = *itr; + ll::prefs::PanelDataPtr pCurPanelData = aParentPanel; + ll::prefs::TabContainerDataPtr pCurTabContainer = aParentTabContainer; + if( !pView ) + continue; + LLPanel const *pPanel = dynamic_cast< LLPanel const *>( pView ); + LLTabContainer const *pTabContainer = dynamic_cast< LLTabContainer const *>( pView ); + ll::ui::SearchableControl const *pSCtrl = dynamic_cast< ll::ui::SearchableControl const *>( pView ); + + if( pTabContainer ) + { + pCurPanelData.reset(); + + pCurTabContainer = ll::prefs::TabContainerDataPtr( new ll::prefs::TabContainerData ); + pCurTabContainer->mTabContainer = const_cast< LLTabContainer *>( pTabContainer ); + pCurTabContainer->mLabel = pTabContainer->getLabel(); + pCurTabContainer->mPanel = 0; + + if( aParentPanel ) + aParentPanel->mChildPanel.push_back( pCurTabContainer ); + if( aParentTabContainer ) + aParentTabContainer->mChildPanel.push_back( pCurTabContainer ); + } + else if( pPanel ) + { + pCurTabContainer.reset(); + + pCurPanelData = ll::prefs::PanelDataPtr( new ll::prefs::PanelData ); + pCurPanelData->mPanel = pPanel; + pCurPanelData->mLabel = pPanel->getLabel(); + + llassert_always( aParentPanel || aParentTabContainer ); + + if( aParentTabContainer ) + aParentTabContainer->mChildPanel.push_back( pCurPanelData ); + else if( aParentPanel ) + aParentPanel->mChildPanel.push_back( pCurPanelData ); + } + else if( pSCtrl && pSCtrl->getSearchText().size() ) + { + ll::prefs::SearchableItemPtr item = ll::prefs::SearchableItemPtr( new ll::prefs::SearchableItem() ); + item->mView = pView; + item->mCtrl = pSCtrl; + + item->mLabel = utf8str_to_wstring( pSCtrl->getSearchText() ); + LLWStringUtil::toLower( item->mLabel ); + + llassert_always( aParentPanel || aParentTabContainer ); + + if( aParentPanel ) + aParentPanel->mChildren.push_back( item ); + if( aParentTabContainer ) + aParentTabContainer->mChildren.push_back( item ); + } + collectChildren( pView, pCurPanelData, pCurTabContainer ); + ++itr; + } +} + +void LLFloaterPreference::collectSearchableItems() +{ + mSearchData.reset( nullptr ); + LLTabContainer *pRoot = getChild< LLTabContainer >( "pref core" ); + if( mFilterEdit && pRoot ) + { + mSearchData.reset(new ll::prefs::SearchData() ); + + ll::prefs::TabContainerDataPtr pRootTabcontainer = ll::prefs::TabContainerDataPtr( new ll::prefs::TabContainerData ); + pRootTabcontainer->mTabContainer = pRoot; + pRootTabcontainer->mLabel = pRoot->getLabel(); + mSearchData->mRootTab = pRootTabcontainer; + + collectChildren( this, ll::prefs::PanelDataPtr(), pRootTabcontainer ); + } +} diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 4e51137df5..1b8229ada6 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -36,6 +36,7 @@ #include "llfloater.h" #include "llavatarpropertiesprocessor.h" #include "llconversationlog.h" +#include "llsearcheditor.h" class LLConversationLogObserver; class LLPanelPreference; @@ -47,6 +48,14 @@ class LLSliderCtrl; class LLSD; class LLTextBox; +namespace ll +{ + namespace prefs + { + struct SearchData; + } +} + typedef std::map<std::string, std::string> notifications_map; typedef enum @@ -189,6 +198,7 @@ private: void onDeleteTranscriptsResponse(const LLSD& notification, const LLSD& response); void updateDeleteTranscriptsButton(); void updateMaxComplexity(); + static bool loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map); static std::string sSkin; notifications_map mNotificationOptions; @@ -205,6 +215,12 @@ private: LLAvatarData mAvatarProperties; std::string mSavedGraphicsPreset; LOG_CLASS(LLFloaterPreference); + + LLSearchEditor *mFilterEdit; + std::unique_ptr< ll::prefs::SearchData > mSearchData; + + void onUpdateFilterTerm( bool force = false ); + void collectSearchableItems(); }; class LLPanelPreference : public LLPanel diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index 21df769d0c..3746b9b6c2 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -90,19 +90,6 @@ LLFloaterScriptLimits::LLFloaterScriptLimits(const LLSD& seed) BOOL LLFloaterScriptLimits::postBuild() { - // a little cheap and cheerful - if there's an about land panel open default to showing parcel info, - // otherwise default to showing attachments (avatar appearance) - bool selectParcelPanel = false; - - LLFloaterLand* instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land"); - if(instance) - { - if(instance->isShown()) - { - selectParcelPanel = true; - } - } - mTab = getChild<LLTabContainer>("scriptlimits_panels"); if(!mTab) @@ -111,28 +98,12 @@ BOOL LLFloaterScriptLimits::postBuild() return FALSE; } - // contruct the panels + // contruct the panel LLPanelScriptLimitsRegionMemory* panel_memory = new LLPanelScriptLimitsRegionMemory; mInfoPanels.push_back(panel_memory); panel_memory->buildFromFile( "panel_script_limits_region_memory.xml"); mTab->addTabPanel(panel_memory); - - LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment; - mInfoPanels.push_back(panel_attachments); - panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml"); - mTab->addTabPanel(panel_attachments); - - - if(mInfoPanels.size() > 0) - { - mTab->selectTab(0); - } - - if(!selectParcelPanel && (mInfoPanels.size() > 1)) - { - mTab->selectTab(1); - } - + mTab->selectTab(0); return TRUE; } @@ -969,269 +940,3 @@ void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata) } } -///---------------------------------------------------------------------------- -// Attachment Panel -///---------------------------------------------------------------------------- - -BOOL LLPanelScriptLimitsAttachment::requestAttachmentDetails() -{ - if (!gAgent.getRegion()) return FALSE; - - LLSD body; - std::string url = gAgent.getRegion()->getCapability("AttachmentResources"); - if (!url.empty()) - { - LLCoros::instance().launch("LLPanelScriptLimitsAttachment::getAttachmentLimitsCoro", - boost::bind(&LLPanelScriptLimitsAttachment::getAttachmentLimitsCoro, this, url)); - return TRUE; - } - else - { - return FALSE; - } -} - -void LLPanelScriptLimitsAttachment::getAttachmentLimitsCoro(std::string url) -{ - LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getAttachmentLimitsCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - - LLSD result = httpAdapter->getAndSuspend(httpRequest, url); - - LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; - LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - - if (!status) - { - LL_WARNS() << "Unable to retrieve attachment limits." << LL_ENDL; - return; - } - - LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); - - if (!instance) - { - LL_WARNS() << "Failed to get llfloaterscriptlimits instance" << LL_ENDL; - return; - } - - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - if (!tab) - { - LL_WARNS() << "Failed to get scriptlimits_panels" << LL_ENDL; - return; - } - - LLPanelScriptLimitsAttachment* panel = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel"); - if (!panel) - { - LL_WARNS() << "Failed to get script_limits_my_avatar_panel" << LL_ENDL; - return; - } - - panel->getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string(""))); - - LLButton* btn = panel->getChild<LLButton>("refresh_list_btn"); - if (btn) - { - btn->setEnabled(true); - } - - result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); - panel->setAttachmentDetails(result); -} - - -void LLPanelScriptLimitsAttachment::setAttachmentDetails(LLSD content) -{ - LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list"); - - if(!list) - { - return; - } - - S32 number_attachments = content["attachments"].size(); - - for(int i = 0; i < number_attachments; i++) - { - std::string humanReadableLocation = ""; - if(content["attachments"][i].has("location")) - { - std::string actualLocation = content["attachments"][i]["location"]; - humanReadableLocation = LLTrans::getString(actualLocation.c_str()); - } - - S32 number_objects = content["attachments"][i]["objects"].size(); - for(int j = 0; j < number_objects; j++) - { - LLUUID task_id = content["attachments"][i]["objects"][j]["id"].asUUID(); - S32 size = 0; - if(content["attachments"][i]["objects"][j]["resources"].has("memory")) - { - size = content["attachments"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB; - } - S32 urls = 0; - if(content["attachments"][i]["objects"][j]["resources"].has("urls")) - { - urls = content["attachments"][i]["objects"][j]["resources"]["urls"].asInteger(); - } - std::string name = content["attachments"][i]["objects"][j]["name"].asString(); - - LLSD element; - - element["id"] = task_id; - element["columns"][0]["column"] = "size"; - element["columns"][0]["value"] = llformat("%d", size); - element["columns"][0]["font"] = "SANSSERIF"; - element["columns"][0]["halign"] = LLFontGL::RIGHT; - - element["columns"][1]["column"] = "urls"; - element["columns"][1]["value"] = llformat("%d", urls); - element["columns"][1]["font"] = "SANSSERIF"; - element["columns"][1]["halign"] = LLFontGL::RIGHT; - - element["columns"][2]["column"] = "name"; - element["columns"][2]["value"] = name; - element["columns"][2]["font"] = "SANSSERIF"; - - element["columns"][3]["column"] = "location"; - element["columns"][3]["value"] = humanReadableLocation; - element["columns"][3]["font"] = "SANSSERIF"; - - list->addElement(element); - } - } - - setAttachmentSummary(content); - - getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string(""))); - - LLButton* btn = getChild<LLButton>("refresh_list_btn"); - if(btn) - { - btn->setEnabled(true); - } -} - -BOOL LLPanelScriptLimitsAttachment::postBuild() -{ - childSetAction("refresh_list_btn", onClickRefresh, this); - - std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); - getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting)); - return requestAttachmentDetails(); -} - -void LLPanelScriptLimitsAttachment::clearList() -{ - LLCtrlListInterface *list = childGetListInterface("scripts_list"); - - if (list) - { - list->operateOnAll(LLCtrlListInterface::OP_DELETE); - } - - std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); - getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting)); -} - -void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content) -{ - if(content["summary"]["used"][0]["type"].asString() == std::string("memory")) - { - mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; - mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; - mGotAttachmentMemoryUsed = true; - } - else if(content["summary"]["used"][1]["type"].asString() == std::string("memory")) - { - mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; - mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; - mGotAttachmentMemoryUsed = true; - } - else - { - LL_WARNS() << "attachment details don't contain memory summary info" << LL_ENDL; - return; - } - - if(content["summary"]["used"][0]["type"].asString() == std::string("urls")) - { - mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger(); - mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger(); - mGotAttachmentURLsUsed = true; - } - else if(content["summary"]["used"][1]["type"].asString() == std::string("urls")) - { - mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger(); - mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger(); - mGotAttachmentURLsUsed = true; - } - else - { - LL_WARNS() << "attachment details don't contain urls summary info" << LL_ENDL; - return; - } - - if((mAttachmentMemoryUsed >= 0) && (mAttachmentMemoryMax >= 0)) - { - LLStringUtil::format_map_t args_attachment_memory; - args_attachment_memory["[COUNT]"] = llformat ("%d", mAttachmentMemoryUsed); - std::string translate_message = "ScriptLimitsMemoryUsedSimple"; - - if (0 < mAttachmentMemoryMax) - { - S32 attachment_memory_available = mAttachmentMemoryMax - mAttachmentMemoryUsed; - - args_attachment_memory["[MAX]"] = llformat ("%d", mAttachmentMemoryMax); - args_attachment_memory["[AVAILABLE]"] = llformat ("%d", attachment_memory_available); - translate_message = "ScriptLimitsMemoryUsed"; - } - - getChild<LLUICtrl>("memory_used")->setValue(LLTrans::getString(translate_message, args_attachment_memory)); - } - - if((mAttachmentURLsUsed >= 0) && (mAttachmentURLsMax >= 0)) - { - S32 attachment_urls_available = mAttachmentURLsMax - mAttachmentURLsUsed; - - LLStringUtil::format_map_t args_attachment_urls; - args_attachment_urls["[COUNT]"] = llformat ("%d", mAttachmentURLsUsed); - args_attachment_urls["[MAX]"] = llformat ("%d", mAttachmentURLsMax); - args_attachment_urls["[AVAILABLE]"] = llformat ("%d", attachment_urls_available); - std::string msg_attachment_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_attachment_urls); - getChild<LLUICtrl>("urls_used")->setValue(LLSD(msg_attachment_urls)); - } -} - -// static -void LLPanelScriptLimitsAttachment::onClickRefresh(void* userdata) -{ - LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); - if(instance) - { - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsAttachment* panel_attachments = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel"); - LLButton* btn = panel_attachments->getChild<LLButton>("refresh_list_btn"); - - //To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer! - //turn the button off, then turn it on when we get a response - if(btn) - { - btn->setEnabled(false); - } - panel_attachments->clearList(); - panel_attachments->requestAttachmentDetails(); - - return; - } - else - { - LL_WARNS() << "could not find LLPanelScriptLimitsRegionMemory instance after refresh button clicked" << LL_ENDL; - return; - } -} - diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h index 16450c6527..d2192f9d01 100644 --- a/indra/newview/llfloaterscriptlimits.h +++ b/indra/newview/llfloaterscriptlimits.h @@ -152,51 +152,4 @@ protected: static void onClickReturn(void* userdata); }; -///////////////////////////////////////////////////////////////////////////// -// Attachment panel -///////////////////////////////////////////////////////////////////////////// - -class LLPanelScriptLimitsAttachment : public LLPanelScriptLimitsInfo -{ - -public: - LLPanelScriptLimitsAttachment() - : LLPanelScriptLimitsInfo(), - mGotAttachmentMemoryUsed(false), - mAttachmentMemoryMax(0), - mAttachmentMemoryUsed(0), - mGotAttachmentURLsUsed(false), - mAttachmentURLsMax(0), - mAttachmentURLsUsed(0) - {}; - - ~LLPanelScriptLimitsAttachment() - { - }; - - // LLPanel - virtual BOOL postBuild(); - - void setAttachmentDetails(LLSD content); - - void setAttachmentSummary(LLSD content); - BOOL requestAttachmentDetails(); - void clearList(); - -private: - void getAttachmentLimitsCoro(std::string url); - - bool mGotAttachmentMemoryUsed; - S32 mAttachmentMemoryMax; - S32 mAttachmentMemoryUsed; - - bool mGotAttachmentURLsUsed; - S32 mAttachmentURLsMax; - S32 mAttachmentURLsUsed; - -protected: - - static void onClickRefresh(void* userdata); -}; - #endif diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index ee4fdbe9a5..c2c15ee12b 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -514,11 +514,6 @@ void LLFloaterTools::refresh() selection_info << getString("status_selectcount", selection_args); getChild<LLTextBox>("selection_count")->setText(selection_info.str()); - - bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); - childSetVisible("selection_count", have_selection); - childSetVisible("remaining_capacity", have_selection); - childSetVisible("selection_empty", !have_selection); } diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index 3e6fc3dc0d..bd49405f34 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -78,8 +78,6 @@ LLFloaterTopObjects::LLFloaterTopObjects(const LLSD& key) mCommitCallbackRegistrar.add("TopObjects.ShowBeacon", boost::bind(&LLFloaterTopObjects::onClickShowBeacon, this)); mCommitCallbackRegistrar.add("TopObjects.ReturnSelected", boost::bind(&LLFloaterTopObjects::onReturnSelected, this)); mCommitCallbackRegistrar.add("TopObjects.ReturnAll", boost::bind(&LLFloaterTopObjects::onReturnAll, this)); - mCommitCallbackRegistrar.add("TopObjects.DisableSelected", boost::bind(&LLFloaterTopObjects::onDisableSelected, this)); - mCommitCallbackRegistrar.add("TopObjects.DisableAll", boost::bind(&LLFloaterTopObjects::onDisableAll, this)); mCommitCallbackRegistrar.add("TopObjects.Refresh", boost::bind(&LLFloaterTopObjects::onRefresh, this)); mCommitCallbackRegistrar.add("TopObjects.GetByObjectName", boost::bind(&LLFloaterTopObjects::onGetByObjectName, this)); mCommitCallbackRegistrar.add("TopObjects.GetByOwnerName", boost::bind(&LLFloaterTopObjects::onGetByOwnerName, this)); @@ -145,6 +143,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) { U32 request_flags; U32 total_count; + U64 total_memory = 0; msg->getU32Fast(_PREHASH_RequestData, _PREHASH_RequestFlags, request_flags); msg->getU32Fast(_PREHASH_RequestData, _PREHASH_TotalObjectCount, total_count); @@ -192,6 +191,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) { parcel_buf = parcel_name; script_memory = script_size; + total_memory += script_size; } } @@ -265,8 +265,10 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) { setTitle(getString("top_scripts_title")); list->setColumnLabel("score", getString("scripts_score_label")); - + LLUIString format = getString("top_scripts_text"); + total_memory /= 1024; + format.setArg("[MEMORY]", llformat("%ld", total_memory)); format.setArg("[COUNT]", llformat("%d", total_count)); format.setArg("[TIME]", llformat("%0.3f", mtotalScore)); getChild<LLUICtrl>("title_text")->setValue(LLSD(format)); @@ -332,7 +334,7 @@ void LLFloaterTopObjects::onClickShowBeacon() showBeacon(); } -void LLFloaterTopObjects::doToObjects(int action, bool all) +void LLFloaterTopObjects::returnObjects(bool all) { LLMessageSystem *msg = gMessageSystem; @@ -356,14 +358,7 @@ void LLFloaterTopObjects::doToObjects(int action, bool all) } if (start_message) { - if (action == ACTION_RETURN) - { - msg->newMessageFast(_PREHASH_ParcelReturnObjects); - } - else - { - msg->newMessageFast(_PREHASH_ParcelDisableObjects); - } + msg->newMessageFast(_PREHASH_ParcelReturnObjects); msg->nextBlockFast(_PREHASH_AgentData); msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); @@ -397,7 +392,7 @@ bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD if(!instance) return false; if (option == 0) { - instance->doToObjects(ACTION_RETURN, true); + instance->returnObjects(true); } return false; } @@ -410,31 +405,7 @@ void LLFloaterTopObjects::onReturnAll() void LLFloaterTopObjects::onReturnSelected() { - doToObjects(ACTION_RETURN, false); -} - - -//static -bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects"); - if(!instance) return false; - if (option == 0) - { - instance->doToObjects(ACTION_DISABLE, true); - } - return false; -} - -void LLFloaterTopObjects::onDisableAll() -{ - LLNotificationsUtil::add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll); -} - -void LLFloaterTopObjects::onDisableSelected() -{ - doToObjects(ACTION_DISABLE, false); + returnObjects(false); } diff --git a/indra/newview/llfloatertopobjects.h b/indra/newview/llfloatertopobjects.h index dbbe9ac521..3138249c7a 100644 --- a/indra/newview/llfloatertopobjects.h +++ b/indra/newview/llfloatertopobjects.h @@ -78,15 +78,12 @@ private: static void onDoubleClickObjectsList(void* data); void onClickShowBeacon(); - void doToObjects(int action, bool all); + void returnObjects(bool all); void onReturnAll(); void onReturnSelected(); - void onDisableAll(); - void onDisableSelected(); static bool callbackReturnAll(const LLSD& notification, const LLSD& response); - static bool callbackDisableAll(const LLSD& notification, const LLSD& response); void onGetByOwnerName(); void onGetByObjectName(); @@ -108,12 +105,6 @@ private: F32 mtotalScore; - enum - { - ACTION_RETURN = 0, - ACTION_DISABLE - }; - static LLFloaterTopObjects* sInstance; }; diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 76ad2146f1..db5a192287 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -60,6 +60,7 @@ #include "llfloaterreg.h" #include "llscrollcontainer.h" // scroll container for overlapping elements #include "lllivefile.h" // live file poll/stat/reload +#include "llviewermenufile.h" // LLFilePickerReplyThread // Boost (for linux/unix command-line execv) #include <boost/tokenizer.hpp> @@ -206,7 +207,9 @@ private: void onClickSaveAll(S32 id); void onClickEditFloater(); void onClickBrowseForEditor(); + void getExecutablePath(const std::vector<std::string>& filenames); void onClickBrowseForDiffs(); + void getDiffsFilePath(const std::vector<std::string>& filenames); void onClickToggleDiffHighlighting(); void onClickToggleOverlapping(); void onClickCloseDisplayedFloater(S32 id); @@ -1019,15 +1022,14 @@ void LLFloaterUIPreview::onClickEditFloater() // Respond to button click to browse for an executable with which to edit XML files void LLFloaterUIPreview::onClickBrowseForEditor() { - // Let the user choose an executable through the file picker dialog box - LLFilePicker& picker = LLFilePicker::instance(); - if (!picker.getOpenFile(LLFilePicker::FFLOAD_EXE)) - { - return; // user cancelled -- do nothing - } + // Let the user choose an executable through the file picker dialog box + (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getExecutablePath, this, _1), LLFilePicker::FFLOAD_EXE, false))->getFile(); +} +void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filenames) +{ // put the selected path into text field - const std::string chosen_path = picker.getFirstFile(); + const std::string chosen_path = filenames[0]; std::string executable_path = chosen_path; #if LL_DARWIN // on Mac, if it's an application bundle, figure out the actual path from the Info.plist file @@ -1075,15 +1077,13 @@ void LLFloaterUIPreview::onClickBrowseForEditor() void LLFloaterUIPreview::onClickBrowseForDiffs() { // create load dialog box - LLFilePicker::ELoadFilter type = (LLFilePicker::ELoadFilter)((intptr_t)((void*)LLFilePicker::FFLOAD_XML)); // nothing for *.exe so just use all - LLFilePicker& picker = LLFilePicker::instance(); - if (!picker.getOpenFile(type)) // user cancelled -- do nothing - { - return; - } + (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getDiffsFilePath, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile(); +} +void LLFloaterUIPreview::getDiffsFilePath(const std::vector<std::string>& filenames) +{ // put the selected path into text field - const std::string chosen_path = picker.getFirstFile(); + const std::string chosen_path = filenames[0]; mDiffPathTextBox->setText(std::string(chosen_path)); // copy the path to the executable to the textfield for display and later fetching if(LLView::sHighlightingDiffs) // if we're already highlighting, toggle off and then on so we get the data from the new file { diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 152d0eddcd..088d052533 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -2137,6 +2137,7 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) static U32 lastGroupMemberRequestFrame = 0; // Have we requested the information already this frame? + // Todo: make this per group, we can invite to one group and simultaneously be checking another one if ((lastGroupMemberRequestFrame == gFrameCount) || (mMemberRequestInFlight)) return; @@ -2166,6 +2167,9 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) return; } + LLGroupMgrGroupData* group_datap = createGroupData(group_id); //make sure group exists + group_datap->mMemberRequestID.generate(); // mark as pending + lastGroupMemberRequestFrame = gFrameCount; LLCoros::instance().launch("LLGroupMgr::groupMembersRequestCoro", diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 940ef6eea1..cf9735e38a 100644 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -258,6 +258,11 @@ public: bool isRoleMemberDataComplete() { return mRoleMemberDataComplete; } bool isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; } + bool isMemberDataPending() { return mMemberRequestID.notNull(); } + bool isRoleDataPending() { return mRoleDataRequestID.notNull(); } + bool isRoleMemberDataPending() { return (mRoleMembersRequestID.notNull() || mPendingRoleMemberRequest); } + bool isGroupTitlePending() { return mTitlesRequestID.notNull(); } + bool isSingleMemberNotOwner(); F32 getAccessTime() const { return mAccessTime; } diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp index e76b3d118e..d59c301210 100644 --- a/indra/newview/llimprocessing.cpp +++ b/indra/newview/llimprocessing.cpp @@ -854,15 +854,33 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, } else // IM_TASK_INVENTORY_OFFERED { - if (sizeof(S8) != binary_bucket_size) + if (offline == IM_OFFLINE && session_id.isNull() && aux_id.notNull() && binary_bucket_size > sizeof(S8)* 5) { - LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL; - delete info; - break; + // cap received offline message + std::string str_bucket = ll_safe_string((char*)binary_bucket, binary_bucket_size); + typedef boost::tokenizer<boost::char_separator<char> > tokenizer; + boost::char_separator<char> sep("|", "", boost::keep_empty_tokens); + tokenizer tokens(str_bucket, sep); + tokenizer::iterator iter = tokens.begin(); + + info->mType = (LLAssetType::EType)(atoi((*(iter++)).c_str())); + // Note There is more elements in 'tokens' ... + + info->mObjectID = LLUUID::null; + info->mFromObject = TRUE; + } + else + { + if (sizeof(S8) != binary_bucket_size) + { + LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL; + delete info; + break; + } + info->mType = (LLAssetType::EType) binary_bucket[0]; + info->mObjectID = LLUUID::null; + info->mFromObject = TRUE; } - info->mType = (LLAssetType::EType) binary_bucket[0]; - info->mObjectID = LLUUID::null; - info->mFromObject = TRUE; } info->mIM = dialog; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 1987e15850..5b12b39fca 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1415,7 +1415,7 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, break; default: - LL_INFOS() << "Unhandled asset type (llassetstorage.h): " + LL_INFOS_ONCE() << "Unhandled asset type (llassetstorage.h): " << (S32)asset_type << " (" << LLAssetType::lookup(asset_type) << ")" << LL_ENDL; break; } @@ -2101,12 +2101,6 @@ BOOL LLItemBridge::isItemCopyable() const LLViewerInventoryItem* item = getItem(); if (item) { - // Can't copy worn objects. DEV-15183 - if(get_is_item_worn(mUUID)) - { - return FALSE; - } - return item->getPermissions().allowCopyBy(gAgent.getID()) || gSavedSettings.getBOOL("InventoryLinking"); } return FALSE; @@ -7344,7 +7338,10 @@ void LLFolderViewGroupedItemBridge::groupFilterContextMenu(folder_view_item_dequ { if (!LLAppearanceMgr::instance().canAddWearables(ids) && canWearSelected(ids)) { - disabled_items.push_back(std::string("Wearable Add")); + disabled_items.push_back(std::string("Wearable And Object Wear")); + disabled_items.push_back(std::string("Wearable Add")); + disabled_items.push_back(std::string("Attach To")); + disabled_items.push_back(std::string("Attach To HUD")); } } disable_context_entries_if_present(menu, disabled_items); @@ -7355,8 +7352,7 @@ bool LLFolderViewGroupedItemBridge::canWearSelected(uuid_vec_t item_ids) for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it) { LLViewerInventoryItem* item = gInventory.getItem(*it); - LLAssetType::EType asset_type = item->getType(); - if (!item || (asset_type >= LLAssetType::AT_COUNT) || (asset_type <= LLAssetType::AT_NONE)) + if (!item || (item->getType() >= LLAssetType::AT_COUNT) || (item->getType() <= LLAssetType::AT_NONE)) { return false; } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index a520e0171e..b140c7c38e 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1820,9 +1820,19 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item) if (LLAssetType::lookup(item->getType()) == LLAssetType::badLookup()) { - LL_WARNS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName() - << " type: " << item->getType() - << " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL; + if (item->getType() >= LLAssetType::AT_COUNT) + { + // Not yet supported. + LL_DEBUGS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName() + << " type: " << item->getType() + << " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL; + } + else + { + LL_WARNS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName() + << " type: " << item->getType() + << " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL; + } } // This condition means that we tried to add a link without the baseobj being in memory. diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 3992b506e9..d4993a1091 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -871,7 +871,8 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id) if (objectp->getType() >= LLAssetType::AT_COUNT) { - LL_WARNS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : " + // Example: Happens when we add assets of new, not yet supported type to library + LL_DEBUGS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : " << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << LL_ENDL; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index c535fc1cdf..1bdeddbcfe 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -516,7 +516,7 @@ LLMutex* LLLogChat::historyThreadsMutex() { if (sHistoryThreadsMutex == NULL) { - sHistoryThreadsMutex = new LLMutex(NULL); + sHistoryThreadsMutex = new LLMutex(); } return sHistoryThreadsMutex; } @@ -573,40 +573,10 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string while (iter.next(filename)) { std::string fullname = gDirUtilp->add(dirname, filename); - - LLFILE * filep = LLFile::fopen(fullname, "rb"); - if (NULL != filep) + if (isTranscriptFileFound(fullname)) { - if(makeLogFileName("chat")== fullname) - { - //Add Nearby chat history to the list of transcriptions - list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename)); - LLFile::close(filep); - continue; - } - char buffer[LOG_RECALL_SIZE]; - - fseek(filep, 0, SEEK_END); // seek to end of file - S32 bytes_to_read = ftell(filep); // get current file pointer - fseek(filep, 0, SEEK_SET); // seek back to beginning of file - - // limit the number characters to read from file - if (bytes_to_read >= LOG_RECALL_SIZE) - { - bytes_to_read = LOG_RECALL_SIZE - 1; - } - - if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep)) - { - //matching a timestamp - boost::match_results<std::string::const_iterator> matches; - if (boost::regex_match(std::string(buffer), matches, TIMESTAMP)) - { - list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename)); - } - } - LLFile::close(filep); - } + list_of_transcriptions.push_back(fullname); + } } } @@ -756,75 +726,70 @@ void LLLogChat::deleteTranscripts() // static bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group) { - std::vector<std::string> list_of_transcriptions; - LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); - - if (list_of_transcriptions.size() > 0) + LLAvatarName avatar_name; + LLAvatarNameCache::get(avatar_id, &avatar_name); + std::string avatar_user_name = avatar_name.getAccountName(); + if(!is_group) { - LLAvatarName avatar_name; - LLAvatarNameCache::get(avatar_id, &avatar_name); - std::string avatar_user_name = avatar_name.getAccountName(); - if(!is_group) - { - std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_'); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) - { - if (std::string::npos != transcript_file_name.find(avatar_user_name)) - { - return true; - } - } - } - else - { - std::string file_name; - gCacheName->getGroupName(avatar_id, file_name); - file_name = makeLogFileName(file_name); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) - { - if (transcript_file_name == file_name) - { - return true; - } - } - } - + std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_'); + return isTranscriptFileFound(makeLogFileName(avatar_user_name)); + } + else + { + std::string file_name; + gCacheName->getGroupName(avatar_id, file_name); + file_name = makeLogFileName(file_name); + return isTranscriptFileFound(makeLogFileName(file_name)); } - return false; } bool LLLogChat::isNearbyTranscriptExist() { - std::vector<std::string> list_of_transcriptions; - LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); - - std::string file_name; - file_name = makeLogFileName("chat"); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) - { - if (transcript_file_name == file_name) - { - return true; - } - } - return false; + return isTranscriptFileFound(makeLogFileName("chat"));; } bool LLLogChat::isAdHocTranscriptExist(std::string file_name) { - std::vector<std::string> list_of_transcriptions; - LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); + return isTranscriptFileFound(makeLogFileName(file_name));; +} - file_name = makeLogFileName(file_name); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) +// static +bool LLLogChat::isTranscriptFileFound(std::string fullname) +{ + bool result = false; + LLFILE * filep = LLFile::fopen(fullname, "rb"); + if (NULL != filep) { - if (transcript_file_name == file_name) - { - return true; + if (makeLogFileName("chat") == fullname) + { + LLFile::close(filep); + return true; + } + char buffer[LOG_RECALL_SIZE]; + + fseek(filep, 0, SEEK_END); // seek to end of file + S32 bytes_to_read = ftell(filep); // get current file pointer + fseek(filep, 0, SEEK_SET); // seek back to beginning of file + + // limit the number characters to read from file + if (bytes_to_read >= LOG_RECALL_SIZE) + { + bytes_to_read = LOG_RECALL_SIZE - 1; } + + if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep)) + { + //matching a timestamp + boost::match_results<std::string::const_iterator> matches; + if (boost::regex_match(std::string(buffer), matches, TIMESTAMP)) + { + result = true; + } + } + LLFile::close(filep); } - return false; + return result; } //*TODO mark object's names in a special way so that they will be distinguishable form avatar name @@ -1012,8 +977,8 @@ void LLDeleteHistoryThread::run() LLActionThread::LLActionThread(const std::string& name) : LLThread(name), - mMutex(NULL), - mRunCondition(NULL), + mMutex(), + mRunCondition(), mFinished(false) { } diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index 6022e539a9..fcbd38a044 100644 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -121,6 +121,7 @@ public: static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false); static bool isNearbyTranscriptExist(); static bool isAdHocTranscriptExist(std::string file_name); + static bool isTranscriptFileFound(std::string fullname); static bool historyThreadsFinished(LLUUID session_id); static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id); diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index df040d8f13..8a69acb8dc 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -63,6 +63,9 @@ #include <sstream> const S32 LOGIN_MAX_RETRIES = 3; +const F32 LOGIN_SRV_TIMEOUT_MIN = 10; +const F32 LOGIN_SRV_TIMEOUT_MAX = 120; +const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9; // make DNS wait shorter then retry time class LLLoginInstance::Disposable { public: @@ -237,8 +240,10 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia // Specify desired timeout/retry options LLSD http_params; - http_params["timeout"] = gSavedSettings.getF32("LoginSRVTimeout"); + F32 srv_timeout = llclamp(gSavedSettings.getF32("LoginSRVTimeout"), LOGIN_SRV_TIMEOUT_MIN, LOGIN_SRV_TIMEOUT_MAX); + http_params["timeout"] = srv_timeout; http_params["retries"] = LOGIN_MAX_RETRIES; + http_params["DNSCacheTimeout"] = srv_timeout * LOGIN_DNS_TIMEOUT_FACTOR; //Default: indefinite mRequestData.clear(); mRequestData["method"] = "login_to_simulator"; diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp index b0ee8e7fcb..2001359e50 100644 --- a/indra/newview/llmachineid.cpp +++ b/indra/newview/llmachineid.cpp @@ -65,11 +65,11 @@ public: S32 LLMachineID::init() { - memset(static_unique_id,0,sizeof(static_unique_id)); + size_t len = sizeof(static_unique_id); + memset(static_unique_id, 0, len); S32 ret_code = 0; #if LL_WINDOWS # pragma comment(lib, "wbemuuid.lib") - size_t len = sizeof(static_unique_id); // algorithm to detect BIOS serial number found at: // http://msdn.microsoft.com/en-us/library/aa394077%28VS.85%29.aspx @@ -218,16 +218,19 @@ S32 LLMachineID::init() // Get the value of the Name property hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); LL_INFOS("AppInit") << " Serial Number : " << vtProp.bstrVal << LL_ENDL; + // use characters in the returned Serial Number to create a byte array of size len BSTR serialNumber ( vtProp.bstrVal); + unsigned int serial_size = SysStringLen(serialNumber); unsigned int j = 0; - while( vtProp.bstrVal[j] != 0) + + while (j < serial_size) { for (unsigned int i = 0; i < len; i++) { - if (vtProp.bstrVal[j] == 0) + if (j >= serial_size) break; - + static_unique_id[i] = (unsigned int)(static_unique_id[i] + serialNumber[j]); j++; } @@ -254,16 +257,8 @@ S32 LLMachineID::init() ret_code = LLUUID::getNodeID(staticPtr); #endif has_static_unique_id = true; - return ret_code; -} - -S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len) -{ - if (has_static_unique_id) - { - memcpy ( unique_id, &static_unique_id, len); - LL_INFOS_ONCE("AppInit") << "UniqueID: 0x"; + LL_INFOS("AppInit") << "UniqueID: 0x"; // Code between here and LL_ENDL is not executed unless the LL_DEBUGS // actually produces output for (size_t i = 0; i < len; ++i) @@ -271,11 +266,21 @@ S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len) // Copy each char to unsigned int to hexify. Sending an unsigned // char to a std::ostream tries to represent it as a char, not // what we want here. - unsigned byte = unique_id[i]; + unsigned byte = static_unique_id[i]; LL_CONT << std::hex << std::setw(2) << std::setfill('0') << byte; } // Reset default output formatting to avoid nasty surprises! LL_CONT << std::dec << std::setw(0) << std::setfill(' ') << LL_ENDL; + + return ret_code; +} + + +S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len) +{ + if (has_static_unique_id) + { + memcpy ( unique_id, &static_unique_id, len); return 1; } return 0; diff --git a/indra/newview/llmainlooprepeater.cpp b/indra/newview/llmainlooprepeater.cpp index db8d2e4ede..6736e9a950 100644 --- a/indra/newview/llmainlooprepeater.cpp +++ b/indra/newview/llmainlooprepeater.cpp @@ -46,7 +46,7 @@ void LLMainLoopRepeater::start(void) { if(mQueue != 0) return; - mQueue = new LLThreadSafeQueue<LLSD>(gAPRPoolp, 1024); + mQueue = new LLThreadSafeQueue<LLSD>(1024); mMainLoopConnection = LLEventPumps::instance(). obtain("mainloop").listen(LLEventPump::inventName(), boost::bind(&LLMainLoopRepeater::onMainLoop, this, _1)); mRepeaterConnection = LLEventPumps::instance(). diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index 8567180dd6..6589aa477f 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -431,7 +431,6 @@ void LLManip::renderXYZ(const LLVector3 &vec) { const S32 PAD = 10; std::string feedback_string; - LLVector3 camera_pos = LLViewerCamera::getInstance()->getOrigin() + LLViewerCamera::getInstance()->getAtAxis(); S32 window_center_x = gViewerWindow->getWorldViewRectScaled().getWidth() / 2; S32 window_center_y = gViewerWindow->getWorldViewRectScaled().getHeight() / 2; S32 vertical_offset = window_center_y - VERTICAL_OFFSET; @@ -442,46 +441,55 @@ void LLManip::renderXYZ(const LLVector3 &vec) LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square"); gViewerWindow->setup2DRender(); const LLVector2& display_scale = gViewerWindow->getDisplayScale(); - gGL.scalef(display_scale.mV[VX], display_scale.mV[VY], 1.f); gGL.color4f(0.f, 0.f, 0.f, 0.7f); imagep->draw( - window_center_x - 115, - window_center_y + vertical_offset - PAD, - 235, - PAD * 2 + 10, + (window_center_x - 115) * display_scale.mV[VX], + (window_center_y + vertical_offset - PAD) * display_scale.mV[VY], + 235 * display_scale.mV[VX], + (PAD * 2 + 10) * display_scale.mV[VY], LLColor4(0.f, 0.f, 0.f, 0.7f) ); - } - gGL.popMatrix(); - - gViewerWindow->setup3DRender(); - { - LLFontGL* font = LLFontGL::getFontSansSerif(); - LLLocale locale(LLLocale::USER_LOCALE); - LLGLDepthTest gls_depth(GL_FALSE); - // render drop shadowed text - feedback_string = llformat("X: %.3f", vec.mV[VX]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -102.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE); - - feedback_string = llformat("Y: %.3f", vec.mV[VY]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -27.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE); - - feedback_string = llformat("Z: %.3f", vec.mV[VZ]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 48.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE); - - // render text on top - feedback_string = llformat("X: %.3f", vec.mV[VX]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -102.f, (F32)vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f), FALSE); - - gGL.diffuseColor3f(0.5f, 1.f, 0.5f); - feedback_string = llformat("Y: %.3f", vec.mV[VY]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -27.f, (F32)vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f), FALSE); - - gGL.diffuseColor3f(0.5f, 0.5f, 1.f); - feedback_string = llformat("Z: %.3f", vec.mV[VZ]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 48.f, (F32)vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f), FALSE); - } + LLFontGL* font = LLFontGL::getFontSansSerif(); + LLLocale locale(LLLocale::USER_LOCALE); + LLGLDepthTest gls_depth(GL_FALSE); + + // render drop shadowed text (manually because of bigger 'distance') + F32 right_x; + feedback_string = llformat("X: %.3f", vec.mV[VX]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black, + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + feedback_string = llformat("Y: %.3f", vec.mV[VY]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black, + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + feedback_string = llformat("Z: %.3f", vec.mV[VZ]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black, + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + // render text on top + feedback_string = llformat("X: %.3f", vec.mV[VX]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f, window_center_y + vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f), + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + feedback_string = llformat("Y: %.3f", vec.mV[VY]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f, window_center_y + vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f), + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + feedback_string = llformat("Z: %.3f", vec.mV[VZ]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f, window_center_y + vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f), + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + } + gGL.popMatrix(); + + gViewerWindow->setup3DRender(); } void LLManip::renderTickText(const LLVector3& pos, const std::string& text, const LLColor4 &color) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index e38bd8846d..38fd2d777e 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -26,10 +26,11 @@ #include "llviewerprecompiledheaders.h" +#include "llapr.h" +#include "apr_portable.h" #include "apr_pools.h" #include "apr_dso.h" #include "llhttpconstants.h" -#include "llapr.h" #include "llmeshrepository.h" #include "llagent.h" @@ -830,9 +831,9 @@ LLMeshRepoThread::LLMeshRepoThread() { LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp()); - mMutex = new LLMutex(NULL); - mHeaderMutex = new LLMutex(NULL); - mSignal = new LLCondition(NULL); + mMutex = new LLMutex(); + mHeaderMutex = new LLMutex(); + mSignal = new LLCondition(); mHttpRequest = new LLCore::HttpRequest; mHttpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); mHttpOptions->setTransferTimeout(SMALL_MESH_XFER_TIMEOUT); @@ -1822,7 +1823,22 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat return false; } - header_size += stream.tellg(); + if (!header.isMap()) + { + LL_WARNS(LOG_MESH) << "Mesh header is invalid for ID: " << mesh_id << LL_ENDL; + return false; + } + + if (header.has("version") && header["version"].asInteger() > MAX_MESH_VERSION) + { + LL_INFOS(LOG_MESH) << "Wrong version in header for " << mesh_id << LL_ENDL; + header["404"] = 1; + } + // make sure there is at least one lod, function returns -1 and marks as 404 otherwise + else if (LLMeshRepository::getActualMeshLOD(header, 0) >= 0) + { + header_size += stream.tellg(); + } } else { @@ -2039,7 +2055,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, mUploadSkin = upload_skin; mUploadJoints = upload_joints; mLockScaleIfJointPosition = lock_scale_if_joint_position; - mMutex = new LLMutex(NULL); + mMutex = new LLMutex(); mPendingUploads = 0; mFinished = false; mOrigin = gAgent.getPositionAgent(); @@ -2174,7 +2190,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) std::map<LLModel*,S32> mesh_index; std::string model_name; - std::string model_metric; S32 instance_num = 0; @@ -2204,11 +2219,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) model_name = data.mBaseModel->getName(); } - if (model_metric.empty()) - { - model_metric = data.mBaseModel->getMetric(); - } - std::stringstream ostr; LLModel::Decomposition& decomp = @@ -2363,11 +2373,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) model_name = data.mBaseModel->getName(); } - if (model_metric.empty()) - { - model_metric = data.mBaseModel->getMetric(); - } - std::stringstream ostr; LLModel::Decomposition& decomp = @@ -2498,8 +2503,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) if (model_name.empty()) model_name = "mesh model"; result["name"] = model_name; - if (model_metric.empty()) model_metric = "MUT_Unspecified"; - res["metric"] = model_metric; + res["metric"] = "MUT_Unspecified"; result["asset_resources"] = res; dump_llsd_to_file(result,make_dump_name("whole_model_",dump_num)); @@ -2919,9 +2923,14 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod) { lod = llclamp(lod, 0, 3); + if (header.has("404")) + { + return -1; + } + S32 version = header["version"]; - if (header.has("404") || version > MAX_MESH_VERSION) + if (version > MAX_MESH_VERSION) { return -1; } @@ -3168,8 +3177,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b if (header_bytes > 0 && !header.has("404") - && header.has("version") - && header["version"].asInteger() <= MAX_MESH_VERSION) + && (!header.has("version") || header["version"].asInteger() <= MAX_MESH_VERSION)) { std::stringstream str; @@ -3458,7 +3466,7 @@ LLMeshRepository::LLMeshRepository() void LLMeshRepository::init() { - mMeshMutex = new LLMutex(NULL); + mMeshMutex = new LLMutex(); LLConvexDecomposition::getInstance()->initSystem(); @@ -4302,10 +4310,13 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLSD& header, F32 radius, S32* byte F32 dlow = llmin(radius/0.06f, max_distance); F32 dmid = llmin(radius/0.24f, max_distance); - F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32("MeshMetaDataDiscount"); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead - F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32("MeshMinimumByteSize"); //make sure nothing is "free" + static LLCachedControl<U32> metadata_discount_ch(gSavedSettings, "MeshMetaDataDiscount", 384); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead + static LLCachedControl<U32> minimum_size_ch(gSavedSettings, "MeshMinimumByteSize", 16); //make sure nothing is "free" + static LLCachedControl<U32> bytes_per_triangle_ch(gSavedSettings, "MeshBytesPerTriangle", 16); - F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle"); + F32 metadata_discount = (F32)metadata_discount_ch; + F32 minimum_size = (F32)minimum_size_ch; + F32 bytes_per_triangle = (F32)bytes_per_triangle_ch; S32 bytes_lowest = header["lowest_lod"]["size"].asInteger(); S32 bytes_low = header["low_lod"]["size"].asInteger(); @@ -4332,10 +4343,10 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLSD& header, F32 radius, S32* byte bytes_lowest = bytes_low; } - F32 triangles_lowest = llmax((F32) bytes_lowest-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; - F32 triangles_low = llmax((F32) bytes_low-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; - F32 triangles_mid = llmax((F32) bytes_mid-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; - F32 triangles_high = llmax((F32) bytes_high-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; + F32 triangles_lowest = llmax((F32) bytes_lowest-metadata_discount, minimum_size)/bytes_per_triangle; + F32 triangles_low = llmax((F32) bytes_low-metadata_discount, minimum_size)/bytes_per_triangle; + F32 triangles_mid = llmax((F32) bytes_mid-metadata_discount, minimum_size)/bytes_per_triangle; + F32 triangles_high = llmax((F32) bytes_high-metadata_discount, minimum_size)/bytes_per_triangle; if (bytes) { @@ -4429,13 +4440,13 @@ bool LLMeshCostData::init(const LLSD& header) mSizeByLOD[2] = bytes_med; mSizeByLOD[3] = bytes_high; - F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32("MeshMetaDataDiscount"); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead - F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32("MeshMinimumByteSize"); //make sure nothing is "free" - F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle"); + static LLCachedControl<U32> metadata_discount(gSavedSettings, "MeshMetaDataDiscount", 384); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead + static LLCachedControl<U32> minimum_size(gSavedSettings, "MeshMinimumByteSize", 16); //make sure nothing is "free" + static LLCachedControl<U32> bytes_per_triangle(gSavedSettings, "MeshBytesPerTriangle", 16); for (S32 i=0; i<4; i++) { - mEstTrisByLOD[i] = llmax((F32) mSizeByLOD[i]-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; + mEstTrisByLOD[i] = llmax((F32)mSizeByLOD[i] - (F32)metadata_discount, (F32)minimum_size) / (F32)bytes_per_triangle; } return true; @@ -4597,8 +4608,8 @@ LLPhysicsDecomp::LLPhysicsDecomp() mQuitting = false; mDone = false; - mSignal = new LLCondition(NULL); - mMutex = new LLMutex(NULL); + mSignal = new LLCondition(); + mMutex = new LLMutex(); } LLPhysicsDecomp::~LLPhysicsDecomp() diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 301487b994..19f238d99a 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -702,11 +702,9 @@ void LLPanelStandStopFlying::updatePosition() { if (mAttached) return; - S32 y_pos = 0; S32 bottom_tb_center = 0; if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_BOTTOM)) { - y_pos = toolbar_bottom->getRect().getHeight(); bottom_tb_center = toolbar_bottom->getRect().getCenterX(); } @@ -716,20 +714,6 @@ void LLPanelStandStopFlying::updatePosition() left_tb_width = toolbar_left->getRect().getWidth(); } - if (!mStateManagementButtons.get()) // Obsolete?!! - { - LLPanel* panel_ssf_container = gToolBarView->getChild<LLPanel>("state_management_buttons_container"); - if (panel_ssf_container) - { - mStateManagementButtons = panel_ssf_container->getHandle(); - } - } - - if(LLPanel* panel_ssf_container = mStateManagementButtons.get()) - { - panel_ssf_container->setOrigin(0, y_pos); - } - if (gToolBarView != NULL && gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT)->hasButtons()) { S32 x_pos = bottom_tb_center - getRect().getWidth() / 2 - left_tb_width; diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h index 4a31f2a814..e8b9a6fdb2 100644 --- a/indra/newview/llmoveview.h +++ b/indra/newview/llmoveview.h @@ -172,8 +172,6 @@ private: */ LLHandle<LLPanel> mOriginalParent; - LLHandle<LLPanel> mStateManagementButtons; - /** * True if the panel is currently attached to the movement controls floater. * diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp index a5bc75e6bd..b405d3dca2 100644 --- a/indra/newview/llnotificationlistitem.cpp +++ b/indra/newview/llnotificationlistitem.cpp @@ -135,7 +135,8 @@ std::string LLNotificationListItem::buildNotificationDate(const LLDate& time_sta +LLTrans::getString("TimeDay")+"]/[" +LLTrans::getString("TimeYear")+"] [" +LLTrans::getString("TimeHour")+"]:[" - +LLTrans::getString("TimeMin")+"]"; + +LLTrans::getString("TimeMin")+"] [" + +LLTrans::getString("TimeTimezone")+"]"; break; } LLSD substitution; @@ -376,13 +377,13 @@ BOOL LLGroupNoticeNotificationListItem::postBuild() mTitleBoxExp->setValue(mParams.subject); mNoticeTextExp->setValue(mParams.message); - mTimeBox->setValue(buildNotificationDate(mParams.time_stamp, UTC)); - mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp, UTC)); + mTimeBox->setValue(buildNotificationDate(mParams.time_stamp)); + mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp)); //Workaround: in case server timestamp is 0 - we use the time when notification was actually received if (mParams.time_stamp.isNull()) { - mTimeBox->setValue(buildNotificationDate(mParams.received_time, UTC)); - mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time, UTC)); + mTimeBox->setValue(buildNotificationDate(mParams.received_time)); + mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time)); } setSender(mParams.sender); diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 892fa385d7..f2a284a561 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -621,8 +621,14 @@ void LLOutfitsList::applyFilterToTab( bool LLOutfitsList::canWearSelected() { + if (!isAgentAvatarValid()) + { + return false; + } + uuid_vec_t selected_items; getSelectedItemsUUIDs(selected_items); + S32 nonreplacable_objects = 0; for (uuid_vec_t::const_iterator it = selected_items.begin(); it != selected_items.end(); ++it) { @@ -633,10 +639,21 @@ bool LLOutfitsList::canWearSelected() { return false; } + + const LLViewerInventoryItem* item = gInventory.getItem(id); + if (!item) + { + return false; + } + + if (item->getType() == LLAssetType::AT_OBJECT) + { + nonreplacable_objects++; + } } - // All selected items can be worn. - return true; + // All selected items can be worn. But do we have enough space for them? + return nonreplacable_objects == 0 || gAgentAvatarp->canAttachMoreObjects(nonreplacable_objects); } void LLOutfitsList::wearSelectedItems() diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp index 6c26073d5b..7f6c065bb9 100644 --- a/indra/newview/lloutputmonitorctrl.cpp +++ b/indra/newview/lloutputmonitorctrl.cpp @@ -72,9 +72,11 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p) mImageLevel3(p.image_level_3), mAutoUpdate(p.auto_update), mSpeakerId(p.speaker_id), + mIsModeratorMuted(false), mIsAgentControl(false), mIndicatorToggled(false), - mShowParticipantsSpeaking(false) + mShowParticipantsSpeaking(false), + mChannelState(INACTIVE_CHANNEL) { //static LLUIColor output_monitor_muted_color = LLUIColorTable::instance().getColor("OutputMonitorMutedColor", LLColor4::orange); //static LLUIColor output_monitor_overdriven_color = LLUIColorTable::instance().getColor("OutputMonitorOverdrivenColor", LLColor4::red); @@ -124,7 +126,7 @@ void LLOutputMonitorCtrl::draw() const F32 LEVEL_1 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL * 2.f / 3.f; const F32 LEVEL_2 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL; - if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull()) + if (getVisible() && mAutoUpdate && !getIsMuted() && mSpeakerId.notNull()) { setPower(LLVoiceClient::getInstance()->getCurrentPower(mSpeakerId)); if(mIsAgentControl) @@ -156,7 +158,7 @@ void LLOutputMonitorCtrl::draw() } LLPointer<LLUIImage> icon; - if (mIsMuted) + if (getIsMuted()) { icon = mImageMute; } @@ -255,6 +257,21 @@ BOOL LLOutputMonitorCtrl::handleMouseUp(S32 x, S32 y, MASK mask) return TRUE; } +void LLOutputMonitorCtrl::setIsActiveChannel(bool val) +{ + setChannelState(val ? ACTIVE_CHANNEL : INACTIVE_CHANNEL); +} + +void LLOutputMonitorCtrl::setChannelState(EChannelState state) +{ + mChannelState = state; + if (state == INACTIVE_CHANNEL) + { + // switchIndicator will set it to TRUE when channel becomes active + setVisible(FALSE); + } +} + void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id/* = LLUUID::null*/, bool show_other_participants_speaking /* = false */) { if (speaker_id.isNull() && mSpeakerId.notNull()) @@ -304,8 +321,7 @@ void LLOutputMonitorCtrl::onChange() // virtual void LLOutputMonitorCtrl::switchIndicator(bool switch_on) { - - if(getVisible() != (BOOL)switch_on) + if ((mChannelState != INACTIVE_CHANNEL) && (getVisible() != (BOOL)switch_on)) { setVisible(switch_on); diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index 0682af1278..98966d39ee 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -72,13 +72,26 @@ public: void setPower(F32 val); F32 getPower(F32 val) const { return mPower; } - + + bool getIsMuted() const { return (mIsMuted || mIsModeratorMuted); } + void setIsModeratorMuted(bool val) { mIsModeratorMuted = val; } + // For the current user, need to know the PTT state to show // correct button image. void setIsAgentControl(bool val) { mIsAgentControl = val; } - void setIsTalking(bool val) { mIsTalking = val; } + enum EChannelState + { + ACTIVE_CHANNEL, + INACTIVE_CHANNEL, + UNDEFINED_CHANNEL + }; + + // switchIndicator controls visibility, 'active channel' governs if we are allowed to show indicator + void setIsActiveChannel(bool val); + void setChannelState(EChannelState state); + void setShowParticipantsSpeaking(bool show) { mShowParticipantsSpeaking = show; } /** @@ -131,6 +144,7 @@ private: F32 mPower; bool mIsAgentControl; + bool mIsModeratorMuted; bool mIsMuted; bool mIsTalking; bool mShowParticipantsSpeaking; @@ -148,6 +162,8 @@ private: LLUUID mSpeakerId; bool mIndicatorToggled; + + EChannelState mChannelState; }; #endif diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index b9b97f4cce..6d0c30fbf3 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -628,12 +628,9 @@ BOOL LLPanelClassifiedEdit::postBuild() { LLPanelClassifiedInfo::postBuild(); - LLTextureCtrl* snapshot = getChild<LLTextureCtrl>("classified_snapshot"); - snapshot->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this)); - LLUICtrl* edit_icon = getChild<LLUICtrl>("edit_icon"); - snapshot->setMouseEnterCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon)); - snapshot->setMouseLeaveCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon)); + mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon)); + mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon)); edit_icon->setVisible(false); LLLineEditor* line_edit = getChild<LLLineEditor>("classified_name"); @@ -1130,6 +1127,7 @@ void LLPanelClassifiedEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl) void LLPanelClassifiedEdit::onTextureSelected() { setSnapshotId(mSnapshotCtrl->getValue().asUUID()); + onChange(); } ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 5e6a44c09d..392bacb8d9 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -1437,6 +1437,11 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image.j2c") ); mColorSwatch->setValid(FALSE); } + LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); + if (radio_mat_type) + { + radio_mat_type->setSelectedIndex(0); + } getChildView("color trans")->setEnabled(FALSE); getChildView("rptctrl")->setEnabled(FALSE); getChildView("tex gen")->setEnabled(FALSE); diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index f85a2ffbc1..b53cd222e7 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -461,11 +461,12 @@ bool LLPanelGroupGeneral::createGroupCallback(const LLSD& notification, const LL // Yay! We are making a new group! U32 enrollment_fee = (mCtrlEnrollmentFee->get() ? (U32) mSpinEnrollmentFee->get() : 0); - + LLUUID insignia_id = mInsignia->getImageItemID().isNull() ? LLUUID::null : mInsignia->getImageAssetID(); + LLGroupMgr::getInstance()->sendCreateGroupRequest(mGroupNameEditor->getText(), mEditCharter->getText(), mCtrlShowInGroupList->get(), - mInsignia->getImageAssetID(), + insignia_id, enrollment_fee, mCtrlOpenEnrollment->get(), false, diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 82ea8377de..d6b66ee622 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -606,11 +606,30 @@ void LLPanelGroupInvite::updateLists() { if (!mPendingUpdate) { + // Note: this will partially fail if some requests are already in progress LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID); LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID); LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mImplementation->mGroupID); LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID); } + else if (gdatap) + { + // restart requests that were interrupted/dropped/failed to start + if (!gdatap->isRoleDataPending() && !gdatap->isRoleDataComplete()) + { + LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID); + } + if (!gdatap->isRoleMemberDataPending() && !gdatap->isRoleMemberDataComplete()) + { + LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mImplementation->mGroupID); + } + // sendCapGroupMembersRequest has a per frame send limitation that could have + // interrupted previous request + if (!gdatap->isMemberDataPending() && !gdatap->isMemberDataComplete()) + { + LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID); + } + } mPendingUpdate = TRUE; } else diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h index 46a6d0ef50..8908078c63 100644 --- a/indra/newview/llpreviewnotecard.h +++ b/indra/newview/llpreviewnotecard.h @@ -47,18 +47,18 @@ public: virtual ~LLPreviewNotecard(); bool saveItem(); - void setObjectID(const LLUUID& object_id); + void setObjectID(const LLUUID& object_id) override; // llview - virtual void draw(); - virtual BOOL handleKeyHere(KEY key, MASK mask); - virtual void setEnabled( BOOL enabled ); + void draw() override; + BOOL handleKeyHere(KEY key, MASK mask) override; + void setEnabled( BOOL enabled ) override; // llfloater - virtual BOOL canClose(); + BOOL canClose() override; // llpanel - virtual BOOL postBuild(); + BOOL postBuild() override; // reach into the text editor, and grab the drag item const LLInventoryItem* getDragItem(); @@ -74,8 +74,8 @@ public: protected: - void updateTitleButtons(); - virtual void loadAsset(); + void updateTitleButtons() override; + void loadAsset() override; bool saveIfNeeded(LLInventoryItem* copyitem = NULL); void deleteNotecard(); diff --git a/indra/newview/llsearchableui.cpp b/indra/newview/llsearchableui.cpp new file mode 100644 index 0000000000..93143eb33f --- /dev/null +++ b/indra/newview/llsearchableui.cpp @@ -0,0 +1,160 @@ +/** +* @file llsearchableui.cpp +* +* $LicenseInfo:firstyear=2019&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2019, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" +#include "llsearchableui.h" + +#include "llview.h" +#include "lltabcontainer.h" +#include "llmenugl.h" + +ll::prefs::SearchableItem::~SearchableItem() +{} + +void ll::prefs::SearchableItem::setNotHighlighted() +{ + mCtrl->setHighlighted( false ); +} + +bool ll::prefs::SearchableItem::hightlightAndHide( LLWString const &aFilter ) +{ + if( mCtrl->getHighlighted() ) + return true; + + LLView const *pView = dynamic_cast< LLView const* >( mCtrl ); + if( pView && !pView->getVisible() ) + return false; + + if( aFilter.empty() ) + { + mCtrl->setHighlighted( false ); + return true; + } + + if( mLabel.find( aFilter ) != LLWString::npos ) + { + mCtrl->setHighlighted( true ); + return true; + } + + return false; +} + +ll::prefs::PanelData::~PanelData() +{} + +bool ll::prefs::PanelData::hightlightAndHide( LLWString const &aFilter ) +{ + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + (*itr)->setNotHighlighted( ); + + if (aFilter.empty()) + { + return true; + } + + bool bVisible(false); + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + bVisible |= (*itr)->hightlightAndHide( aFilter ); + + for( tPanelDataList::iterator itr = mChildPanel.begin(); itr != mChildPanel.end(); ++itr ) + bVisible |= (*itr)->hightlightAndHide( aFilter ); + + return bVisible; +} + +bool ll::prefs::TabContainerData::hightlightAndHide( LLWString const &aFilter ) +{ + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + (*itr)->setNotHighlighted( ); + + bool bVisible(false); + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + bVisible |= (*itr)->hightlightAndHide( aFilter ); + + for( tPanelDataList::iterator itr = mChildPanel.begin(); itr != mChildPanel.end(); ++itr ) + { + bool bPanelVisible = (*itr)->hightlightAndHide( aFilter ); + if( (*itr)->mPanel ) + mTabContainer->setTabVisibility( (*itr)->mPanel, bPanelVisible ); + bVisible |= bPanelVisible; + } + + return bVisible; +} + +ll::statusbar::SearchableItem::SearchableItem() + : mMenu(0) + , mCtrl(0) + , mWasHiddenBySearch( false ) +{ } + +void ll::statusbar::SearchableItem::setNotHighlighted( ) +{ + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + (*itr)->setNotHighlighted( ); + + if( mCtrl ) + { + mCtrl->setHighlighted( false ); + + if( mWasHiddenBySearch ) + mMenu->setVisible( TRUE ); + } +} + +bool ll::statusbar::SearchableItem::hightlightAndHide(LLWString const &aFilter, bool hide) +{ + if ((mMenu && !mMenu->getVisible() && !mWasHiddenBySearch) || dynamic_cast<LLMenuItemTearOffGL*>(mMenu)) + return false; + + setNotHighlighted( ); + + if( aFilter.empty() ) + { + if( mCtrl ) + mCtrl->setHighlighted( false ); + return true; + } + + bool bHighlighted(!hide); + if( mLabel.find( aFilter ) != LLWString::npos ) + { + if( mCtrl ) + mCtrl->setHighlighted( true ); + bHighlighted = true; + } + + bool bVisible(false); + for (tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr) + bVisible |= (*itr)->hightlightAndHide(aFilter, !bHighlighted); + + if (mCtrl && !bVisible && !bHighlighted) + { + mWasHiddenBySearch = true; + mMenu->setVisible(FALSE); + } + return bVisible || bHighlighted; +} diff --git a/indra/newview/llsearchableui.h b/indra/newview/llsearchableui.h new file mode 100644 index 0000000000..9741557e49 --- /dev/null +++ b/indra/newview/llsearchableui.h @@ -0,0 +1,121 @@ +/** +* @file llsearchableui.h +* +* $LicenseInfo:firstyear=2019&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2019, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#ifndef LL_SEARCHABLE_UI_H +#define LL_SEARCHABLE_UI_H + +class LLMenuItemGL; +class LLView; +class LLPanel; +class LLTabContainer; + +#include "llsearchablecontrol.h" + +namespace ll +{ + namespace prefs + { + struct SearchableItem; + struct PanelData; + struct TabContainerData; + + typedef boost::shared_ptr< SearchableItem > SearchableItemPtr; + typedef boost::shared_ptr< PanelData > PanelDataPtr; + typedef boost::shared_ptr< TabContainerData > TabContainerDataPtr; + + typedef std::vector< TabContainerData > tTabContainerDataList; + typedef std::vector< SearchableItemPtr > tSearchableItemList; + typedef std::vector< PanelDataPtr > tPanelDataList; + + struct SearchableItem + { + LLWString mLabel; + LLView const *mView; + ll::ui::SearchableControl const *mCtrl; + + std::vector< boost::shared_ptr< SearchableItem > > mChildren; + + virtual ~SearchableItem(); + + void setNotHighlighted(); + virtual bool hightlightAndHide( LLWString const &aFilter ); + }; + + struct PanelData + { + LLPanel const *mPanel; + std::string mLabel; + + std::vector< boost::shared_ptr< SearchableItem > > mChildren; + std::vector< boost::shared_ptr< PanelData > > mChildPanel; + + virtual ~PanelData(); + + virtual bool hightlightAndHide( LLWString const &aFilter ); + }; + + struct TabContainerData: public PanelData + { + LLTabContainer *mTabContainer; + virtual bool hightlightAndHide( LLWString const &aFilter ); + }; + + struct SearchData + { + TabContainerDataPtr mRootTab; + LLWString mLastFilter; + }; + } + namespace statusbar + { + struct SearchableItem; + + typedef boost::shared_ptr< SearchableItem > SearchableItemPtr; + + typedef std::vector< SearchableItemPtr > tSearchableItemList; + + struct SearchableItem + { + LLWString mLabel; + LLMenuItemGL *mMenu; + tSearchableItemList mChildren; + ll::ui::SearchableControl const *mCtrl; + bool mWasHiddenBySearch; + + SearchableItem(); + + void setNotHighlighted( ); + bool hightlightAndHide( LLWString const &aFilter, bool hide = true ); + }; + + struct SearchData + { + SearchableItemPtr mRootMenu; + LLWString mLastFilter; + }; + } +} + +#endif diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index b36df244f8..97c547e524 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -3861,6 +3861,14 @@ BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& r return TRUE; } +BOOL LLSelectMgr::isSelfAvatarSelected() +{ + if (mAllowSelectAvatar) + { + return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject() == gAgentAvatarp); + } + return FALSE; +} //-------------------------------------------------------------------- // Duplicate objects @@ -6686,8 +6694,28 @@ void LLSelectMgr::pauseAssociatedAvatars() mSelectedObjects->mSelectType = getSelectTypeForObject(object); + bool is_attached = false; if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && - isAgentAvatarValid() && object->getParent() != NULL) + isAgentAvatarValid()) + { + // Selection can be obsolete, confirm that this is an attachment + LLViewerObject* parent = (LLViewerObject*)object->getParent(); + while (parent != NULL) + { + if (parent->isAvatar()) + { + is_attached = true; + break; + } + else + { + parent = (LLViewerObject*)parent->getParent(); + } + } + } + + + if (is_attached) { if (object->isAnimatedObject()) { @@ -6705,14 +6733,12 @@ void LLSelectMgr::pauseAssociatedAvatars() mPauseRequests.push_back(gAgentAvatarp->requestPause()); } } - else + else if (object && object->isAnimatedObject() && object->getControlAvatar()) { - if (object && object->isAnimatedObject() && object->getControlAvatar()) - { - // Is a non-attached animated object. Pause the control avatar. - mPauseRequests.push_back(object->getControlAvatar()->requestPause()); - } + // Is a non-attached animated object. Pause the control avatar. + mPauseRequests.push_back(object->getControlAvatar()->requestPause()); } + } } diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index ce0fee8803..3e8bfdb00e 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -714,6 +714,8 @@ public: LLPermissions* findObjectPermissions(const LLViewerObject* object); + BOOL isSelfAvatarSelected(); + void selectDelete(); // Delete on simulator void selectForceDelete(); // just delete, no into trash void selectDuplicate(const LLVector3& offset, BOOL select_copy); // Duplicate on simulator diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 43c0fbd53a..f3c270a97b 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -81,6 +81,8 @@ #include "llparcel.h" #include "llstring.h" #include "message.h" +#include "llsearchableui.h" +#include "llsearcheditor.h" // system includes #include <iomanip> @@ -113,7 +115,9 @@ LLStatusBar::LLStatusBar(const LLRect& rect) mBalance(0), mHealth(100), mSquareMetersCredit(0), - mSquareMetersCommitted(0) + mSquareMetersCommitted(0), + mFilterEdit(NULL), // Edit for filtering + mSearchPanel(NULL) // Panel for filtering { setRect(rect); @@ -239,6 +243,16 @@ BOOL LLStatusBar::postBuild() mPanelNearByMedia->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT); mPanelNearByMedia->setVisible(FALSE); + // Hook up and init for filtering + mFilterEdit = getChild<LLSearchEditor>( "search_menu_edit" ); + mSearchPanel = getChild<LLPanel>( "menu_search_panel" ); + + mSearchPanel->setVisible(gSavedSettings.getBOOL("MenuSearch")); + mFilterEdit->setKeystrokeCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this)); + mFilterEdit->setCommitCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this)); + collectSearchableItems(); + gSavedSettings.getControl("MenuSearch")->getCommitSignal()->connect(boost::bind(&LLStatusBar::updateMenuSearchVisibility, this, _2)); + return TRUE; } @@ -318,6 +332,7 @@ void LLStatusBar::setVisibleForMouselook(bool visible) mMediaToggle->setVisible(visible); mSGBandwidth->setVisible(visible); mSGPacketLoss->setVisible(visible); + mSearchPanel->setVisible(visible && gSavedSettings.getBOOL("MenuSearch")); setBackgroundVisible(visible); mIconPresets->setVisible(visible); } @@ -358,6 +373,12 @@ void LLStatusBar::setBalance(S32 balance) balance_bg_view->setShape(balance_bg_rect); } + // If the search panel is shown, move this according to the new balance width. Parcel text will reshape itself in setParcelInfoText + if (mSearchPanel && mSearchPanel->getVisible()) + { + updateMenuSearchPosition(); + } + if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold"))) { if (mBalance > balance) @@ -570,6 +591,75 @@ void LLStatusBar::onVolumeChanged(const LLSD& newvalue) refresh(); } +void LLStatusBar::onUpdateFilterTerm() +{ + LLWString searchValue = utf8str_to_wstring( mFilterEdit->getValue() ); + LLWStringUtil::toLower( searchValue ); + + if( !mSearchData || mSearchData->mLastFilter == searchValue ) + return; + + mSearchData->mLastFilter = searchValue; + + mSearchData->mRootMenu->hightlightAndHide( searchValue ); + gMenuBarView->needsArrange(); +} + +void collectChildren( LLMenuGL *aMenu, ll::statusbar::SearchableItemPtr aParentMenu ) +{ + for( U32 i = 0; i < aMenu->getItemCount(); ++i ) + { + LLMenuItemGL *pMenu = aMenu->getItem( i ); + + ll::statusbar::SearchableItemPtr pItem( new ll::statusbar::SearchableItem ); + pItem->mCtrl = pMenu; + pItem->mMenu = pMenu; + pItem->mLabel = utf8str_to_wstring( pMenu->ll::ui::SearchableControl::getSearchText() ); + LLWStringUtil::toLower( pItem->mLabel ); + aParentMenu->mChildren.push_back( pItem ); + + LLMenuItemBranchGL *pBranch = dynamic_cast< LLMenuItemBranchGL* >( pMenu ); + if( pBranch ) + collectChildren( pBranch->getBranch(), pItem ); + } + +} + +void LLStatusBar::collectSearchableItems() +{ + mSearchData.reset( new ll::statusbar::SearchData ); + ll::statusbar::SearchableItemPtr pItem( new ll::statusbar::SearchableItem ); + mSearchData->mRootMenu = pItem; + collectChildren( gMenuBarView, pItem ); +} + +void LLStatusBar::updateMenuSearchVisibility(const LLSD& data) +{ + bool visible = data.asBoolean(); + mSearchPanel->setVisible(visible); + if (!visible) + { + mFilterEdit->setText(LLStringUtil::null); + onUpdateFilterTerm(); + } + else + { + updateMenuSearchPosition(); + } +} + +void LLStatusBar::updateMenuSearchPosition() +{ + const S32 HPAD = 12; + LLRect balanceRect = getChildView("balance_bg")->getRect(); + LLRect searchRect = mSearchPanel->getRect(); + S32 w = searchRect.getWidth(); + searchRect.mLeft = balanceRect.mLeft - w - HPAD; + searchRect.mRight = searchRect.mLeft + w; + mSearchPanel->setShape( searchRect ); +} + + // Implements secondlife:///app/balance/request to request a L$ balance // update via UDP message system. JC class LLBalanceHandler : public LLCommandHandler diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index a3326e752a..403d590aca 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -45,7 +45,15 @@ class LLPanelPresetsPulldown; class LLPanelVolumePulldown; class LLPanelNearByMedia; class LLIconCtrl; +class LLSearchEditor; +namespace ll +{ + namespace statusbar + { + struct SearchData; + } +} class LLStatusBar : public LLPanel { @@ -99,6 +107,15 @@ private: static void onClickMediaToggle(void* data); static void onClickBalance(void* data); + LLSearchEditor *mFilterEdit; + LLPanel *mSearchPanel; + void onUpdateFilterTerm(); + + std::unique_ptr< ll::statusbar::SearchData > mSearchData; + void collectSearchableItems(); + void updateMenuSearchVisibility( const LLSD& data ); + void updateMenuSearchPosition(); + private: LLTextBox *mTextTime; diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 633e025478..e5af47ab6c 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -825,10 +825,10 @@ void LLTextureCacheWorker::endWork(S32 param, bool aborted) LLTextureCache::LLTextureCache(bool threaded) : LLWorkerThread("TextureCache", threaded), - mWorkersMutex(NULL), - mHeaderMutex(NULL), - mListMutex(NULL), - mFastCacheMutex(NULL), + mWorkersMutex(), + mHeaderMutex(), + mListMutex(), + mFastCacheMutex(), mHeaderAPRFile(NULL), mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called. mTexturesSizeTotal(0), @@ -1038,11 +1038,11 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL texture_cache { llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized. - S64 header_size = (max_size / 100) * 36; //0.36 * max_size - S64 max_entries = header_size / (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE); + S64 entries_size = (max_size * 36) / 100; //0.36 * max_size + S64 max_entries = entries_size / (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE); sCacheMaxEntries = (S32)(llmin((S64)sCacheMaxEntries, max_entries)); - header_size = sCacheMaxEntries * TEXTURE_CACHE_ENTRY_SIZE; - max_size -= header_size; + entries_size = sCacheMaxEntries * (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE); + max_size -= entries_size; if (sCacheMaxTexturesSize > 0) sCacheMaxTexturesSize = llmin(sCacheMaxTexturesSize, max_size); else diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index 987b9375c0..81ea7aeee2 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -221,7 +221,7 @@ private: typedef std::map<LLUUID,S32> size_map_t; size_map_t mTexturesSizeMap; S64 mTexturesSizeTotal; - LLAtomic32<BOOL> mDoPurge; + LLAtomicBool mDoPurge; typedef std::map<S32, Entry> idx_entry_map_t; idx_entry_map_t mUpdatedEntryMap; diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index a5a2eec246..1396a8546d 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -131,7 +131,7 @@ LLFloaterTexturePicker::~LLFloaterTexturePicker() void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selection /*=true*/) { - if( mImageAssetID != image_id && mActive) + if( ((mImageAssetID != image_id) || mTentative) && mActive) { mNoCopyTextureSelected = FALSE; mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? @@ -1096,6 +1096,10 @@ void LLTextureCtrl::setVisible( BOOL visible ) void LLTextureCtrl::setEnabled( BOOL enabled ) { LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get(); + if( floaterp ) + { + floaterp->setActive(enabled); + } if( enabled ) { std::string tooltip; @@ -1110,11 +1114,6 @@ void LLTextureCtrl::setEnabled( BOOL enabled ) closeDependentFloater(); } - if( floaterp ) - { - floaterp->setActive(enabled); - } - mCaption->setEnabled( enabled ); LLView::setEnabled( enabled ); @@ -1215,9 +1214,10 @@ void LLTextureCtrl::showPicker(BOOL take_focus) void LLTextureCtrl::closeDependentFloater() { LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get(); - if( floaterp ) + if( floaterp && floaterp->isInVisibleChain()) { floaterp->setOwner(NULL); + floaterp->setVisible(FALSE); floaterp->closeFloater(); } } diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index f8849bf997..c9133338fb 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -936,7 +936,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, mCanUseHTTP(true), mRetryAttempt(0), mActiveCount(0), - mWorkMutex(NULL), + mWorkMutex(), mFirstPacket(0), mLastPacket(-1), mTotalPackets(0), @@ -2558,8 +2558,8 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image mDebugPause(FALSE), mPacketCount(0), mBadPacketCount(0), - mQueueMutex(getAPRPool()), - mNetworkQueueMutex(getAPRPool()), + mQueueMutex(), + mNetworkQueueMutex(), mTextureCache(cache), mImageDecodeThread(imagedecodethread), mTextureBandwidth(0), diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index a2155bde1f..a01c01847e 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -35,7 +35,6 @@ #include "lluuid.h" #include "llworkerthread.h" #include "lltextureinfo.h" -#include "llapr.h" #include "llimageworker.h" #include "httprequest.h" #include "httpoptions.h" diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index f7dc32d0d7..817d1dd7b4 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -84,14 +84,14 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi //message body const std::string& message = payload["message"].asString(); - std::string timeStr = "["+LLTrans::getString("UTCTimeWeek")+"],[" - +LLTrans::getString("UTCTimeDay")+"] [" - +LLTrans::getString("UTCTimeMth")+"] [" - +LLTrans::getString("UTCTimeYr")+"] [" - +LLTrans::getString("UTCTimeHr")+"]:[" - +LLTrans::getString("UTCTimeMin")+"]:[" - +LLTrans::getString("UTCTimeSec")+"] [" - +LLTrans::getString("UTCTimeTimezone")+"]"; + std::string timeStr = "[" + LLTrans::getString("TimeWeek") + "], [" + + LLTrans::getString("TimeMonth") + "]/[" + + LLTrans::getString("TimeDay") + "]/[" + + LLTrans::getString("TimeYear") + "] [" + + LLTrans::getString("TimeHour") + "]:[" + + LLTrans::getString("TimeMin") + "] [" + + LLTrans::getString("TimeTimezone") + "]"; + const LLDate timeStamp = notification->getDate(); LLDate notice_date = timeStamp.notNull() ? timeStamp : payload["received_time"].asDate(); LLSD substitution; diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index e3a856be5c..a2116817a2 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -46,8 +46,6 @@ const S32 BOTTOM_PAD = VPAD * 3; const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding S32 BUTTON_WIDTH = 90; -// *TODO: magic numbers - copied from llnotify.cpp(250) -const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; //static @@ -319,7 +317,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) mTextBox = getChild<LLTextEditor>("text_editor_box"); } - mTextBox->setMaxTextLength(MAX_LENGTH); + mTextBox->setMaxTextLength(LLToastPanel::MAX_TEXT_LENGTH); mTextBox->setVisible(TRUE); mTextBox->setPlainText(!show_images); mTextBox->setContentTrusted(is_content_trusted); @@ -411,7 +409,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) //.xml file intially makes info panel only follow left/right/top. This is so that when control buttons are added the info panel //can shift upward making room for the buttons inside mControlPanel. After the buttons are added, the info panel can then be set to follow 'all'. mInfoPanel->setFollowsAll(); - snapToMessageHeight(mTextBox, MAX_LENGTH); + snapToMessageHeight(mTextBox, LLToastPanel::MAX_TEXT_LENGTH); // reshape the panel to its previous size if (current_rect.notEmpty()) @@ -472,7 +470,7 @@ void LLIMToastNotifyPanel::snapToMessageHeight() //Add message height if it is visible if (mTextBox->getVisible()) { - S32 new_panel_height = computeSnappedToMessageHeight(mTextBox, MAX_LENGTH); + S32 new_panel_height = computeSnappedToMessageHeight(mTextBox, LLToastPanel::MAX_TEXT_LENGTH); //reshape the panel with new height if (new_panel_height != getRect().getHeight()) diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index e1b764a943..7c624d5b50 100644 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -26,6 +26,7 @@ #include "llviewerprecompiledheaders.h" +#include "lldbstrings.h" #include "llpanelgenerictip.h" #include "llpanelonlinestatus.h" #include "llnotifications.h" @@ -35,6 +36,8 @@ //static const S32 LLToastPanel::MIN_PANEL_HEIGHT = 40; // VPAD(4)*2 + ICON_HEIGHT(32) +// 'magic numbers', consider initializing (512+20) part from xml/notifications +const S32 LLToastPanel::MAX_TEXT_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; LLToastPanel::LLToastPanel(const LLNotificationPtr& notification) { diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h index 51630381f2..6a9b72a5ae 100644 --- a/indra/newview/lltoastpanel.h +++ b/indra/newview/lltoastpanel.h @@ -49,6 +49,7 @@ public: virtual const LLUUID& getID(); static const S32 MIN_PANEL_HEIGHT; + static const S32 MAX_TEXT_LENGTH; /** * Builder method for constructing notification specific panels. diff --git a/indra/newview/lltoastscripttextbox.cpp b/indra/newview/lltoastscripttextbox.cpp index 518c6c0ee4..eb86a44055 100644 --- a/indra/newview/lltoastscripttextbox.cpp +++ b/indra/newview/lltoastscripttextbox.cpp @@ -36,8 +36,6 @@ #include "llviewertexteditor.h" const S32 LLToastScriptTextbox::DEFAULT_MESSAGE_MAX_LINE_COUNT= 14; -// *TODO: magic numbers - copied from lltoastnotifypanel.cpp(50) which was copied from llnotify.cpp(250) -const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; LLToastScriptTextbox::LLToastScriptTextbox(const LLNotificationPtr& notification) : LLToastPanel(notification) @@ -45,7 +43,7 @@ LLToastScriptTextbox::LLToastScriptTextbox(const LLNotificationPtr& notification buildFromFile( "panel_notify_textbox.xml"); mInfoText = getChild<LLTextEditor>("text_editor_box"); - mInfoText->setMaxTextLength(MAX_LENGTH); + mInfoText->setMaxTextLength(LLToastPanel::MAX_TEXT_LENGTH); mInfoText->setValue(notification->getMessage()); getChild<LLButton>("ignore_btn")->setClickedCallback(boost::bind(&LLToastScriptTextbox::onClickIgnore, this)); diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp index 4aad650b68..b5d78f3654 100644 --- a/indra/newview/lltool.cpp +++ b/indra/newview/lltool.cpp @@ -191,7 +191,9 @@ LLTool* LLTool::getOverrideTool(MASK mask) { return NULL; } - if (gSavedSettings.getBOOL("EnableAltZoom")) + + static LLCachedControl<bool> alt_zoom(gSavedSettings, "EnableAltZoom", true); + if (alt_zoom) { if (mask & MASK_ALT) { diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 392c103d7c..f9c327b46e 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -267,7 +267,7 @@ BOOL LLToolCompTranslate::handleHover(S32 x, S32 y, MASK mask) BOOL LLToolCompTranslate::handleMouseDown(S32 x, S32 y, MASK mask) { mMouseDown = TRUE; - gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE); + gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE, LLFloaterReg::instanceVisible("build")); return TRUE; } diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 9e37ca0394..697db01d11 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -111,11 +111,24 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) mMouseOutsideSlop = FALSE; mMouseDownX = x; mMouseDownY = y; - LLTimer pick_timer; - BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick"); - //left mouse down always picks transparent (but see handleMouseUp) - mPick = gViewerWindow->pickImmediate(x, y, TRUE, pick_rigged); - LL_INFOS() << "pick_rigged is " << (S32) pick_rigged << " pick time elapsed " << pick_timer.getElapsedTimeF32() << LL_ENDL; + LLTimer pick_timer; + BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick"); + mPick = gViewerWindow->pickImmediate(x, y, FALSE, pick_rigged); + LLViewerObject *object = mPick.getObject(); + LLViewerObject *parent = object ? object->getRootEdit() : NULL; + if (!object + || object->isAttachment() + || object->getClickAction() == CLICK_ACTION_DISABLED + || (!useClickAction(mask, object, parent) && !object->flagHandleTouch() && !(parent && parent->flagHandleTouch()))) + { + // Unless we are hovering over actionable visible object + // left mouse down always picks transparent (but see handleMouseUp). + // Also see LLToolPie::handleHover() - priorities are a bit different there. + // Todo: we need a more consistent set of rules to work with + mPick = gViewerWindow->pickImmediate(x, y, TRUE /*transparent*/, pick_rigged); + } + LL_INFOS() << "pick_rigged is " << (S32) pick_rigged << " pick time elapsed " << pick_timer.getElapsedTimeF32() << LL_ENDL; + mPick.mKeyMask = mask; mMouseButtonDown = true; @@ -857,13 +870,11 @@ static bool needs_tooltip(LLSelectNode* nodep) BOOL LLToolPie::handleTooltipLand(std::string line, std::string tooltip_msg) { - LLViewerParcelMgr::getInstance()->setHoverParcel( mHoverPick.mPosGlobal ); - // - // Do not show hover for land unless prefs are set to allow it. - // - + // Do not show hover for land unless prefs are set to allow it. if (!gSavedSettings.getBOOL("ShowLandHoverTip")) return TRUE; - + + LLViewerParcelMgr::getInstance()->setHoverParcel( mHoverPick.mPosGlobal ); + // Didn't hit an object, but since we have a land point we // must be hovering over land. diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 88984d518a..a699491e1b 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -219,20 +219,20 @@ static bool handleAnisotropicChanged(const LLSD& newvalue) static bool handleVolumeLODChanged(const LLSD& newvalue) { - LLVOVolume::sLODFactor = (F32) newvalue.asReal(); + LLVOVolume::sLODFactor = llclamp((F32) newvalue.asReal(), 0.01f, MAX_LOD_FACTOR); LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f; return true; } static bool handleAvatarLODChanged(const LLSD& newvalue) { - LLVOAvatar::sLODFactor = (F32) newvalue.asReal(); + LLVOAvatar::sLODFactor = llclamp((F32) newvalue.asReal(), 0.f, MAX_AVATAR_LOD_FACTOR); return true; } static bool handleAvatarPhysicsLODChanged(const LLSD& newvalue) { - LLVOAvatar::sPhysicsLODFactor = (F32) newvalue.asReal(); + LLVOAvatar::sPhysicsLODFactor = llclamp((F32) newvalue.asReal(), 0.f, MAX_AVATAR_LOD_FACTOR); return true; } diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 0ebacddd9b..a7b2fafddf 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -90,6 +90,7 @@ #include "llfloatermediasettings.h" #include "llfloatermemleak.h" #include "llfloatermodelpreview.h" +#include "llfloatermyscripts.h" #include "llfloaternamedesc.h" #include "llfloaternotificationsconsole.h" #include "llfloaternotificationstabbed.h" @@ -335,6 +336,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>); LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>); LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>); + LLFloaterReg::add("my_scripts", "floater_my_scripts.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMyScripts>); LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater); LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>); LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index b89e1497a1..e930eb20d3 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -64,7 +64,12 @@ LLViewerKeyboard gViewerKeyboard; void agent_jump( EKeystate s ) { - if( KEYSTATE_UP == s ) return; + static BOOL first_fly_attempt(TRUE); + if (KEYSTATE_UP == s) + { + first_fly_attempt = TRUE; + return; + } F32 time = gKeyboard->getCurKeyElapsedTime(); S32 frame_count = ll_round(gKeyboard->getCurKeyElapsedFrameCount()); @@ -77,7 +82,8 @@ void agent_jump( EKeystate s ) } else { - gAgent.setFlying(TRUE); + gAgent.setFlying(TRUE, first_fly_attempt); + first_fly_attempt = FALSE; gAgent.moveUp(1); } } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 22a21c9ca3..d8745b1eca 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -682,8 +682,8 @@ void LLViewerMedia::updateMedia(void *dummy_arg) std::vector<LLViewerMediaImpl*> proximity_order; - bool inworld_media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia"); - bool inworld_audio_enabled = gSavedSettings.getBOOL("AudioStreamingMusic"); + static LLCachedControl<bool> inworld_media_enabled(gSavedSettings, "AudioStreamingMedia", true); + static LLCachedControl<bool> inworld_audio_enabled(gSavedSettings, "AudioStreamingMusic", true); U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal"); U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal"); U32 max_low = gSavedSettings.getU32("PluginInstancesLow"); @@ -941,7 +941,8 @@ void LLViewerMedia::setAllMediaEnabled(bool val) LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel()); } - if (gSavedSettings.getBOOL("AudioStreamingMusic") && + static LLCachedControl<bool> audio_streaming_music(gSavedSettings, "AudioStreamingMusic", true); + if (audio_streaming_music && !LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio()) @@ -1012,7 +1013,8 @@ void LLViewerMedia::setAllMediaPaused(bool val) LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel()); } - if (gSavedSettings.getBOOL("AudioStreamingMusic") && + static LLCachedControl<bool> audio_streaming_music(gSavedSettings, "AudioStreamingMusic", true); + if (audio_streaming_music && !LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio()) @@ -3318,8 +3320,39 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla } else { - // Don't track redirects. - setNavState(MEDIANAVSTATE_NONE); + bool internal_nav = false; + if (url != mCurrentMediaURL) + { + // Check if it is internal navigation + // Note: Not sure if we should detect internal navigations as 'address change', + // but they are not redirects and do not cause NAVIGATE_BEGIN (also see SL-1005) + size_t pos = url.find("#"); + if (pos != std::string::npos) + { + // assume that new link always have '#', so this is either + // transfer from 'link#1' to 'link#2' or from link to 'link#2' + // filter out cases like 'redirect?link' + std::string base_url = url.substr(0, pos); + pos = mCurrentMediaURL.find(base_url); + if (pos == 0) + { + // base link hasn't changed + internal_nav = true; + } + } + } + + if (internal_nav) + { + // Internal navigation by '#' + mCurrentMediaURL = url; + setNavState(MEDIANAVSTATE_FIRST_LOCATION_CHANGED); + } + else + { + // Don't track redirects. + setNavState(MEDIANAVSTATE_NONE); + } } } break; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 6c52f118ad..aa6d75f5fb 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4066,10 +4066,8 @@ void near_sit_down_point(BOOL success, void *) if (success) { gAgent.setFlying(FALSE); + gAgent.clearControlFlags(AGENT_CONTROL_STAND_UP); // might have been set by autopilot gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); - - // Might be first sit - //LLFirstUse::useSit(); } } @@ -7068,25 +7066,19 @@ BOOL object_selected_and_point_valid() BOOL object_is_wearable() { - if (!object_selected_and_point_valid()) + if (!isAgentAvatarValid()) { return FALSE; } - if (sitting_on_selection()) + if (!object_selected_and_point_valid()) { return FALSE; } - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - for (LLObjectSelection::valid_root_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_root_begin(); - iter != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); iter++) + if (sitting_on_selection()) { - LLSelectNode* node = *iter; - if (node->mPermissions->getOwner() == gAgent.getID()) - { - return TRUE; - } + return FALSE; } - return FALSE; + return gAgentAvatarp->canAttachMoreObjects(); } @@ -9207,7 +9199,7 @@ void initialize_menus() enable.add("Object.EnableOpen", boost::bind(&enable_object_open)); enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1)); enable.add("Object.EnableDelete", boost::bind(&enable_object_delete)); - enable.add("Object.EnableWear", boost::bind(&object_selected_and_point_valid)); + enable.add("Object.EnableWear", boost::bind(&object_is_wearable)); enable.add("Object.EnableStandUp", boost::bind(&enable_object_stand_up)); enable.add("Object.EnableSit", boost::bind(&enable_object_sit, _1)); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index d2a5578568..a9a91b158b 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -175,7 +175,7 @@ void LLFilePickerThread::run() //static void LLFilePickerThread::initClass() { - sMutex = new LLMutex(NULL); + sMutex = new LLMutex(); } //static diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 981d226824..e50c8ee9f0 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5531,17 +5531,6 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp void script_question_mute(const LLUUID& item_id, const std::string& object_name); -bool unknown_script_question_cb(const LLSD& notification, const LLSD& response) -{ - // Only care if they muted the object here. - if ( response["Mute"] ) // mute - { - LLUUID task_id = notification["payload"]["task_id"].asUUID(); - script_question_mute(task_id,notification["payload"]["object_name"].asString()); - } - return false; -} - void experiencePermissionBlock(LLUUID experience, LLSD result) { LLSD permission; @@ -5647,8 +5636,7 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name) bool matches(const LLNotificationPtr notification) const { if (notification->getName() == "ScriptQuestionCaution" - || notification->getName() == "ScriptQuestion" - || notification->getName() == "UnknownScriptQuestion") + || notification->getName() == "ScriptQuestion") { return (notification->getPayload()["task_id"].asUUID() == blocked_id); } @@ -5665,7 +5653,6 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name) static LLNotificationFunctorRegistration script_question_cb_reg_1("ScriptQuestion", script_question_cb); static LLNotificationFunctorRegistration script_question_cb_reg_2("ScriptQuestionCaution", script_question_cb); static LLNotificationFunctorRegistration script_question_cb_reg_3("ScriptQuestionExperience", script_question_cb); -static LLNotificationFunctorRegistration unknown_script_question_cb_reg("UnknownScriptQuestion", unknown_script_question_cb); void process_script_experience_details(const LLSD& experience_details, LLSD args, LLSD payload) { @@ -5778,14 +5765,12 @@ void process_script_question(LLMessageSystem *msg, void **user_data) args["QUESTIONS"] = script_question; if (known_questions != questions) - { // This is in addition to the normal dialog. - LLSD payload; - payload["task_id"] = taskid; - payload["item_id"] = itemid; - payload["object_name"] = object_name; - - args["DOWNLOADURL"] = LLTrans::getString("ViewerDownloadURL"); - LLNotificationsUtil::add("UnknownScriptQuestion",args,payload); + { + // This is in addition to the normal dialog. + // Viewer got a request for not supported/implemented permission + LL_WARNS("Messaging") << "Object \"" << object_name << "\" requested " << script_question + << " permission. Permission is unknown and can't be granted. Item id: " << itemid + << " taskid:" << taskid << LL_ENDL; } if (known_questions) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 1e46a1cf9e..ec1095813b 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -127,6 +127,7 @@ BOOL LLViewerObject::sUseSharedDrawables(FALSE); // TRUE // sMaxUpdateInterpolationTime must be greater than sPhaseOutUpdateInterpolationTime F64Seconds LLViewerObject::sMaxUpdateInterpolationTime(3.0); // For motion interpolation: after X seconds with no updates, don't predict object motion F64Seconds LLViewerObject::sPhaseOutUpdateInterpolationTime(2.0); // For motion interpolation: after Y seconds with no updates, taper off motion prediction +F64Seconds LLViewerObject::sMaxRegionCrossingInterpolationTime(1.0);// For motion interpolation: don't interpolate over this time on region crossing std::map<std::string, U32> LLViewerObject::sObjectDataMap; @@ -260,6 +261,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mLastInterpUpdateSecs(0.f), mLastMessageUpdateSecs(0.f), mLatestRecvPacketID(0), + mRegionCrossExpire(0), mData(NULL), mAudioSourcep(NULL), mAudioGain(1.f), @@ -2487,7 +2489,7 @@ void LLViewerObject::loadFlags(U32 flags) return; } -void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time) +void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &frame_time) { //static LLTrace::BlockTimerStatHandle ftm("Viewer Object"); //LL_RECORD_BLOCK_TIME(ftm); @@ -2498,19 +2500,19 @@ void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time) { // calculate dt from last update F32 time_dilation = mRegionp ? mRegionp->getTimeDilation() : 1.0f; - F32 dt_raw = ((F64Seconds)time - mLastInterpUpdateSecs).value(); + F32 dt_raw = ((F64Seconds)frame_time - mLastInterpUpdateSecs).value(); F32 dt = time_dilation * dt_raw; applyAngularVelocity(dt); if (isAttachment()) { - mLastInterpUpdateSecs = (F64Seconds)time; + mLastInterpUpdateSecs = (F64Seconds)frame_time; return; } else { // Move object based on it's velocity and rotation - interpolateLinearMotion(time, dt); + interpolateLinearMotion(frame_time, dt); } } @@ -2520,7 +2522,7 @@ void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time) // Move an object due to idle-time viewer side updates by interpolating motion -void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, const F32SecondsImplicit& dt_seconds) +void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& frame_time, const F32SecondsImplicit& dt_seconds) { // linear motion // PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object @@ -2532,7 +2534,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con // zeroing it out F32 dt = dt_seconds; - F64Seconds time_since_last_update = time - mLastMessageUpdateSecs; + F64Seconds time_since_last_update = frame_time - mLastMessageUpdateSecs; if (time_since_last_update <= (F64Seconds)0.0 || dt <= 0.f) { return; @@ -2580,7 +2582,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con (time_since_last_packet > sPhaseOutUpdateInterpolationTime)) { // Start to reduce motion interpolation since we haven't seen a server update in a while - F64Seconds time_since_last_interpolation = time - mLastInterpUpdateSecs; + F64Seconds time_since_last_interpolation = frame_time - mLastInterpUpdateSecs; F64 phase_out = 1.0; if (time_since_last_update > sMaxUpdateInterpolationTime) { // Past the time limit, so stop the object @@ -2635,7 +2637,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]); // Check to see if it's going off the region - LLVector3 temp(new_pos); + LLVector3 temp(new_pos.mV[VX], new_pos.mV[VY], 0.f); if (temp.clamp(0.f, mRegionp->getWidth())) { // Going off this region, so see if we might end up on another region LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion()); @@ -2644,21 +2646,47 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con // Clip the positions to known regions LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global); if (clip_pos_global != new_pos_global) - { // Was clipped, so this means we hit a edge where there is no region to enter - - //LL_INFOS() << "Hit empty region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global) - // << " from " << new_pos << LL_ENDL; - new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global); + { + // Was clipped, so this means we hit a edge where there is no region to enter + LLVector3 clip_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global); + LL_DEBUGS("Interpolate") << "Hit empty region edge, clipped predicted position to " + << clip_pos + << " from " << new_pos << LL_ENDL; + new_pos = clip_pos; // Stop motion and get server update for bouncing on the edge new_v.clear(); setAcceleration(LLVector3::zero); } else - { // Let predicted movement cross into another region - //LL_INFOS() << "Predicting region crossing to " << new_pos << LL_ENDL; + { + // Check for how long we are crossing. + // Note: theoretically we can find time from velocity, acceleration and + // distance from border to new position, but it is not going to work + // if 'phase_out' activates + if (mRegionCrossExpire == 0) + { + // Workaround: we can't accurately figure out time when we cross border + // so just write down time 'after the fact', it is far from optimal in + // case of lags, but for lags sMaxUpdateInterpolationTime will kick in first + LL_DEBUGS("Interpolate") << "Predicted region crossing, new position " << new_pos << LL_ENDL; + mRegionCrossExpire = frame_time + sMaxRegionCrossingInterpolationTime; + } + else if (frame_time > mRegionCrossExpire) + { + // Predicting crossing over 1s, stop motion + // Stop motion + LL_DEBUGS("Interpolate") << "Predicting region crossing for too long, stopping at " << new_pos << LL_ENDL; + new_v.clear(); + setAcceleration(LLVector3::zero); + mRegionCrossExpire = 0; + } } } + else + { + mRegionCrossExpire = 0; + } // Set new position and velocity setPositionRegion(new_pos); @@ -2669,7 +2697,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con } // Update the last time we did anything - mLastInterpUpdateSecs = time; + mLastInterpUpdateSecs = frame_time; } @@ -3072,6 +3100,7 @@ void LLViewerObject::unlinkControlAvatar() if (mControlAvatar) { mControlAvatar->markForDeath(); + mControlAvatar->mRootVolp = NULL; mControlAvatar = NULL; } } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index d6c8b76147..8b1535851e 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -615,7 +615,7 @@ private: U32 checkMediaURL(const std::string &media_url); // Motion prediction between updates - void interpolateLinearMotion(const F64SecondsImplicit & time, const F32SecondsImplicit & dt); + void interpolateLinearMotion(const F64SecondsImplicit & frame_time, const F32SecondsImplicit & dt); static void initObjectDataMap(); @@ -772,6 +772,7 @@ protected: F64Seconds mLastInterpUpdateSecs; // Last update for purposes of interpolation F64Seconds mLastMessageUpdateSecs; // Last update from a message from the simulator TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator + F64SecondsImplicit mRegionCrossExpire; // frame time we detected region crossing in + wait time // extra data sent from the sim...currently only used for tree species info U8* mData; @@ -851,6 +852,7 @@ protected: static void setPhaseOutUpdateInterpolationTime(F32 value) { sPhaseOutUpdateInterpolationTime = (F64Seconds) value; } static void setMaxUpdateInterpolationTime(F32 value) { sMaxUpdateInterpolationTime = (F64Seconds) value; } + static void setMaxRegionCrossingInterpolationTime(F32 value) { sMaxRegionCrossingInterpolationTime = (F64Seconds) value; } static void setVelocityInterpolate(BOOL value) { sVelocityInterpolate = value; } static void setPingInterpolate(BOOL value) { sPingInterpolate = value; } @@ -860,6 +862,7 @@ private: static F64Seconds sPhaseOutUpdateInterpolationTime; // For motion interpolation static F64Seconds sMaxUpdateInterpolationTime; // For motion interpolation + static F64Seconds sMaxRegionCrossingInterpolationTime; // For motion interpolation static BOOL sVelocityInterpolate; static BOOL sPingInterpolate; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 2aff71367e..932759c86d 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -854,6 +854,7 @@ void LLViewerObjectList::update(LLAgent &agent) F32 interp_time = gSavedSettings.getF32("InterpolationTime"); F32 phase_out_time = gSavedSettings.getF32("InterpolationPhaseOut"); + F32 region_interp_time = llclamp(gSavedSettings.getF32("RegionCrossingInterpolationTime"), 0.5f, 5.f); if (interp_time < 0.0 || phase_out_time < 0.0 || phase_out_time > interp_time) @@ -864,6 +865,7 @@ void LLViewerObjectList::update(LLAgent &agent) } LLViewerObject::setPhaseOutUpdateInterpolationTime( interp_time ); LLViewerObject::setMaxUpdateInterpolationTime( phase_out_time ); + LLViewerObject::setMaxRegionCrossingInterpolationTime(region_interp_time); gAnimateTextures = gSavedSettings.getBOOL("AnimateTextures"); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index f4d14a39fe..416d5d8e2e 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -957,7 +957,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id) return; } - LL_INFOS() << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL; + LL_INFOS("ParcelMgr") << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL; // BUG: Only works for the region containing mWestSouthBottom LLVector3d east_north_region_check( mEastNorth ); @@ -980,7 +980,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id) return; } - LL_INFOS() << "Region " << region->getOriginGlobal() << LL_ENDL; + LL_INFOS("ParcelMgr") << "Region " << region->getOriginGlobal() << LL_ENDL; LLSD payload; payload["owner_id"] = owner_id; @@ -1120,8 +1120,8 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy( if (is_claim) { - LL_INFOS() << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL; - LL_INFOS() << "Region " << region->getOriginGlobal() << LL_ENDL; + LL_INFOS("ParcelMgr") << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL; + LL_INFOS("ParcelMgr") << "Region " << region->getOriginGlobal() << LL_ENDL; // BUG: Only works for the region containing mWestSouthBottom LLVector3d east_north_region_check( mEastNorth ); @@ -1294,8 +1294,6 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag if (!region) return; - //LL_INFOS() << "found region: " << region->getName() << LL_ENDL; - LLSD body; std::string url = region->getCapability("ParcelPropertiesUpdate"); if (!url.empty()) @@ -1304,7 +1302,7 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag U32 message_flags = 0x01; body["flags"] = ll_sd_from_U32(message_flags); parcel->packMessage(body); - LL_INFOS() << "Sending parcel properties update via capability to: " + LL_INFOS("ParcelMgr") << "Sending parcel properties update via capability to: " << url << LL_ENDL; LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(url, body, @@ -1333,22 +1331,18 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos) { static U32 last_west, last_south; - + static LLUUID last_region; // only request parcel info if position has changed outside of the // last parcel grid step - U32 west_parcel_step = (U32) floor( pos.mdV[VX] / PARCEL_GRID_STEP_METERS ); - U32 south_parcel_step = (U32) floor( pos.mdV[VY] / PARCEL_GRID_STEP_METERS ); - + const U32 west_parcel_step = (U32) floor( pos.mdV[VX] / PARCEL_GRID_STEP_METERS ); + const U32 south_parcel_step = (U32) floor( pos.mdV[VY] / PARCEL_GRID_STEP_METERS ); + if ((west_parcel_step == last_west) && (south_parcel_step == last_south)) { + // We are staying in same segment return; } - else - { - last_west = west_parcel_step; - last_south = south_parcel_step; - } LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( pos ); if (!region) @@ -1356,34 +1350,95 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos) return; } + LLUUID region_id = region->getRegionID(); + LLVector3 pos_in_region = region->getPosRegionFromGlobal(pos); - // Send a rectangle around the point. - // This means the parcel sent back is at least a rectangle around the point, - // which is more efficient for public land. Fewer requests are sent. JC - LLVector3 wsb_region = region->getPosRegionFromGlobal( pos ); + bool request_properties = false; + if (region_id != last_region) + { + request_properties = true; + } + else + { + // Check if new position is in same parcel. + // This check is not ideal, since it checks by way of straight lines. + // So sometimes (small parcel in the middle of large one) it can + // decide that parcel actually changed, but it still allows to + // reduce amount of requests significantly - F32 west = PARCEL_GRID_STEP_METERS * floor( wsb_region.mV[VX] / PARCEL_GRID_STEP_METERS ); - F32 south = PARCEL_GRID_STEP_METERS * floor( wsb_region.mV[VY] / PARCEL_GRID_STEP_METERS ); + S32 west_parcel_local = (S32)(pos_in_region.mV[VX] / PARCEL_GRID_STEP_METERS); + S32 south_parcel_local = (S32)(pos_in_region.mV[VY] / PARCEL_GRID_STEP_METERS); - F32 east = west + PARCEL_GRID_STEP_METERS; - F32 north = south + PARCEL_GRID_STEP_METERS; + LLViewerParcelOverlay* overlay = region->getParcelOverlay(); + if (!overlay) + { + request_properties = true; + } + while (!request_properties && west_parcel_step < last_west) + { + S32 segment_shift = last_west - west_parcel_step; + request_properties = overlay->parcelLineFlags(south_parcel_local, west_parcel_local + segment_shift) & PARCEL_WEST_LINE; + last_west--; + } + while (!request_properties && south_parcel_step < last_south) + { + S32 segment_shift = last_south - south_parcel_step; + request_properties = overlay->parcelLineFlags(south_parcel_local + segment_shift, west_parcel_local) & PARCEL_SOUTH_LINE; + last_south--; + } + // Note: could have just swapped values, reused first two 'while' and set last_south, last_west separately, + // but this looks to be easier to understand/straightforward/less bulky + while (!request_properties && west_parcel_step > last_west) + { + S32 segment_shift = west_parcel_step - last_west; + request_properties = overlay->parcelLineFlags(south_parcel_local, west_parcel_local - segment_shift + 1) & PARCEL_WEST_LINE; + last_west++; + } + while (!request_properties && south_parcel_step > last_south) + { + S32 segment_shift = south_parcel_step - last_south; + request_properties = overlay->parcelLineFlags(south_parcel_local - segment_shift + 1, west_parcel_local) & PARCEL_SOUTH_LINE; + last_south++; + } - // Send request message - LLMessageSystem *msg = gMessageSystem; - msg->newMessageFast(_PREHASH_ParcelPropertiesRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - msg->nextBlockFast(_PREHASH_ParcelData); - msg->addS32Fast(_PREHASH_SequenceID, HOVERED_PARCEL_SEQ_ID ); - msg->addF32Fast(_PREHASH_West, west ); - msg->addF32Fast(_PREHASH_South, south ); - msg->addF32Fast(_PREHASH_East, east ); - msg->addF32Fast(_PREHASH_North, north ); - msg->addBOOL("SnapSelection", FALSE ); - msg->sendReliable( region->getHost() ); + // if (!request_properties) last_south and last_west will be equal to new values + } + + if (request_properties) + { + last_west = west_parcel_step; + last_south = south_parcel_step; + last_region = region_id; - mHoverRequestResult = PARCEL_RESULT_NO_DATA; + LL_DEBUGS("ParcelMgr") << "Requesting parcel properties on hover, for " << pos << LL_ENDL; + + + // Send a rectangle around the point. + // This means the parcel sent back is at least a rectangle around the point, + // which is more efficient for public land. Fewer requests are sent. JC + F32 west = PARCEL_GRID_STEP_METERS * floor(pos_in_region.mV[VX] / PARCEL_GRID_STEP_METERS); + F32 south = PARCEL_GRID_STEP_METERS * floor(pos_in_region.mV[VY] / PARCEL_GRID_STEP_METERS); + + F32 east = west + PARCEL_GRID_STEP_METERS; + F32 north = south + PARCEL_GRID_STEP_METERS; + + // Send request message + LLMessageSystem *msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ParcelPropertiesRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ParcelData); + msg->addS32Fast(_PREHASH_SequenceID, HOVERED_PARCEL_SEQ_ID); + msg->addF32Fast(_PREHASH_West, west); + msg->addF32Fast(_PREHASH_South, south); + msg->addF32Fast(_PREHASH_East, east); + msg->addF32Fast(_PREHASH_North, north); + msg->addBOOL("SnapSelection", FALSE); + msg->sendReliable(region->getHost()); + + mHoverRequestResult = PARCEL_RESULT_NO_DATA; + } } @@ -1472,7 +1527,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use if (request_result == PARCEL_RESULT_NO_DATA) { // no valid parcel data - LL_INFOS() << "no valid parcel data" << LL_ENDL; + LL_INFOS("ParcelMgr") << "no valid parcel data" << LL_ENDL; return; } @@ -1504,7 +1559,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use } else { - LL_INFOS() << "out of order agent parcel sequence id " << sequence_id + LL_INFOS("ParcelMgr") << "out of order agent parcel sequence id " << sequence_id << " last good " << parcel_mgr.mAgentParcelSequenceID << LL_ENDL; return; @@ -1552,6 +1607,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use msg->getS32("ParcelData", "OtherCleanTime", other_clean_time ); + LL_DEBUGS("ParcelMgr") << "Processing parcel " << local_id << " update, target(sequence): " << sequence_id << LL_ENDL; + // Actually extract the data. if (parcel) { @@ -1790,7 +1847,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use } else { - LL_INFOS() << "Stopping parcel music (invalid audio stream URL)" << LL_ENDL; + LL_INFOS("ParcelMgr") << "Stopping parcel music (invalid audio stream URL)" << LL_ENDL; // clears the URL // null value causes fade out LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null); @@ -1798,7 +1855,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use } else if (!gAudiop->getInternetStreamURL().empty()) { - LL_INFOS() << "Stopping parcel music (parcel stream URL is empty)" << LL_ENDL; + LL_INFOS("ParcelMgr") << "Stopping parcel music (parcel stream URL is empty)" << LL_ENDL; // null value causes fade out LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null); } @@ -1827,7 +1884,7 @@ void LLViewerParcelMgr::optionally_start_music(const std::string& music_url) gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) && gSavedSettings.getBOOL("MediaTentativeAutoPlay"))) { - LL_INFOS() << "Starting parcel music " << music_url << LL_ENDL; + LL_INFOS("ParcelMgr") << "Starting parcel music " << music_url << LL_ENDL; LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(music_url); } else @@ -1855,7 +1912,7 @@ void LLViewerParcelMgr::processParcelAccessListReply(LLMessageSystem *msg, void if (parcel_id != parcel->getLocalID()) { - LL_WARNS_ONCE("") << "processParcelAccessListReply for parcel " << parcel_id + LL_WARNS_ONCE("ParcelMgr") << "processParcelAccessListReply for parcel " << parcel_id << " which isn't the selected parcel " << parcel->getLocalID()<< LL_ENDL; return; } diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 4fd423b6f4..7c3dd00e1a 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -274,6 +274,23 @@ U8 LLViewerParcelOverlay::ownership( const LLVector3& pos) const return ownership(row, column); } +U8 LLViewerParcelOverlay::parcelLineFlags(const LLVector3& pos) const +{ + S32 row = S32(pos.mV[VY] / PARCEL_GRID_STEP_METERS); + S32 column = S32(pos.mV[VX] / PARCEL_GRID_STEP_METERS); + return parcelLineFlags(row, column); +} +U8 LLViewerParcelOverlay::parcelLineFlags(S32 row, S32 col) const +{ + U8 flags = PARCEL_WEST_LINE | PARCEL_SOUTH_LINE; + if (row > mParcelGridsPerEdge || col > mParcelGridsPerEdge) + { + LL_WARNS() << "Attempted to get ownership out of region's overlay, row: " << row << " col: " << col << LL_ENDL; + return flags; + } + return mOwnership[row * mParcelGridsPerEdge + col] & flags; +} + F32 LLViewerParcelOverlay::getOwnedRatio() const { S32 size = mParcelGridsPerEdge * mParcelGridsPerEdge; diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h index 14a2af5354..e30dbf17b3 100644 --- a/indra/newview/llviewerparceloverlay.h +++ b/indra/newview/llviewerparceloverlay.h @@ -71,6 +71,8 @@ public: S32 renderPropertyLines(); U8 ownership( const LLVector3& pos) const; + U8 parcelLineFlags( const LLVector3& pos) const; + U8 parcelLineFlags(S32 row, S32 col) const; // MANIPULATE void uncompressLandOverlay(S32 chunk, U8 *compressed_overlay); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index b3d561edd5..6d8b27ff2d 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -407,7 +407,8 @@ void LLViewerShaderMgr::setShaders() return; } - LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) gSavedSettings.getU32("RenderMaxTextureIndex")), 1); + static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16); + LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) max_texture_index), 1); //NEVER use more than 16 texture channels (work around for prevalent driver bug) LLGLSLShader::sIndexedTextureChannels = llmin(LLGLSLShader::sIndexedTextureChannels, 16); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 092b51238e..68a9994bee 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -100,7 +100,7 @@ const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128; const S32 DEFAULT_ICON_DIMENTIONS = 32; S32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256. S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA; -BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE; +bool LLViewerTexture::sFreezeImageUpdates = false; F32 LLViewerTexture::sCurrentTime = 0.0f; F32 LLViewerTexture::sTexelPixelRatio = 1.0f; @@ -474,6 +474,7 @@ void LLViewerTexture::initClass() // tuning params const F32 discard_bias_delta = .25f; const F32 discard_delta_time = 0.5f; +const F32 GPU_MEMORY_CHECK_WAIT_TIME = 1.0f; // non-const (used externally F32 texmem_lower_bound_scale = 0.85f; F32 texmem_middle_bound_scale = 0.925f; @@ -483,53 +484,68 @@ static LLTrace::BlockTimerStatHandle FTM_TEXTURE_MEMORY_CHECK("Memory Check"); //static bool LLViewerTexture::isMemoryForTextureLow() { - const F32 WAIT_TIME = 1.0f; //second - static LLFrameTimer timer; + // Note: we need to figure out a better source for 'min' values, + // what is free for low end at minimal settings is 'nothing left' + // for higher end gpus at high settings. + const S32Megabytes MIN_FREE_TEXTURE_MEMORY(20); + const S32Megabytes MIN_FREE_MAIN_MEMORY(100); - if(timer.getElapsedTimeF32() < WAIT_TIME) //call this once per second. - { - return false; - } - timer.reset(); + S32Megabytes gpu; + S32Megabytes physical; + getGPUMemoryForTextures(gpu, physical); - LL_RECORD_BLOCK_TIME(FTM_TEXTURE_MEMORY_CHECK); + return (gpu < MIN_FREE_TEXTURE_MEMORY) || (physical < MIN_FREE_MAIN_MEMORY); +} - const S32Megabytes MIN_FREE_TEXTURE_MEMORY(20); //MB Changed to 20 MB per MAINT-6882 - const S32Megabytes MIN_FREE_MAIN_MEMORY(100); //MB +//static +bool LLViewerTexture::isMemoryForTextureSuficientlyFree() +{ + const S32Megabytes DESIRED_FREE_TEXTURE_MEMORY(50); + const S32Megabytes DESIRED_FREE_MAIN_MEMORY(200); - bool low_mem = false; - if (gGLManager.mHasATIMemInfo) - { - S32 meminfo[4]; - glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); + S32Megabytes gpu; + S32Megabytes physical; + getGPUMemoryForTextures(gpu, physical); - if((S32Megabytes)meminfo[0] < MIN_FREE_TEXTURE_MEMORY) - { - low_mem = true; - } + return (gpu > DESIRED_FREE_TEXTURE_MEMORY) && (physical > DESIRED_FREE_MAIN_MEMORY); +} - if(!low_mem) //check main memory, only works for windows. - { - LLMemory::updateMemoryInfo(); - if(LLMemory::getAvailableMemKB() < MIN_FREE_TEXTURE_MEMORY) - { - low_mem = true; - } - } - } - //Enabled this branch per MAINT-6882 - else if (gGLManager.mHasNVXMemInfo) - { - S32 free_memory; - glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory); - - if ((S32Megabytes)(free_memory / 1024) < MIN_FREE_TEXTURE_MEMORY) - { - low_mem = true; - } - } +//static +void LLViewerTexture::getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &physical) +{ + static LLFrameTimer timer; + static S32Megabytes gpu_res = S32Megabytes(S32_MAX); + static S32Megabytes physical_res = S32Megabytes(S32_MAX); + + if (timer.getElapsedTimeF32() < GPU_MEMORY_CHECK_WAIT_TIME) //call this once per second. + { + gpu = gpu_res; + physical = physical_res; + return; + } + timer.reset(); + + LL_RECORD_BLOCK_TIME(FTM_TEXTURE_MEMORY_CHECK); + + if (gGLManager.mHasATIMemInfo) + { + S32 meminfo[4]; + glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); + gpu_res = (S32Megabytes)meminfo[0]; + + //check main memory, only works for windows. + LLMemory::updateMemoryInfo(); + physical_res = LLMemory::getAvailableMemKB(); + } + else if (gGLManager.mHasNVXMemInfo) + { + S32 free_memory; + glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory); + gpu_res = (S32Megabytes)(free_memory / 1024); + } - return low_mem; + gpu = gpu_res; + physical = physical_res; } static LLTrace::BlockTimerStatHandle FTM_TEXTURE_UPDATE_MEDIA("Media"); @@ -572,15 +588,20 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity sEvaluationTimer.reset(); } } - else if(sEvaluationTimer.getElapsedTimeF32() > discard_delta_time && isMemoryForTextureLow()) + else if(isMemoryForTextureLow()) { - sDesiredDiscardBias += discard_bias_delta; - sEvaluationTimer.reset(); + // Note: isMemoryForTextureLow() uses 1s delay, make sure we waited enough for it to recheck + if (sEvaluationTimer.getElapsedTimeF32() > GPU_MEMORY_CHECK_WAIT_TIME) + { + sDesiredDiscardBias += discard_bias_delta; + sEvaluationTimer.reset(); + } } - else if (sDesiredDiscardBias > 0.0f && - sBoundTextureMemory < sMaxBoundTextureMemory * texmem_lower_bound_scale && - sTotalTextureMemory < sMaxTotalTextureMem * texmem_lower_bound_scale) - { + else if (sDesiredDiscardBias > 0.0f + && sBoundTextureMemory < sMaxBoundTextureMemory * texmem_lower_bound_scale + && sTotalTextureMemory < sMaxTotalTextureMem * texmem_lower_bound_scale + && isMemoryForTextureSuficientlyFree()) + { // If we are using less texture memory than we should, // scale down the desired discard level if (sEvaluationTimer.getElapsedTimeF32() > discard_delta_time) @@ -590,14 +611,8 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity } } sDesiredDiscardBias = llclamp(sDesiredDiscardBias, desired_discard_bias_min, desired_discard_bias_max); - - F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed(); - F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed(); - sCameraMovingBias = llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1); - sCameraMovingDiscardBias = (S8)(sCameraMovingBias); - LLViewerTexture::sFreezeImageScalingDown = (sBoundTextureMemory < 0.75f * sMaxBoundTextureMemory * texmem_middle_bound_scale) && - (sTotalTextureMemory < 0.75f * sMaxTotalTextureMem * texmem_middle_bound_scale); + LLViewerTexture::sFreezeImageUpdates = sDesiredDiscardBias > (desired_discard_bias_max - 1.0f); } //end of static functions @@ -3125,9 +3140,9 @@ S8 LLViewerLODTexture::getType() const return LLViewerTexture::LOD_TEXTURE; } -BOOL LLViewerLODTexture::isUpdateFrozen() +bool LLViewerLODTexture::isUpdateFrozen() { - return LLViewerTexture::sFreezeImageScalingDown && !getDiscardLevel(); + return LLViewerTexture::sFreezeImageUpdates; } // This is gauranteed to get called periodically for every texture @@ -3253,9 +3268,16 @@ void LLViewerLODTexture::processTextureStats() (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) { scaleDown(); - } } + + if (isUpdateFrozen() // we are out of memory and nearing max allowed bias + && mBoostLevel < LLGLTexture::BOOST_SCULPTED + && mDesiredDiscardLevel < current_discard) + { + // stop requesting more + mDesiredDiscardLevel = current_discard; + } } if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0) diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 5d89f9f029..7cbcc931b1 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -186,6 +186,9 @@ private: virtual void switchToCachedImage(); static bool isMemoryForTextureLow() ; + static bool isMemoryForTextureSuficientlyFree(); + static void getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &physical); + protected: LLUUID mID; S32 mTextureListType; // along with mID identifies where to search for this texture in TextureList @@ -227,7 +230,7 @@ public: static S32 sMaxSculptRez ; static S32 sMinLargeImageSize ; static S32 sMaxSmallImageSize ; - static BOOL sFreezeImageScalingDown ;//do not scale down image res if set. + static bool sFreezeImageUpdates; static F32 sCurrentTime ; enum EDebugTexels @@ -543,7 +546,7 @@ public: /*virtual*/ S8 getType() const; // Process image stats to determine priority/quality requirements. /*virtual*/ void processTextureStats(); - BOOL isUpdateFrozen() ; + bool isUpdateFrozen() ; private: void init(bool firstinit) ; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index cc10d08f3a..e293db0342 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3809,7 +3809,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL draw_handles = TRUE; - if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move) + if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move && !LLSelectMgr::getInstance()->isSelfAvatarSelected()) { draw_handles = FALSE; } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 321f774210..2682c5b698 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5992,7 +5992,7 @@ void LLVOAvatar::rebuildAttachmentOverrides() LLViewerObject *vo = *at_it; // Attached animated objects affect joints in their control // avs, not the avs to which they are attached. - if (!vo->isAnimatedObject()) + if (vo && !vo->isAnimatedObject()) { addAttachmentOverridesForObject(vo); } @@ -6043,7 +6043,7 @@ void LLVOAvatar::updateAttachmentOverrides() LLViewerObject *vo = *at_it; // Attached animated objects affect joints in their control // avs, not the avs to which they are attached. - if (!vo->isAnimatedObject()) + if (vo && !vo->isAnimatedObject()) { addAttachmentOverridesForObject(vo, &meshes_seen); } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index deb22617a4..a4f8e95c65 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -75,6 +75,8 @@ class LLTexGlobalColor; struct LLAppearanceMessageContents; class LLViewerJointMesh; +const F32 MAX_AVATAR_LOD_FACTOR = 1.0f; + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLVOAvatar diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index cf40058c34..2231bda33e 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -770,12 +770,16 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() { #ifndef VIVOXDAEMON_REMOTEHOST // Launch the voice daemon - std::string exe_path = gDirUtilp->getAppRODataDir(); #if LL_WINDOWS + // On windows use exe (not work or RO) directory + std::string exe_path = gDirUtilp->getExecutableDir(); gDirUtilp->append(exe_path, "SLVoice.exe"); #elif LL_DARWIN + // On MAC use resource directory + std::string exe_path = gDirUtilp->getAppRODataDir(); gDirUtilp->append(exe_path, "SLVoice"); #else + std::string exe_path = gDirUtilp->getExecutableDir(); gDirUtilp->append(exe_path, "SLVoice"); #endif // See if the vivox executable exists diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 976ced7d3e..3793d6b9b2 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1380,7 +1380,8 @@ BOOL LLVOVolume::calcLOD() mLODDistance = distance; mLODRadius = radius; - if (gSavedSettings.getBOOL("DebugObjectLODs")) + static LLCachedControl<bool> debug_lods(gSavedSettings, "DebugObjectLODs", false); + if (debug_lods) { if (getAvatar() && isRootEdit()) { @@ -4276,10 +4277,16 @@ F32 LLVOVolume::getBinRadius() F32 scale = 1.f; - S32 size_factor = llmax(gSavedSettings.getS32("OctreeStaticObjectSizeFactor"), 1); - S32 attachment_size_factor = llmax(gSavedSettings.getS32("OctreeAttachmentSizeFactor"), 1); - LLVector3 distance_factor = gSavedSettings.getVector3("OctreeDistanceFactor"); - LLVector3 alpha_distance_factor = gSavedSettings.getVector3("OctreeAlphaDistanceFactor"); + static LLCachedControl<S32> octree_size_factor(gSavedSettings, "OctreeStaticObjectSizeFactor", 3); + static LLCachedControl<S32> octree_attachment_size_factor(gSavedSettings, "OctreeAttachmentSizeFactor", 4); + static LLCachedControl<LLVector3> octree_distance_factor(gSavedSettings, "OctreeDistanceFactor", LLVector3(0.01f, 0.f, 0.f)); + static LLCachedControl<LLVector3> octree_alpha_distance_factor(gSavedSettings, "OctreeAlphaDistanceFactor", LLVector3(0.1f, 0.f, 0.f)); + + S32 size_factor = llmax((S32)octree_size_factor, 1); + S32 attachment_size_factor = llmax((S32)octree_attachment_size_factor, 1); + LLVector3 distance_factor = octree_distance_factor; + LLVector3 alpha_distance_factor = octree_alpha_distance_factor; + const LLVector4a* ext = mDrawable->getSpatialExtents(); BOOL shrink_wrap = mDrawable->isAnimating(); @@ -5355,8 +5362,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) U32 useage = group->getSpatialPartition()->mBufferUsage; - U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); - U32 max_total = (gSavedSettings.getS32("RenderMaxNodeSize")*1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); + LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512); + LLCachedControl<S32> max_node_size(gSavedSettings, "RenderMaxNodeSize", 65536); + U32 max_vertices = (max_vbo_size * 1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); + U32 max_total = (max_node_size * 1024) / LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); max_vertices = llmin(max_vertices, (U32) 65535); U32 cur_total = 0; @@ -6109,7 +6118,8 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace #endif //calculate maximum number of vertices to store in a single buffer - U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); + LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512); + U32 max_vertices = (max_vbo_size * 1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); max_vertices = llmin(max_vertices, (U32) 65535); { @@ -6152,7 +6162,8 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels; } - texture_index_channels = llmin(texture_index_channels, (S32) gSavedSettings.getU32("RenderMaxTextureIndex")); + static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16); + texture_index_channels = llmin(texture_index_channels, (S32) max_texture_index); //NEVER use more than 16 texture index channels (workaround for prevalent driver bug) texture_index_channels = llmin(texture_index_channels, 16); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 0882fc095d..13db9c39b7 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -54,6 +54,8 @@ enum LLVolumeInterfaceType INTERFACE_FLEXIBLE = 1, }; +const F32 MAX_LOD_FACTOR = 4.0f; + class LLRiggedVolume : public LLVolume { diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index 3b9b96e9f1..2cb5fc81b0 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -335,7 +335,8 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable) } { - const U32 max_buffer_bytes = gSavedSettings.getS32("RenderMaxVBOSize")*1024; + LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512); + const U32 max_buffer_bytes = max_vbo_size * 1024; const U32 data_mask = LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK; const U32 max_verts = max_buffer_bytes / LLVertexBuffer::calcVertexSize(data_mask); diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp index 2782cd9545..dd6c77ca7d 100644 --- a/indra/newview/llwatchdog.cpp +++ b/indra/newview/llwatchdog.cpp @@ -155,7 +155,7 @@ void LLWatchdogTimeout::ping(const std::string& state) // LLWatchdog LLWatchdog::LLWatchdog() : - mSuspectsAccessMutex(NULL), + mSuspectsAccessMutex(), mTimer(NULL), mLastClockCount(0), mKillerCallback(&default_killer_callback) @@ -185,7 +185,7 @@ void LLWatchdog::init(killer_event_callback func) mKillerCallback = func; if(!mSuspectsAccessMutex && !mTimer) { - mSuspectsAccessMutex = new LLMutex(NULL); + mSuspectsAccessMutex = new LLMutex(); mTimer = new LLWatchdogTimerThread(); mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000); mLastClockCount = LLTimer::getTotalTime(); diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 93d1dacf1f..b27257a262 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -465,7 +465,11 @@ void LLWorldMapView::draw() mesg, 0, llfloor(left + 3), llfloor(bottom + 2), LLColor4::white, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW, + S32_MAX, //max_chars + sMapScale, //max_pixels + NULL, + TRUE); //use ellipses } } } @@ -1756,9 +1760,12 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) case MAP_ITEM_LAND_FOR_SALE_ADULT: { LLVector3d pos_global = viewPosToGlobal(x, y); - LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); - LLFloaterReg::hideInstance("world_map"); - LLFloaterReg::showInstance("search", LLSD().with("category", "land").with("query", info->getName())); + std::string sim_name; + if (LLWorldMap::getInstance()->simNameFromPosGlobal(pos_global, sim_name)) + { + LLFloaterReg::hideInstance("world_map"); + LLFloaterReg::showInstance("search", LLSD().with("category", "land").with("query", sim_name)); + } break; } case MAP_ITEM_CLASSIFIED: diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 143c97fca4..8e2539606b 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -362,6 +362,10 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const { httpOpts->setRetries(httpParams["retries"].asInteger()); } + if (httpParams.has("DNSCacheTimeout")) + { + httpOpts->setDNSCacheTimeout(httpParams["DNSCacheTimeout"].asInteger()); + } bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert"); mCertStore = gSavedSettings.getString("CertStore"); @@ -483,38 +487,24 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status) { CURLcode code = static_cast<CURLcode>(status.toULong()); std::string message; - std::string uri = "http://secondlife.com/community/support.php"; + std::string uri = "http://support.secondlife.com"; LLURI failuri(mURI); - + LLStringUtil::format_map_t args; switch (code) { case CURLE_COULDNT_RESOLVE_HOST: - message = - std::string("DNS could not resolve the host name(") + failuri.hostName() + ").\n" - "Please verify that you can connect to the www.secondlife.com\n" - "web site. If you can, but continue to receive this error,\n" - "please go to the support section and report this problem."; + args["[HOSTNAME]"] = failuri.hostName(); + message = LLTrans::getString("couldnt_resolve_host", args); break; case CURLE_SSL_PEER_CERTIFICATE: - message = - "The login server couldn't verify itself via SSL.\n" - "If you continue to receive this error, please go\n" - "to the Support section of the SecondLife.com web site\n" - "and report the problem."; + message = LLTrans::getString("ssl_peer_certificate"); break; case CURLE_SSL_CACERT: - case CURLE_SSL_CONNECT_ERROR: - message = - "Often this means that your computer\'s clock is set incorrectly.\n" - "Please go to Control Panels and make sure the time and date\n" - "are set correctly.\n" - "Also check that your network and firewall are set up correctly.\n" - "If you continue to receive this error, please go\n" - "to the Support section of the SecondLife.com web site\n" - "and report the problem."; + case CURLE_SSL_CONNECT_ERROR: + message = LLTrans::getString("ssl_connect_error"); break; default: diff --git a/indra/newview/skins/default/default_languages.xml b/indra/newview/skins/default/default_languages.xml new file mode 100644 index 0000000000..357930e1c5 --- /dev/null +++ b/indra/newview/skins/default/default_languages.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<labels> + <label + name="en" + value="System default" /> + <label + name="it" + value="Default di sistema" /> + <label + name="ja" + value="システムデフォルト" /> + <label + name="pl" + value="Domyślny" /> + <label + name="pt" + value="Padrão" /> + <label + name="ru" + value="Язык системы" /> + <label + name="tr" + value="Sistem varsayılanı" /> + <label + name="zh" + value="系統預設" /> + <label + name="da" + value="System standard" /> + <label + name="de" + value="Systemvorgabe" /> + <label + name="es" + value="Predeterminado del sistema" /> + <label + name="fr" + value="Choix par défaut" /> +</labels> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml index 5702d48e97..624c6634cc 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml @@ -4,7 +4,6 @@ Sprog: </text> <combo_box name="language_combobox"> - <combo_box.item label="System standard" name="System Default Language"/> <combo_box.item label="English (Engelsk)" name="English"/> <combo_box.item label="Dansk - Beta" name="Danish"/> <combo_box.item label="Deutsch (Tysk) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml index 27c6b73967..2422e414e0 100644 --- a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml @@ -96,7 +96,7 @@ </combo_box> <check_box label="Begehbare Objekte" name="show_walkables"/> <check_box label="Materialvolumen" name="show_material_volumes"/> - <check_box label="Statische Hinternisse" name="show_static_obstacles"/> + <check_box label="Statische Hindernisse" name="show_static_obstacles"/> <check_box label="Ausschlussvolumen" name="show_exclusion_volumes"/> <check_box label="Wasserebene" name="show_water_plane"/> <check_box label="Mit Röntgenblick" name="show_xray"/> diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml index a423f3efea..6729e242ac 100644 --- a/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml +++ b/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml @@ -61,10 +61,10 @@ Begehbar </floater.string> <floater.string name="linkset_use_static_obstacle"> - Statisches Hinternis + Statisches Hindernis </floater.string> <floater.string name="linkset_use_dynamic_obstacle"> - Bewegliches Hinternis + Bewegliches Hindernis </floater.string> <floater.string name="linkset_use_material_volume"> Materialvolumen @@ -103,8 +103,8 @@ <combo_box name="filter_by_linkset_use"> <combo_box.item label="Nach Linkset-Nutzung filtern..." name="filter_by_linkset_use_none"/> <combo_box.item label="Begehbar" name="filter_by_linkset_use_walkable"/> - <combo_box.item label="Statisches Hinternis" name="filter_by_linkset_use_static_obstacle"/> - <combo_box.item label="Bewegliches Hinternis" name="filter_by_linkset_use_dynamic_obstacle"/> + <combo_box.item label="Statisches Hindernis" name="filter_by_linkset_use_static_obstacle"/> + <combo_box.item label="Bewegliches Hindernis" name="filter_by_linkset_use_dynamic_obstacle"/> <combo_box.item label="Materialvolumen" name="filter_by_linkset_use_material_volume"/> <combo_box.item label="Ausschlussvolumen" name="filter_by_linkset_use_exclusion_volume"/> <combo_box.item label="Bewegliches Phantom" name="filter_by_linkset_use_dynamic_phantom"/> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 94ec441b15..3da2bb5c3c 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -244,6 +244,10 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. Hinweis: Bei Aktivierung dieser Option sehen alle Personen, die diesen Computer benutzen, Ihre Lieblingsorte. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + Das Starten mehrerer Second Life Viewer wird nicht unterstützt. Dies kann zu Kollisionen des Textur-Caches, Fehlern sowie verschlechterter Grafik und Leistung führen. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Wenn Sie einem anderen Einwohner Änderungsrechte gewähren, dann kann dieser JEDES Objekt, das Sie inworld besitzen, ändern, löschen oder an sich nehmen. Seien Sie daher beim Gewähren dieser Rechte sehr vorsichtig! Möchten Sie [NAME] Änderungsrechte gewähren? @@ -725,9 +729,9 @@ Sie können die Grafikqualität unter Einstellungen > Grafik wieder erhöhen. Sie sind nicht zum Terraformen der Parzelle „[PARCEL]“ berechtigt. </notification> <notification name="CannotCopyWarning"> - Sie sind nicht berechtigt, die folgenden Objekte zu kopieren: -[ITEMS] -Wenn Sie diese weitergeben, werden sie aus Ihrem Inventar entfernt. Möchten Sie diese Objekte wirklich weggeben? + Sie sind nicht berechtigt, die folgenden Objekte zu kopieren: +<nolink>[ITEMS]</nolink> +und die Objekte werden aus Ihrem Inventar gelöscht, wenn Sie diese weggeben. Möchten Sie diese Objekte wirklich weggeben? <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> </notification> <notification name="CannotGiveItem"> @@ -3726,13 +3730,13 @@ es sich nicht in der gleichen Region befindet wie Sie. Auf Land, das Sie nicht besitzen, können Sie keine Bäume und Gräser erstellen. </notification> <notification name="NoCopyPermsNoObject"> - Kopieren fehlgeschlagen, da Sie keine Berechtigung zum Kopieren des Objekts „OBJ_NAME]“ besitzen. + Kopieren fehlgeschlagen, da Sie nicht über die Berechtigung zum Kopieren des Objekts <nolink>'[OBJ_NAME]'</nolink> verfügen. </notification> <notification name="NoTransPermsNoObject"> - Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ nicht an Sie übertragen werden kann. + Kopieren fehlgeschlagen, da das Objekt <nolink>'[OBJ_NAME]'</nolink> nicht an Sie übertragen werden kann. </notification> <notification name="AddToNavMeshNoCopy"> - Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ zum Navmesh beiträgt. + Kopieren fehlgeschlagen, da das Objekt <nolink>'[OBJ_NAME]'</nolink> zum Navmesh beiträgt. </notification> <notification name="DupeWithNoRootsSelected"> Ohne ausgewählte Hauptobjekte duplizieren. @@ -3777,34 +3781,34 @@ Warten Sie kurz und versuchen Sie es noch einmal. Erneutes Speichern im Inventar ist deaktiviert. </notification> <notification name="NoExistNoSaveToContents"> - „[OBJ_NAME]“ kann nicht im Objektinhalt gespeichert werden, da das Objekt, aus dem es gerezzt wurde, nicht mehr existiert. + <nolink>'[OBJ_NAME]'</nolink> kann nicht im Objektinhalt gespeichert werden, da das Objekt, aus dem es gerezzt wurde, nicht mehr existiert. </notification> <notification name="NoModNoSaveToContents"> - „[OBJ_NAME]“ kann nicht in Objektinhalt gespeichert werden, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[DEST_NAME]“ besitzen. + <nolink>'[OBJ_NAME]'</nolink> kann nicht in Objektinhalt gespeichert werden, da Sie nicht über die Berechtigung zum Modifizieren des Objekts <nolink>'[DEST_NAME]'</nolink> verfügen. </notification> <notification name="NoSaveBackToInvDisabled"> - „[OBJ_NAME]“ kann nicht erneut im Inventar gespeichert werden – dieser Vorgang wurde deaktiviert. + <nolink>'[OBJ_NAME]'</nolink> kann nicht erneut im Inventar gespeichert werden – dieser Vorgang wurde deaktiviert. </notification> <notification name="NoCopyNoSelCopy"> - Sie können Ihre Auswahl nicht kopieren, da Sie nicht die Berechtigung zum Kopieren des Objekts „[OBJ_NAME]“ haben. + Sie können Ihre Auswahl nicht kopieren, da Sie nicht über die Berechtigung zum Kopieren des Objekts <nolink>'[OBJ_NAME]'</nolink> verfügen. </notification> <notification name="NoTransNoSelCopy"> - Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist. + Sie können Ihre Auswahl nicht kopieren, da das Objekt <nolink>'[OBJ_NAME]'</nolink> nicht übertragbar ist. </notification> <notification name="NoTransNoCopy"> - Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist. + Sie können Ihre Auswahl nicht kopieren, da das Objekt <nolink>'[OBJ_NAME]'</nolink> nicht übertragbar ist. </notification> <notification name="NoPermsNoRemoval"> - Entfernen des Objekts „[OBJ_NAME]“ aus dem Simulator wird vom Berechtigungssystem nicht gestattet. + Entfernen des Objekts <nolink>'[OBJ_NAME]'</nolink> aus dem Simulator wird vom Berechtigungssystem nicht gestattet. </notification> <notification name="NoModNoSaveSelection"> - Sie können Ihre Auswahl nicht speichern, da Sie keine Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ besitzen. + Sie können Ihre Auswahl nicht speichern, da Sie nicht über die Berechtigung zum Modifizieren des Objekts <nolink>'[OBJ_NAME]'</nolink> verfügen. </notification> <notification name="NoCopyNoSaveSelection"> - Ihre Auswahl kann nicht gespeichert werden, da das Objekt „[OBJ_NAME]“ nicht kopiert werden kann. + Ihre Auswahl kann nicht gespeichert werden, da das Objekt <nolink>'[OBJ_NAME]'</nolink> nicht kopiert werden kann. </notification> <notification name="NoModNoTaking"> - Sie können Ihre Auswahl nicht in Empfang nehmen, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ haben. + Sie können Ihre Auswahl nicht in Empfang nehmen, da Sie nicht über die Berechtigung zum Modifizieren des Objekts <nolink>'[OBJ_NAME]'</nolink> verfügen. </notification> <notification name="RezDestInternalError"> Interner Fehler: Unbekannter Zielttyp. diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml index 201998f220..c4705d7283 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml @@ -4,7 +4,6 @@ Sprache: </text> <combo_box name="language_combobox"> - <combo_box.item label="Systemvorgabe" name="System Default Language"/> <combo_box.item label="English (Englisch)" name="English"/> <combo_box.item label="Dansk (Dänisch) - Beta" name="Danish"/> <combo_box.item label="Deutsch - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index cde04d8d69..78d445f362 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -5740,4 +5740,25 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="Mav_Details_MAV_UNKNOWN_VERSION"> Die Physikform hat keine korrekte Version. Legen Sie die korrekte Version für das Physikmodell fest. </string> + <string name="couldnt_resolve_host"> + Der DNS konnte den Hostnamen ([HOSTNAME]) nicht auflösen Prüfen +Sie bitte, ob Sie die Website www.secondlife.com aufrufen können. Wenn Sie die +Website aufrufen können, jedoch weiterhin diese Fehlermeldung erhalten, +besuchen Sie bitte den Support-Bereich und melden Sie das Problem. + </string> + <string name="ssl_peer_certificate"> + Der Anmeldeserver konnte sich nicht per SSL verifizieren. +Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen +Sie bitte den Support-Bereich der Website Secondlife.com +und melden Sie das Problem. + </string> + <string name="ssl_connect_error"> + Die Ursache hierfür ist häufig eine falsch eingestellte Uhrzeit auf Ihrem Computer. +Bitte vergewissern Sie sich, dass Datum und Uhrzeit in der Systemsteuerung korrekt +eingestellt sind. Überprüfen Sie außerdem, ob Ihre Netzwerk- und Firewall-Einstellungen +korrekt sind. Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen Sie bitte den +Support-Bereich der Website Secondlife.com und melden Sie das Problem. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge-Base] + </string> </strings> diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index e7ab3cacdc..9fa93b640f 100644 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -213,6 +213,7 @@ layout="topleft" top_pad="0" name="share_with_group" + tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." width="92" /> <text type="string" @@ -234,6 +235,7 @@ layout="topleft" top_pad="0" name="everyone_copy" + tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive" width="92" /> <text type="string" @@ -254,6 +256,7 @@ label="Modify" layout="topleft" name="next_owner_modify" + tool_tip="Next owner can edit properties like item name or scale of this object." top_pad="0" width="92" /> <check_box @@ -263,6 +266,7 @@ layout="topleft" top_pad="0" name="next_owner_copy" + tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." width="92"> <check_box.commit_callback function="BulkPermission.CommitCopy"/> @@ -276,7 +280,7 @@ label="Transfer" layout="topleft" name="next_owner_transfer" - tool_tip="Next owner can give away or resell this object" + tool_tip="Next owner can give away or resell this object." width="92" /> <scroll_list enabled="false" diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index 3db431de1b..5a86eb06fb 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -73,35 +73,6 @@ prevalidate_callback="ascii" top_pad="5" width="290" /> - <text - follows="left|top" - height="15" - layout="topleft" - left_pad="15" - name="model_category_label" - text_color="White" - top="0" - width="200"> - This model represents... - </text> - <combo_box - follows="left|top" - height="23" - left_pad="10" - name="model_category_combo" - top_pad="10" - width="200"> - <combo_box.drop_down_button - label_color="White"/> - <combo_item name="Choose one" label="Choose One..." value="MUT_Unspecified"/> - <combo_item name="Avatar shape" label="Avatar shape" value="MUT_AvatarShape"/> - <combo_item name="Avatar attachment" label="Avatar attachment" value="MUT_AvatarAttachment"/> - <combo_item name="Moving object (vehicle, animal)" label="Moving object (vehicle, animal)" value="MUT_MovingObject"/> - <combo_item name="Building Component" label="Building Component" value="MUT_BuildingComponent"/> - <combo_item name="Large, non moving etc" label="Large, non moving etc" value="MUT_LargeStationary"/> - <combo_item name="Smaller, non-moving etc" label="Smaller, non-moving etc" value="MUT_SmallStationary"/> - <combo_item name="Not really any of these" label="Not really any of these" value="MUT_Other"/> - </combo_box> </panel> <tab_container follows="top|left" diff --git a/indra/newview/skins/default/xui/en/floater_my_scripts.xml b/indra/newview/skins/default/xui/en/floater_my_scripts.xml new file mode 100644 index 0000000000..3b0b6723c7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_my_scripts.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_resize="true" + height="570" + help_topic="scriptlimits" + layout="topleft" + name="myscripts" + save_rect="true" + title="My Scripts" + min_width="620" + width="620"> + <panel + filename="panel_script_limits_my_avatar.xml" + follows="all" + bottom="555" + layout="topleft" + left="3" + right="-2" + name="script_limits_my_avatar_panel" + top="20"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 845c1efe4d..0e62d50072 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -3,7 +3,7 @@ legacy_header_height="18" positioning="centered" default_tab_group="1" - height="512" + height="530" layout="topleft" name="Preferences" help_topic="preferences" @@ -25,7 +25,7 @@ https://accounts.secondlife.com/change_email/ layout="topleft" right="-105" name="OK" - top="473" + top="492" width="90"> <button.commit_callback function="Pref.OK" /> @@ -43,6 +43,42 @@ https://accounts.secondlife.com/change_email/ <button.commit_callback function="Pref.Cancel" /> </button> + + <panel + name="search_panel" + layout="topleft" + follows="left|top|right" + left="4" + right="-4" + top="21" + height="18" + tab_group="2"> + <search_editor + clear_button_visible="true" + follows="left|top|right" + height="18" + label="Search Settings" + layout="topleft" + left="0" + max_length_bytes="255" + name="search_prefs_edit" + right="-1" + text_pad_left="6" + tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the setting's name or comment." + top="0"> + <search_editor.commit_callback + function="UpdateFilter" /> + <search_editor.clear_button + rect.height="18" + rect.width="18" + rect.bottom="-1" /> + <search_editor.search_button + rect.height="12" + rect.width="12" + rect.bottom="-1" /> + </search_editor> + </panel> + <tab_container follows="all" halign="left" @@ -54,7 +90,7 @@ https://accounts.secondlife.com/change_email/ tab_position="left" tab_width="140" tab_padding_right="0" - top="21" + top="40" width="658"> <panel class="panel_preference" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index d9a15fed9e..0abee2ff80 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -915,7 +915,8 @@ name="Object Name" select_on_focus="true" top_delta="0" - width="170" /> + width="170" + tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe '|'." /> <text follows="left|top" height="10" @@ -933,7 +934,8 @@ name="Object Description" select_on_focus="true" top_delta="0" - width="170" /> + width="170" + tool_tip="When people have 'Hover Tips on All Objects' selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." /> <text type="string" left="10" @@ -1090,7 +1092,8 @@ layout="topleft" name="clickaction" width="130" - left_pad="10"> + left_pad="10" + tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts" > <combo_box.item label="Touch (default)" name="Touch/grab(default)" @@ -1126,7 +1129,8 @@ layout="topleft" name="checkbox for sale" left="7" - width="97" /> + width="97" + tool_tip="Lets people buy this object, its content or it copy inworld for specified price." /> <!-- NEW PRICE SPINNER Objects are allowed to be for sale for L$0 to invoke buy UI behavior even though the user gets a free copy. @@ -1144,7 +1148,8 @@ even though the user gets a free copy. width="85" min_val="0" height="20" - max_val="999999999" /> + max_val="999999999" + tool_tip="Object cost." /> <!-- NEW SALE TYPE COMBO BOX --> <combo_box left_pad="8" @@ -1157,7 +1162,8 @@ even though the user gets a free copy. max_chars="20" mouse_opaque="true" name="sale type" - width="89"> + width="89" + tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself." > <combo_box.item name="Copy" label="Copy" @@ -1219,6 +1225,7 @@ even though the user gets a free copy. label="Move" layout="topleft" name="checkbox allow everyone move" + tool_tip="Anyone can move the object." left="10" width="85" /> <check_box @@ -1227,6 +1234,7 @@ even though the user gets a free copy. layout="topleft" left_pad="0" name="checkbox allow everyone copy" + tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive." width="90" /> <text type="string" @@ -1244,6 +1252,7 @@ even though the user gets a free copy. left="10" height="10" name="checkbox next owner can modify" + tool_tip="Next owner can edit properties like item name or scale of this object." width="85" /> <check_box follows="left|top|right" @@ -1252,6 +1261,7 @@ even though the user gets a free copy. layout="topleft" left_pad="0" name="checkbox next owner can copy" + tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." width="80" /> <check_box follows="left|top|right" @@ -1261,7 +1271,7 @@ even though the user gets a free copy. name="checkbox next owner can transfer" left_pad="0" top_delta="0" - tool_tip="Next owner can give away or resell this object" + tool_tip="Next owner can give away or resell this object." width="100" /> <!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above, but that's OK, this is used only for debugging. --> diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml index 36ceddd305..b82fe43e74 100644 --- a/indra/newview/skins/default/xui/en/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_resize="true" - height="372" + height="350" layout="topleft" min_height="300" min_width="450" @@ -16,7 +16,7 @@ </floater.string> <floater.string name="top_scripts_text"> - [COUNT] scripts taking a total of [TIME] ms + [COUNT] scripts taking a total of [TIME] ms and using [MEMORY] KB </floater.string> <floater.string name="scripts_score_label"> @@ -273,28 +273,4 @@ <button.commit_callback function="TopObjects.ReturnAll" /> </button> - <button - follows="bottom|left" - height="23" - label="Disable Selected" - layout="topleft" - - left="112" - name="disable_selected_btn" - width="130"> - <button.commit_callback - function="TopObjects.DisableSelected" /> - </button> - <button - follows="bottom|left" - height="23" - label="Disable All" - layout="topleft" - left_pad="10" - name="disable_all_btn" - top_delta="0" - width="130"> - <button.commit_callback - function="TopObjects.DisableAll" /> - </button> </floater> diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 82027d9e7c..87c39b1024 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -9,6 +9,8 @@ <file>gulim.ttc</file> <file>simhei.ttf</file> <file>ArialUni.ttf</file> + <file>msyh.ttc</file> + <file load_collection="true">Cambria.ttc</file> </os> <os name="Mac"> <file>ヒラギノ角ゴシック W3.ttc</file> @@ -19,6 +21,8 @@ <file>AppleGothic.ttf</file> <file>AppleSDGothicNeo-Regular.otf</file> <file>华文细黑.ttf</file> + <file>PingFang.ttc</file> + <file>STIXGeneral.otf</file> </os> </font> diff --git a/indra/newview/skins/default/xui/en/language_settings.xml b/indra/newview/skins/default/xui/en/language_settings.xml index 51779e4bfd..d418fc38e3 100644 --- a/indra/newview/skins/default/xui/en/language_settings.xml +++ b/indra/newview/skins/default/xui/en/language_settings.xml @@ -42,6 +42,7 @@ <string name="TimeWeek">wkday,datetime,slt</string> <string name="TimeAMPM">ampm,datetime,slt</string> <string name="TimeHour12">hour12,datetime,slt</string> + <string name="TimeTimezone">timezone,datetime,slt</string> <string name="LTimeMthNum">mthnum,datetime,local</string> <string name="LTimeWeek">wkday,datetime,local</string> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 42744b561f..cac84cfccf 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -73,6 +73,13 @@ function="Floater.ToggleOrBringToFront" parameter="experiences"/> </menu_item_call> + <menu_item_call + label="My Scripts..." + name="MyScripts"> + <menu_item_call.on_click + function="Floater.ToggleOrBringToFront" + parameter="my_scripts"/> + </menu_item_call> <menu_item_separator/> <menu_item_call label="Camera Controls..." diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index d521074453..121914b1cb 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1845,7 +1845,7 @@ You are not allowed to terraform parcel [PARCEL]. name="CannotCopyWarning" type="alertmodal"> You do not have permission to copy the following items: -[ITEMS] +<nolink>[ITEMS]</nolink> and will lose it from your inventory if you give it away. Do you really want to offer these items? <tag>confirm</tag> <usetemplate @@ -7791,28 +7791,6 @@ Do not allow access if you do not fully understand why it wants access to your a </footer> </notification> - <notification - icon="notify.tga" - name="UnknownScriptQuestion" - persist="false" - type="notify"> -The runtime script permission requested by '<nolink>[OBJECTNAME]</nolink>', an object owned by '[NAME]', isn't recognized by the viewer and can't be granted. - -To grant this permission please update your viewer to the latest version from [DOWNLOADURL]. - <tag>confirm</tag> - <form name="form"> - <button - default="true" - index="1" - name="Deny" - text="Ok"/> - <button - index="2" - name="Mute" - text="Block"/> - </form> - </notification> - <notification icon="notify.tga" name="ScriptDialog" @@ -9504,7 +9482,7 @@ You Can't create trees and grass on land you don't own. name="NoCopyPermsNoObject" type="notify"> <tag>fail</tag> -Copy failed because you lack permission to copy the object '[OBJ_NAME]'. +Copy failed because you lack permission to copy the object <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification @@ -9512,7 +9490,7 @@ Copy failed because you lack permission to copy the object '[OBJ_NAME]'. name="NoTransPermsNoObject" type="notify"> <tag>fail</tag> -Copy failed because the object '[OBJ_NAME]' cannot be transferred to you. +Copy failed because the object <nolink>'[OBJ_NAME]'</nolink> cannot be transferred to you. </notification> <notification @@ -9520,7 +9498,7 @@ Copy failed because the object '[OBJ_NAME]' cannot be transferred to you. name="AddToNavMeshNoCopy" type="notify"> <tag>fail</tag> -Copy failed because the object '[OBJ_NAME]' contributes to navmesh. +Copy failed because the object <nolink>'[OBJ_NAME]'</nolink> contributes to navmesh. </notification> <notification @@ -9644,7 +9622,7 @@ Save Back To Inventory has been disabled. name="NoExistNoSaveToContents" type="notify"> <tag>fail</tag> -Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed from no longer exists. +Cannot save <nolink>'[OBJ_NAME]'</nolink> to object contents because the object it was rezzed from no longer exists. </notification> <notification @@ -9652,7 +9630,7 @@ Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed fro name="NoModNoSaveToContents" type="notify"> <tag>fail</tag> -Cannot save '[OBJ_NAME]' to object contents because you do not have permission to modify the object '[DEST_NAME]'. +Cannot save <nolink>'[OBJ_NAME]'</nolink> to object contents because you do not have permission to modify the object <nolink>'[DEST_NAME]'</nolink>. </notification> <notification @@ -9660,7 +9638,7 @@ Cannot save '[OBJ_NAME]' to object contents because you do not have permission t name="NoSaveBackToInvDisabled" type="notify"> <tag>fail</tag> -Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled. +Cannot save <nolink>'[OBJ_NAME]'</nolink> back to inventory -- this operation has been disabled. </notification> <notification @@ -9668,7 +9646,7 @@ Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled. name="NoCopyNoSelCopy" type="notify"> <tag>fail</tag> -You cannot copy your selection because you do not have permission to copy the object '[OBJ_NAME]'. +You cannot copy your selection because you do not have permission to copy the object <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification @@ -9676,7 +9654,7 @@ You cannot copy your selection because you do not have permission to copy the ob name="NoTransNoSelCopy" type="notify"> <tag>fail</tag> -You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable. +You cannot copy your selection because the object <nolink>'[OBJ_NAME]'</nolink> is not transferrable. </notification> <notification @@ -9684,7 +9662,7 @@ You cannot copy your selection because the object '[OBJ_NAME]' is not transferra name="NoTransNoCopy" type="notify"> <tag>fail</tag> -You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable. +You cannot copy your selection because the object <nolink>'[OBJ_NAME]'</nolink> is not transferrable. </notification> <notification @@ -9692,7 +9670,7 @@ You cannot copy your selection because the object '[OBJ_NAME]' is not transferra name="NoPermsNoRemoval" type="notify"> <tag>fail</tag> -Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permissions system. +Removal of the object <nolink>'[OBJ_NAME]'</nolink> from the simulator is disallowed by the permissions system. </notification> <notification @@ -9700,7 +9678,7 @@ Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permi name="NoModNoSaveSelection" type="notify"> <tag>fail</tag> -Cannot save your selection because you do not have permission to modify the object '[OBJ_NAME]'. +Cannot save your selection because you do not have permission to modify the object <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification @@ -9708,7 +9686,7 @@ Cannot save your selection because you do not have permission to modify the obje name="NoCopyNoSaveSelection" type="notify"> <tag>fail</tag> -Cannot save your selection because the object '[OBJ_NAME]' is not copyable. +Cannot save your selection because the object <nolink>'[OBJ_NAME]'</nolink> is not copyable. </notification> <notification @@ -9716,7 +9694,7 @@ Cannot save your selection because the object '[OBJ_NAME]' is not copyable. name="NoModNoTaking" type="notify"> <tag>fail</tag> -You cannot take your selection because you do not have permission to modify the object '[OBJ_NAME]'. +You cannot take your selection because you do not have permission to modify the object <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 26f54bacbc..e34335a2af 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -214,7 +214,7 @@ Hover your mouse over the options for more help. layout="topleft" left="10" name="group_mature_check" - tool_tip="Sets whether your group contains information rated as Moderate" + tool_tip="Maturity ratings designate the type of content and behavior allowed in a group" top_pad="4" width="190"> <combo_item name="select_mature" value="Select"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 9da044ab64..335d7caa51 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -32,11 +32,6 @@ width="200"> <combo_box.item enabled="true" - label="System default" - name="System Default Language" - value="default" /> - <combo_box.item - enabled="true" label="English" name="English" value="en" /> diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 998f1ce599..52bcce01f7 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -34,6 +34,46 @@ L$ [AMT] </panel.string> <panel + height="18" + left="-458" + top="0" + width="120" + follows="right|top" + name="menu_search_panel" + background_opaque="true" + background_visible="true" + bg_opaque_color="MouseGray"> + <search_editor + clear_button_visible="true" + follows="left|top" + height="18" + label="Search Menus" + layout="topleft" + left="0" + max_length_bytes="255" + name="search_menu_edit" + right="-1" + text_pad_left="6" + tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the menu." + top="0"> + <search_button + top_pad="4" + left_pad="4" + width="12" + height="12" + image_unselected="Search" + image_selected="Search"/> + <clear_button + bottom="2" + height="12" + image_unselected="Icon_Close_Foreground" + image_selected="Icon_Close_Press" + pad_right="4" + pad_left="4" + width="12"/> + </search_editor> + </panel> + <panel height="18" left="-416" width="185" diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index fd14b13ed6..acb6f5b42a 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -130,7 +130,8 @@ max_length_bytes="63" name="LabelItemName" top_delta="0" - width="210" /> + width="210" + tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe '|'." /> <text type="string" length="1" @@ -153,7 +154,8 @@ max_length_bytes="127" name="LabelItemDesc" top_delta="-5" - width="210" /> + width="210" + tool_tip="When people have 'Hover Tips on All Objects' selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." /> <text type="string" length="1" @@ -351,6 +353,7 @@ layout="topleft" left_pad="0" name="CheckEveryoneCopy" + tool_tip="Anyone can take a copy of the object . Object and all of its contents must be copy and transfer permissive." top_delta="-2" width="150" /> <text @@ -394,6 +397,7 @@ left="20" top_pad="0" name="CheckNextOwnerModify" + tool_tip="Next owner can edit properties like item name or scale of this object." width="90" /> <check_box height="18" @@ -401,6 +405,7 @@ layout="topleft" left_pad="0" name="CheckNextOwnerCopy" + tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." width="90" /> <check_box height="18" @@ -408,7 +413,7 @@ layout="topleft" left_pad="0" name="CheckNextOwnerTransfer" - tool_tip="Next owner can give away or resell this object" + tool_tip="Next owner can give away or resell this object." width="106" /> </panel> <check_box @@ -418,14 +423,16 @@ left="20" name="CheckPurchase" top_pad="20" - width="100" /> + width="100" + tool_tip="Lets people buy this object, its content or it copy inworld for specified price." /> <combo_box height="23" left_pad="0" layout="topleft" follows="left|top" name="ComboBoxSaleType" - width="170"> + width="170" + tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself." > <combo_box.item name="Copy" label="Copy" @@ -452,7 +459,8 @@ min_val="0" height="23" max_val="999999999" - top_pad="10"/> + top_pad="10" + tool_tip="Object cost." /> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index efedb9559e..8a3e18707f 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -130,7 +130,8 @@ max_length_bytes="63" name="Object Name" top_delta="0" - width="225" /> + width="225" + tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe '|'." /> <text type="string" length="1" @@ -154,7 +155,8 @@ left_delta="78" max_length_bytes="127" top_delta="-5" - width="225"/> + width="225" + tool_tip="When people have 'Hover Tips on All Objects' selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." /> <text type="string" length="1" @@ -271,23 +273,24 @@ layout="topleft" name="clickaction" width="168" - left="81"> + left="81" + tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts" > <combo_box.item label="Touch (default)" name="Touch/grab(default)" - value="Touch" /> + value="Touch" /> <combo_box.item label="Sit on object" name="Sitonobject" - value="Sit" /> + value="Sit" /> <combo_box.item label="Buy object" name="Buyobject" - value="Buy" /> + value="Buy" /> <combo_box.item label="Pay object" name="Payobject" - value="Pay" /> + value="Pay" /> <combo_box.item label="Open" name="Open" @@ -344,6 +347,7 @@ layout="topleft" left_pad="0" name="checkbox allow everyone copy" + tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive." top_delta="-2" width="90" /> <check_box @@ -351,6 +355,7 @@ label="Move" layout="topleft" name="checkbox allow everyone move" + tool_tip="Anyone can move the object." left_pad="0" width="150" /> <text @@ -394,6 +399,7 @@ left="20" top_pad="0" name="checkbox next owner can modify" + tool_tip="Next owner can edit properties like item name or scale of this object." width="90" /> <check_box height="18" @@ -401,6 +407,7 @@ layout="topleft" left_pad="0" name="checkbox next owner can copy" + tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." width="90" /> <check_box height="18" @@ -418,14 +425,16 @@ left="20" name="checkbox for sale" top_pad="10" - width="100" /> + width="100" + tool_tip="Lets people buy this object, its content or it copy inworld for specified price." /> <combo_box height="23" left_pad="0" layout="topleft" follows="left|top" - name="sale type" - width="170"> + name="sale type" + width="170" + tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself."> <combo_box.item name="Copy" label="Copy" @@ -452,7 +461,8 @@ width="150" min_val="1" height="20" - max_val="999999999" /> + max_val="999999999" + tool_tip="Object cost." /> <check_box height="20" width="110" @@ -569,7 +579,8 @@ left="5" name="open_btn" top="0" - width="73" /> + width="73" + tool_tip="Open to view the Object Contents." /> <button follows="bottom|left" height="23" @@ -578,7 +589,8 @@ left_pad="5" name="pay_btn" top="0" - width="73" /> + width="73" + tool_tip="Open Pay Window. Object must have pay script for this to work." /> <button follows="bottom|left" height="23" @@ -587,7 +599,8 @@ left_pad="5" name="buy_btn" top="0" - width="73" /> + width="73" + tool_tip="Open Buy Window. Requires the object to be set for sale." /> <button follows="bottom|left" height="23" @@ -596,7 +609,8 @@ left_pad="5" name="details_btn" top="0" - width="74" /> + width="74" + tool_tip="Open Inspect Object Window." /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index f5f4b4acab..d91f3ac095 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2675,14 +2675,14 @@ If you continue to receive this message, please contact Second Life support for <string name="SITTING_ON">Sitting On</string> <string name="ATTACH_CHEST">Chest</string> - <string name="ATTACH_HEAD">Head</string> + <string name="ATTACH_HEAD">Skull</string> <string name="ATTACH_LSHOULDER">Left Shoulder</string> <string name="ATTACH_RSHOULDER">Right Shoulder</string> <string name="ATTACH_LHAND">Left Hand</string> <string name="ATTACH_RHAND">Right Hand</string> <string name="ATTACH_LFOOT">Left Foot</string> <string name="ATTACH_RFOOT">Right Foot</string> - <string name="ATTACH_BACK">Back</string> + <string name="ATTACH_BACK">Spine</string> <string name="ATTACH_PELVIS">Pelvis</string> <string name="ATTACH_MOUTH">Mouth</string> <string name="ATTACH_CHIN">Chin</string> @@ -2692,16 +2692,16 @@ If you continue to receive this message, please contact Second Life support for <string name="ATTACH_REYE">Right Eye</string> <string name="ATTACH_NOSE">Nose</string> <string name="ATTACH_RUARM">Right Upper Arm</string> - <string name="ATTACH_RLARM">Right Lower Arm</string> + <string name="ATTACH_RLARM">Right Forearm</string> <string name="ATTACH_LUARM">Left Upper Arm</string> - <string name="ATTACH_LLARM">Left Lower Arm</string> + <string name="ATTACH_LLARM">Left Forearm</string> <string name="ATTACH_RHIP">Right Hip</string> <string name="ATTACH_RULEG">Right Upper Leg</string> <string name="ATTACH_RLLEG">Right Lower Leg</string> <string name="ATTACH_LHIP">Left Hip</string> <string name="ATTACH_LULEG">Left Upper Leg</string> <string name="ATTACH_LLLEG">Left Lower Leg</string> - <string name="ATTACH_BELLY">Belly</string> + <string name="ATTACH_BELLY">Stomach</string> <string name="ATTACH_LEFT_PEC">Left Pec</string> <string name="ATTACH_RIGHT_PEC">Right Pec</string> <string name="ATTACH_HUD_CENTER_2">HUD Center 2</string> @@ -4233,4 +4233,29 @@ Try enclosing path to the editor with double quotes. The physics shape does not have correct version. Set the correct version for the physics model. </string> + <!-- CURL error messages --> + <string name="couldnt_resolve_host"> +DNS could not resolve the host name([HOSTNAME]). +Please verify that you can connect to the www.secondlife.com +web site. If you can, but continue to receive this error, +please go to the support section and report this problem. + </string> + <string name="ssl_peer_certificate"> +The login server couldn't verify itself via SSL. +If you continue to receive this error, please go +to the Support section of the SecondLife.com web site +and report the problem. + </string> + <string name="ssl_connect_error"> +Often this means that your computer's clock is set incorrectly. +Please go to Control Panels and make sure the time and date +are set correctly. +Also check that your network and firewall are set up correctly. +If you continue to receive this error, please go +to the Support section of the SecondLife.com web site +and report the problem. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge Base] + </string> + </strings> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 18703761ec..92c3864f62 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -243,6 +243,10 @@ La inicialización del mercado ha fallado por un error del sistema o de la red. Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + No es posible ejecutar varios visores Second Life ya que esta funcionalidad no es compatible. Puede provocar problemas de caché en la textura, imágenes degradadas o alteradas y un bajo rendimiento. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso. ¿Quieres conceder permisos de modificación a [NAME]? @@ -713,8 +717,9 @@ La calidad gráfica puede ajustarse en Preferencias > Gráficos. No tienes permiso para modificar el terreno de la parcela [PARCEL]. </notification> <notification name="CannotCopyWarning"> - No tienes permiso para copiar los elementos siguientes: -[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos? + No tienes permiso para copiar los elementos siguientes: +<nolink>[ITEMS]</nolink> +y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos? <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/> </notification> <notification name="CannotGiveItem"> @@ -3708,13 +3713,13 @@ no está en la misma región que tú. No puedes crear árboles y hierba en un terreno que no es tuyo. </notification> <notification name="NoCopyPermsNoObject"> - Error al copiar: careces de permiso para copiar el objeto '[OBJ_NAME]'. + Error al copiar porque no tienes permiso para copiar el objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - Error al copiar: no se te puede transferir el objeto '[OBJ_NAME]'. + Error al copiar porque no puedes recibir una transferencia del objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="AddToNavMeshNoCopy"> - Error al copiar porque el objeto '[OBJ_NAME]' contribuye al navmesh. + Error al copiar porque el objeto <nolink>'[OBJ_NAME]'</nolink> contribuye a navmesh. </notification> <notification name="DupeWithNoRootsSelected"> Duplicación sin objetos raíz seleccionados. @@ -3759,34 +3764,34 @@ Prueba otra vez dentro de un minuto. Se ha deshabilitado Devolver el objeto a mi inventario. </notification> <notification name="NoExistNoSaveToContents"> - No se puede guardar '[OBJ_NAME]' en el contenido del objeto porque el objeto desde el cual ha sido colocado ya no existe. + No se puede guardar <nolink>'[OBJ_NAME]'</nolink> en los contenidos del objeto porque el objeto a partir del cual fue creado ya no existe. </notification> <notification name="NoModNoSaveToContents"> - No se puede guardar '[OBJ_NAME]' en el contenido del objeto porque no tienes permiso para modificar el objeto '[DEST_NAME]'. + No se puede guardar <nolink>'[OBJ_NAME]'</nolink> en los contenidos del objeto porque no tienes permiso para modificar el objeto <nolink>'[DEST_NAME]'</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - No se puede guardar '[OBJ_NAME]' de nuevo en el inventario; esta operación está desactivada. + No se puede volver a guardar <nolink>'[OBJ_NAME]'</nolink> en el inventario. Esta operación fue desactivada. </notification> <notification name="NoCopyNoSelCopy"> - No se puede copiar tu selección porque no tienes permiso para copiar el objeto '[OBJ_NAME]'. + No puedes copiar el elemento seleccionado porque no tienes permiso para copiar el objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - No se puede copiar tu selección porque el objeto '[OBJ_NAME]' es intransferible. + No puedes copiar el elemento seleccionado porque el objeto <nolink>'[OBJ_NAME]'</nolink> no es transferible. </notification> <notification name="NoTransNoCopy"> - No se puede copiar tu selección porque el objeto '[OBJ_NAME]' es intransferible. + No puedes copiar el elemento seleccionado porque el objeto <nolink>'[OBJ_NAME]'</nolink> no es transferible. </notification> <notification name="NoPermsNoRemoval"> - El sistema de permisos no admite la eliminación del objeto '[OBJ_NAME]' del simulador. + El sistema de permisos no autoriza quitar el objeto <nolink>'[OBJ_NAME]'</nolink> del simulador. </notification> <notification name="NoModNoSaveSelection"> - No se puede guardar tu selección porque no tienes permiso para modificar el objeto '[OBJ_NAME]'. + No puedes guardar el elemento seleccionado porque no tienes permiso para modificar el objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - No se puede guardar tu selección porque el objeto '[OBJ_NAME]' no se puede copiar. + No puedes guardar el elemento seleccionado porque el objeto <nolink>'[OBJ_NAME]'</nolink> no puede ser copiado. </notification> <notification name="NoModNoTaking"> - No se puede aceptar tu selección porque no tienes permiso para modificar el objeto '[OBJ_NAME]'. + No puedes tomar el elemento seleccionado porque no tienes permiso para modificar el objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> Error interno: tipo de destino desconocido. diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml index 7d3c33a781..d2246630d8 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -4,7 +4,6 @@ Idioma: </text> <combo_box name="language_combobox"> - <combo_box.item label="Predeterminado del sistema" name="System Default Language"/> <combo_box.item label="English (Inglés)" name="English"/> <combo_box.item label="Dansk (danés) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 36a2711a5c..15e3c0622d 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -5651,4 +5651,25 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="Mav_Details_MAV_UNKNOWN_VERSION"> La versión de la forma física no es correcta. Configura la versión correcta del modelo físico. </string> + <string name="couldnt_resolve_host"> + Error de DNS al resolver el nombre del host([HOSTNAME]). +Por favor verifica si puedes conectarte al sitio web www.secondlife.com. +Si puedes conectarte, pero aún recibes este error, por favor accede a +la sección Soporte y genera un informe del problema. + </string> + <string name="ssl_peer_certificate"> + El servidor de inicio de sesión no pudo verificarse vía SSL. +Si aún recibes este error, por favor accede a +la sección Soporte del sitio web Secondlife.com +y genera un informe del problema. + </string> + <string name="ssl_connect_error"> + En general esto significa que el horario de tu computadora no está bien configurado. +Por favor accede al Panel de control y asegúrate de que la hora y la fecha estén +bien configurados. Verifica también que tu red y tu cortafuegos estén bien +configurados. Si aún recibes este error, por favor accede a la sección Soporte +del sitio web Secondlife.com y genera un informe del problema. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conocimientos] + </string> </strings> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 62237221dd..1e6c481293 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -244,6 +244,10 @@ Veuillez ne sélectionner qu'un seul objet. Remarque : si vous activez cette option, toutes les personnes utilisant cet ordinateur pourront voir votre liste d'endroits favoris. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + L'exécution de plusieurs visualiseurs Second Life n'est pas prise en charge. Cela peut entraîner des collisions de cache de texture, une corruption et une dégradation des visuels et des performances. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Lorsque vous accordez des droits de modification à un autre résident, vous lui permettez de changer, supprimer ou prendre n'importe lequel de vos objets dans Second Life. Réfléchissez bien avant d'accorder ces droits. Voulez-vous vraiment accorder des droits de modification à [NAME] ? @@ -717,9 +721,9 @@ La qualité des graphiques peut être augmentée à la section Préférences > Vous n'êtes pas autorisé(e) à terraformer la parcelle [PARCEL]. </notification> <notification name="CannotCopyWarning"> - Vous n'êtes pas autorisé à copier les articles suivants : -[ITEMS]. -Ceux-ci disparaîtront donc de votre inventaire si vous les donnez. Voulez-vous vraiment offrir ces articles ? + Vous n'êtes pas autorisé à copier les objets suivants : +<nolink>[ITEMS]</nolink> +et il disparaîtra de votre inventaire si vous le donnez. Voulez-vous vraiment offrir ces articles ? <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> </notification> <notification name="CannotGiveItem"> @@ -2943,7 +2947,7 @@ Si vous restez dans cette région, vous serez déconnecté(e). Si vous restez dans cette région, vous serez déconnecté(e). </notification> <notification name="LoadWebPage"> - Charger la page Web [URL] ? +Charger la page Web [URL] ? [MESSAGE] @@ -3711,13 +3715,13 @@ il ne se trouve pas dans la même région que vous. Vous ne pouvez pas créer d'arbres ni d'herbe sur un terrain qui ne vous appartient pas. </notification> <notification name="NoCopyPermsNoObject"> - Échec de la copie car vous ne disposez pas des droits requis pour copier l'objet [OBJ_NAME]. + La copie a échoué car vous ne disposez pas de l'autorisation nécessaire pour copier l'objet <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - Échec de la copie car l'objet [OBJ_NAME] ne peut pas vous être transféré. + La copie a échoué car l'objet <nolink>'[OBJ_NAME]'</nolink> ne peut pas vous être transféré. </notification> <notification name="AddToNavMeshNoCopy"> - Échec de la copie car l'objet [OBJ_NAME] contribue au maillage de navigation. + La copie a échoué car l'objet <nolink>'[OBJ_NAME]'</nolink> contribue à navmesh. </notification> <notification name="DupeWithNoRootsSelected"> Dupliquer sans objet racine sélectionné @@ -3762,34 +3766,34 @@ Veuillez réessayer dans une minute. Le réenregistrement dans l'inventaire a été désactivé. </notification> <notification name="NoExistNoSaveToContents"> - Impossible d'enregistrer [OBJ_NAME] dans le contenu des objets car l'objet à partir duquel il a été rezzé n'existe plus. + Impossible de sauvegarder <nolink>'[OBJ_NAME]'</nolink> dans le contenu de l'objet car l'objet à partir duquel il a été rezzé n'existe plus. </notification> <notification name="NoModNoSaveToContents"> - Impossible d'enregistrer [OBJ_NAME] dans le contenu des objets car vous ne disposez pas des droits requis pour modifier l'objet [DEST_NAME]. + Impossible de sauvegarder<nolink>'[OBJ_NAME]'</nolink> dans le contenu de l'objet car vous n'êtes pas autorisé à modifier l'objet <nolink>'[DEST_NAME]'</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - Impossible de réenregistrer [OBJ_NAME] dans l'inventaire -- cette opération a été désactivée. + Impossible de sauvegarder <nolink>'[OBJ_NAME]'</nolink> dans l'inventaire - cette opération a été désactivée. </notification> <notification name="NoCopyNoSelCopy"> - Vous ne pouvez pas copier votre sélection car vous n'avez pas le droit de copier l'objet [OBJ_NAME]. + Vous ne pouvez pas copier votre sélection parce que vous n'êtes pas autorisé à copier l'objet <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - Vous ne pouvez pas copier votre sélection car l'objet [OBJ_NAME] n'est pas transférable. + Vous ne pouvez pas copier votre sélection parce que l'objet <nolink>'[OBJ_NAME]'</nolink> n'est pas transférable. </notification> <notification name="NoTransNoCopy"> - Vous ne pouvez pas copier votre sélection car l'objet [OBJ_NAME] n'est pas transférable. + Vous ne pouvez pas copier votre sélection parce que l'objet <nolink>'[OBJ_NAME]'</nolink> n'est pas transférable. </notification> <notification name="NoPermsNoRemoval"> - La suppression de l'objet [OBJ_NAME] du simulateur n'est pas autorisée par le système de droits. + La suppression de l'objet <nolink>'[OBJ_NAME]'</nolink> du simulateur n'est pas autorisée par le système d'autorisations. </notification> <notification name="NoModNoSaveSelection"> - Vous ne pouvez pas enregistrer votre sélection car vous n'avez pas le droit de modifier l'objet [OBJ_NAME]. + Impossible de sauvegarder votre sélection parce que vous n'êtes pas autorisé à modifier l'objet <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - Vous ne pouvez pas enregistrer votre sélection car l'objet [OBJ_NAME] ne peut pas être copié. + Impossible d'enregistrer votre sélection car l'objet <nolink>'[OBJ_NAME]'</nolink> n'est pas copiable. </notification> <notification name="NoModNoTaking"> - Vous ne pouvez pas prendre votre sélection car vous n'avez pas le droit de modifier l'objet [OBJ_NAME]. + Vous ne pouvez pas sauvegarder votre sélection parce que vous n'êtes pas autorisé à modifier l'objet <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> Erreur interne : type de destination inconnue. diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml index 11b1bd9b87..b75567a40f 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml @@ -4,7 +4,6 @@ Langue : </text> <combo_box name="language_combobox"> - <combo_box.item label="Choix par défaut" name="System Default Language"/> <combo_box.item label="English (Anglais)" name="English"/> <combo_box.item label="Dansk (Danois) - Bêta" name="Danish"/> <combo_box.item label="Deutsch (Allemand) - Bêta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 7f5851b51d..13dd2b3640 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -5741,4 +5741,25 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <string name="Mav_Details_MAV_UNKNOWN_VERSION"> La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique. </string> + <string name="couldnt_resolve_host"> + DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]). +Veuillez vérifier que vous parvenez à vous connecter au site www.secondlife.com. +Si c'est le cas, et que vous continuez à recevoir ce message d'erreur, veuillez vous +rendre à la section Support et signaler ce problème + </string> + <string name="ssl_peer_certificate"> + Le serveur d'identification a rencontré une erreur de connexion SSL. +Si vous continuez à recevoir ce message d'erreur, +veuillez vous rendre à la section Support du site web +SecondLife.com et signaler ce problème + </string> + <string name="ssl_connect_error"> + Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur. +Veuillez aller à Tableaux de bord et assurez-vous que l'heure et la date sont réglés +correctement. Vérifiez également que votre réseau et votre pare-feu sont configurés +correctement. Si vous continuez à recevoir ce message d'erreur, veuillez vous rendre +à la section Support du site web SecondLife.com et signaler ce problème. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances] + </string> </strings> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 0abcde80e0..0175275eb3 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -244,6 +244,10 @@ Scegli solo un oggetto e riprova. Nota: Se attivi questa opzione, chiunque usa questo computer può vedere l'elenco di luoghi preferiti. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + Non è possibile utilizzare più di un viewer Second Life contemporaneamente. L’utilizzo simultaneo potrebbe portare a collisioni o corruzione della cache texture, e ad un peggioramento nelle immagini e nella performance. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare, eliminare o prendere QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto. Vuoi concedere i diritti di modifica a [NAME]? @@ -716,8 +720,8 @@ La qualità grafica può essere aumentata in Preferenze > Grafica. </notification> <notification name="CannotCopyWarning"> Non hai l'autorizzazione a copiare i seguenti oggetti: -[ITEMS] -e se li dai via, verranno eliminati dal tuo inventario. Sicuro di volere offrire questi oggetti? +<nolink>[ITEMS]</nolink> +e se li dai via, verranno eliminati dal tuo inventario. Sicuro di voler offrire questi oggetti? <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/> </notification> <notification name="CannotGiveItem"> @@ -3715,13 +3719,13 @@ non è nella stessa regione in cui ti trovi. Non puoi creare alberi ed erba su terreni che non sono di tua proprietà. </notification> <notification name="NoCopyPermsNoObject"> - Copia non riuscita perché non hai l'autorizzazione necessaria per copiare l'oggetto '[OBJ_NAME]'. + Copia non riuscita perché non hai il permesso per copiare l’oggetto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - La copia non è riuscita perché '[OBJ_NAME]' non può essere trasferito a te. + Copia non riuscita perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> non può esserti trasferito. </notification> <notification name="AddToNavMeshNoCopy"> - La copia non è riuscita perché '[OBJ_NAME]' contribuisce al navmesh. + Copia non riuscita perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> contribuisce al navmesh. </notification> <notification name="DupeWithNoRootsSelected"> Duplicato senza oggetto principale selezionato. @@ -3766,34 +3770,34 @@ Riprova tra un minuto. Opzione Salva nell'inventario disattivata </notification> <notification name="NoExistNoSaveToContents"> - Impossibile salvare '[OBJ_NAME]' nei contenuti dell'oggetto perché l'oggetto da cui è stato razzato non esiste più. + Impossibile salvare <nolink>'[OBJ_NAME]'</nolink> in contenuti oggetto perché l’oggetto da cui è stato rezzato non esiste più. </notification> <notification name="NoModNoSaveToContents"> - Impossibile salvare '[OBJ_NAME]' nei contenuti dell'oggetto perché non hai l'autorizzazione necessaria per modificare l'oggetto '[DEST_NAME]'. + Impossibile salvare <nolink>'[OBJ_NAME]'</nolink> in contenuti oggetto perché non hai i permessi per modificare l’oggetto <nolink>'[DEST_NAME]’</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - Impossibile riportare '[OBJ_NAME]' nell'inventario -- questa operazione è stata disattivata. + Impossibile salvare <nolink>'[OBJ_NAME]'</nolink> nell’inventario: questa operazione è stata disabilitata. </notification> <notification name="NoCopyNoSelCopy"> - Non puoi copiare l'elemento selezionato perché non hai l'autorizzazione necessaria per copiare l'oggetto '[OBJ_NAME]'. + Non puoi copiare la selezione perché non hai il permesso di copiare l’oggetto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - Non puoi copiare la selezione perché l'oggetto '[OBJ_NAME]' non può essere trasferito. + Non puoi copiare la selezione perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> non è trasferibile. </notification> <notification name="NoTransNoCopy"> - Non puoi copiare la selezione perché l'oggetto '[OBJ_NAME]' non può essere trasferito. + Non puoi copiare la selezione perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> non è trasferibile. </notification> <notification name="NoPermsNoRemoval"> - La rimozione dell'oggetto '[OBJ_NAME]' dal simulatore non è consentita dal sistema delle autorizzazioni. + La rimozione dell’oggetto <nolink>'[OBJ_NAME]'</nolink> dal simulatore è disattivata dal sistema dei permessi. </notification> <notification name="NoModNoSaveSelection"> - Non puoi salvare l'elemento selezionato perché non hai l'autorizzazione necessaria per modificare l'oggetto '[OBJ_NAME]'. + Non puoi copiare la selezione perché non hai il permesso di modificare l’oggetto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - Non puoi salvare la selezione perché l'oggetto '[OBJ_NAME]' non può essere copiato. + Non puoi copiare la selezione perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> non è copiabile. </notification> <notification name="NoModNoTaking"> - Non puoi prendere l'elemento selezionato perché non hai l'autorizzazione necessaria per modificare l'oggetto '[OBJ_NAME]'. + Non puoi prendere ciò che hai selezionato perché non hai il permesso di modificare l’oggetto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> Errore interno: Tipo di destinazione sconosciuto. diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml index ef999d03c0..49edc0aa12 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml @@ -4,7 +4,6 @@ Lingua: </text> <combo_box name="language_combobox"> - <combo_box.item label="Default di sistema" name="System Default Language"/> <combo_box.item label="English" name="English"/> <combo_box.item label="Dansk (Danese) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Tedesco) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 918e655ab6..be3acc14b3 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -5656,4 +5656,25 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="Mav_Details_MAV_UNKNOWN_VERSION"> La versione della forma fisica non è corretta. Imposta la versione corretta per il modello della fisica. </string> + <string name="couldnt_resolve_host"> + Il DNS non ha potuto risolvere il nome dell’host([HOSTNAME]). +Verifica di riuscire a connetterti al sito web www.secondlife.com. +Se riesci ma continui a ricevere questo errore, visita la sezione +Assistenza e segnala il problema. + </string> + <string name="ssl_peer_certificate"> + Il server per il login non ha potuto effettuare la verifica tramite SSL. +Se continui a ricevere questo errore, visita +la sezione Assistenza nel sito SecondLife.com +e segnala il problema. + </string> + <string name="ssl_connect_error"> + Spesso l’errore è dovuto all’orologio del computer, impostato incorrettamente. +Vai al Pannello di Controllo e assicurati che data e ora siano +esatte. Controlla anche che il network e il firewall siano impostati +correttamente. Se continui a ricevere questo errore, visita la sezione +Assistenza nel sito SecondLife.com e segnala il problema. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base conoscenze] + </string> </strings> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index abd9515e34..315e35bc41 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -244,6 +244,10 @@ 注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。 <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + 複数の Second Life ビューワを実行することはサポートされていません。テクスチャキャッシュのコリジョンや破損、およびビジュアルとパフォーマンスの低下につながる恐れがあります。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。 [NAME] に修正権限を与えますか? @@ -735,7 +739,9 @@ L$ が不足しているのでこのグループに参加することができ あなたには [PARCEL] 区画を地形編集する許可がありません。 </notification> <notification name="CannotCopyWarning"> - あなたには[ITEMS]というアイテムをコピーする許可がありません。他の住人に提供すると、そのアイテムはあなたのインベントリから削除されます。本当にこれらのアイテムを譲りますか? + あなたには次アイテムをコピーする権限がありません: +<nolink>[ITEMS]</nolink> +他の住人に譲ると、そのアイテムはあなたの持ち物から削除されます。本当にこれらのアイテムを譲りますか? <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/> </notification> <notification name="CannotGiveItem"> @@ -3752,13 +3758,13 @@ M キーを押して変更します。 所有していない土地に木や草を植えることはできません。 </notification> <notification name="NoCopyPermsNoObject"> - オブジェクト '[OBJ_NAME]' をコピーする権限がないため、コピーに失敗しました。 + あなたにはオブジェクト <nolink>'[OBJ_NAME]'</nolink> をコピーする権限がないため、コピーに失敗しました。 </notification> <notification name="NoTransPermsNoObject"> - オブジェクト '[OBJ_NAME]' をあなたに転送できないため、コピーに失敗しました。 + オブジェクト <nolink>'[OBJ_NAME]'</nolink> はあなたに譲渡できないため、コピーに失敗しました。 </notification> <notification name="AddToNavMeshNoCopy"> - オブジェクト '[OBJ_NAME]' がナビメッシュに貢献しているため、コピーに失敗しました。 + オブジェクト <nolink>'[OBJ_NAME]'</nolink> は navmesh に関連があるため、コピーに失敗しました。 </notification> <notification name="DupeWithNoRootsSelected"> ルートオブジェクトを選択せずに複製します。 @@ -3803,34 +3809,34 @@ M キーを押して変更します。 「「持ち物」に保存」が無効になっています。 </notification> <notification name="NoExistNoSaveToContents"> - '[OBJ_NAME]' の Rez 元であるオブジェクトが存在しないため、このオブジェクトをオブジェクトコンテンツに保存できません。 + 「存在しません」から rez されたため、<nolink>'[OBJ_NAME]'</nolink> をオブジェクトの中身に保存できませんでした。 </notification> <notification name="NoModNoSaveToContents"> - オブジェクト '[DEST_NAME]' を修正する権限がないため、オブジェクトのコンテンツに '[OBJ_NAME]' を保存できません。 + あなたにはオブジェクト <nolink>'[DEST_NAME]'</nolink> を修正する権限がないため、<nolink>'[OBJ_NAME]'</nolink>をオブジェクトの中身に保存できませんでした。 </notification> <notification name="NoSaveBackToInvDisabled"> - インベントリに '[OBJ_NAME]' を保存することはできません - この操作が無効になっています。 + <nolink>'[OBJ_NAME]'</nolink> をインベントリに保存できません。この操作は無効になりました。 </notification> <notification name="NoCopyNoSelCopy"> - オブジェクト '[OBJ_NAME]' を変更する権限を持っていないため、選択したものをコピーできません。 + あなたにはオブジェクト <nolink>'[OBJ_NAME]'</nolink> をコピーする権限がないため、選択内容をコピーできません。 </notification> <notification name="NoTransNoSelCopy"> - オブジェクト '[OBJ_NAME]' を転送できないため、選択したものをコピーできません。 + オブジェクト <nolink>'[OBJ_NAME]'</nolink> を譲渡できないため、選択内容をコピーできません。 </notification> <notification name="NoTransNoCopy"> - オブジェクト '[OBJ_NAME]' を転送できないため、選択したものをコピーできません。 + オブジェクト <nolink>'[OBJ_NAME]'</nolink> を譲渡できないため、選択内容をコピーできません。 </notification> <notification name="NoPermsNoRemoval"> - シミュレータからのオブジェクト '[OBJ_NAME]' の削除は、権限システムによって無効にされています。 + オブジェクト <nolink>'[OBJ_NAME]'</nolink> をシミュレーターから削除することは、権限のシステムにより許可されていません。 </notification> <notification name="NoModNoSaveSelection"> - オブジェクト '[OBJ_NAME]' を変更する権限を持っていないため、選択したものを保存できません。 + あなたにはオブジェクト <nolink>'[OBJ_NAME]'</nolink> を修正する権限がないため、選択内容を保存できません。 </notification> <notification name="NoCopyNoSaveSelection"> - オブジェクト '[OBJ_NAME]' をコピーできないため、選択したものを保存できません。 + オブジェクト <nolink>'[OBJ_NAME]'</nolink> はコピー不可なため、選択内容を保存できません。 </notification> <notification name="NoModNoTaking"> - オブジェクト '[OBJ_NAME]' を変更する権限を持っていないため、選択したものを取得できません。 + あなたにはオブジェクト <nolink>'[OBJ_NAME]'</nolink> を修正する権限がないため、選択内容を選ぶことはできません。 </notification> <notification name="RezDestInternalError"> 内部エラー: 不明な宛先タイプ。 diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml index e2b74354fa..378cf8652e 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml @@ -4,7 +4,6 @@ 言語: </text> <combo_box name="language_combobox"> - <combo_box.item label="システムデフォルト" name="System Default Language"/> <combo_box.item label="English (英語)" name="English"/> <combo_box.item label="Dansk (デンマーク語) - ベータ" name="Danish"/> <combo_box.item label="Deutsch (ドイツ語) – ベータ" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml index ebaab7c122..04dfc0176d 100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="ディスクに保存" name="save_to_computer_btn"/> - <button label="持ち物に保存(L$[Amount])" name="save_to_inventory_btn"/> + <button label="持ち物に保存(L$[AMOUNT])" name="save_to_inventory_btn"/> <button label="プロフィールフィードで共有する" name="save_to_profile_btn"/> <button label="Facebook で共有する" name="send_to_facebook_btn"/> <button label="Twitter で共有する" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index bcf4698bb0..9116bba8bb 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -5739,4 +5739,25 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ <string name="Mav_Details_MAV_UNKNOWN_VERSION"> 物理形状のバージョンが正しくありません。物理モデルに正しいバージョンを設定してください。 </string> + <string name="couldnt_resolve_host"> + DNS がホスト名 ([HOSTNAME]) を解決できませんでした。 +www.secondlife.com のウェブサイトに接続できるかご確認ください。 +接続できても、このエラーが継続的に起こる場合は、 +サポートセクションから問題を報告してください。 + </string> + <string name="ssl_peer_certificate"> + ログインサーバーが SSL 経由で確認できませんでした。 +このエラーが継続的に起こる場合は、 +Secondlife.com のサポートセクションから +問題を報告してください。 + </string> + <string name="ssl_connect_error"> + この問題の多くは、お使いのコンピュータの時計が正しく設定されていないために起こります。 +コントロールパネルから時刻と日付が正しく設定されているかご確認ください。 +お使いのネットワークとファイアウォールも正しく設定されているかお確かめください。 +このエラーが継続的に起こる場合は、Secondlife.com のサポートセクションから +問題を報告してください。 + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 ナレッジベース] + </string> </strings> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml index 082dc0687e..55df13e7ac 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml @@ -4,7 +4,6 @@ Język: </text> <combo_box name="language_combobox"> - <combo_box.item label="Domyślny" name="System Default Language" /> <combo_box.item label="English (Angielski)" name="English" /> <combo_box.item label="Dansk (Duński) - Beta" name="Danish" /> <combo_box.item label="Deutsch (Niemiecki) - Beta" name="Deutsch(German)" /> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index fde883131a..b7a057e769 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -243,6 +243,10 @@ Por favor, selecione apenas um objeto e tente novamente. Nota: Ao ativar esta opção, qualquer pessoa que utilizar este computador poderá ver a sua lista de lugares preferidos. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + Não é possível executar múltiplos visualizadores Second Life. Pode levar a uma falha, um corrompimento, visuais alterados e falha no desempenho no cache de textura. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Conceder direitos de modificação a outros residentes vai autorizá-los a mudar, apagar ou pegar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização. Deseja dar direitos de modificação a [NAME]? @@ -711,9 +715,9 @@ Para aumentar a qualidade do vídeo, vá para Preferências > Vídeo. Você não está autorizado a terraplanar o terreno [PARCEL]. </notification> <notification name="CannotCopyWarning"> - Você não tem autorização para copiar os itens abaixo: -[ITEMS] -ao dá-los, você ficará sem eles no seu inventário. Deseja realmente dar estes itens? + Não existe autorização para copiar os itens abaixo: +<nolink>[ITEMS]</nolink> +e eles sairão do inverntário se sair. Deseja realmente dar estes itens? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="CannotGiveItem"> @@ -3698,13 +3702,13 @@ ele não está na mesma região que você. Você não pode criar árvores e grama em terrenos que não são sua propriedade. </notification> <notification name="NoCopyPermsNoObject"> - A cópia falhou porque você não está autorizado a copiar o objeto '[OBJ_NAME]'. + Falha na cópia por falta de permissão para copiar o objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - A cópia falhou porque o objeto '[OBJ_NAME]' não pode ser transferido para você. + Falha na cópia, porque o objeto <nolink>'[OBJ_NAME]'</nolink> não pode ser transferido para você. </notification> <notification name="AddToNavMeshNoCopy"> - A cópia falhou porque o objeto '[OBJ_NAME]' contribui para o navmesh. + Falha na cópia, porque o objeto <nolink>'[OBJ_NAME]'</nolink> contribui para o Navmesh. </notification> <notification name="DupeWithNoRootsSelected"> Duplicar sem objetos raiz selecionados. @@ -3749,34 +3753,34 @@ Tente novamente em instantes. Salvar no inventário foi desativado. </notification> <notification name="NoExistNoSaveToContents"> - Não é possível salvar '[OBJ_NAME]' no conteúdo do objeto porque o objeto do qual ele foi renderizado não existe mais. + Não foi possível salvar <nolink>'[OBJ_NAME]'</nolink> para os conteúdos do objeto, porque o objeto foi utilizado e não existe mais. </notification> <notification name="NoModNoSaveToContents"> - Não é possível salvar '[OBJ_NAME]' no conteúdo do objeto porque você não tem permissão para modificar o objeto '[DEST_NAME]'. + Não foi possível salvar <nolink>'[OBJ_NAME]'</nolink> para os conteúdos do objeto, porque você não tem permissão para modificar o objeto <nolink>'[DEST_NAME]'</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - Não é possível salvar '[OBJ_NAME]' no inventário -- essa operação foi desativada. + Não é possível salvar <nolink>'[OBJ_NAME]'</nolink> no inventário outra vez -- esta operação foi desabilitada. </notification> <notification name="NoCopyNoSelCopy"> - Você não pode copiar sua seleção porque não está autorizado a copiar o objeto '[OBJ_NAME]'. + Não é possível copiar a seleção porque você não tem permissão para copiar o objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - Você não pode copiar a seleção porque o objeto '[OBJ_NAME]' não é transferível. + Não é possível copiar a seleção porque o objeto <nolink>'[OBJ_NAME]'</nolink> não é transferível. </notification> <notification name="NoTransNoCopy"> - Você não pode copiar a seleção porque o objeto '[OBJ_NAME]' não é transferível. + Não é possível copiar a seleção porque o objeto <nolink>'[OBJ_NAME]'</nolink> não é transferível. </notification> <notification name="NoPermsNoRemoval"> - A remoção do objeto '[OBJ_NAME]' do simulador é proibida pelo sistema de permissões. + A remoção do objeto <nolink>'[OBJ_NAME]'</nolink> do simulador não é permitida pelo sistema de permissão. </notification> <notification name="NoModNoSaveSelection"> - Você não pode salvar sua seleção porque não está autorizado a modificar o objeto '[OBJ_NAME]'. + Não é possível salvar a seleção porque você não tem permissão para modificar o objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - Não é possível salvar sua seleção porque o objeto '[OBJ_NAME]' não é copiável. + Não é possível salvar a seleção porque o objeto <nolink>'[OBJ_NAME]'</nolink> não é copiável. </notification> <notification name="NoModNoTaking"> - Você não pode levar sua seleção porque não está autorizado a modificar o objeto '[OBJ_NAME]'. + Não é possível realizar a seleção porque você não tem permissão para modificar o objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> Erro interno: tipo de destino desconhecido. diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml index 68fbd049b1..915d695605 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml @@ -4,7 +4,6 @@ Idioma: </text> <combo_box name="language_combobox"> - <combo_box.item label="Padrão" name="System Default Language"/> <combo_box.item label="English (Inglês)" name="English"/> <combo_box.item label="Dansk (Dinamarquês) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Alemão) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index ecf90ef787..4151ef36ac 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -5615,4 +5615,25 @@ Tente colocar o caminho do editor entre aspas. <string name="Mav_Details_MAV_UNKNOWN_VERSION"> A forma física não tem a versão correta. Defina a versão correta para o modelo físico. </string> + <string name="couldnt_resolve_host"> + O DNS não pode resolver o nome do host([HOSTNAME]). +Verifique se você pode conectar ao site www.secondlife.com . Se você +puder, mas se continuar recebendo esta mensagem de erro, vá à sessão +Suporte no site Secondlife.com e informe o problema. + </string> + <string name="ssl_peer_certificate"> + O servidor de acesso não pôde verificá-lo pelo SSL. +Se você continuar recebendo esta mensagem de erro, +vá à sessão Suporte no site Secondlife.com +e informe o problema. + </string> + <string name="ssl_connect_error"> + Geralmente, esse erro significa que o relógio do seu computador não está com o horário correto. +Vá em Painel de Controles e certifique-se de que a hora e data estejam corretos. +Além disso, verifique se a sua rede e firewall estejam corretos. Se você continuar +recebendo esta mensagem de erro, vá à sessão Suporte no site Secondlife.com +e informe o problema. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conhecimento] + </string> </strings> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 85314638c5..4801c22cc6 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -244,6 +244,10 @@ Примечание. После включения этой опции все пользователи данного компьютера смогут увидеть список ваших избранных мест. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + Запуск нескольких приложений Second Life Viewer не поддерживается. Это может привести к конфликтам кэша текстур, повреждению и снижению производительности и визуального отображения. + <usetemplate name="okbutton" yestext="ОК"/> + </notification> <notification name="GrantModifyRights"> Предоставление другому жителю прав на изменение позволит ему изменять, удалять или брать ЛЮБЫЕ ваши объекты. Будьте ОЧЕНЬ осторожны с предоставлением такого разрешения. Дать пользователю [NAME] права на изменение? @@ -717,9 +721,9 @@ Вам не разрешено терраформировать участок [PARCEL]. </notification> <notification name="CannotCopyWarning"> - У вас нет разрешения на копирование следующих предметов: -[ITEMS] -Если вы отдадите эти вещи, их больше не будет в вашем инвентаре. Вы действительно хотите предложить эти предметы? + У вас нет разрешения на копирование следующих предметов: +<nolink>[ITEMS]</nolink> +и они пропадут из вашего инвентаря, если вы их отдадите. Вы действительно хотите предложить эти предметы? <usetemplate name="okcancelbuttons" notext="Нет" yestext="Да"/> </notification> <notification name="CannotGiveItem"> @@ -3711,13 +3715,13 @@ Вы не можете создавать деревья и траву на чужой земле. </notification> <notification name="NoCopyPermsNoObject"> - Не удалось скопировать: вам не разрешено копировать объект «[OBJ_NAME]». + Не удалось скопировать, потому что у вас нет разрешения на копирование этого предмета <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - Не удалось скопировать: объект «[OBJ_NAME]» нельзя перенести к вам. + Не удалось скопировать, потому что предмет <nolink>'[OBJ_NAME]'</nolink> не может быть перемещён к вам. </notification> <notification name="AddToNavMeshNoCopy"> - Не удалось скопировать: объект «[OBJ_NAME]» относится к навигационной сетке. + Не удалось скопировать, потому что предмет <nolink>'[OBJ_NAME]'</nolink> относится к навигационной сетке. </notification> <notification name="DupeWithNoRootsSelected"> Выбран дубликат без корневых объектов. @@ -3762,34 +3766,34 @@ Сохранение в инвентаре отключено. </notification> <notification name="NoExistNoSaveToContents"> - Нельзя сохранить «[OBJ_NAME]» в содержимом объекта: объект, из которого оно было выложено, уже не существует. + Не удалось сохранить <nolink>'[OBJ_NAME]'</nolink> в содержимом предмета, потому что место, в котором был создан предмет, больше не существует. </notification> <notification name="NoModNoSaveToContents"> - Нельзя сохранить «[OBJ_NAME]» в содержимом объекта: вам не разрешено изменять объект «[DEST_NAME]». + Не удалось сохранить <nolink>'[OBJ_NAME]'</nolink> в содержимом предмета, потому что у вас нет разрешения на модификацию предмета <nolink>'[DEST_NAME]'</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - Невозможно сохранить «[OBJ_NAME]» в инвентаре: эта операция запрещена. + Не удалось сохранить <nolink>'[OBJ_NAME]'</nolink> обратно в инвентаре – эта операция заблокирована. </notification> <notification name="NoCopyNoSelCopy"> - Нельзя скопировать выбранное: вам не разрешено копировать объект «[OBJ_NAME]». + Вы не можете скопировать выбор, потому что у вас нет разрешения на копирование этого предмета <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - Невозможно скопировать выбранный предмет: объект «[OBJ_NAME]» не переносится. + Вы не можете скопировать свой выбор, потому что предмет <nolink>'[OBJ_NAME]'</nolink> не может быть перемещён. </notification> <notification name="NoTransNoCopy"> - Невозможно скопировать выбранный предмет: объект «[OBJ_NAME]» не переносится. + Вы не можете скопировать свой выбор, потому что предмет <nolink>'[OBJ_NAME]'</nolink> не может быть перемещён. </notification> <notification name="NoPermsNoRemoval"> - Удаление объекта «[OBJ_NAME]» из симулятора запрещено системой разрешений. + Удаление предмета <nolink>'[OBJ_NAME]'</nolink> из симулятора не допущено системой прав доступа. </notification> <notification name="NoModNoSaveSelection"> - Нельзя сохранить выбранное: вам не разрешено изменять объект «[OBJ_NAME]». + Копирование выбора невозможно, потому что у вас нет разрешения на модифицирование этого предмета <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - Невозможно сохранить выбранный предмет: объект «[OBJ_NAME]» не копируется. + Вы не можете сохранить свой выбор, потому что предмет <nolink>'[OBJ_NAME]'</nolink> не поддаётся копированию. </notification> <notification name="NoModNoTaking"> - Нельзя забрать выбранное: вам не разрешено изменять объект «[OBJ_NAME]». + Вы не можете скопировать свой выбор, потому что у вас нет разрешения на модифицирование этого предмета <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> Внутренняя ошибка: неизвестный тип места назначения. diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml index b15d0e3abf..918b042dd7 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml @@ -4,7 +4,6 @@ Язык: </text> <combo_box name="language_combobox"> - <combo_box.item label="Язык системы" name="System Default Language"/> <combo_box.item label="English - Английский" name="English"/> <combo_box.item label="Dansk – датский (бета-версия)" name="Danish"/> <combo_box.item label="Deutsch – немецкий (бета-версия)" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 267c717189..dcc503f18c 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -5747,4 +5747,25 @@ support@secondlife.com. <string name="Mav_Details_MAV_UNKNOWN_VERSION"> У физической формы нет правильной версии. Задайте правильную версию для физической модели. </string> + <string name="couldnt_resolve_host"> + DNS не удалось разрешить имя узла([HOSTNAME]). +Проверьте возможность подключения к веб-сайту www.secondlife.com. +Если вы продолжаете получать эту ошибку, перейдите в раздел +поддержки и сообщите о проблеме. + </string> + <string name="ssl_peer_certificate"> + Серверу входа в систему не удалось пройти аутентификацию с помощью +протокола SSL. Если вы продолжаете получать эту ошибку, +перейдите в раздел поддержки на веб-сайте SecondLife.com +и сообщите о проблеме. + </string> + <string name="ssl_connect_error"> + Часто это означает, что часы компьютера установлены неправильно. +Перейдите, пожалуйста, на Панели управления и убедитесь в правильной +установке времени и даты. Также проверьте правильность настройки сети +и брандмауэра. Если вы продолжаете получать эту ошибку, перейдите в +раздел поддержки на веб-сайте SecondLife.com и сообщите о проблеме. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 База знаний] + </string> </strings> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index 187638d488..291f8539b3 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -244,6 +244,10 @@ Lütfen sadece bir nesne seçin ve tekrar deneyin. Not: Bu seçeneği etkinleştirdiğinizde, bu bilgisayarı kullanan herkes en sevdiğiniz konumlar listenizi görebilecek. <usetemplate name="okbutton" yestext="Tamam"/> </notification> + <notification name="AllowMultipleViewers"> + Birden çok Second Life görüntüleyiciyi çalıştırma özelliği desteklenmiyor. Bu durum doku önbelleği çakışmalarına, görsellerin bozulmasına ve performansın düşmesine yol açabilir. + <usetemplate name="okbutton" yestext="Tamam"/> + </notification> <notification name="GrantModifyRights"> Başka bir Sakine değişiklik yapma hakkı verdiğinizde, SL dünyasında sahip olduğunuz HERHANGİ BİR nesneyi değiştirebilme, silebilme veya alabilmelerine izin vermiş olursunuz. Bu izni verirken ÇOK dikkatli olun. [NAME] adlı kişiye değişiklik yapma hakkı vermek istiyor musunuz? @@ -718,9 +722,9 @@ Grafik Kalitesi, Tercihler > Grafikler sekmesinden yükseltilebilir. [PARCEL] parseli üzerinde yer şekillendirmesi yapma izniniz bulunmuyor. </notification> <notification name="CannotCopyWarning"> - Aşağıdaki öğeleri kopyalamak için gerekli izne sahip değilsiniz: -[ITEMS] -Bu öğeleri verdiğiniz takdirde envanterinizden çıkacaklar. Bu öğeleri teklif etmeyi gerçekten istiyor musunuz? + Aşağıdaki öğeleri kopyalama izniniz yok: +<nolink>[ITEMS]</nolink> +ve bunları elden çıkardığınız takdirde envanterinizden kaybolacaktır. Bu öğeleri sunmayı gerçekten istiyor musunuz? <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/> </notification> <notification name="CannotGiveItem"> @@ -3710,13 +3714,13 @@ Girişim iptal edildi. Sahibi olmadığınız arazide ağaçlar ve çimen oluşturamazsınız. </notification> <notification name="NoCopyPermsNoObject"> - '[OBJ_NAME]' nesnesini kopyalama izniniz olmadığı için kopyalama başarılamadı. + <nolink>'[OBJ_NAME]'</nolink> nesnesini kopyalama izniniz olmadığından kopyalama başarısız oldu. </notification> <notification name="NoTransPermsNoObject"> - '[OBJ_NAME]' nesnesi size aktarılamadığı için kopyalama başarılamadı. + <nolink>'[OBJ_NAME]'</nolink> nesnesi size devredilemediğinden kopyalama başarısız oldu. </notification> <notification name="AddToNavMeshNoCopy"> - '[OBJ_NAME]' nesnesi navmesh'e katkıda bulunduğu için kopyalama başarılamadı. + <nolink>'[OBJ_NAME]'</nolink> nesnesi navigasyon örgüsüne katkıda bulunduğundan kopyalama başarısız oldu. </notification> <notification name="DupeWithNoRootsSelected"> Kök nesne seçili olmayan kopya. @@ -3761,34 +3765,34 @@ Lütfen bir dakika sonra tekrar deneyin. Envantere Geri Kaydet devre dışı bırakıldı. </notification> <notification name="NoExistNoSaveToContents"> - '[OBJ_NAME]' nesne içeriğine kaydedilemedi, çünkü oluşturulurken temel alınan nesne artık mevcut değil. + Yeniden canlandırıldığı nesne artık mevcut olmadığından <nolink>'[OBJ_NAME]'</nolink> nesne içeriklerine kaydedilemiyor. </notification> <notification name="NoModNoSaveToContents"> - '[DEST_NAME]' nesnesini değiştirme izniniz olmadığı için '[OBJ_NAME]' nesne içeriğine kaydedilemedi. + <nolink>'[DEST_NAME]'</nolink> nesnesini değiştirme izniniz olmadığından <nolink>'[OBJ_NAME]'</nolink> nesne içeriklerine kaydedilemiyor. </notification> <notification name="NoSaveBackToInvDisabled"> - '[OBJ_NAME]' envantere geri kaydedilemez -- bu işlem devre dışı bırakıldı. + <nolink>'[OBJ_NAME]'</nolink> envantere tekrar kaydedilemiyor -- bu işlem devre dışı bırakılmış. </notification> <notification name="NoCopyNoSelCopy"> - '[OBJ_NAME]' nesnesini kopyalama izniniz olmadığı için seçiminizi kopyalamayazsınız. + <nolink>'[OBJ_NAME]'</nolink> nesnesini kopyalama izniniz olmadığından seçiminizi kopyalayamazsınız. </notification> <notification name="NoTransNoSelCopy"> - '[OBJ_NAME]' nesnesi aktarılamaz olduğu için seçiminizi kopyalayamazsınız. + <nolink>'[OBJ_NAME]'</nolink> nesnesi devredilebilir olmadığından seçiminizi kopyalayamazsınız. </notification> <notification name="NoTransNoCopy"> - '[OBJ_NAME]' nesnesi aktarılamaz olduğu için seçiminizi kopyalayamazsınız. + <nolink>'[OBJ_NAME]'</nolink> nesnesi devredilebilir olmadığından seçiminizi kopyalayamazsınız. </notification> <notification name="NoPermsNoRemoval"> - Benzeticiden '[OBJ_NAME]' nesnesinin kaldırılmasına izinler sistemi izin vermiyor. + <nolink>'[OBJ_NAME]'</nolink> nesnesinin simülatörden kaldırılmasına izin sistemi tarafından izin verilmiyor. </notification> <notification name="NoModNoSaveSelection"> - '[OBJ_NAME]' nesnesini değiştirme izniniz olmadığı için seçiminizi kaydedemezsiniz. + <nolink>'[OBJ_NAME]'</nolink> nesnesini değiştirme izniniz olmadığından seçiminiz kaydedilemiyor. </notification> <notification name="NoCopyNoSaveSelection"> - '[OBJ_NAME]' nesnesi kopyalanamaz olduğu için seçiminizi kaydedemezsiniz. + <nolink>'[OBJ_NAME]'</nolink> nesnesi kopyalanabilir olmadığından seçiminiz kaydedilemiyor. </notification> <notification name="NoModNoTaking"> - '[OBJ_NAME]' nesnesini değiştirme izniniz olmadığı için seçiminizi alamazsınız. + <nolink>'[OBJ_NAME]'</nolink> nesnesini değiştirme izniniz olmadığından seçiminizi alamazsınız. </notification> <notification name="RezDestInternalError"> Dahili Hata: Bilinmeyen hedef türü. diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml index 2c05e8a47a..cec7a67f2f 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml @@ -4,7 +4,6 @@ Dil: </text> <combo_box name="language_combobox"> - <combo_box.item label="Sistem varsayılanı" name="System Default Language"/> <combo_box.item label="English (İngilizce)" name="English"/> <combo_box.item label="Dansk (Danca) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Almanca) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index b574420793..ea6f2115e4 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -5748,4 +5748,25 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="Mav_Details_MAV_UNKNOWN_VERSION"> Fiziksel şekil doğru sürüme sahip değil. Fiziksel model için doğru sürümü ayarlayın. </string> + <string name="couldnt_resolve_host"> + DNS sunucusu ana bilgisayar adını çözümleyemedi ([HOSTNAME]). +Lütfen www.secondlife.com web sitesine bağlanabildiğinizi doğrulayın. +Bağlanabiliyor, ancak bu hatayı almaya devam ediyorsanız, lütfen +destek bölümüne gidin ve bu sorunu bildirin. + </string> + <string name="ssl_peer_certificate"> + Oturum açma sunucusu SSL aracılığıyla kendini doğrulayamadı. +Bu hatayı almaya devam ederseniz, lütfen +SecondLife.com web sitesinin Destek +bölümüne gidin ve sorunu bildirin. + </string> + <string name="ssl_connect_error"> + Çoğunlukla, bu durum, bilgisayarınızın saatinin yanlış ayarlandığı anlamına gelir. +Lütfen Denetim Masası'na gidin ve tarih ve saat ayarlarının doğru yapıldığından emin olun. +Ayrıca, ağınızın ve güvenlik duvarınızın doğru şekilde ayarlanıp ayarlanmadığını kontrol edin. +Bu hatayı almaya devam ederseniz, lütfen SecondLife.com web sitesinin Destek bölümüne +gidin ve sorunu bildirin. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Bilgi Bankası] + </string> </strings> diff --git a/indra/newview/skins/default/xui/zh/floater_tos.xml b/indra/newview/skins/default/xui/zh/floater_tos.xml index 4cac07cd21..2f02316fc0 100644 --- a/indra/newview/skins/default/xui/zh/floater_tos.xml +++ b/indra/newview/skins/default/xui/zh/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E 正在載入 %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html;charset=utf-8,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E 正在載入 %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <text name="tos_heading"> 請閱讀並遵守Second Life使用條款、隱私政策、服務條款,包括同意在發生爭議時接受仲裁並放棄採取集體或群體求訴的規定。 繼續登入[SECOND_LIFE]前,你必須同意這些條款。 diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index ea635d0e5d..e8b2481a7c 100644 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -244,6 +244,10 @@ 注意:你一旦同意這選項,任何使用這部電腦的人都可看到你有哪些「最愛」地點。 <usetemplate name="okbutton" yestext="確定"/> </notification> + <notification name="AllowMultipleViewers"> + 不支援同時執行多個Second Life瀏覽器。 這麼做可能導致材質快取相互碰撞、毀損,並降低視覺效果及性能。 + <usetemplate name="okbutton" yestext="確定"/> + </notification> <notification name="GrantModifyRights"> 賦予另一居民「修改」權,將允許他更改、刪除或拿取你在虛擬世界裡擁有的任何物件。 賦予這項權限時,敬請慎重考慮。 你仍要賦予 [NAME] 修改權嗎? @@ -719,7 +723,7 @@ </notification> <notification name="CannotCopyWarning"> 你沒有權限複製以下項目: -[ITEMS] +<nolink>[ITEMS]</nolink> 如果你將它送人,它將無法續留在收納區。 你確定要送出這些東西嗎? <usetemplate name="okcancelbuttons" notext="否" yestext="是"/> </notification> @@ -3710,13 +3714,13 @@ SHA1 指紋:[MD5_DIGEST] 你無法在別人的土地上建立樹和草。 </notification> <notification name="NoCopyPermsNoObject"> - 複製失敗,你無權複製物件 '[OBJ_NAME]'。 + 複製失敗,你無權複製物件<nolink>'[OBJ_NAME]'</nolink>。 </notification> <notification name="NoTransPermsNoObject"> - 複製失敗,因為物件 '[OBJ_NAME]' 無法轉移給你。 + 複製失敗,因為物件<nolink>'[OBJ_NAME]'</nolink>無法轉移給你。 </notification> <notification name="AddToNavMeshNoCopy"> - 複製失敗,因為物件 '[OBJ_NAME]' 對導航網面有貢獻。 + 複製失敗,因為物件<nolink>'[OBJ_NAME]'</nolink>對導航網面有貢獻。 </notification> <notification name="DupeWithNoRootsSelected"> 選取了沒有根的重覆物件。 @@ -3761,34 +3765,34 @@ SHA1 指紋:[MD5_DIGEST] 「儲存回收納區」功能已被停用。 </notification> <notification name="NoExistNoSaveToContents"> - 無法將 '[OBJ_NAME]' 儲存到物件內容,因為產生它的來源物件已不存在。 + 無法將<nolink>'[OBJ_NAME]'</nolink>儲存到物件內容,因為產生它的來源物件已不存在。 </notification> <notification name="NoModNoSaveToContents"> - 無法儲存 [OBJ_NAME] 到物件內容,你無權修改 '[DEST_NAME]' 物件。 + 無法儲存<nolink>'[OBJ_NAME]'</nolink>到物件內容,因爲你無權修改<nolink>'[DEST_NAME]'</nolink>物件。 </notification> <notification name="NoSaveBackToInvDisabled"> - 無法將 '[OBJ_NAME]' 儲存回收納區,此動作已被停用。 + 無法將<nolink>'[OBJ_NAME]'</nolink>儲存回收納區,此動作已被停用。 </notification> <notification name="NoCopyNoSelCopy"> - 無法複製你所選的,因為你無權複製物件 '[OBJ_NAME]'。 + 無法複製你所選的,因為你無權複製物件<nolink>'[OBJ_NAME]'</nolink>。 </notification> <notification name="NoTransNoSelCopy"> - 無法選取複製,因為物件 '[OBJ_NAME]' 不可轉移。 + 無法選取複製,因為物件<nolink>'[OBJ_NAME]'</nolink>不可轉移。 </notification> <notification name="NoTransNoCopy"> - 無法選取複製,因為物件 '[OBJ_NAME]' 不可轉移。 + 無法選取複製,因為物件<nolink>'[OBJ_NAME]'</nolink>不可轉移。 </notification> <notification name="NoPermsNoRemoval"> - 權限系統不允許從模擬器移除物件 '[OBJ_NAME]'。 + 權限系統不允許從模擬器移除物件<nolink>'[OBJ_NAME]'</nolink>。 </notification> <notification name="NoModNoSaveSelection"> - 無法儲存你所選的,因為你無權修改 '[OBJ_NAME]' 物件。 + 無法儲存你所選的,因為你無權修改<nolink>'[OBJ_NAME]'</nolink>物件。 </notification> <notification name="NoCopyNoSaveSelection"> - 無法儲存你所選的,因為物件 '[OBJ_NAME]' 不可複製。 + 無法儲存你所選的,因為物件<nolink>'[OBJ_NAME]'</nolink>不可複製。 </notification> <notification name="NoModNoTaking"> - 無法拿取你所選的,因為你無權修改 '[OBJ_NAME]' 物件。 + 無法取用你所選的,因為你無權修改物件<nolink>'[OBJ_NAME]'</nolink>。 </notification> <notification name="RezDestInternalError"> 內部錯誤:未知的目的地類型。 diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml index 20335d82ae..87c38e4346 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml @@ -4,7 +4,6 @@ 語言: </text> <combo_box name="language_combobox"> - <combo_box.item label="系統預設" name="System Default Language"/> <combo_box.item label="英語" name="English"/> <combo_box.item label="Dansk(丹麥語)- 試用版" name="Danish"/> <combo_box.item label="Deutsch(德語)- 試用版" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index 24d8dc60cb..f8fd727145 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -5746,4 +5746,25 @@ http://secondlife.com/support 求助解決問題。 <string name="Mav_Details_MAV_UNKNOWN_VERSION"> 物理形狀的版本不正確。 請設成正確的物理模型版本。 </string> + <string name="couldnt_resolve_host"> + DNS無法解決主機名稱([HOSTNAME])。 +請確認你能夠連通 www.secondlife.com +網站。 如能連通,但繼續看到這個錯誤, +請到「支援」部分通報問題。 + </string> + <string name="ssl_peer_certificate"> + 登入伺服器無法透過SSL自我確認。 +如果你繼續看到這個錯誤,請前往 +SecondLife.com網站的「支援」部分 +提報問題。 + </string> + <string name="ssl_connect_error"> + 這通常意味你電腦的時鐘設定不正確。 +請到控制台確定時間和日期設定正確。 +並檢查確定你的網路和防火牆設定正確。 +如果你繼續看到這個錯誤,請前往SecondLife.com +網站的「支援」部分提報問題。 + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 知識庫] + </string> </strings> |