diff options
Diffstat (limited to 'indra/newview')
208 files changed, 3592 insertions, 2264 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 1c32c690a8..cd7c002096 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -7,6 +7,7 @@ include(Boost) include(BuildVersion) include(DBusGlib) include(DirectX) +include(DragDrop) include(ELFIO) include(FMOD) include(OPENAL) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 2a7c3b0f74..c7300fcee2 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2817,16 +2817,16 @@ <key>Value</key> <integer>0</integer> </map> - <key>FirstRunThisInstall</key> + <key>HadFirstSuccessfulLogin</key> <map> <key>Comment</key> - <string>Specifies that you have not run the viewer since you installed the latest update</string> + <string>Specifies whether you have successfully logged in at least once before</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>FirstSelectedDisabledPopups</key> <map> @@ -5527,6 +5527,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>PrimMediaDragNDrop</key> + <map> + <key>Comment</key> + <string>Enable drag and drop of URLs onto prim faces</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>PrimMediaMaxRetries</key> <map> <key>Comment</key> @@ -7791,7 +7802,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>ShowCrosshairs</key> <map> @@ -10820,6 +10831,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>SLURLDragNDrop</key> + <map> + <key>Comment</key> + <string>Enable drag and drop of SLURLs onto the viewer</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>soundsbeacon</key> <map> <key>Comment</key> diff --git a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store b/indra/newview/installers/darwin/firstlook-dmg/_DS_Store Binary files differindex 9d9fd897e7..495ec37f53 100644 --- a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store +++ b/indra/newview/installers/darwin/firstlook-dmg/_DS_Store diff --git a/indra/newview/installers/darwin/fix_application_icon_position.sh b/indra/newview/installers/darwin/fix_application_icon_position.sh index a0b72a89f2..c6b92589db 100644 --- a/indra/newview/installers/darwin/fix_application_icon_position.sh +++ b/indra/newview/installers/darwin/fix_application_icon_position.sh @@ -4,11 +4,14 @@ cp -r ./../../../build-darwin-i386/newview/*.dmg ~/Desktop/TempBuild.dmg hdid ~/Desktop/TempBuild.dmg open -a finder /Volumes/Second\ Life\ Installer osascript dmg-cleanup.applescript -cp /Volumes/Second\ Life\ Installer/.DS_Store ~/Desktop/_DS_Store -chflags nohidden ~/Desktop/_DS_Store -cp ~/Desktop/_DS_Store ./firstlook-dmg/_DS_Store -cp ~/Desktop/_DS_Store ./publicnightly-dmg/_DS_Store -cp ~/Desktop/_DS_Store ./release-dmg/_DS_Store -cp ~/Desktop/_DS_Store ./releasecandidate-dmg/_DS_Store umount /Volumes/Second\ Life\ Installer/ -rm ~/Desktop/_DS_Store ~/Desktop/TempBuild.dmg +hdid ~/Desktop/TempBuild.dmg +open -a finder /Volumes/Second\ Life\ Installer +#cp /Volumes/Second\ Life\ Installer/.DS_Store ~/Desktop/_DS_Store +#chflags nohidden ~/Desktop/_DS_Store +#cp ~/Desktop/_DS_Store ./firstlook-dmg/_DS_Store +#cp ~/Desktop/_DS_Store ./publicnightly-dmg/_DS_Store +#cp ~/Desktop/_DS_Store ./release-dmg/_DS_Store +#cp ~/Desktop/_DS_Store ./releasecandidate-dmg/_DS_Store +#umount /Volumes/Second\ Life\ Installer/ +#rm ~/Desktop/_DS_Store ~/Desktop/TempBuild.dmg diff --git a/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store b/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store Binary files differindex 9d9fd897e7..495ec37f53 100644 --- a/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store +++ b/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store diff --git a/indra/newview/installers/darwin/release-dmg/_DS_Store b/indra/newview/installers/darwin/release-dmg/_DS_Store Binary files differindex 9d9fd897e7..495ec37f53 100644 --- a/indra/newview/installers/darwin/release-dmg/_DS_Store +++ b/indra/newview/installers/darwin/release-dmg/_DS_Store diff --git a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store Binary files differindex 9d9fd897e7..495ec37f53 100644 --- a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store +++ b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 4724bb9ada..c38ed194a3 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -2302,7 +2302,7 @@ public: virtual ~LLLibraryOutfitsCopyDone() { - if (mLibraryOutfitsFetcher) + if (!LLApp::isExiting() && mLibraryOutfitsFetcher) { gInventory.addObserver(mLibraryOutfitsFetcher); mLibraryOutfitsFetcher->done(); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 5088c65122..0fe236c056 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -279,7 +279,10 @@ public: virtual ~LLUpdateAppearanceOnDestroy() { - LLAppearanceManager::instance().updateAppearanceFromCOF(); + if (!LLApp::isExiting()) + { + LLAppearanceManager::instance().updateAppearanceFromCOF(); + } } /* virtual */ void fire(const LLUUID& inv_item) @@ -318,7 +321,7 @@ public: ~LLWearableHoldingPattern(); bool pollCompletion(); - bool isDone(); + bool isFetchCompleted(); bool isTimedOut(); typedef std::list<LLFoundData> found_list_t; @@ -327,10 +330,12 @@ public: LLInventoryModel::item_array_t mGestItems; S32 mResolved; LLTimer mWaitTime; + bool mFired; }; LLWearableHoldingPattern::LLWearableHoldingPattern(): - mResolved(0) + mResolved(0), + mFired(false) { } @@ -338,31 +343,34 @@ LLWearableHoldingPattern::~LLWearableHoldingPattern() { } -bool LLWearableHoldingPattern::isDone() +bool LLWearableHoldingPattern::isFetchCompleted() { - if (mResolved >= (S32)mFoundList.size()) - return true; // have everything we were waiting for - else if (isTimedOut()) - { - llwarns << "Exceeded max wait time, updating appearance based on what has arrived" << llendl; - return true; - } - return false; - + return (mResolved >= (S32)mFoundList.size()); // have everything we were waiting for? } bool LLWearableHoldingPattern::isTimedOut() { - static F32 max_wait_time = 15.0; // give up if wearable fetches haven't completed in max_wait_time seconds. + static F32 max_wait_time = 20.0; // give up if wearable fetches haven't completed in max_wait_time seconds. return mWaitTime.getElapsedTimeF32() > max_wait_time; } bool LLWearableHoldingPattern::pollCompletion() { - bool done = isDone(); - llinfos << "polling, done status: " << done << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl; + bool completed = isFetchCompleted(); + bool timed_out = isTimedOut(); + bool done = completed || timed_out; + + llinfos << "polling, done status: " << completed << " timed out? " << timed_out << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl; + if (done) { + mFired = true; + + if (timed_out) + { + llwarns << "Exceeded max wait time for wearables, updating appearance based on what has arrived" << llendl; + } + // Activate all gestures in this folder if (mGestItems.count() > 0) { @@ -394,7 +402,11 @@ bool LLWearableHoldingPattern::pollCompletion() LLAgentWearables::userUpdateAttachments(mObjItems); } - delete this; + if (completed) + { + // Only safe to delete if all wearable callbacks completed. + delete this; + } } return done; } @@ -429,7 +441,11 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items) static void onWearableAssetFetch(LLWearable* wearable, void* data) { LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; - + if (holder->mFired) + { + llwarns << "called after holder fired" << llendl; + } + if(wearable) { for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 2d694eefd3..2f90885df3 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2611,7 +2611,7 @@ void LLAppViewer::handleViewerCrash() gDebugInfo["StartupState"] = LLStartUp::getStartupStateString(); gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer) LLMemory::getCurrentRSS() >> 10; gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin(); - gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall"); + gDebugInfo["HadFirstSuccessfulLogin"] = gSavedSettings.getBOOL("HadFirstSuccessfulLogin"); if(gLogoutInProgress) { diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 7eed2e7b9a..bd987eac77 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -612,3 +612,13 @@ bool LLAvatarActions::isBlocked(const LLUUID& id) gCacheName->getFullName(id, name); return LLMuteList::getInstance()->isMuted(id, name); } + +// static +bool LLAvatarActions::canBlock(const LLUUID& id) +{ + std::string firstname, lastname; + gCacheName->getName(id, firstname, lastname); + bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden"); + bool is_self = id == gAgentID; + return !is_self && !is_linden; +} diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index c751661acf..16a58718a2 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -124,6 +124,11 @@ public: static bool isBlocked(const LLUUID& id); /** + * @return true if you can block the avatar + */ + static bool canBlock(const LLUUID& id); + + /** * Return true if the avatar is in a P2P voice call with a given user */ /* AD *TODO: Is this function needed any more? diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index a58a562378..aeed4fee08 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -57,11 +57,11 @@ public: struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> { - Optional<bool> ignore_online_status; // show all items as online - Optional<bool> show_last_interaction_time; // show most recent interaction time. *HACK: move this to a derived class - Optional<bool> show_info_btn; - Optional<bool> show_profile_btn; - Optional<bool> show_speaking_indicator; + Optional<bool> ignore_online_status, // show all items as online + show_last_interaction_time, // show most recent interaction time. *HACK: move this to a derived class + show_info_btn, + show_profile_btn, + show_speaking_indicator; Params(); }; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 2bcd097717..846b2843dd 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -48,6 +48,17 @@ S32 LLAvatarListItem::sLeftPadding = 0; S32 LLAvatarListItem::sRightNamePadding = 0; S32 LLAvatarListItem::sChildrenWidths[LLAvatarListItem::ALIC_COUNT]; +static LLWidgetNameRegistry::StaticRegistrar sRegisterAvatarListItemParams(&typeid(LLAvatarListItem::Params), "avatar_list_item"); + +LLAvatarListItem::Params::Params() +: default_style("default_style"), + voice_call_invited_style("voice_call_invited_style"), + voice_call_joined_style("voice_call_joined_style"), + voice_call_left_style("voice_call_left_style"), + online_style("online_style"), + offline_style("offline_style") +{}; + LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/) : LLPanel(), @@ -166,9 +177,30 @@ void LLAvatarListItem::setHighlight(const std::string& highlight) void LLAvatarListItem::setState(EItemState item_style) { - item_style_map_t& item_styles_params_map = getItemStylesParams(); + const LLAvatarListItem::Params& params = LLUICtrlFactory::getDefaultParams<LLAvatarListItem>(); - mAvatarNameStyle = item_styles_params_map[item_style]; + switch(item_style) + { + default: + case IS_DEFAULT: + mAvatarNameStyle = params.default_style(); + break; + case IS_VOICE_INVITED: + mAvatarNameStyle = params.voice_call_invited_style(); + break; + case IS_VOICE_JOINED: + mAvatarNameStyle = params.voice_call_joined_style(); + break; + case IS_VOICE_LEFT: + mAvatarNameStyle = params.voice_call_left_style(); + break; + case IS_ONLINE: + mAvatarNameStyle = params.online_style(); + break; + case IS_OFFLINE: + mAvatarNameStyle = params.offline_style(); + break; + } // *NOTE: You cannot set the style on a text box anymore, you must // rebuild the text. This will cause problems if the text contains @@ -353,58 +385,6 @@ std::string LLAvatarListItem::formatSeconds(U32 secs) } // static -LLAvatarListItem::item_style_map_t& LLAvatarListItem::getItemStylesParams() -{ - static item_style_map_t item_styles_params_map; - if (!item_styles_params_map.empty()) return item_styles_params_map; - - LLPanel::Params params = LLUICtrlFactory::getDefaultParams<LLPanel>(); - LLPanel* params_panel = LLUICtrlFactory::create<LLPanel>(params); - - BOOL sucsess = LLUICtrlFactory::instance().buildPanel(params_panel, "panel_avatar_list_item_params.xml"); - - if (sucsess) - { - - item_styles_params_map.insert( - std::make_pair(IS_DEFAULT, - params_panel->getChild<LLTextBox>("default_style")->getDefaultStyle())); - - item_styles_params_map.insert( - std::make_pair(IS_VOICE_INVITED, - params_panel->getChild<LLTextBox>("voice_call_invited_style")->getDefaultStyle())); - - item_styles_params_map.insert( - std::make_pair(IS_VOICE_JOINED, - params_panel->getChild<LLTextBox>("voice_call_joined_style")->getDefaultStyle())); - - item_styles_params_map.insert( - std::make_pair(IS_VOICE_LEFT, - params_panel->getChild<LLTextBox>("voice_call_left_style")->getDefaultStyle())); - - item_styles_params_map.insert( - std::make_pair(IS_ONLINE, - params_panel->getChild<LLTextBox>("online_style")->getDefaultStyle())); - - item_styles_params_map.insert( - std::make_pair(IS_OFFLINE, - params_panel->getChild<LLTextBox>("offline_style")->getDefaultStyle())); - } - else - { - item_styles_params_map.insert(std::make_pair(IS_DEFAULT, LLStyle::Params())); - item_styles_params_map.insert(std::make_pair(IS_VOICE_INVITED, LLStyle::Params())); - item_styles_params_map.insert(std::make_pair(IS_VOICE_JOINED, LLStyle::Params())); - item_styles_params_map.insert(std::make_pair(IS_VOICE_LEFT, LLStyle::Params())); - item_styles_params_map.insert(std::make_pair(IS_ONLINE, LLStyle::Params())); - item_styles_params_map.insert(std::make_pair(IS_OFFLINE, LLStyle::Params())); - } - if (params_panel) params_panel->die(); - - return item_styles_params_map; -} - -// static LLAvatarListItem::icon_color_map_t& LLAvatarListItem::getItemIconColorMap() { static icon_color_map_t item_icon_color_map; diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 61c0a8660e..426d80e0a8 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -46,6 +46,18 @@ class LLAvatarIconCtrl; class LLAvatarListItem : public LLPanel, public LLFriendObserver { public: + struct Params : public LLInitParam::Block<Params, LLPanel::Params> + { + Optional<LLStyle::Params> default_style, + voice_call_invited_style, + voice_call_joined_style, + voice_call_left_style, + online_style, + offline_style; + + Params(); + }; + typedef enum e_item_state_type { IS_DEFAULT, IS_VOICE_INVITED, @@ -143,9 +155,6 @@ private: std::string formatSeconds(U32 secs); - typedef std::map<EItemState, LLStyle::Params> item_style_map_t; - static item_style_map_t& getItemStylesParams(); - typedef std::map<EItemState, LLColor4> icon_color_map_t; static icon_color_map_t& getItemIconColorMap(); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index a2d594cfa2..4c8cec3d30 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -280,7 +280,13 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b break; } - mSpeakBtn->setEnabled(enable); + // We have to enable/disable right and left parts of speak button separately (EXT-4648) + mSpeakBtn->setSpeakBtnEnabled(enable); + // skipped to avoid button blinking + if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL) + { + mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()); + } } void LLBottomTray::onMouselookModeOut() @@ -410,9 +416,10 @@ BOOL LLBottomTray::postBuild() mSpeakPanel = getChild<LLPanel>("speak_panel"); mSpeakBtn = getChild<LLSpeakButton>("talk"); - // Speak button should be initially disabled because + // Both parts of speak button should be initially disabled because // it takes some time between logging in to world and connecting to voice channel. - mSpeakBtn->setEnabled(FALSE); + mSpeakBtn->setSpeakBtnEnabled(false); + mSpeakBtn->setFlyoutBtnEnabled(false); // Localization tool doesn't understand custom buttons like <talk_button> mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); @@ -474,6 +481,7 @@ void LLBottomTray::onContextMenuItemClicked(const LLSD& userdata) else if (item == "paste") { edit_box->paste(); + edit_box->setFocus(TRUE); } else if (item == "delete") { diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index f62fd44bc0..bd4fae6ab6 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -52,6 +52,7 @@ #include "lltransientfloatermgr.h" #include "llviewerwindow.h" #include "llvoicechannel.h" +#include "llviewerparcelmgr.h" static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids); void reshape_floater(LLCallFloater* floater, S32 delta_height); @@ -677,7 +678,8 @@ void LLCallFloater::resetVoiceRemoveTimers() void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id) { - mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id); + bool delete_it = true; + mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id, delete_it); } bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id) @@ -731,11 +733,11 @@ void LLCallFloater::updateState(const LLVoiceChannel::EState& new_state) } else { - reset(); + reset(new_state); } } -void LLCallFloater::reset() +void LLCallFloater::reset(const LLVoiceChannel::EState& new_state) { // lets forget states from the previous session // for timers... @@ -748,8 +750,18 @@ void LLCallFloater::reset() mParticipants = NULL; mAvatarList->clear(); - // update floater to show Loading while waiting for data. - mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); + // "loading" is shown in parcel with disabled voice only when state is "ringing" + // to avoid showing it in nearby chat vcp all the time- "no_one_near" is now shown there (EXT-4648) + bool show_loading = LLVoiceChannel::STATE_RINGING == new_state; + if(!show_loading && !LLViewerParcelMgr::getInstance()->allowAgentVoice() && mVoiceType == VC_LOCAL_CHAT) + { + mAvatarList->setNoItemsCommentText(getString("no_one_near")); + } + else + { + // update floater to show Loading while waiting for data. + mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); + } mAvatarList->setVisible(TRUE); mNonAvatarCaller->setVisible(FALSE); diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index 766191379b..dac4390fa7 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -220,7 +220,7 @@ private: * * Clears all data from the latest voice session. */ - void reset(); + void reset(const LLVoiceChannel::EState& new_state); private: speaker_state_map_t mSpeakerStateMap; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index a570862675..f046e08827 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -53,8 +53,11 @@ #include "llagent.h" #include "llnotificationsutil.h" #include "lltoastnotifypanel.h" +#include "lltooltip.h" #include "llviewerregion.h" +#include "llviewertexteditor.h" #include "llworld.h" +#include "lluiconstants.h" #include "llsidetray.h"//for blocked objects panel @@ -110,6 +113,34 @@ public: return LLPanel::handleMouseUp(x,y,mask); } + //*TODO remake it using mouse enter/leave and static LLHandle<LLIconCtrl> to add/remove as a child + BOOL handleToolTip(S32 x, S32 y, MASK mask) + { + LLViewerTextEditor* name = getChild<LLViewerTextEditor>("user_name"); + if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && SYSTEM_FROM != mFrom) + { + + // Spawn at right side of the name textbox. + LLRect sticky_rect = name->calcScreenRect(); + S32 icon_x = llmin(sticky_rect.mLeft + name->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3); + + LLToolTip::Params params; + params.background_visible(false); + params.click_callback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, 0, 0, 0)); + params.delay_time(0.0f); // spawn instantly on hover + params.image(LLUI::getUIImage("Info_Small")); + params.message(""); + params.padding(0); + params.pos(LLCoordGL(icon_x, sticky_rect.mTop - 2)); + params.sticky_rect(sticky_rect); + + LLToolTipMgr::getInstance()->show(params); + return TRUE; + } + + return LLPanel::handleToolTip(x, y, mask); + } + void onObjectIconContextMenuItemClicked(const LLSD& userdata) { std::string level = userdata.asString(); @@ -518,7 +549,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL chatters += *it; if (++it != mUnreadChatSources.end()) { - chatters += ","; + chatters += ", "; } } LLStringUtil::format_map_t args; @@ -554,9 +585,16 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL bool irc_me = prefix == "/me " || prefix == "/me'"; // Delimiter after a name in header copy/past and in plain text mode - std::string delimiter = (chat.mChatType != CHAT_TYPE_SHOUT && chat.mChatType != CHAT_TYPE_WHISPER) - ? ": " - : " "; + std::string delimiter = ": "; + std::string shout = LLTrans::getString("shout"); + std::string whisper = LLTrans::getString("whisper"); + if (chat.mChatType == CHAT_TYPE_SHOUT || + chat.mChatType == CHAT_TYPE_WHISPER || + chat.mText.compare(0, shout.length(), shout) == 0 || + chat.mText.compare(0, whisper.length(), whisper) == 0) + { + delimiter = " "; + } // Don't add any delimiter after name in irc styled messages if (irc_me || chat.mChatStyle == CHAT_STYLE_IRC) @@ -579,19 +617,26 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL url += "?name=" + chat.mFromName; url += "&owner=" + args["owner_id"].asString(); - LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent); - if (region) + std::string slurl = args["slurl"].asString(); + if (slurl.empty()) { - S32 x, y, z; - LLSLURL::globalPosToXYZ(LLVector3d(chat.mPosAgent), x, y, z); - url += "&slurl=" + region->getName() + llformat("/%d/%d/%d", x, y, z); + LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent); + if (region) + { + S32 x, y, z; + LLSLURL::globalPosToXYZ(LLVector3d(chat.mPosAgent), x, y, z); + slurl = region->getName() + llformat("/%d/%d/%d", x, y, z); + } } + url += "&slurl=" + slurl; // set the link for the object name to be the objectim SLapp + // (don't let object names with hyperlinks override our objectim Url) LLStyle::Params link_params(style_params); link_params.color.control = "HTMLLinkColor"; link_params.link_href = url; - mEditor->appendText(chat.mFromName + delimiter, false, link_params); + mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter, + false, link_params); } else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() ) { @@ -664,8 +709,36 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL { LLToastNotifyPanel* notify_box = new LLToastNotifyPanel( notification); + //we can't set follows in xml since it broke toasts behavior notify_box->setFollowsLeft(); notify_box->setFollowsRight(); + notify_box->setFollowsTop(); + + LLButton* accept_button = notify_box->getChild<LLButton> ("Accept", + TRUE); + if (accept_button != NULL) + { + accept_button->setFollowsNone(); + accept_button->setOrigin(2*HPAD, accept_button->getRect().mBottom); + } + + LLButton* decline_button = notify_box->getChild<LLButton> ( + "Decline", TRUE); + if (accept_button != NULL && decline_button != NULL) + { + decline_button->setFollowsNone(); + decline_button->setOrigin(4*HPAD + + accept_button->getRect().getWidth(), + decline_button->getRect().mBottom); + } + + LLTextEditor* text_editor = notify_box->getChild<LLTextEditor>("text_editor_box", TRUE); + S32 text_heigth = 0; + if(text_editor != NULL) + { + text_heigth = text_editor->getTextBoundingRect().getHeight(); + } + //Prepare the rect for the view LLRect target_rect = mEditor->getDocumentView()->getRect(); // squeeze down the widget by subtracting padding off left and right @@ -675,6 +748,15 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL notify_box->getRect().getHeight()); notify_box->setOrigin(target_rect.mLeft, notify_box->getRect().mBottom); + if (text_editor != NULL) + { + S32 text_heigth_delta = + text_editor->getTextBoundingRect().getHeight() + - text_heigth; + notify_box->reshape(target_rect.getWidth(), + notify_box->getRect().getHeight() + text_heigth_delta); + } + LLInlineViewSegment::Params params; params.view = notify_box; params.left_pad = mLeftWidgetPad; diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index f7f7ee83af..f772aea4bd 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -258,8 +258,12 @@ BOOL LLNearbyChatToastPanel::handleMouseDown (S32 x, S32 y, MASK mask) BOOL LLNearbyChatToastPanel::handleMouseUp (S32 x, S32 y, MASK mask) { + /* + fix for request EXT-4780 + leaving this commented since I don't remember why ew block those messages... if(mSourceType != CHAT_SOURCE_AGENT) return LLPanel::handleMouseUp(x,y,mask); + */ LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false); S32 local_x = x - text_box->getRect().mLeft; diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index 5a10b688da..651dabff9e 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -44,7 +44,6 @@ #include "llquaternion.h" #include "xform.h" #include "llmemtype.h" -#include "llprimitive.h" #include "lldarray.h" #include "llviewerobject.h" #include "llrect.h" diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 9f6412c0ab..3818ee6f78 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -116,7 +116,7 @@ LLExpandableTextBox::LLTextBoxEx::Params::Params() } LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p) -: LLTextBox(p), +: LLTextEditor(p), mExpanderLabel(p.more_label), mExpanderVisible(false) { @@ -127,7 +127,7 @@ LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p) void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL called_from_parent) { hideExpandText(); - LLTextBox::reshape(width, height, called_from_parent); + LLTextEditor::reshape(width, height, called_from_parent); if (getTextPixelHeight() > getRect().getHeight()) { @@ -140,7 +140,7 @@ void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,cons // LLTextBox::setText will obliterate the expander segment, so make sure // we generate it again by clearing mExpanderVisible mExpanderVisible = false; - LLTextBox::setText(text, input_params); + LLTextEditor::setText(text, input_params); // text contents have changed, segments are cleared out // so hide the expander and determine if we need it @@ -169,8 +169,7 @@ void LLExpandableTextBox::LLTextBoxEx::showExpandText() std::pair<S32, S32> visible_lines = getVisibleLines(true); S32 last_line = visible_lines.second - 1; - LLStyle::Params expander_style = getDefaultStyle(); - expander_style.font.name(LLFontGL::nameFromFont(expander_style.font)); + LLStyle::Params expander_style(getDefaultStyleParams()); expander_style.font.style = "UNDERLINE"; expander_style.color = LLUIColorTable::instance().getColor("HTMLLinkColor"); LLExpanderSegment* expanderp = new LLExpanderSegment(new LLStyle(expander_style), getLineStart(last_line), getLength() + 1, mExpanderLabel, *this); @@ -186,8 +185,8 @@ void LLExpandableTextBox::LLTextBoxEx::hideExpandText() if (mExpanderVisible) { // this will overwrite the expander segment and all text styling with a single style - LLNormalTextSegment* segmentp = new LLNormalTextSegment( - new LLStyle(getDefaultStyle()), 0, getLength() + 1, *this); + LLStyleConstSP sp(new LLStyle(getDefaultStyleParams())); + LLNormalTextSegment* segmentp = new LLNormalTextSegment(sp, 0, getLength() + 1, *this); insertSegment(segmentp); mExpanderVisible = false; @@ -202,6 +201,11 @@ S32 LLExpandableTextBox::LLTextBoxEx::getVerticalTextDelta() return text_height - textbox_height; } +S32 LLExpandableTextBox::LLTextBoxEx::getTextPixelHeight() +{ + return getTextBoundingRect().getHeight(); +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h index 2b4f9e527c..58316ddb98 100644 --- a/indra/newview/llexpandabletextbox.h +++ b/indra/newview/llexpandabletextbox.h @@ -33,7 +33,7 @@ #ifndef LL_LLEXPANDABLETEXTBOX_H #define LL_LLEXPANDABLETEXTBOX_H -#include "lltextbox.h" +#include "lltexteditor.h" #include "llscrollcontainer.h" /** @@ -49,10 +49,10 @@ protected: * Extended text box. "More" link will appear at end of text if * text is too long to fit into text box size. */ - class LLTextBoxEx : public LLTextBox + class LLTextBoxEx : public LLTextEditor { public: - struct Params : public LLInitParam::Block<Params, LLTextBox::Params> + struct Params : public LLInitParam::Block<Params, LLTextEditor::Params> { Mandatory<std::string> more_label; Params(); @@ -70,6 +70,11 @@ protected: virtual S32 getVerticalTextDelta(); /** + * Returns the height of text rect. + */ + S32 getTextPixelHeight(); + + /** * Shows "More" link */ void showExpandText(); diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index f5bb777419..90f6438980 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -34,7 +34,6 @@ #include "llfavoritesbar.h" -#include "llbutton.h" #include "llfloaterreg.h" #include "llfocusmgr.h" #include "llinventory.h" @@ -48,7 +47,6 @@ #include "llclipboard.h" #include "llinventoryclipboard.h" #include "llinventorybridge.h" -#include "llinventorymodel.h" #include "llfloaterworldmap.h" #include "lllandmarkactions.h" #include "llnotificationsutil.h" @@ -370,7 +368,8 @@ struct LLFavoritesSort LLFavoritesBarCtrl::Params::Params() : image_drag_indication("image_drag_indication"), - chevron_button("chevron_button") + chevron_button("chevron_button"), + label("label") { } @@ -401,6 +400,10 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p) chevron_button_params.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this)); mChevronButton = LLUICtrlFactory::create<LLButton> (chevron_button_params); addChild(mChevronButton); + + LLTextBox::Params label_param(p.label); + mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param); + addChild(mBarLabel); } LLFavoritesBarCtrl::~LLFavoritesBarCtrl() @@ -669,7 +672,14 @@ void LLFavoritesBarCtrl::updateButtons() { return; } - + if(mItems.empty()) + { + mBarLabel->setVisible(TRUE); + } + else + { + mBarLabel->setVisible(FALSE); + } const child_list_t* childs = getChildList(); child_list_const_iter_t child_it = childs->begin(); int first_changed_item_index = 0; @@ -715,14 +725,22 @@ void LLFavoritesBarCtrl::updateButtons() } } // we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning + // keep in mind that we are cutting all buttons in space between the last visible child of favbar and ChevronButton if (mChevronButton->getParent() == this) { removeChild(mChevronButton); } int last_right_edge = 0; + //calculate new buttons offset if (getChildList()->size() > 0) { - last_right_edge = getChildList()->back()->getRect().mRight; + //find last visible child to get the rightest button offset + child_list_const_reverse_iter_t last_visible_it = std::find_if(childs->rbegin(), childs->rend(), + std::mem_fun(&LLView::getVisible)); + if(last_visible_it != childs->rend()) + { + last_right_edge = (*last_visible_it)->getRect().mRight; + } } //last_right_edge is saving coordinates LLButton* last_new_button = NULL; diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 40dd551eef..2c6d8d1580 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -35,6 +35,7 @@ #include "llbutton.h" #include "lluictrl.h" +#include "lltextbox.h" #include "llinventoryobserver.h" #include "llinventorymodel.h" @@ -46,6 +47,7 @@ public: { Optional<LLUIImage*> image_drag_indication; Optional<LLButton::Params> chevron_button; + Optional<LLTextBox::Params> label; Params(); }; @@ -139,6 +141,7 @@ private: LLUICtrl* mLandingTab; LLUICtrl* mLastTab; LLButton* mChevronButton; + LLTextBox* mBarLabel; LLUUID mDragItemId; BOOL mStartDrag; diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 60f150bd96..5ec58c8dd6 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -86,38 +86,40 @@ const F32 BASE_ANIM_TIME_OFFSET = 5.f; std::string STATUS[] = { - "E_ST_OK", - "E_ST_EOF", - "E_ST_NO_CONSTRAINT", - "E_ST_NO_FILE", -"E_ST_NO_HIER", -"E_ST_NO_JOINT", -"E_ST_NO_NAME", -"E_ST_NO_OFFSET", -"E_ST_NO_CHANNELS", -"E_ST_NO_ROTATION", -"E_ST_NO_AXIS", -"E_ST_NO_MOTION", -"E_ST_NO_FRAMES", -"E_ST_NO_FRAME_TIME", -"E_ST_NO_POS", -"E_ST_NO_ROT", -"E_ST_NO_XLT_FILE", -"E_ST_NO_XLT_HEADER", -"E_ST_NO_XLT_NAME", -"E_ST_NO_XLT_IGNORE", -"E_ST_NO_XLT_RELATIVE", -"E_ST_NO_XLT_OUTNAME", -"E_ST_NO_XLT_MATRIX", -"E_ST_NO_XLT_MERGECHILD", -"E_ST_NO_XLT_MERGEPARENT", -"E_ST_NO_XLT_PRIORITY", -"E_ST_NO_XLT_LOOP", -"E_ST_NO_XLT_EASEIN", -"E_ST_NO_XLT_EASEOUT", -"E_ST_NO_XLT_HAND", -"E_ST_NO_XLT_EMOTE", + "E_ST_OK", + "E_ST_EOF", + "E_ST_NO_CONSTRAINT", + "E_ST_NO_FILE", + "E_ST_NO_HIER", + "E_ST_NO_JOINT", + "E_ST_NO_NAME", + "E_ST_NO_OFFSET", + "E_ST_NO_CHANNELS", + "E_ST_NO_ROTATION", + "E_ST_NO_AXIS", + "E_ST_NO_MOTION", + "E_ST_NO_FRAMES", + "E_ST_NO_FRAME_TIME", + "E_ST_NO_POS", + "E_ST_NO_ROT", + "E_ST_NO_XLT_FILE", + "E_ST_NO_XLT_HEADER", + "E_ST_NO_XLT_NAME", + "E_ST_NO_XLT_IGNORE", + "E_ST_NO_XLT_RELATIVE", + "E_ST_NO_XLT_OUTNAME", + "E_ST_NO_XLT_MATRIX", + "E_ST_NO_XLT_MERGECHILD", + "E_ST_NO_XLT_MERGEPARENT", + "E_ST_NO_XLT_PRIORITY", + "E_ST_NO_XLT_LOOP", + "E_ST_NO_XLT_EASEIN", + "E_ST_NO_XLT_EASEOUT", + "E_ST_NO_XLT_HAND", + "E_ST_NO_XLT_EMOTE", +"E_ST_BAD_ROOT" }; + //----------------------------------------------------------------------------- // LLFloaterAnimPreview() //----------------------------------------------------------------------------- diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 0ad283d7c6..8cd63deebe 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -427,8 +427,26 @@ BOOL LLPanelLandGeneral::postBuild() mBtnBuyLand = getChild<LLButton>("Buy Land..."); mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND); - mBtnScriptLimits = getChild<LLButton>("Scripts..."); - mBtnScriptLimits->setClickedCallback(onClickScriptLimits, this); + // note: on region change this will not be re checked, should not matter on Agni as + // 99% of the time all regions will return the same caps. In case of an erroneous setting + // to enabled the floater will just throw an error when trying to get it's cap + std::string url = gAgent.getRegion()->getCapability("LandResources"); + if (!url.empty()) + { + mBtnScriptLimits = getChild<LLButton>("Scripts..."); + if(mBtnScriptLimits) + { + mBtnScriptLimits->setClickedCallback(onClickScriptLimits, this); + } + } + else + { + mBtnScriptLimits = getChild<LLButton>("Scripts..."); + if(mBtnScriptLimits) + { + mBtnScriptLimits->setVisible(false); + } + } mBtnBuyGroupLand = getChild<LLButton>("Buy For Group..."); mBtnBuyGroupLand->setClickedCallback(onClickBuyLand, (void*)&BUY_GROUP_LAND); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index ef444c8ba4..9d9fbacee3 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -571,6 +571,16 @@ void LLFloaterPreference::setHardwareDefaults() { LLFeatureManager::getInstance()->applyRecommendedSettings(); refreshEnabledGraphics(); + LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); + child_list_t::const_iterator iter = tabcontainer->getChildList()->begin(); + child_list_t::const_iterator end = tabcontainer->getChildList()->end(); + for ( ; iter != end; ++iter) + { + LLView* view = *iter; + LLPanelPreference* panel = dynamic_cast<LLPanelPreference*>(view); + if (panel) + panel->setHardwareDefaults(); + } } //virtual @@ -1525,3 +1535,93 @@ void LLPanelPreference::setControlFalse(const LLSD& user_data) if (control) control->set(LLSD(FALSE)); } + +static LLRegisterPanelClassWrapper<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics"); + +BOOL LLPanelPreferenceGraphics::postBuild() +{ + return LLPanelPreference::postBuild(); +} +void LLPanelPreferenceGraphics::draw() +{ + LLPanelPreference::draw(); + + LLButton* button_apply = findChild<LLButton>("Apply"); + + if(button_apply && button_apply->getVisible()) + { + bool enable = hasDirtyChilds(); + + button_apply->setEnabled(enable); + + } +} +bool LLPanelPreferenceGraphics::hasDirtyChilds() +{ + std::list<LLView*> view_stack; + view_stack.push_back(this); + while(!view_stack.empty()) + { + // Process view on top of the stack + LLView* curview = view_stack.front(); + view_stack.pop_front(); + + LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); + if (ctrl) + { + if(ctrl->isDirty()) + return true; + } + // Push children onto the end of the work stack + for (child_list_t::const_iterator iter = curview->getChildList()->begin(); + iter != curview->getChildList()->end(); ++iter) + { + view_stack.push_back(*iter); + } + } + return false; +} + +void LLPanelPreferenceGraphics::resetDirtyChilds() +{ + std::list<LLView*> view_stack; + view_stack.push_back(this); + while(!view_stack.empty()) + { + // Process view on top of the stack + LLView* curview = view_stack.front(); + view_stack.pop_front(); + + LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); + if (ctrl) + { + ctrl->resetDirty(); + } + // Push children onto the end of the work stack + for (child_list_t::const_iterator iter = curview->getChildList()->begin(); + iter != curview->getChildList()->end(); ++iter) + { + view_stack.push_back(*iter); + } + } +} +void LLPanelPreferenceGraphics::apply() +{ + resetDirtyChilds(); + LLPanelPreference::apply(); +} +void LLPanelPreferenceGraphics::cancel() +{ + resetDirtyChilds(); + LLPanelPreference::cancel(); +} +void LLPanelPreferenceGraphics::saveSettings() +{ + resetDirtyChilds(); + LLPanelPreference::saveSettings(); +} +void LLPanelPreferenceGraphics::setHardwareDefaults() +{ + resetDirtyChilds(); + LLPanelPreference::setHardwareDefaults(); +} diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 8778d76a5a..0827c7c2b2 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -161,6 +161,7 @@ public: virtual void apply(); virtual void cancel(); void setControlFalse(const LLSD& user_data); + virtual void setHardwareDefaults(){}; // This function squirrels away the current values of the controls so that // cancel() can restore them. @@ -177,4 +178,19 @@ private: string_color_map_t mSavedColors; }; +class LLPanelPreferenceGraphics : public LLPanelPreference +{ +public: + BOOL postBuild(); + void draw(); + void apply(); + void cancel(); + void saveSettings(); + void setHardwareDefaults(); +protected: + bool hasDirtyChilds(); + void resetDirtyChilds(); + +}; + #endif // LL_LLPREFERENCEFLOATER_H diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index 8875e35821..4194416a01 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -59,10 +59,30 @@ /// LLFloaterScriptLimits ///---------------------------------------------------------------------------- -// due to server side bugs the full summary display is not possible -// until they are fixed this define creates a simple version of the -// summary which only shows available & correct information -#define USE_SIMPLE_SUMMARY +// debug switches, won't work in release +#ifndef LL_RELEASE_FOR_DOWNLOAD + +// dump responder replies to llinfos for debugging +//#define DUMP_REPLIES_TO_LLINFOS + +#ifdef DUMP_REPLIES_TO_LLINFOS +#include "llsdserialize.h" +#include "llwindow.h" +#endif + +// use fake LLSD responses to check the viewer side is working correctly +// I'm syncing this with the server side efforts so hopfully we can keep +// the to-ing and fro-ing between the two teams to a minimum +//#define USE_FAKE_RESPONSES + +#ifdef USE_FAKE_RESPONSES +const S32 FAKE_NUMBER_OF_URLS = 329; +const S32 FAKE_AVAILABLE_URLS = 731; +const S32 FAKE_AMOUNT_OF_MEMORY = 66741; +const S32 FAKE_AVAILABLE_MEMORY = 895577; +#endif + +#endif const S32 SIZE_OF_ONE_KB = 1024; @@ -87,32 +107,41 @@ BOOL LLFloaterScriptLimits::postBuild() } mTab = getChild<LLTabContainer>("scriptlimits_panels"); + + if(!mTab) + { + llinfos << "Error! couldn't get scriptlimits_panels, aborting Script Information setup" << llendl; + return FALSE; + } // contruct the panels - LLPanelScriptLimitsRegionMemory* panel_memory; - panel_memory = new LLPanelScriptLimitsRegionMemory; - mInfoPanels.push_back(panel_memory); + std::string land_url = gAgent.getRegion()->getCapability("LandResources"); + if (!land_url.empty()) + { + LLPanelScriptLimitsRegionMemory* panel_memory; + panel_memory = new LLPanelScriptLimitsRegionMemory; + mInfoPanels.push_back(panel_memory); + LLUICtrlFactory::getInstance()->buildPanel(panel_memory, "panel_script_limits_region_memory.xml"); + mTab->addTabPanel(panel_memory); + } - LLUICtrlFactory::getInstance()->buildPanel(panel_memory, "panel_script_limits_region_memory.xml"); - mTab->addTabPanel(panel_memory); - - LLPanelScriptLimitsRegionURLs* panel_urls = new LLPanelScriptLimitsRegionURLs; - mInfoPanels.push_back(panel_urls); - LLUICtrlFactory::getInstance()->buildPanel(panel_urls, "panel_script_limits_region_urls.xml"); - mTab->addTabPanel(panel_urls); - - LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment; - mInfoPanels.push_back(panel_attachments); - LLUICtrlFactory::getInstance()->buildPanel(panel_attachments, "panel_script_limits_my_avatar.xml"); - mTab->addTabPanel(panel_attachments); - - if(selectParcelPanel) + std::string attachment_url = gAgent.getRegion()->getCapability("AttachmentResources"); + if (!attachment_url.empty()) + { + LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment; + mInfoPanels.push_back(panel_attachments); + LLUICtrlFactory::getInstance()->buildPanel(panel_attachments, "panel_script_limits_my_avatar.xml"); + mTab->addTabPanel(panel_attachments); + } + + if(mInfoPanels.size() > 0) { mTab->selectTab(0); } - else + + if(!selectParcelPanel && (mInfoPanels.size() > 1)) { - mTab->selectTab(2); + mTab->selectTab(1); } return TRUE; @@ -160,6 +189,20 @@ void LLPanelScriptLimitsInfo::updateChild(LLUICtrl* child_ctr) void fetchScriptLimitsRegionInfoResponder::result(const LLSD& content) { + //we don't need to test with a fake respose here (shouldn't anyway) + +#ifdef DUMP_REPLIES_TO_LLINFOS + + LLSDNotationStreamer notation_streamer(content); + std::ostringstream nice_llsd; + nice_llsd << notation_streamer; + + OSMessageBox(nice_llsd.str(), "main cap response:", 0); + + llinfos << "main cap response:" << content << llendl; + +#endif + // at this point we have an llsd which should contain ether one or two urls to the services we want. // first we look for the details service: if(content.has("ScriptResourceDetails")) @@ -173,24 +216,6 @@ void fetchScriptLimitsRegionInfoResponder::result(const LLSD& content) { llinfos << "Failed to get llfloaterscriptlimits instance" << llendl; } - else - { - -// temp - only show info if we get details - there's nothing to show if not until the sim gets fixed -#ifdef USE_SIMPLE_SUMMARY - - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); - std::string msg = LLTrans::getString("ScriptLimitsRequestDontOwnParcel"); - panel_memory->childSetValue("loading_text", LLSD(msg)); - LLPanelScriptLimitsRegionURLs* panel_urls = (LLPanelScriptLimitsRegionURLs*)tab->getChild<LLPanel>("script_limits_region_urls_panel"); - panel_urls->childSetValue("loading_text", LLSD(msg)); - - // intentional early out as we dont want the resource summary if we are using the "simple summary" - // and the details are missing - return; -#endif - } } // then the summary service: @@ -205,8 +230,61 @@ void fetchScriptLimitsRegionInfoResponder::error(U32 status, const std::string& llinfos << "Error from responder " << reason << llendl; } -void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content) +void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref) { +#ifdef USE_FAKE_RESPONSES + + LLSD fake_content; + LLSD summary = LLSD::emptyMap(); + LLSD available = LLSD::emptyArray(); + LLSD available_urls = LLSD::emptyMap(); + LLSD available_memory = LLSD::emptyMap(); + LLSD used = LLSD::emptyArray(); + LLSD used_urls = LLSD::emptyMap(); + LLSD used_memory = LLSD::emptyMap(); + + used_urls["type"] = "urls"; + used_urls["amount"] = FAKE_NUMBER_OF_URLS; + available_urls["type"] = "urls"; + available_urls["amount"] = FAKE_AVAILABLE_URLS; + used_memory["type"] = "memory"; + used_memory["amount"] = FAKE_AMOUNT_OF_MEMORY; + available_memory["type"] = "memory"; + available_memory["amount"] = FAKE_AVAILABLE_MEMORY; + +//summary response:{'summary':{'available':[{'amount':i731,'type':'urls'},{'amount':i895577,'type':'memory'},{'amount':i731,'type':'urls'},{'amount':i895577,'type':'memory'}],'used':[{'amount':i329,'type':'urls'},{'amount':i66741,'type':'memory'}]}} + + used.append(used_urls); + used.append(used_memory); + available.append(available_urls); + available.append(available_memory); + + summary["available"] = available; + summary["used"] = used; + + fake_content["summary"] = summary; + + const LLSD& content = fake_content; + +#else + + const LLSD& content = content_ref; + +#endif + + +#ifdef DUMP_REPLIES_TO_LLINFOS + + LLSDNotationStreamer notation_streamer(content); + std::ostringstream nice_llsd; + nice_llsd << notation_streamer; + + OSMessageBox(nice_llsd.str(), "summary response:", 0); + + llinfos << "summary response:" << *content << llendl; + +#endif + LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(!instance) { @@ -217,8 +295,6 @@ void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content) LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); panel_memory->setRegionSummary(content); - LLPanelScriptLimitsRegionURLs* panel_urls = (LLPanelScriptLimitsRegionURLs*)tab->getChild<LLPanel>("script_limits_region_urls_panel"); - panel_urls->setRegionSummary(content); } } @@ -227,8 +303,82 @@ void fetchScriptLimitsRegionSummaryResponder::error(U32 status, const std::strin llinfos << "Error from responder " << reason << llendl; } -void fetchScriptLimitsRegionDetailsResponder::result(const LLSD& content) +void fetchScriptLimitsRegionDetailsResponder::result(const LLSD& content_ref) { +#ifdef USE_FAKE_RESPONSES +/* +Updated detail service, ** denotes field added: + +result (map) ++-parcels (array of maps) + +-id (uuid) + +-local_id (S32)** + +-name (string) + +-owner_id (uuid) (in ERS as owner, but owner_id in code) + +-objects (array of maps) + +-id (uuid) + +-name (string) + +-owner_id (uuid) (in ERS as owner, in code as owner_id) + +-owner_name (sting)** + +-location (map)** + +-x (float) + +-y (float) + +-z (float) + +-resources (map) (this is wrong in the ERS but right in code) + +-type (string) + +-amount (int) +*/ + LLSD fake_content; + LLSD resource = LLSD::emptyMap(); + LLSD location = LLSD::emptyMap(); + LLSD object = LLSD::emptyMap(); + LLSD objects = LLSD::emptyArray(); + LLSD parcel = LLSD::emptyMap(); + LLSD parcels = LLSD::emptyArray(); + + resource["urls"] = FAKE_NUMBER_OF_URLS; + resource["memory"] = FAKE_AMOUNT_OF_MEMORY; + + location["x"] = 128.0f; + location["y"] = 128.0f; + location["z"] = 0.0f; + + object["id"] = LLUUID("d574a375-0c6c-fe3d-5733-da669465afc7"); + object["name"] = "Gabs fake Object!"; + object["owner_id"] = LLUUID("8dbf2d41-69a0-4e5e-9787-0c9d297bc570"); + object["owner_name"] = "Gabs Linden"; + object["location"] = location; + object["resources"] = resource; + + objects.append(object); + + parcel["id"] = LLUUID("da05fb28-0d20-e593-2728-bddb42dd0160"); + parcel["local_id"] = 42; + parcel["name"] = "Gabriel Linden\'s Sub Plot"; + parcel["objects"] = objects; + parcels.append(parcel); + + fake_content["parcels"] = parcels; + const LLSD& content = fake_content; + +#else + + const LLSD& content = content_ref; + +#endif + +#ifdef DUMP_REPLIES_TO_LLINFOS + + LLSDNotationStreamer notation_streamer(content); + std::ostringstream nice_llsd; + nice_llsd << notation_streamer; + + OSMessageBox(nice_llsd.str(), "details response:", 0); + + llinfos << "details response:" << content << llendl; + +#endif + LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(!instance) @@ -238,11 +388,22 @@ void fetchScriptLimitsRegionDetailsResponder::result(const LLSD& content) else { LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); - panel_memory->setRegionDetails(content); - - LLPanelScriptLimitsRegionURLs* panel_urls = (LLPanelScriptLimitsRegionURLs*)tab->getChild<LLPanel>("script_limits_region_urls_panel"); - panel_urls->setRegionDetails(content); + if(tab) + { + LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); + if(panel_memory) + { + panel_memory->setRegionDetails(content); + } + else + { + llinfos << "Failed to get scriptlimits memory panel" << llendl; + } + } + else + { + llinfos << "Failed to get scriptlimits_panels" << llendl; + } } } @@ -251,8 +412,61 @@ void fetchScriptLimitsRegionDetailsResponder::error(U32 status, const std::strin llinfos << "Error from responder " << reason << llendl; } -void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content) +void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref) { + +#ifdef USE_FAKE_RESPONSES + + // just add the summary, as that's all I'm testing currently! + LLSD fake_content = LLSD::emptyMap(); + LLSD summary = LLSD::emptyMap(); + LLSD available = LLSD::emptyArray(); + LLSD available_urls = LLSD::emptyMap(); + LLSD available_memory = LLSD::emptyMap(); + LLSD used = LLSD::emptyArray(); + LLSD used_urls = LLSD::emptyMap(); + LLSD used_memory = LLSD::emptyMap(); + + used_urls["type"] = "urls"; + used_urls["amount"] = FAKE_NUMBER_OF_URLS; + available_urls["type"] = "urls"; + available_urls["amount"] = FAKE_AVAILABLE_URLS; + used_memory["type"] = "memory"; + used_memory["amount"] = FAKE_AMOUNT_OF_MEMORY; + available_memory["type"] = "memory"; + available_memory["amount"] = FAKE_AVAILABLE_MEMORY; + + used.append(used_urls); + used.append(used_memory); + available.append(available_urls); + available.append(available_memory); + + summary["available"] = available; + summary["used"] = used; + + fake_content["summary"] = summary; + fake_content["attachments"] = content_ref["attachments"]; + + const LLSD& content = fake_content; + +#else + + const LLSD& content = content_ref; + +#endif + +#ifdef DUMP_REPLIES_TO_LLINFOS + + LLSDNotationStreamer notation_streamer(content); + std::ostringstream nice_llsd; + nice_llsd << notation_streamer; + + OSMessageBox(nice_llsd.str(), "attachment response:", 0); + + llinfos << "attachment response:" << content << llendl; + +#endif + LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(!instance) @@ -262,8 +476,22 @@ void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content) else { LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsAttachment* panel = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel"); - panel->setAttachmentDetails(content); + if(tab) + { + LLPanelScriptLimitsAttachment* panel = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel"); + if(panel) + { + panel->setAttachmentDetails(content); + } + else + { + llinfos << "Failed to get script_limits_my_avatar_panel" << llendl; + } + } + else + { + llinfos << "Failed to get scriptlimits_panels" << llendl; + } } } @@ -309,7 +537,7 @@ void LLPanelScriptLimitsRegionMemory::processParcelInfo(const LLParcelData& parc { std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); childSetValue("loading_text", LLSD(msg_waiting)); - } + } } void LLPanelScriptLimitsRegionMemory::setParcelID(const LLUUID& parcel_id) @@ -341,6 +569,11 @@ void LLPanelScriptLimitsRegionMemory::onNameCache( std::string name = first_name + " " + last_name; LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list"); + if(!list) + { + return; + } + std::vector<LLSD>::iterator id_itor; for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor) { @@ -351,33 +584,8 @@ void LLPanelScriptLimitsRegionMemory::onNameCache( if(item) { - item->getColumn(2)->setValue(LLSD(name)); - element["columns"][2]["value"] = name; - } - } - } - - // fill in the url's tab if needed, all urls must have memory so we can do it all here - LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); - if(instance) - { - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_urls_panel"); - - LLScrollListCtrl *list = panel->getChild<LLScrollListCtrl>("scripts_list"); - std::vector<LLSD>::iterator id_itor; - for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor) - { - LLSD element = *id_itor; - if(element["owner_id"].asUUID() == id) - { - LLScrollListItem* item = list->getItem(element["id"].asUUID()); - - if(item) - { - item->getColumn(2)->setValue(LLSD(name)); - element["columns"][2]["value"] = name; - } + item->getColumn(3)->setValue(LLSD(name)); + element["columns"][3]["value"] = name; } } } @@ -386,6 +594,12 @@ void LLPanelScriptLimitsRegionMemory::onNameCache( void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content) { LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list"); + + if(!list) + { + llinfos << "Error getting the scripts_list control" << llendl; + return; + } S32 number_parcels = content["parcels"].size(); @@ -394,130 +608,197 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content) std::string msg_parcels = LLTrans::getString("ScriptLimitsParcelsOwned", args_parcels); childSetValue("parcels_listed", LLSD(msg_parcels)); - S32 total_objects = 0; - S32 total_size = 0; - std::vector<LLUUID> names_requested; + // This makes the assumption that all objects will have the same set + // of attributes, ie they will all have, or none will have locations + // This is a pretty safe assumption as it's reliant on server version. + bool has_locations = false; + bool has_local_ids = false; + for(S32 i = 0; i < number_parcels; i++) { std::string parcel_name = content["parcels"][i]["name"].asString(); LLUUID parcel_id = content["parcels"][i]["id"].asUUID(); S32 number_objects = content["parcels"][i]["objects"].size(); + + S32 local_id = 0; + if(content["parcels"][i].has("local_id")) + { + // if any locations are found flag that we can use them and turn on the highlight button + has_local_ids = true; + local_id = content["parcels"][i]["local_id"].asInteger(); + } + for(S32 j = 0; j < number_objects; j++) { S32 size = content["parcels"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB; - total_size += size; + + S32 urls = content["parcels"][i]["objects"][j]["resources"]["urls"].asInteger(); std::string name_buf = content["parcels"][i]["objects"][j]["name"].asString(); LLUUID task_id = content["parcels"][i]["objects"][j]["id"].asUUID(); LLUUID owner_id = content["parcels"][i]["objects"][j]["owner_id"].asUUID(); - + + F32 location_x = 0.0f; + F32 location_y = 0.0f; + F32 location_z = 0.0f; + + if(content["parcels"][i]["objects"][j].has("location")) + { + // if any locations are found flag that we can use them and turn on the highlight button + LLVector3 vec = ll_vector3_from_sd(content["parcels"][i]["objects"][j]["location"]); + has_locations = true; + location_x = vec.mV[0]; + location_y = vec.mV[1]; + location_z = vec.mV[2]; + } + std::string owner_buf; - - BOOL name_is_cached = gCacheName->getFullName(owner_id, owner_buf); - if(!name_is_cached) + + // in the future the server will give us owner names, so see if we're there yet: + if(content["parcels"][i]["objects"][j].has("owner_name")) + { + owner_buf = content["parcels"][i]["objects"][j]["owner_name"].asString(); + } + // ...and if not use the slightly more painful method of disovery: + else { - if(std::find(names_requested.begin(), names_requested.end(), owner_id) == names_requested.end()) + BOOL name_is_cached = gCacheName->getFullName(owner_id, owner_buf); + if(!name_is_cached) { - names_requested.push_back(owner_id); - gCacheName->get(owner_id, TRUE, - boost::bind(&LLPanelScriptLimitsRegionMemory::onNameCache, - this, _1, _2, _3)); + if(std::find(names_requested.begin(), names_requested.end(), owner_id) == names_requested.end()) + { + names_requested.push_back(owner_id); + gCacheName->get(owner_id, TRUE, + boost::bind(&LLPanelScriptLimitsRegionMemory::onNameCache, + this, _1, _2, _3)); + } } } LLSD element; element["id"] = task_id; - element["owner_id"] = owner_id; element["columns"][0]["column"] = "size"; element["columns"][0]["value"] = llformat("%d", size); element["columns"][0]["font"] = "SANSSERIF"; - element["columns"][1]["column"] = "name"; - element["columns"][1]["value"] = name_buf; + element["columns"][1]["column"] = "urls"; + element["columns"][1]["value"] = llformat("%d", urls); element["columns"][1]["font"] = "SANSSERIF"; - element["columns"][2]["column"] = "owner"; - element["columns"][2]["value"] = owner_buf; + element["columns"][2]["column"] = "name"; + element["columns"][2]["value"] = name_buf; element["columns"][2]["font"] = "SANSSERIF"; - element["columns"][3]["column"] = "location"; - element["columns"][3]["value"] = parcel_name; + element["columns"][3]["column"] = "owner"; + element["columns"][3]["value"] = owner_buf; element["columns"][3]["font"] = "SANSSERIF"; + element["columns"][4]["column"] = "parcel"; + element["columns"][4]["value"] = parcel_name; + element["columns"][4]["font"] = "SANSSERIF"; + element["columns"][5]["column"] = "location"; + if(has_locations) + { + element["columns"][5]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z); + } + else + { + element["columns"][5]["value"] = ""; + } + element["columns"][5]["font"] = "SANSSERIF"; list->addElement(element, ADD_SORTED); + + element["owner_id"] = owner_id; + element["local_id"] = local_id; mObjectListItems.push_back(element); - total_objects++; } } - mParcelMemoryUsed =total_size; - mGotParcelMemoryUsed = TRUE; - populateParcelMemoryText(); -} + if (has_locations) + { + LLButton* btn = getChild<LLButton>("highlight_btn"); + if(btn) + { + btn->setVisible(true); + } + } -void LLPanelScriptLimitsRegionMemory::populateParcelMemoryText() -{ - if(mGotParcelMemoryUsed && mGotParcelMemoryMax) + if (has_local_ids) { -#ifdef USE_SIMPLE_SUMMARY - LLStringUtil::format_map_t args_parcel_memory; - args_parcel_memory["[COUNT]"] = llformat ("%d", mParcelMemoryUsed); - std::string msg_parcel_memory = LLTrans::getString("ScriptLimitsMemoryUsedSimple", args_parcel_memory); - childSetValue("memory_used", LLSD(msg_parcel_memory)); -#else - S32 parcel_memory_available = mParcelMemoryMax - mParcelMemoryUsed; + LLButton* btn = getChild<LLButton>("return_btn"); + if(btn) + { + btn->setVisible(true); + } + } - LLStringUtil::format_map_t args_parcel_memory; - args_parcel_memory["[COUNT]"] = llformat ("%d", mParcelMemoryUsed); - args_parcel_memory["[MAX]"] = llformat ("%d", mParcelMemoryMax); - args_parcel_memory["[AVAILABLE]"] = llformat ("%d", parcel_memory_available); - std::string msg_parcel_memory = LLTrans::getString("ScriptLimitsMemoryUsed", args_parcel_memory); - childSetValue("memory_used", LLSD(msg_parcel_memory)); -#endif + // save the structure to make object return easier + mContent = content; - childSetValue("loading_text", LLSD(std::string(""))); - } + childSetValue("loading_text", LLSD(std::string(""))); } void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content) { - if(content["summary"]["available"][0]["type"].asString() == std::string("memory")) + if(content["summary"]["used"][0]["type"].asString() == std::string("memory")) { - mParcelMemoryMax = content["summary"]["available"][0]["amount"].asInteger(); - mGotParcelMemoryMax = TRUE; + mParcelMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; + mParcelMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; + mGotParcelMemoryUsed = TRUE; } - else if(content["summary"]["available"][1]["type"].asString() == std::string("memory")) + else if(content["summary"]["used"][1]["type"].asString() == std::string("memory")) { - mParcelMemoryMax = content["summary"]["available"][1]["amount"].asInteger(); - mGotParcelMemoryMax = TRUE; + mParcelMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; + mParcelMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; + mGotParcelMemoryUsed = TRUE; } else { llinfos << "summary doesn't contain memory info" << llendl; return; } -/* - currently this is broken on the server, so we get this value from the details section - and update via populateParcelMemoryText() when both sets of information have been returned - - when the sim is fixed this should be used instead: - if(content["summary"]["used"][0]["type"].asString() == std::string("memory")) + + if(content["summary"]["used"][0]["type"].asString() == std::string("urls")) { - mParcelMemoryUsed = content["summary"]["used"][0]["amount"].asInteger(); - mGotParcelMemoryUsed = TRUE; + mParcelURLsUsed = content["summary"]["used"][0]["amount"].asInteger(); + mParcelURLsMax = content["summary"]["available"][0]["amount"].asInteger(); + mGotParcelURLsUsed = TRUE; } - else if(content["summary"]["used"][1]["type"].asString() == std::string("memory")) + else if(content["summary"]["used"][1]["type"].asString() == std::string("urls")) { - mParcelMemoryUsed = content["summary"]["used"][1]["amount"].asInteger(); - mGotParcelMemoryUsed = TRUE; + mParcelURLsUsed = content["summary"]["used"][1]["amount"].asInteger(); + mParcelURLsMax = content["summary"]["available"][1]["amount"].asInteger(); + mGotParcelURLsUsed = TRUE; } else { - //ERROR!!! + llinfos << "summary doesn't contain urls info" << llendl; return; - }*/ + } - populateParcelMemoryText(); + if((mParcelMemoryUsed >= 0) && (mParcelMemoryMax >= 0)) + { + S32 parcel_memory_available = mParcelMemoryMax - mParcelMemoryUsed; + + LLStringUtil::format_map_t args_parcel_memory; + args_parcel_memory["[COUNT]"] = llformat ("%d", mParcelMemoryUsed); + args_parcel_memory["[MAX]"] = llformat ("%d", mParcelMemoryMax); + args_parcel_memory["[AVAILABLE]"] = llformat ("%d", parcel_memory_available); + std::string msg_parcel_memory = LLTrans::getString("ScriptLimitsMemoryUsed", args_parcel_memory); + childSetValue("memory_used", LLSD(msg_parcel_memory)); + } + + if((mParcelURLsUsed >= 0) && (mParcelURLsMax >= 0)) + { + S32 parcel_urls_available = mParcelURLsMax - mParcelURLsUsed; + + LLStringUtil::format_map_t args_parcel_urls; + args_parcel_urls["[COUNT]"] = llformat ("%d", mParcelURLsUsed); + args_parcel_urls["[MAX]"] = llformat ("%d", mParcelURLsMax); + args_parcel_urls["[AVAILABLE]"] = llformat ("%d", parcel_urls_available); + std::string msg_parcel_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_parcel_urls); + childSetValue("urls_used", LLSD(msg_parcel_urls)); + } } BOOL LLPanelScriptLimitsRegionMemory::postBuild() @@ -530,6 +811,10 @@ BOOL LLPanelScriptLimitsRegionMemory::postBuild() childSetValue("loading_text", LLSD(msg_waiting)); LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list"); + if(!list) + { + return FALSE; + } //set all columns to resizable mode even if some columns will be empty for(S32 column = 0; column < list->getNumColumns(); column++) @@ -548,18 +833,11 @@ BOOL LLPanelScriptLimitsRegionMemory::StartRequestChain() LLFloaterLand* instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land"); if(!instance) { - //this isnt really an error... -// llinfos << "Failed to get about land instance" << llendl; -// std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestError"); childSetValue("loading_text", LLSD(std::string(""))); //might have to do parent post build here //if not logic below could use early outs return FALSE; } - - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionURLs* panel_urls = (LLPanelScriptLimitsRegionURLs*)tab->getChild<LLPanel>("script_limits_region_urls_panel"); - LLParcel* parcel = instance->getCurrentSelectedParcel(); LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); @@ -575,7 +853,6 @@ BOOL LLPanelScriptLimitsRegionMemory::StartRequestChain() { std::string msg_wrong_region = LLTrans::getString("ScriptLimitsRequestWrongRegion"); childSetValue("loading_text", LLSD(msg_wrong_region)); - panel_urls->childSetValue("loading_text", LLSD(msg_wrong_region)); return FALSE; } @@ -605,14 +882,12 @@ BOOL LLPanelScriptLimitsRegionMemory::StartRequestChain() std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestError"); childSetValue("loading_text", LLSD(msg_waiting)); - panel_urls->childSetValue("loading_text", LLSD(msg_waiting)); } } else { - std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestError"); + std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestNoParcelSelected"); childSetValue("loading_text", LLSD(msg_waiting)); - panel_urls->childSetValue("loading_text", LLSD(msg_waiting)); } return LLPanelScriptLimitsInfo::postBuild(); @@ -629,10 +904,13 @@ void LLPanelScriptLimitsRegionMemory::clearList() mGotParcelMemoryUsed = FALSE; mGotParcelMemoryMax = FALSE; + mGotParcelURLsUsed = FALSE; + mGotParcelURLsMax = FALSE; LLStringUtil::format_map_t args_parcel_memory; std::string msg_empty_string(""); childSetValue("memory_used", LLSD(msg_empty_string)); + childSetValue("urls_used", LLSD(msg_empty_string)); childSetValue("parcels_listed", LLSD(msg_empty_string)); mObjectListItems.clear(); @@ -647,13 +925,16 @@ void LLPanelScriptLimitsRegionMemory::onClickRefresh(void* userdata) if(instance) { LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); - panel_memory->clearList(); - - LLPanelScriptLimitsRegionURLs* panel_urls = (LLPanelScriptLimitsRegionURLs*)tab->getChild<LLPanel>("script_limits_region_urls_panel"); - panel_urls->clearList(); + if(tab) + { + LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); + if(panel_memory) + { + panel_memory->clearList(); - panel_memory->StartRequestChain(); + panel_memory->StartRequestChain(); + } + } return; } else @@ -665,78 +946,80 @@ void LLPanelScriptLimitsRegionMemory::onClickRefresh(void* userdata) void LLPanelScriptLimitsRegionMemory::showBeacon() { -/* LLScrollListCtrl* list = getChild<LLScrollListCtrl>("scripts_list"); + LLScrollListCtrl* list = getChild<LLScrollListCtrl>("scripts_list"); if (!list) return; LLScrollListItem* first_selected = list->getFirstSelected(); if (!first_selected) return; - std::string name = first_selected->getColumn(1)->getValue().asString(); - std::string pos_string = first_selected->getColumn(3)->getValue().asString(); + std::string name = first_selected->getColumn(2)->getValue().asString(); + std::string pos_string = first_selected->getColumn(5)->getValue().asString(); - llinfos << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" <<llendl; - llinfos << "name = " << name << " pos = " << pos_string << llendl; - F32 x, y, z; S32 matched = sscanf(pos_string.c_str(), "<%g,%g,%g>", &x, &y, &z); if (matched != 3) return; LLVector3 pos_agent(x, y, z); LLVector3d pos_global = gAgent.getPosGlobalFromAgent(pos_agent); - llinfos << "name = " << name << " pos = " << pos_string << llendl; + std::string tooltip(""); - LLTracker::trackLocation(pos_global, name, tooltip, LLTracker::LOCATION_ITEM);*/ + LLTracker::trackLocation(pos_global, name, tooltip, LLTracker::LOCATION_ITEM); } // static void LLPanelScriptLimitsRegionMemory::onClickHighlight(void* userdata) { -/* llinfos << "LLPanelRegionGeneralInfo::onClickHighlight" << llendl; + llinfos << "LLPanelRegionGeneralInfo::onClickHighlight" << llendl; LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(instance) { LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); - panel->showBeacon(); + if(tab) + { + LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); + if(panel) + { + panel->showBeacon(); + } + } return; } else { llwarns << "could not find LLPanelScriptLimitsRegionMemory instance after highlight button clicked" << llendl; -// std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestError"); -// panel->childSetValue("loading_text", LLSD(msg_waiting)); return; - }*/ + } } -void LLPanelScriptLimitsRegionMemory::returnObjects() +void LLPanelScriptLimitsRegionMemory::returnObjectsFromParcel(S32 local_id) { -/* llinfos << "started" << llendl; LLMessageSystem *msg = gMessageSystem; LLViewerRegion* region = gAgent.getRegion(); if (!region) return; - llinfos << "got region" << llendl; LLCtrlListInterface *list = childGetListInterface("scripts_list"); if (!list || list->getItemCount() == 0) return; - llinfos << "got list" << llendl; - std::vector<LLUUID>::iterator id_itor; + std::vector<LLSD>::iterator id_itor; bool start_message = true; - for (id_itor = mObjectListIDs.begin(); id_itor != mObjectListIDs.end(); ++id_itor) + for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor) { - LLUUID task_id = *id_itor; - llinfos << task_id << llendl; - if (!list->isSelected(task_id)) + LLSD element = *id_itor; + if (!list->isSelected(element["id"].asUUID())) { - llinfos << "not selected" << llendl; // Selected only continue; } - llinfos << "selected" << llendl; + + if(element["local_id"].asInteger() != local_id) + { + // Not the parcel we are looking for + continue; + } + if (start_message) { msg->newMessageFast(_PREHASH_ParcelReturnObjects); @@ -744,285 +1027,74 @@ void LLPanelScriptLimitsRegionMemory::returnObjects() msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); msg->nextBlockFast(_PREHASH_ParcelData); - msg->addS32Fast(_PREHASH_LocalID, -1); // Whole region - msg->addS32Fast(_PREHASH_ReturnType, RT_LIST); + msg->addS32Fast(_PREHASH_LocalID, element["local_id"].asInteger()); + msg->addU32Fast(_PREHASH_ReturnType, RT_LIST); start_message = false; - llinfos << "start message" << llendl; } msg->nextBlockFast(_PREHASH_TaskIDs); - msg->addUUIDFast(_PREHASH_TaskID, task_id); - llinfos << "added id" << llendl; + msg->addUUIDFast(_PREHASH_TaskID, element["id"].asUUID()); if (msg->isSendFullFast(_PREHASH_TaskIDs)) { msg->sendReliable(region->getHost()); start_message = true; - llinfos << "sent 1" << llendl; } } if (!start_message) { msg->sendReliable(region->getHost()); - llinfos << "sent 2" << llendl; - }*/ + } } -// static -void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata) +void LLPanelScriptLimitsRegionMemory::returnObjects() { -/* llinfos << "LLPanelRegionGeneralInfo::onClickReturn" << llendl; - LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); - if(instance) + if(!mContent.has("parcels")) { - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); - panel->returnObjects(); return; } - else - { - llwarns << "could not find LLPanelScriptLimitsRegionMemory instance after highlight button clicked" << llendl; -// std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestError"); -// panel->childSetValue("loading_text", LLSD(msg_waiting)); - return; - }*/ -} - -///---------------------------------------------------------------------------- -// URLs Panel -///---------------------------------------------------------------------------- - -void LLPanelScriptLimitsRegionURLs::setRegionDetails(LLSD content) -{ - LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list"); - - S32 number_parcels = content["parcels"].size(); - - LLStringUtil::format_map_t args_parcels; - args_parcels["[PARCELS]"] = llformat ("%d", number_parcels); - std::string msg_parcels = LLTrans::getString("ScriptLimitsParcelsOwned", args_parcels); - childSetValue("parcels_listed", LLSD(msg_parcels)); - - S32 total_objects = 0; - S32 total_size = 0; + S32 number_parcels = mContent["parcels"].size(); + + // a message per parcel containing all objects to be returned from that parcel for(S32 i = 0; i < number_parcels; i++) { - std::string parcel_name = content["parcels"][i]["name"].asString(); - llinfos << parcel_name << llendl; - - S32 number_objects = content["parcels"][i]["objects"].size(); - for(S32 j = 0; j < number_objects; j++) + S32 local_id = 0; + if(mContent["parcels"][i].has("local_id")) { - if(content["parcels"][i]["objects"][j]["resources"].has("urls")) - { - S32 size = content["parcels"][i]["objects"][j]["resources"]["urls"].asInteger(); - total_size += size; - - std::string name_buf = content["parcels"][i]["objects"][j]["name"].asString(); - LLUUID task_id = content["parcels"][i]["objects"][j]["id"].asUUID(); - LLUUID owner_id = content["parcels"][i]["objects"][j]["owner_id"].asUUID(); - - std::string owner_buf; - gCacheName->getFullName(owner_id, owner_buf); //dont care if this fails as the memory tab will request and fill the field - - LLSD element; - - element["id"] = task_id; - element["columns"][0]["column"] = "urls"; - element["columns"][0]["value"] = llformat("%d", size); - element["columns"][0]["font"] = "SANSSERIF"; - element["columns"][1]["column"] = "name"; - element["columns"][1]["value"] = name_buf; - element["columns"][1]["font"] = "SANSSERIF"; - element["columns"][2]["column"] = "owner"; - element["columns"][2]["value"] = owner_buf; - element["columns"][2]["font"] = "SANSSERIF"; - element["columns"][3]["column"] = "location"; - element["columns"][3]["value"] = parcel_name; - element["columns"][3]["font"] = "SANSSERIF"; - - list->addElement(element); - mObjectListItems.push_back(element); - total_objects++; - } + local_id = mContent["parcels"][i]["local_id"].asInteger(); + returnObjectsFromParcel(local_id); } } - - mParcelURLsUsed =total_size; - mGotParcelURLsUsed = TRUE; - populateParcelURLsText(); -} - -void LLPanelScriptLimitsRegionURLs::populateParcelURLsText() -{ - if(mGotParcelURLsUsed && mGotParcelURLsMax) - { - -#ifdef USE_SIMPLE_SUMMARY - LLStringUtil::format_map_t args_parcel_urls; - args_parcel_urls["[COUNT]"] = llformat ("%d", mParcelURLsUsed); - std::string msg_parcel_urls = LLTrans::getString("ScriptLimitsURLsUsedSimple", args_parcel_urls); - childSetValue("urls_used", LLSD(msg_parcel_urls)); -#else - S32 parcel_urls_available = mParcelURLsMax - mParcelURLsUsed; - LLStringUtil::format_map_t args_parcel_urls; - args_parcel_urls["[COUNT]"] = llformat ("%d", mParcelURLsUsed); - args_parcel_urls["[MAX]"] = llformat ("%d", mParcelURLsMax); - args_parcel_urls["[AVAILABLE]"] = llformat ("%d", parcel_urls_available); - std::string msg_parcel_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_parcel_urls); - childSetValue("urls_used", LLSD(msg_parcel_urls)); -#endif - - childSetValue("loading_text", LLSD(std::string(""))); - - } + onClickRefresh(NULL); } -void LLPanelScriptLimitsRegionURLs::setRegionSummary(LLSD content) -{ - if(content["summary"]["available"][0]["type"].asString() == std::string("urls")) - { - mParcelURLsMax = content["summary"]["available"][0]["amount"].asInteger(); - mGotParcelURLsMax = TRUE; - } - else if(content["summary"]["available"][1]["type"].asString() == std::string("urls")) - { - mParcelURLsMax = content["summary"]["available"][1]["amount"].asInteger(); - mGotParcelURLsMax = TRUE; - } - else - { - llinfos << "summary contains no url info" << llendl; - return; - } -/* - currently this is broken on the server, so we get this value from the details section - and update via populateParcelMemoryText() when both sets of information have been returned - - when the sim is fixed this should be used instead: - if(content["summary"]["used"][0]["type"].asString() == std::string("urls")) - { - mParcelURLsUsed = content["summary"]["used"][0]["amount"].asInteger(); - mGotParcelURLsUsed = TRUE; - } - else if(content["summary"]["used"][1]["type"].asString() == std::string("urls")) - { - mParcelURLsUsed = content["summary"]["used"][1]["amount"].asInteger(); - mGotParcelURLsUsed = TRUE; - } - else - { - //ERROR!!! - return; - }*/ - - populateParcelURLsText(); -} - -BOOL LLPanelScriptLimitsRegionURLs::postBuild() -{ - childSetAction("refresh_list_btn", onClickRefresh, this); - childSetAction("highlight_btn", onClickHighlight, this); - childSetAction("return_btn", onClickReturn, this); - - std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); - childSetValue("loading_text", LLSD(msg_waiting)); - return FALSE; -} - -void LLPanelScriptLimitsRegionURLs::clearList() -{ - LLCtrlListInterface *list = childGetListInterface("scripts_list"); - - if (list) - { - list->operateOnAll(LLCtrlListInterface::OP_DELETE); - } - - mGotParcelURLsUsed = FALSE; - mGotParcelURLsMax = FALSE; - - LLStringUtil::format_map_t args_parcel_urls; - std::string msg_empty_string(""); - childSetValue("urls_used", LLSD(msg_empty_string)); - childSetValue("parcels_listed", LLSD(msg_empty_string)); - - mObjectListItems.clear(); -} - -// static -void LLPanelScriptLimitsRegionURLs::onClickRefresh(void* userdata) -{ - llinfos << "Refresh clicked" << llendl; - - LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); - if(instance) - { - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); - // use the memory panel to re-request all the info - panel_memory->clearList(); - - LLPanelScriptLimitsRegionURLs* panel_urls = (LLPanelScriptLimitsRegionURLs*)tab->getChild<LLPanel>("script_limits_region_urls_panel"); - // but the urls panel to clear itself - panel_urls->clearList(); - - panel_memory->StartRequestChain(); - return; - } - else - { - llwarns << "could not find LLPanelScriptLimitsRegionMemory instance after refresh button clicked" << llendl; - return; - } -} // static -void LLPanelScriptLimitsRegionURLs::onClickHighlight(void* userdata) +void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata) { -/* llinfos << "Highlight clicked" << llendl; + llinfos << "LLPanelRegionGeneralInfo::onClickReturn" << llendl; LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(instance) { LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); - // use the beacon function from the memory panel - panel->showBeacon(); + if(tab) + { + LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); + if(panel) + { + panel->returnObjects(); + } + } return; } else { llwarns << "could not find LLPanelScriptLimitsRegionMemory instance after highlight button clicked" << llendl; -// std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestError"); -// panel->childSetValue("loading_text", LLSD(msg_waiting)); - return; - }*/ -} - -// static -void LLPanelScriptLimitsRegionURLs::onClickReturn(void* userdata) -{ -/* llinfos << "Return clicked" << llendl; - LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); - if(instance) - { - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); - // use the return function from the memory panel - panel->returnObjects(); return; } - else - { - llwarns << "could not find LLPanelScriptLimitsRegionMemory instance after highlight button clicked" << llendl; -// std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestError"); -// panel->childSetValue("loading_text", LLSD(msg_waiting)); - return; - }*/ } ///---------------------------------------------------------------------------- @@ -1047,6 +1119,12 @@ BOOL LLPanelScriptLimitsAttachment::requestAttachmentDetails() 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++) @@ -1096,6 +1174,8 @@ void LLPanelScriptLimitsAttachment::setAttachmentDetails(LLSD content) list->addElement(element); } } + + setAttachmentSummary(content); childSetValue("loading_text", LLSD(std::string(""))); } @@ -1122,6 +1202,69 @@ void LLPanelScriptLimitsAttachment::clearList() childSetValue("loading_text", 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 + { + llinfos << "attachment details don't contain memory summary info" << llendl; + 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 + { + llinfos << "attachment details don't contain urls summary info" << llendl; + return; + } + + if((mAttachmentMemoryUsed >= 0) && (mAttachmentMemoryMax >= 0)) + { + S32 attachment_memory_available = mAttachmentMemoryMax - mAttachmentMemoryUsed; + + LLStringUtil::format_map_t args_attachment_memory; + args_attachment_memory["[COUNT]"] = llformat ("%d", mAttachmentMemoryUsed); + args_attachment_memory["[MAX]"] = llformat ("%d", mAttachmentMemoryMax); + args_attachment_memory["[AVAILABLE]"] = llformat ("%d", attachment_memory_available); + std::string msg_attachment_memory = LLTrans::getString("ScriptLimitsMemoryUsed", args_attachment_memory); + childSetValue("memory_used", LLSD(msg_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); + childSetValue("urls_used", LLSD(msg_attachment_urls)); + } +} + // static void LLPanelScriptLimitsAttachment::onClickRefresh(void* userdata) { diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h index e675d14515..4c1ecc1019 100644 --- a/indra/newview/llfloaterscriptlimits.h +++ b/indra/newview/llfloaterscriptlimits.h @@ -166,10 +166,10 @@ public: BOOL StartRequestChain(); - void populateParcelMemoryText(); BOOL getLandScriptResources(); void clearList(); void showBeacon(); + void returnObjectsFromParcel(S32 local_id); void returnObjects(); private: @@ -178,69 +178,30 @@ private: const std::string& first_name, const std::string& last_name); + LLSD mContent; LLUUID mParcelId; BOOL mGotParcelMemoryUsed; + BOOL mGotParcelMemoryUsedDetails; BOOL mGotParcelMemoryMax; S32 mParcelMemoryMax; S32 mParcelMemoryUsed; + S32 mParcelMemoryUsedDetails; - std::vector<LLSD> mObjectListItems; - -protected: - -// LLRemoteParcelInfoObserver interface: -/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); -/*virtual*/ void setParcelID(const LLUUID& parcel_id); -/*virtual*/ void setErrorStatus(U32 status, const std::string& reason); - - static void onClickRefresh(void* userdata); - static void onClickHighlight(void* userdata); - static void onClickReturn(void* userdata); -}; - -///////////////////////////////////////////////////////////////////////////// -// URLs panel -///////////////////////////////////////////////////////////////////////////// - -class LLPanelScriptLimitsRegionURLs : public LLPanelScriptLimitsInfo -{ - -public: - LLPanelScriptLimitsRegionURLs() - : LLPanelScriptLimitsInfo(), - - mParcelId(LLUUID()), - mGotParcelURLsUsed(FALSE), - mGotParcelURLsMax(FALSE), - mParcelURLsMax(0), - mParcelURLsUsed(0) - { - }; - - ~LLPanelScriptLimitsRegionURLs() - { - }; - - // LLPanel - virtual BOOL postBuild(); - - void setRegionDetails(LLSD content); - void setRegionSummary(LLSD content); - - void populateParcelURLsText(); - void clearList(); - -private: - - LLUUID mParcelId; BOOL mGotParcelURLsUsed; + BOOL mGotParcelURLsUsedDetails; BOOL mGotParcelURLsMax; S32 mParcelURLsMax; S32 mParcelURLsUsed; + S32 mParcelURLsUsedDetails; std::vector<LLSD> mObjectListItems; protected: + +// LLRemoteParcelInfoObserver interface: +/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); +/*virtual*/ void setParcelID(const LLUUID& parcel_id); +/*virtual*/ void setErrorStatus(U32 status, const std::string& reason); static void onClickRefresh(void* userdata); static void onClickHighlight(void* userdata); @@ -266,11 +227,26 @@ public: void setAttachmentDetails(LLSD content); + void setAttachmentSummary(LLSD content); BOOL requestAttachmentDetails(); void clearList(); private: + BOOL mGotAttachmentMemoryUsed; + BOOL mGotAttachmentMemoryUsedDetails; + BOOL mGotAttachmentMemoryMax; + S32 mAttachmentMemoryMax; + S32 mAttachmentMemoryUsed; + S32 mAttachmentMemoryUsedDetails; + + BOOL mGotAttachmentURLsUsed; + BOOL mGotAttachmentURLsUsedDetails; + BOOL mGotAttachmentURLsMax; + S32 mAttachmentURLsMax; + S32 mAttachmentURLsUsed; + S32 mAttachmentURLsUsedDetails; + protected: static void onClickRefresh(void* userdata); diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index b6e9fb3f6c..a0031f0193 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -2084,10 +2084,6 @@ void LLFloaterSnapshot::draw() S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ; S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ; - if (! gSavedSettings.getBOOL("AdvanceSnapshot")) - { - offset_y += getUIWinHeightShort() - getUIWinHeightLong(); - } glMatrixMode(GL_MODELVIEW); gl_draw_scaled_image(offset_x, offset_y, diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 645f8ef054..c6e12476bd 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -1091,7 +1091,9 @@ void LLFloaterUIPreview::onClickEditFloater() char *args2 = new char[args.size() + 1]; // Windows requires that the second parameter to CreateProcessA be a writable (non-const) string... strcpy(args2, args.c_str()); - if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, exe_dir.c_str(), &sinfo, &pinfo)) + // we don't want the current directory to be the executable directory, since the file path is now relative. By using + // NULL for the current directory instead of exe_dir.c_str(), the path to the target file will work. + if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) { // DWORD dwErr = GetLastError(); std::string warning = "Creating editor process failed!"; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index c6135d3bc3..5c65b2c293 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -1272,8 +1272,7 @@ BOOL LLFolderView::canCut() const const LLFolderViewItem* item = *selected_it; const LLFolderViewEventListener* listener = item->getListener(); - // *WARKAROUND: it is too many places where the "isItemRemovable" method should be changed with "const" modifier - if (!listener || !(const_cast<LLFolderViewEventListener*>(listener))->isItemRemovable()) + if (!listener || !listener->isItemRemovable()) { return FALSE; } diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index d6c4459e6f..12e100caf4 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -73,7 +73,8 @@ public: virtual BOOL isItemRenameable() const = 0; virtual BOOL renameItem(const std::string& new_name) = 0; virtual BOOL isItemMovable( void ) const = 0; // Can be moved to another folder - virtual BOOL isItemRemovable( void ) = 0; // Can be destroyed + virtual BOOL isItemRemovable( void ) const = 0; // Can be destroyed + virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make into pure virtual. virtual BOOL removeItem() = 0; virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) = 0; virtual void move( LLFolderViewEventListener* parent_listener ) = 0; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index b05eb84e52..f154de39c9 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -2540,13 +2540,11 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde { static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - static const LLUUID& landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID(); LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID(); - if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id) || - (a_uuid == landmarks_folder_id && b_uuid == landmarks_folder_id)) + if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id)) { // *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem // or to LLInvFVBridge diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 3653371d76..00e2365ffd 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -161,12 +161,17 @@ void LLGroupActions::join(const LLUUID& group_id) S32 cost = gdatap->mMembershipFee; LLSD args; args["COST"] = llformat("%d", cost); + args["NAME"] = gdatap->mName; LLSD payload; payload["group_id"] = group_id; if (can_afford_transaction(cost)) { - LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup); + if(cost > 0) + LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup); + else + LLNotificationsUtil::add("JoinGroupNoCost", args, payload, onJoinGroup); + } else { diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index e01709aa3a..1ed1113f4d 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -72,6 +72,8 @@ public: static const LLGroupComparator GROUP_COMPARATOR; LLGroupList::Params::Params() +: no_groups_msg("no_groups_msg") +, no_filtered_groups_msg("no_filtered_groups_msg") { } @@ -79,15 +81,14 @@ LLGroupList::Params::Params() LLGroupList::LLGroupList(const Params& p) : LLFlatListView(p) , mDirty(true) // to force initial update + , mNoFilteredGroupsMsg(p.no_filtered_groups_msg) + , mNoGroupsMsg(p.no_groups_msg) { // Listen for agent group changes. gAgent.addListener(this, "new group"); mShowIcons = gSavedSettings.getBOOL("GroupListShowIcons"); setCommitOnSelectionChange(true); - // TODO: implement context menu - // display a context menu appropriate for a list of group names -// setContextMenu(LLScrollListCtrl::MENU_GROUP); // Set default sort order. setComparator(&GROUP_COMPARATOR); @@ -158,6 +159,18 @@ void LLGroupList::refresh() LLUUID id; bool have_filter = !mNameFilter.empty(); + // set no items message depend on filter state & total count of groups + if (have_filter) + { + // groups were filtered + setNoItemsCommentText(mNoFilteredGroupsMsg); + } + else if (0 == count) + { + // user is not a member of any group + setNoItemsCommentText(mNoGroupsMsg); + } + clear(); for(S32 i = 0; i < count; ++i) @@ -173,7 +186,8 @@ void LLGroupList::refresh() sort(); // Add "none" to list at top if filter not set (what's the point of filtering "none"?). - if (!have_filter) + // but only if some real groups exists. EXT-4838 + if (!have_filter && count > 0) { std::string loc_none = LLTrans::getString("GroupsNone"); addNewItem(LLUUID::null, loc_none, LLUUID::null, ADD_TOP); diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h index f7afe0c0b2..f3ac676edd 100644 --- a/indra/newview/llgrouplist.h +++ b/indra/newview/llgrouplist.h @@ -53,6 +53,15 @@ class LLGroupList: public LLFlatListView, public LLOldEvents::LLSimpleListener public: struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> { + /** + * Contains a message for empty list when user is not a member of any group + */ + Optional<std::string> no_groups_msg; + + /** + * Contains a message for empty list when all groups don't match passed filter + */ + Optional<std::string> no_filtered_groups_msg; Params(); }; @@ -80,6 +89,8 @@ private: bool mShowIcons; bool mDirty; std::string mNameFilter; + std::string mNoFilteredGroupsMsg; + std::string mNoGroupsMsg; }; class LLButton; diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 8bd0e520c3..4c1019a882 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1708,12 +1708,18 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, bool start_message = true; LLMessageSystem* msg = gMessageSystem; + + LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id); if (!group_datap) return; for (std::vector<LLUUID>::iterator it = member_ids.begin(); it != member_ids.end(); ++it) { + LLUUID& ejected_member_id = (*it); + + llwarns << "LLGroupMgr::sendGroupMemberEjects -- ejecting member" << ejected_member_id << llendl; + // Can't use 'eject' to leave a group. if ((*it) == gAgent.getID()) continue; @@ -1734,7 +1740,7 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, } msg->nextBlock("EjectData"); - msg->addUUID("EjecteeID",(*it)); + msg->addUUID("EjecteeID",ejected_member_id); if (msg->isSendFull()) { @@ -1746,13 +1752,18 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, for (LLGroupMemberData::role_list_t::iterator rit = (*mit).second->roleBegin(); rit != (*mit).second->roleEnd(); ++rit) { - if ((*rit).first.notNull()) + if ((*rit).first.notNull() && (*rit).second!=0) { - (*rit).second->removeMember(*it); + (*rit).second->removeMember(ejected_member_id); + + llwarns << "LLGroupMgr::sendGroupMemberEjects - removing member from role " << llendl; } } - delete (*mit).second; + group_datap->mMembers.erase(*it); + + llwarns << "LLGroupMgr::sendGroupMemberEjects - deleting memnber data " << llendl; + delete (*mit).second; } } @@ -1760,6 +1771,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, { gAgent.sendReliableMessage(); } + + llwarns << "LLGroupMgr::sendGroupMemberEjects - done " << llendl; } void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 4a18c8640f..1eac90371d 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -515,7 +515,7 @@ BOOL LLIMFloater::getVisible() if(isChatMultiTab()) { LLIMFloaterContainer* im_container = LLIMFloaterContainer::getInstance(); - // Tabbed IM window is "visible" when we minimize it. + // getVisible() returns TRUE when Tabbed IM window is minimized. return !im_container->isMinimized() && im_container->getVisible(); } else @@ -572,6 +572,12 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id) setKey(im_session_id); mControlPanel->setSessionId(im_session_id); } + + // updating "Call" button from group control panel here to enable it without placing into draw() (EXT-4796) + if(gAgent.isInGroup(im_session_id)) + { + mControlPanel->updateCallButton(); + } //*TODO here we should remove "starting session..." warning message if we added it in postBuild() (IB) diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 784c2eaaf9..22eb9a51d2 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -52,6 +52,7 @@ LLIMFloaterContainer::~LLIMFloaterContainer(){} BOOL LLIMFloaterContainer::postBuild() { + LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1)); // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button // mTabContainer will be initialized in LLMultiFloater::addChild() return TRUE; @@ -162,6 +163,21 @@ void LLIMFloaterContainer::onCloseFloater(LLUUID id) { LLAvatarPropertiesProcessor::instance().removeObserver(id, this); LLGroupMgr::instance().removeObserver(id, this); + +} + +void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data) +{ + LLUUID session_id = data["from_id"].asUUID(); + LLFloater* floaterp = get_ptr_in_map(mSessions, session_id); + LLFloater* current_floater = LLMultiFloater::getActiveFloater(); + + if(floaterp && current_floater && floaterp != current_floater) + { + if(LLMultiFloater::isFloaterFlashing(floaterp)) + LLMultiFloater::setFloaterFlashing(floaterp, FALSE); + LLMultiFloater::setFloaterFlashing(floaterp, TRUE); + } } LLIMFloaterContainer* LLIMFloaterContainer::findInstance() diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index e4a32dbe1d..bc06f0cbd3 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -66,10 +66,12 @@ public: static LLIMFloaterContainer* getInstance(); private: - typedef std::map<LLUUID,LLPanel*> avatarID_panel_map_t; + typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t; avatarID_panel_map_t mSessions; void onCloseFloater(LLUUID avatar_id); + + void onNewMessageReceived(const LLSD& data); }; #endif // LL_LLIMFLOATERCONTAINER_H diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index db6b2041f8..0c64c2b032 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1709,6 +1709,8 @@ BOOL LLOutgoingCallDialog::postBuild() childSetAction("Cancel", onCancel, this); + setCanDrag(FALSE); + return success; } @@ -1808,6 +1810,8 @@ BOOL LLIncomingCallDialog::postBuild() mLifetimeTimer.stop(); } + setCanDrag(FALSE); + return TRUE; } @@ -2985,48 +2989,6 @@ public: } }; -LLCallInfoDialog::LLCallInfoDialog(const LLSD& payload) : LLCallDialog(payload) -{ -} - -BOOL LLCallInfoDialog::postBuild() -{ - // init notification's lifetime - std::istringstream ss( getString("lifetime") ); - if (!(ss >> mLifetime)) - { - mLifetime = DEFAULT_LIFETIME; - } - return LLCallDialog::postBuild(); -} - -void LLCallInfoDialog::onOpen(const LLSD& key) -{ - if(key.has("msg")) - { - std::string msg = key["msg"]; - getChild<LLTextBox>("msg")->setValue(msg); - } - - mLifetimeTimer.start(); -} - -void LLCallInfoDialog::show(const std::string& status_name, const LLSD& args) -{ - LLUIString message = LLTrans::getString(status_name); - message.setArgs(args); - - LLSD payload; - payload["msg"] = message; - LLFloater* inst = LLFloaterReg::findInstance("call_info"); - - // avoid recreate instance with the same message - if (inst == NULL || message.getString() != inst->getChild<LLTextBox>("msg")->getValue()) - { - LLFloaterReg::showInstance("call_info", payload); - } -} - LLHTTPRegistration<LLViewerChatterBoxSessionStartReply> gHTTPRegistrationMessageChatterboxsessionstartreply( "/message/ChatterBoxSessionStartReply"); diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index b573490fa3..1c7aaa3f1b 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -530,16 +530,6 @@ private: void hideAllText(); }; -class LLCallInfoDialog : public LLCallDialog -{ -public: - LLCallInfoDialog(const LLSD& payload); - /*virtual*/ BOOL postBuild(); - /*virtual*/ void onOpen(const LLSD& key); - - static void show(const std::string& status_name, const LLSD& args); -}; - // Globals extern LLIMMgr *gIMMgr; diff --git a/indra/newview/llinspect.cpp b/indra/newview/llinspect.cpp index c7b8db9635..c7b651f37c 100644 --- a/indra/newview/llinspect.cpp +++ b/indra/newview/llinspect.cpp @@ -34,6 +34,7 @@ #include "llcontrol.h" // LLCachedControl #include "llui.h" // LLUI::sSettingsGroups +#include "llviewermenu.h" LLInspect::LLInspect(const LLSD& key) : LLFloater(key), @@ -108,3 +109,26 @@ void LLInspect::onMouseLeave(S32 x, S32 y, MASK mask) { mOpenTimer.unpause(); } + +bool LLInspect::childHasVisiblePopupMenu() +{ + // Child text-box may spawn a pop-up menu, if mouse is over the menu, Inspector + // will hide(which is not expected). + // This is an attempt to find out if child control has spawned a menu. + + LLView* child_menu = gMenuHolder->getVisibleMenu(); + if(child_menu) + { + LLRect floater_rc = calcScreenRect(); + LLRect menu_screen_rc = child_menu->calcScreenRect(); + S32 mx, my; + LLUI::getMousePositionScreen(&mx, &my); + + // This works wrong if we spawn a menu near Inspector and menu overlaps Inspector. + if(floater_rc.overlaps(menu_screen_rc) && menu_screen_rc.pointInRect(mx, my)) + { + return true; + } + } + return false; +} diff --git a/indra/newview/llinspect.h b/indra/newview/llinspect.h index a1cb9cd71c..f8c86618d2 100644 --- a/indra/newview/llinspect.h +++ b/indra/newview/llinspect.h @@ -56,6 +56,9 @@ public: /*virtual*/ void onFocusLost(); protected: + + virtual bool childHasVisiblePopupMenu(); + LLFrameTimer mCloseTimer; LLFrameTimer mOpenTimer; }; diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 3a41aebf28..b2cdc0738f 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -393,11 +393,18 @@ void LLInspectAvatar::onMouseLeave(S32 x, S32 y, MASK mask) { LLMenuGL* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu(); LLMenuGL* gear_menu_self = getChild<LLMenuButton>("gear_self_btn")->getMenu(); - if ( !(gear_menu && gear_menu->getVisible()) && - !(gear_menu_self && gear_menu_self->getVisible())) + if ( gear_menu && gear_menu->getVisible() && + gear_menu_self && gear_menu_self->getVisible() ) { - mOpenTimer.unpause(); + return; + } + + if(childHasVisiblePopupMenu()) + { + return; } + + mOpenTimer.unpause(); } void LLInspectAvatar::updateModeratorPanel() diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index dd313c528d..91cbbbf430 100644 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -51,6 +51,7 @@ #include "llmenubutton.h" #include "llresmgr.h" // getMonetaryString #include "llsafehandle.h" +#include "llsidetray.h" #include "lltextbox.h" // for description truncation #include "lltrans.h" #include "llui.h" // positionViewNearMouse() @@ -575,10 +576,17 @@ void LLInspectObject::updateSecureBrowsing() void LLInspectObject::onMouseLeave(S32 x, S32 y, MASK mask) { LLMenuGL* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu(); - if ( !(gear_menu && gear_menu->getVisible())) + if ( gear_menu && gear_menu->getVisible() ) { - mOpenTimer.unpause(); + return; + } + + if(childHasVisiblePopupMenu()) + { + return; } + + mOpenTimer.unpause(); } void LLInspectObject::onClickBuy() @@ -636,8 +644,9 @@ void LLInspectObject::onClickOpen() void LLInspectObject::onClickMoreInfo() { - // *TODO: Show object info side panel, once that is implemented. - LLNotificationsUtil::add("ClickUnimplemented"); + LLSD key; + key["task"] = "task"; + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); closeFloater(); } diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp index 898f1cd9ac..66e4a1bf66 100644 --- a/indra/newview/llinspectremoteobject.cpp +++ b/indra/newview/llinspectremoteobject.cpp @@ -167,7 +167,8 @@ void LLInspectRemoteObject::nameCallback(const LLUUID& id, const std::string& fi void LLInspectRemoteObject::update() { // show the object name as the inspector's title - getChild<LLUICtrl>("object_name")->setValue(mName); + // (don't hyperlink URLs in object names) + getChild<LLUICtrl>("object_name")->setValue("<nolink>" + mName + "</nolink>"); // show the object's owner - click it to show profile std::string owner = mOwner; @@ -192,7 +193,7 @@ void LLInspectRemoteObject::update() std::string url; if (! mSLurl.empty()) { - std::string url = "secondlife:///app/teleport/" + mSLurl; + url = "secondlife:///app/teleport/" + mSLurl; } getChild<LLUICtrl>("object_slurl")->setValue(url); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index e8a4899a0b..3a630650c5 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -174,7 +174,7 @@ time_t LLInvFVBridge::getCreationDate() const } // Can be destroyed (or moved to trash) -BOOL LLInvFVBridge::isItemRemovable() +BOOL LLInvFVBridge::isItemRemovable() const { const LLInventoryModel* model = getInventoryModel(); if(!model) @@ -605,14 +605,14 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl; std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { - items.push_back(std::string("PurgeItem")); + items.push_back(std::string("Purge Item")); if (!isItemRemovable()) { - disabled_items.push_back(std::string("PurgeItem")); + disabled_items.push_back(std::string("Purge Item")); } - items.push_back(std::string("RestoreItem")); + items.push_back(std::string("Restore Item")); } else { @@ -670,7 +670,7 @@ LLInventoryModel* LLInvFVBridge::getInventoryModel() const return panel ? panel->getModel() : NULL; } -BOOL LLInvFVBridge::isInTrash() const +BOOL LLInvFVBridge::isItemInTrash() const { LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; @@ -680,7 +680,7 @@ BOOL LLInvFVBridge::isInTrash() const BOOL LLInvFVBridge::isLinkedObjectInTrash() const { - if (isInTrash()) return TRUE; + if (isItemInTrash()) return TRUE; const LLInventoryObject *obj = getInventoryObject(); if (obj && obj->getIsLinkType()) @@ -1412,7 +1412,7 @@ public: }; // Can be destroyed (or moved to trash) -BOOL LLFolderBridge::isItemRemovable() +BOOL LLFolderBridge::isItemRemovable() const { LLInventoryModel* model = getInventoryModel(); if(!model) @@ -2617,14 +2617,17 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) mItems.push_back(std::string("New Gesture")); mItems.push_back(std::string("New Clothes")); mItems.push_back(std::string("New Body Parts")); - mItems.push_back(std::string("Change Type")); - LLViewerInventoryCategory *cat = getCategory(); + // Changing folder types is just a debug feature; this is fairly unsupported + // and can lead to unexpected behavior if enabled. +#if !LL_RELEASE_FOR_DOWNLOAD + mItems.push_back(std::string("Change Type")); + const LLViewerInventoryCategory *cat = getCategory(); if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { mDisabledItems.push_back(std::string("Change Type")); } - +#endif getClipboardEntries(false, mItems, mDisabledItems, flags); } else @@ -3205,7 +3208,7 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) @@ -3299,7 +3302,7 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) @@ -3348,7 +3351,7 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) std::vector<std::string> disabled_items; lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) @@ -3573,7 +3576,7 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) @@ -3773,6 +3776,21 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode gInventory.updateItem(item); gInventory.notifyObservers(); } + else if("play" == action) + { + if(!LLGestureManager::instance().isGestureActive(mUUID)) + { + // we need to inform server about gesture activating to be consistent with LLPreviewGesture and LLGestureComboList. + BOOL inform_server = TRUE; + BOOL deactivate_similar = FALSE; + LLGestureManager::instance().setGestureLoadedCallback(mUUID, boost::bind(&LLGestureBridge::playGesture, mUUID)); + LLGestureManager::instance().activateGestureWithAsset(mUUID, gInventory.getItem(mUUID)->getAssetUUID(), inform_server, deactivate_similar); + } + else + { + playGesture(mUUID); + } + } else LLItemBridge::performAction(folder, model, action); } @@ -3823,7 +3841,7 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) lldebugs << "LLGestureBridge::buildContextMenu()" << llendl; std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) @@ -3858,6 +3876,20 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) hide_context_entries(menu, items, disabled_items); } +// static +void LLGestureBridge::playGesture(const LLUUID& item_id) +{ + if (LLGestureManager::instance().isGesturePlaying(item_id)) + { + LLGestureManager::instance().stopGesture(item_id); + } + else + { + LLGestureManager::instance().playGesture(item_id); + } +} + + // +=================================================+ // | LLAnimationBridge | // +=================================================+ @@ -3873,7 +3905,7 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) std::vector<std::string> disabled_items; lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) @@ -4152,7 +4184,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) @@ -4188,7 +4220,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { items.push_back(std::string("Detach From Yourself")); } - else if (!isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing()) + else if (!isItemInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing()) { items.push_back(std::string("Attach Separator")); items.push_back(std::string("Object Wear")); @@ -4526,7 +4558,7 @@ void LLWearableBridge::openItem() LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } /* - if( isInTrash() ) + if( isItemInTrash() ) { LLNotificationsUtil::add("CannotWearTrash"); } @@ -4568,7 +4600,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) lldebugs << "LLWearableBridge::buildContextMenu()" << llendl; std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) @@ -5163,7 +5195,7 @@ void LLLSLTextBridgeAction::doIt() } -BOOL LLWearableBridgeAction::isInTrash() const +BOOL LLWearableBridgeAction::isItemInTrash() const { if(!mModel) return FALSE; const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH); @@ -5211,7 +5243,7 @@ void LLWearableBridgeAction::wearOnAvatar() //virtual void LLWearableBridgeAction::doIt() { - if(isInTrash()) + if(isItemInTrash()) { LLNotificationsUtil::add("CannotWearTrash"); } @@ -5276,7 +5308,7 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) items.push_back(std::string("Find Original")); disabled_items.push_back(std::string("Find Original")); - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) @@ -5327,7 +5359,7 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index eeb8246b11..6e256edc05 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -158,8 +158,10 @@ public: virtual void showProperties(); virtual BOOL isItemRenameable() const { return TRUE; } //virtual BOOL renameItem(const std::string& new_name) {} - virtual BOOL isItemRemovable(); + virtual BOOL isItemRemovable() const; virtual BOOL isItemMovable() const; + virtual BOOL isItemInTrash() const; + //virtual BOOL removeItem() = 0; virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch); virtual void move(LLFolderViewEventListener* new_parent_bridge) {} @@ -185,13 +187,13 @@ public: // Allow context menus to be customized for side panel. bool isInOutfitsSidePanel() const; + protected: LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid); LLInventoryObject* getInventoryObject() const; LLInventoryModel* getInventoryModel() const; - BOOL isInTrash() const; BOOL isLinkedObjectInTrash() const; // Is this obj or its baseobj in the trash? BOOL isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory? @@ -306,7 +308,7 @@ public: EDragAndDropType cargo_type, void* cargo_data); - virtual BOOL isItemRemovable(); + virtual BOOL isItemRemovable() const; virtual BOOL isItemMovable() const ; virtual BOOL isUpToDate() const; virtual BOOL isItemCopyable() const; @@ -491,6 +493,8 @@ public: virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + static void playGesture(const LLUUID& item_id); + protected: LLGestureBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : LLItemBridge(inventory, uuid) {} @@ -784,7 +788,7 @@ protected: LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - BOOL isInTrash() const; + BOOL isItemInTrash() const; // return true if the item is in agent inventory. if false, it // must be lost or in the inventory library. BOOL isAgentInventory() const; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index bdf1ebddac..7ec976604a 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -142,105 +142,6 @@ bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item) return rv; } -/* -This namespace contains a functionality to remove LM prefixes were used to store sort order of -Favorite Landmarks in landmarks' names. -Once being in Favorites folder LM inventory Item has such prefix. -Due to another solution is implemented in EXT-3985 these prefixes should be removed. - -*NOTE: It will be unnecessary after the first successful session in viewer 2.0. -Can be removed before public release. - -Implementation details: -At the first run with this patch it patches all cached landmarks: removes LM sort prefixes and -updates them on the viewer and server sides. -Also it calls fetching agent's inventory to process not yet loaded landmarks too. -If fetching is successfully done it will store special per-agent empty file-marker -in the user temporary folder (where cached inventory is loaded) while caching agent's inventory. -After that in will not affect the viewer until cached marker is removed. -*/ -namespace LMSortPrefix -{ - bool cleanup_done = false; - const std::string getMarkerPath() - { - std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, gAgentID.asString())); - std::string marker_filename = llformat("%s-lm_prefix_marker", path.c_str()); - - return marker_filename; - } - bool wasClean() - { - static bool was_clean = false; - static bool already_init = false; - if (already_init) return was_clean; - - already_init = true; - std::string path_to_marker = getMarkerPath(); - was_clean = LLFile::isfile(path_to_marker); - - return was_clean; - } - - void setLandmarksWereCleaned() - { - if (cleanup_done) - { - std::string path_to_marker = getMarkerPath(); - LLFILE* file = LLFile::fopen(path_to_marker, "w"); - if(!file) - { - llwarns << "unable to save marker that LM prefixes were removed: " << path_to_marker << llendl; - return; - } - - fclose(file); - } - } - - void removePrefix(LLPointer<LLViewerInventoryItem> inv_item) - { - if (wasClean()) - { - LL_INFOS_ONCE("") << "Inventory was cleaned for this avatar. Patch can be removed." << LL_ENDL; - return; - } - - if (LLInventoryType::IT_LANDMARK != inv_item->getInventoryType()) return; - - std::string old_name = inv_item->getName(); - - S32 sort_field = -1; - std::string display_name; - BOOL exists = LLViewerInventoryItem::extractSortFieldAndDisplayName(old_name, &sort_field, &display_name); - if (exists && sort_field != -1) - { - llinfos << "Removing Landmark sort field and separator for: " << old_name << " | " << inv_item->getUUID() << llendl; - LLUUID parent_uuid = inv_item->getParentUUID(); - if (gInventory.getCategory(parent_uuid)) - { - llinfos << "parent folder is: " << gInventory.getCategory(parent_uuid)->getName() << llendl; - } - - - // mark item completed to avoid error while copying and updating server - inv_item->setComplete(TRUE); - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item.get()); - new_item->rename(display_name); - gInventory.updateItem(new_item); - new_item->updateServer(FALSE); - - gInventory.notifyObservers(); - } - } - - void completeCleanup() - { - // background fetch is completed. can save marker - cleanup_done = true; - } -} - ///---------------------------------------------------------------------------- /// Class LLInventoryModel ///---------------------------------------------------------------------------- @@ -317,7 +218,10 @@ BOOL LLInventoryModel::isObjectDescendentOf(const LLUUID& obj_id, const LLViewerInventoryCategory *LLInventoryModel::getFirstNondefaultParent(const LLUUID& obj_id) const { const LLInventoryObject* obj = getObject(obj_id); - const LLUUID& parent_id = obj->getParentUUID(); + + // Search up the parent chain until we get to root or an acceptable folder. + // This assumes there are no cycles in the tree else we'll get a hang. + LLUUID parent_id = obj->getParentUUID(); while (!parent_id.isNull()) { const LLViewerInventoryCategory *cat = getCategory(parent_id); @@ -329,6 +233,7 @@ const LLViewerInventoryCategory *LLInventoryModel::getFirstNondefaultParent(cons { return cat; } + parent_id = cat->getParentUUID(); } return NULL; } @@ -1835,8 +1740,6 @@ void LLInventoryModel::stopBackgroundFetch() gIdleCallbacks.deleteFunction(&LLInventoryModel::backgroundFetch, NULL); sBulkFetchCount=0; sMinTimeBetweenFetches=0.0f; - - LMSortPrefix::completeCleanup(); } } @@ -1983,13 +1886,6 @@ void LLInventoryModel::cache( const LLUUID& parent_folder_id, const LLUUID& agent_id) { - if (getRootFolderID() == parent_folder_id) - { - // *TODO: mantipov: can be removed before public release, EXT-3985 - //save marker to avoid fetching inventory on future sessions - LMSortPrefix::setLandmarksWereCleaned(); - } - lldebugs << "Caching " << parent_folder_id << " for " << agent_id << llendl; LLViewerInventoryCategory* root_cat = getCategory(parent_folder_id); @@ -2800,28 +2696,6 @@ void LLInventoryModel::buildParentChildMap() // The inv tree is built. mIsAgentInvUsable = true; - {// *TODO: mantipov: can be removed before public release, EXT-3985 - /* - *HACK: mantipov: to cleanup landmarks were marked with sort index prefix in name. - Is necessary to be called once per account after EXT-3985 is implemented. - So, let fetch agent's inventory, processing will be done in processInventoryDescendents() - Should be removed before public release. - */ - if (!LMSortPrefix::wasClean()) - { - cat_array_t cats; - item_array_t items; - collectDescendents(agent_inv_root_id, cats, items, INCLUDE_TRASH); - - for (item_array_t::const_iterator it= items.begin(); it != items.end(); ++it) - { - LMSortPrefix::removePrefix(*it); - } - - gInventory.startBackgroundFetch(agent_inv_root_id); - } - } - llinfos << "Inventory initialized, notifying observers" << llendl; addChangedMask(LLInventoryObserver::ALL, LLUUID::null); notifyObservers(); @@ -3587,10 +3461,6 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**) continue; } gInventory.updateItem(titem); - - {// *TODO: mantipov: can be removed before public release, EXT-3985 - LMSortPrefix::removePrefix(titem); - } } // set version and descendentcount according to message. diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 12a2c370d2..a6d63e58f5 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -432,7 +432,26 @@ void LLInventoryPanel::initializeViews() rebuildViewsFor(mStartFolderID); mViewsInitialized = true; + openStartFolderOrMyInventory(); + + // Special case for new user login + if (gAgent.isFirstLogin()) + { + // Auto open the user's library + LLFolderViewFolder* lib_folder = mFolders->getFolderByID(gInventory.getLibraryRootFolderID()); + if (lib_folder) + { + lib_folder->setOpen(TRUE); + } + + // Auto close the user's my inventory folder + LLFolderViewFolder* my_inv_folder = mFolders->getFolderByID(gInventory.getRootFolderID()); + if (my_inv_folder) + { + my_inv_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN); + } + } } void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index dc187bf36c..96ce01c05f 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -138,16 +138,20 @@ void LLLogChat::saveHistory(const std::string& filename, const LLUUID& from_id, const std::string& line) { - if(!filename.size()) + std::string tmp_filename = filename; + LLStringUtil::trim(tmp_filename); + if (tmp_filename.empty()) { - llinfos << "Filename is Empty!" << llendl; + std::string warn = "Chat history filename [" + filename + "] is empty!"; + llwarning(warn, 666); + llassert(tmp_filename.size()); return; } - + llofstream file (LLLogChat::makeLogFileName(filename), std::ios_base::app); if (!file.is_open()) { - llinfos << "Couldn't open chat history log!" << llendl; + llwarns << "Couldn't open chat history log! - " + filename << llendl; return; } diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index d464862eed..3c34d26692 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -542,9 +542,9 @@ void LLMediaCtrl::navigateToLocalPage( const std::string& subdir, const std::str if (! gDirUtilp->fileExists(expanded_filename)) { - if (language != "en-us") + if (language != "en") { - expanded_filename = gDirUtilp->findSkinnedFilename("html", "en-us", filename); + expanded_filename = gDirUtilp->findSkinnedFilename("html", "en", filename); if (! gDirUtilp->fileExists(expanded_filename)) { llwarns << "File " << subdir << delim << filename_in << "not found" << llendl; diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 8c875c9b63..d579058c32 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -152,6 +152,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) if (avatar_id.notNull()) { // ...valid avatar id + LLScrollListCell* hit_cell = hit_item->getColumn(column_index); if (hit_cell) { @@ -162,8 +163,8 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) localRectToScreen(cell_rect, &sticky_rect); // Spawn at right side of cell - LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop + (sticky_rect.getHeight()-16)/2 ); LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small"); + LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 ); // Should we show a group or an avatar inspector? bool is_group = hit_item->getValue()["is_group"].asBoolean(); diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 71dc0f9011..46cab0d868 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -34,6 +34,8 @@ #include "llnavigationbar.h" +#include "v2math.h" + #include "llregionhandle.h" #include "llfloaterreg.h" @@ -181,6 +183,84 @@ void LLTeleportHistoryMenuItem::onMouseLeave(S32 x, S32 y, MASK mask) mArrowIcon->setVisible(FALSE); } +static LLDefaultChildRegistry::Register<LLPullButton> menu_button("pull_button"); + +LLPullButton::LLPullButton(const LLPullButton::Params& params) : + LLButton(params) +{ + setDirectionFromName(params.direction); +} +boost::signals2::connection LLPullButton::setClickDraggingCallback(const commit_signal_t::slot_type& cb) +{ + return mClickDraggingSignal.connect(cb); +} + +/*virtual*/ +void LLPullButton::onMouseLeave(S32 x, S32 y, MASK mask) +{ + LLButton::onMouseLeave(x, y, mask); + + if (mMouseDownTimer.getStarted()) //an user have done a mouse down, if the timer started. see LLButton::handleMouseDown for details + { + const LLVector2 cursor_direction = LLVector2(F32(x), F32(y)) - mLastMouseDown; + /* For now cursor_direction points to the direction of mouse movement + * Need to decide whether should we fire a signal. + * We fire if angle between mDraggingDirection and cursor_direction is less that 45 degree + * Note: + * 0.5 * F_PI_BY_TWO equals to PI/4 radian that equals to angle of 45 degrees + */ + if (angle_between(mDraggingDirection, cursor_direction) < 0.5 * F_PI_BY_TWO)//call if angle < pi/4 + { + mClickDraggingSignal(this, LLSD()); + } + } + +} + +/*virtual*/ +BOOL LLPullButton::handleMouseDown(S32 x, S32 y, MASK mask) +{ + BOOL handled = LLButton::handleMouseDown(x, y, mask); + if (handled) + { + //if mouse down was handled by button, + //capture mouse position to calculate the direction of mouse move after mouseLeave event + mLastMouseDown.set(F32(x), F32(y)); + } + return handled; +} + +/*virtual*/ +BOOL LLPullButton::handleMouseUp(S32 x, S32 y, MASK mask) +{ + // reset data to get ready for next circle + mLastMouseDown.clear(); + return LLButton::handleMouseUp(x, y, mask); +} +/** + * this function is setting up dragging direction vector. + * Last one is just unit vector. It points to direction of mouse drag that we need to handle + */ +void LLPullButton::setDirectionFromName(const std::string& name) +{ + if (name == "left") + { + mDraggingDirection.set(F32(-1), F32(0)); + } + else if (name == "right") + { + mDraggingDirection.set(F32(0), F32(1)); + } + else if (name == "down") + { + mDraggingDirection.set(F32(0), F32(-1)); + } + else if (name == "up") + { + mDraggingDirection.set(F32(0), F32(1)); + } +} + //-- LNavigationBar ---------------------------------------------------------- /* @@ -215,8 +295,8 @@ LLNavigationBar::~LLNavigationBar() BOOL LLNavigationBar::postBuild() { - mBtnBack = getChild<LLButton>("back_btn"); - mBtnForward = getChild<LLButton>("forward_btn"); + mBtnBack = getChild<LLPullButton>("back_btn"); + mBtnForward = getChild<LLPullButton>("forward_btn"); mBtnHome = getChild<LLButton>("home_btn"); mCmbLocation= getChild<LLLocationInputCtrl>("location_combo"); @@ -224,20 +304,15 @@ BOOL LLNavigationBar::postBuild() fillSearchComboBox(); - if (!mBtnBack || !mBtnForward || !mBtnHome || - !mCmbLocation || !mSearchComboBox) - { - llwarns << "Malformed navigation bar" << llendl; - return FALSE; - } - mBtnBack->setEnabled(FALSE); mBtnBack->setClickedCallback(boost::bind(&LLNavigationBar::onBackButtonClicked, this)); - mBtnBack->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this, _2)); - + mBtnBack->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this,_1, _2)); + mBtnBack->setClickDraggingCallback(boost::bind(&LLNavigationBar::showTeleportHistoryMenu, this,_1)); + mBtnForward->setEnabled(FALSE); mBtnForward->setClickedCallback(boost::bind(&LLNavigationBar::onForwardButtonClicked, this)); - mBtnForward->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this, _2)); + mBtnForward->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this, _1, _2)); + mBtnForward->setClickDraggingCallback(boost::bind(&LLNavigationBar::showTeleportHistoryMenu, this,_1)); mBtnHome->setClickedCallback(boost::bind(&LLNavigationBar::onHomeButtonClicked, this)); @@ -332,10 +407,10 @@ void LLNavigationBar::onBackButtonClicked() LLTeleportHistory::getInstance()->goBack(); } -void LLNavigationBar::onBackOrForwardButtonHeldDown(const LLSD& param) +void LLNavigationBar::onBackOrForwardButtonHeldDown(LLUICtrl* ctrl, const LLSD& param) { if (param["count"].asInteger() == 0) - showTeleportHistoryMenu(); + showTeleportHistoryMenu(ctrl); } void LLNavigationBar::onForwardButtonClicked() @@ -571,7 +646,7 @@ void LLNavigationBar::onRegionNameResponse( gAgent.teleportViaLocation(global_pos); } -void LLNavigationBar::showTeleportHistoryMenu() +void LLNavigationBar::showTeleportHistoryMenu(LLUICtrl* btn_ctrl) { // Don't show the popup if teleport history is empty. if (LLTeleportHistory::getInstance()->isEmpty()) @@ -585,14 +660,43 @@ void LLNavigationBar::showTeleportHistoryMenu() if (mTeleportHistoryMenu == NULL) return; - // *TODO: why to draw/update anything before showing the menu? - mTeleportHistoryMenu->buildDrawLabels(); mTeleportHistoryMenu->updateParent(LLMenuGL::sMenuContainer); const S32 MENU_SPAWN_PAD = -1; - LLMenuGL::showPopup(mBtnBack, mTeleportHistoryMenu, 0, MENU_SPAWN_PAD); - + LLMenuGL::showPopup(btn_ctrl, mTeleportHistoryMenu, 0, MENU_SPAWN_PAD); + LLButton* nav_button = dynamic_cast<LLButton*>(btn_ctrl); + if(nav_button) + { + if(mHistoryMenuConnection.connected()) + { + LL_WARNS("Navgationbar")<<"mHistoryMenuConnection should be disconnected at this moment."<<LL_ENDL; + mHistoryMenuConnection.disconnect(); + } + mHistoryMenuConnection = gMenuHolder->setMouseUpCallback(boost::bind(&LLNavigationBar::onNavigationButtonHeldUp, this, nav_button)); + // pressed state will be update after mouseUp in onBackOrForwardButtonHeldUp(); + nav_button->setForcePressedState(true); + } // *HACK pass the mouse capturing to the drop-down menu - gFocusMgr.setMouseCapture( NULL ); + // it need to let menu handle mouseup event + gFocusMgr.setMouseCapture(gMenuHolder); +} +/** + * Taking into account the HACK above, this callback-function is responsible for correct handling of mouseUp event in case of holding-down the navigation buttons.. + * We need to process this case separately to update a pressed state of navigation button. + */ +void LLNavigationBar::onNavigationButtonHeldUp(LLButton* nav_button) +{ + if(nav_button) + { + nav_button->setForcePressedState(false); + } + if(gFocusMgr.getMouseCapture() == gMenuHolder) + { + // we had passed mouseCapture in showTeleportHistoryMenu() + // now we MUST release mouseCapture to continue a proper mouseevent workflow. + gFocusMgr.setMouseCapture(NULL); + } + //gMenuHolder is using to display bunch of menus. Disconnect signal to avoid unnecessary calls. + mHistoryMenuConnection.disconnect(); } void LLNavigationBar::handleLoginComplete() diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 9d0687f193..b512f2a79c 100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -34,14 +34,56 @@ #define LL_LLNAVIGATIONBAR_H #include "llpanel.h" +#include "llbutton.h" -class LLButton; class LLLocationInputCtrl; class LLMenuGL; class LLSearchEditor; class LLSearchComboBox; /** + * This button is able to handle click-dragging mouse event. + * It has appropriated signal for this event. + * Dragging direction can be set from xml attribute called 'direction' + * + * *TODO: move to llui? + */ + +class LLPullButton: public LLButton +{ + LOG_CLASS(LLPullButton); + +public: + struct Params: public LLInitParam::Block<Params, LLButton::Params> + { + Optional<std::string> direction; // left, right, down, up + + Params() + : direction("direction", "down") + { + } + }; + + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); + + /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); + + /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); + + boost::signals2::connection setClickDraggingCallback(const commit_signal_t::slot_type& cb); + +protected: + friend class LLUICtrlFactory; + // convert string name into direction vector + void setDirectionFromName(const std::string& name); + LLPullButton(const LLPullButton::Params& params); + + commit_signal_t mClickDraggingSignal; + LLVector2 mLastMouseDown; + LLVector2 mDraggingDirection; +}; + +/** * Web browser-like navigation bar. */ class LLNavigationBar @@ -70,13 +112,14 @@ public: private: void rebuildTeleportHistoryMenu(); - void showTeleportHistoryMenu(); + void showTeleportHistoryMenu(LLUICtrl* btn_ctrl); void invokeSearch(std::string search_text); // callbacks void onTeleportHistoryMenuItemClicked(const LLSD& userdata); void onTeleportHistoryChanged(); void onBackButtonClicked(); - void onBackOrForwardButtonHeldDown(const LLSD& param); + void onBackOrForwardButtonHeldDown(LLUICtrl* ctrl, const LLSD& param); + void onNavigationButtonHeldUp(LLButton* nav_button); void onForwardButtonClicked(); void onHomeButtonClicked(); void onLocationSelection(); @@ -94,8 +137,8 @@ private: void fillSearchComboBox(); LLMenuGL* mTeleportHistoryMenu; - LLButton* mBtnBack; - LLButton* mBtnForward; + LLPullButton* mBtnBack; + LLPullButton* mBtnForward; LLButton* mBtnHome; LLSearchComboBox* mSearchComboBox; LLLocationInputCtrl* mCmbLocation; @@ -103,6 +146,7 @@ private: LLRect mDefaultFpRect; boost::signals2::connection mTeleportFailedConnection; boost::signals2::connection mTeleportFinishConnection; + boost::signals2::connection mHistoryMenuConnection; bool mPurgeTPHistoryItems; // if true, save location to location history when teleport finishes bool mSaveToLocationHistory; diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 90482eb74d..8fc11d3929 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -62,6 +62,12 @@ static const S32 RESIZE_BAR_THICKNESS = 3; +const static std::string IM_TIME("time"); +const static std::string IM_TEXT("message"); +const static std::string IM_FROM("from"); +const static std::string IM_FROM_ID("from_id"); + + LLNearbyChat::LLNearbyChat(const LLSD& key) : LLDockableFloater(NULL, false, false, key) ,mChatHistory(NULL) @@ -195,6 +201,16 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args) if(mMessageArchive.size()>200) mMessageArchive.erase(mMessageArchive.begin()); } + + if (args["do_not_log"].asBoolean()) + { + return; + } + + if (gSavedPerAccountSettings.getBOOL("LogChat")) + { + LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText); + } } void LLNearbyChat::onNearbySpeakers() @@ -262,6 +278,42 @@ void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue) nearby_chat->updateChatHistoryStyle(); } +void LLNearbyChat::loadHistory() +{ + LLSD do_not_log; + do_not_log["do_not_log"] = true; + + std::list<LLSD> history; + LLLogChat::loadAllHistory("chat", history); + + std::list<LLSD>::const_iterator it = history.begin(); + while (it != history.end()) + { + const LLSD& msg = *it; + + std::string from = msg[IM_FROM]; + LLUUID from_id = LLUUID::null; + if (msg[IM_FROM_ID].isUndefined()) + { + gCacheName->getUUID(from, from_id); + } + + LLChat chat; + chat.mFromName = from; + chat.mFromID = from_id; + chat.mText = msg[IM_TEXT].asString(); + chat.mTimeStr = msg[IM_TIME].asString(); + addMessage(chat, true, do_not_log); + + it++; + } +} + +//static +LLNearbyChat* LLNearbyChat::getInstance() +{ + return LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); +} //////////////////////////////////////////////////////////////////////////////// // @@ -278,3 +330,4 @@ void LLNearbyChat::onFocusLost() setBackgroundOpaque(false); LLPanel::onFocusLost(); } + diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 5fb8ade19e..6ef2a1fee3 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -47,6 +47,8 @@ public: ~LLNearbyChat(); BOOL postBuild (); + + /** @param archive true - to save a message to the chat history log */ void addMessage (const LLChat& message,bool archive = true, const LLSD &args = LLSD()); void onNearbyChatContextMenuItemClicked(const LLSD& userdata); bool onNearbyChatCheckContextMenuItem(const LLSD& userdata); @@ -65,6 +67,10 @@ public: static void processChatHistoryStyleUpdate(const LLSD& newvalue); + void loadHistory(); + + static LLNearbyChat* getInstance(); + private: virtual void applySavedVariables(); diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index c08ca30bab..be48770567 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -274,6 +274,13 @@ void LLNearbyChatScreenChannel::showToastsBottom() toast->setRect(toast_rect); toast->setIsHidden(false); toast->setVisible(TRUE); + + if(!toast->hasFocus()) + { + // Fixing Z-order of toasts (EXT-4862) + // Next toast will be positioned under this one. + gFloaterView->sendChildToBack(toast); + } bottom = toast->getRect().mTop; } diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index e2a748a1c5..b8e0892b02 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -168,6 +168,12 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_fi session_name = "chat"; } + //there still appears a log history file with weird name " .txt" + if (" " == session_name || "{waiting}" == session_name || "{nobody}" == session_name) + { + llwarning("Weird session name (" + session_name + ") for notification " + notification->getName(), 666) + } + if(to_file_only) { logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(), diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 48dd5513bd..4a7cdfc856 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -483,6 +483,7 @@ BOOL LLPanelAvatarProfile::postBuild() LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this)); registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this)); + registrar.add("Profile.BlockUnblock", boost::bind(&LLPanelAvatarProfile::toggleBlock, this)); registrar.add("Profile.Kick", boost::bind(&LLPanelAvatarProfile::kick, this)); registrar.add("Profile.Freeze", boost::bind(&LLPanelAvatarProfile::freeze, this)); registrar.add("Profile.Unfreeze", boost::bind(&LLPanelAvatarProfile::unfreeze, this)); @@ -490,6 +491,8 @@ BOOL LLPanelAvatarProfile::postBuild() LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable; enable.add("Profile.EnableGod", boost::bind(&enable_god)); + enable.add("Profile.CheckItem", boost::bind(&LLPanelAvatarProfile::checkOverflowMenuItem, this, _2)); + enable.add("Profile.EnableItem", boost::bind(&LLPanelAvatarProfile::enableOverflowMenuItem, this, _2)); mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); @@ -666,6 +669,26 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data) childSetValue("acc_status_text", caption_text); } +bool LLPanelAvatarProfile::checkOverflowMenuItem(const LLSD& param) +{ + std::string item = param.asString(); + + if (item == "is_blocked") + return LLAvatarActions::isBlocked(getAvatarId()); + + return false; +} + +bool LLPanelAvatarProfile::enableOverflowMenuItem(const LLSD& param) +{ + std::string item = param.asString(); + + if (item == "can_block") + return LLAvatarActions::canBlock(getAvatarId()); + + return false; +} + void LLPanelAvatarProfile::pay() { LLAvatarActions::pay(getAvatarId()); @@ -676,6 +699,11 @@ void LLPanelAvatarProfile::share() LLAvatarActions::share(getAvatarId()); } +void LLPanelAvatarProfile::toggleBlock() +{ + LLAvatarActions::toggleBlock(getAvatarId()); +} + void LLPanelAvatarProfile::kick() { LLAvatarActions::kick(getAvatarId()); diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index ce59f1e93d..632590aa27 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -192,12 +192,18 @@ protected: */ void share(); + /** + * Add/remove resident to/from your block list. + */ + void toggleBlock(); + void kick(); void freeze(); void unfreeze(); void csr(); - + bool checkOverflowMenuItem(const LLSD& param); + bool enableOverflowMenuItem(const LLSD& param); bool enableGod(); diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 3f5d80c123..1e46827c1a 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -1231,12 +1231,14 @@ void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType t static std::string mature_str = getString("type_mature"); static std::string pg_str = getString("type_pg"); + static LLUIString price_str = getString("l$_price"); bool mature = is_cf_mature(c_info->flags); childSetValue("content_type", mature ? mature_str : pg_str); childSetValue("auto_renew", is_cf_auto_renew(c_info->flags)); - childSetTextArg("price_for_listing", "[PRICE]", llformat("%d", c_info->price_for_listing)); + price_str.setArg("[PRICE]", llformat("%d", c_info->price_for_listing)); + childSetValue("price_for_listing", LLSD(price_str)); setInfoLoaded(true); } diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index ff1e43b526..cbd6f64a48 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -81,11 +81,15 @@ void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::E void LLPanelChatControlPanel::updateCallButton() { - // hide/show call button bool voice_enabled = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking(); LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId); - if (!session) return; + + if (!session) + { + childSetEnabled("call_btn", false); + return; + } bool session_initialized = session->mSessionInitialized; bool callback_enabled = session->mCallBackEnabled; @@ -280,8 +284,6 @@ void LLPanelGroupControlPanel::draw() // Need to resort the participant list if it's in sort by recent speaker order. if (mParticipantList) mParticipantList->updateRecentSpeakersOrder(); - //* TODO: find better way to properly enable call button for group and remove this call from draw() - updateCallButton(); LLPanelChatControlPanel::draw(); } diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 47feef496a..7c1b0f6234 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -171,8 +171,6 @@ BOOL LLLandmarksPanel::postBuild() initLandmarksInventoryPanel(); initMyInventoryPanel(); initLibraryInventoryPanel(); - getChild<LLAccordionCtrlTab>("tab_favorites")->setDisplayChildren(true); - getChild<LLAccordionCtrlTab>("tab_landmarks")->setDisplayChildren(true); return TRUE; } @@ -462,7 +460,7 @@ void LLLandmarksPanel::initFavoritesInventoryPanel() initLandmarksPanel(mFavoritesInventoryPanel); mFavoritesInventoryPanel->getFilter()->setEmptyLookupMessage("FavoritesNoMatchingItems"); - initAccordion("tab_favorites", mFavoritesInventoryPanel); + initAccordion("tab_favorites", mFavoritesInventoryPanel, true); } void LLLandmarksPanel::initLandmarksInventoryPanel() @@ -481,7 +479,7 @@ void LLLandmarksPanel::initLandmarksInventoryPanel() // subscribe to have auto-rename functionality while creating New Folder mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2)); - initAccordion("tab_landmarks", mLandmarksInventoryPanel); + initAccordion("tab_landmarks", mLandmarksInventoryPanel, true); } void LLLandmarksPanel::initMyInventoryPanel() @@ -490,7 +488,7 @@ void LLLandmarksPanel::initMyInventoryPanel() initLandmarksPanel(mMyInventoryPanel); - initAccordion("tab_inventory", mMyInventoryPanel); + initAccordion("tab_inventory", mMyInventoryPanel, false); } void LLLandmarksPanel::initLibraryInventoryPanel() @@ -499,7 +497,15 @@ void LLLandmarksPanel::initLibraryInventoryPanel() initLandmarksPanel(mLibraryInventoryPanel); - initAccordion("tab_library", mLibraryInventoryPanel); + // We want to fetch only "Landmarks" category from the library. + const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true); + if (landmarks_cat.notNull()) + { + gInventory.startBackgroundFetch(landmarks_cat); + } + + // Expanding "Library" tab for new users who have no landmarks in "My Inventory". + initAccordion("tab_library", mLibraryInventoryPanel, true); } void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list) @@ -526,14 +532,14 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list inventory_list->saveFolderState(); } -void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list) +void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab) { LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name); mAccordionTabs.push_back(accordion_tab); accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list)); - accordion_tab->setDisplayChildren(false); + accordion_tab->setDisplayChildren(expand_tab); } void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list) diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 96b790844c..cbbd10ac26 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -110,7 +110,7 @@ private: void initMyInventoryPanel(); void initLibraryInventoryPanel(); void initLandmarksPanel(LLPlacesInventoryPanel* inventory_list); - void initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list); + void initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab); void onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list); void deselectOtherThan(const LLPlacesInventoryPanel* inventory_list); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 87d101b00f..df9002facc 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -676,7 +676,7 @@ void LLPanelLogin::refreshLocation( bool force_visible ) // Don't show on first run after install // Otherwise ShowStartLocation defaults to true. show_start = gSavedSettings.getBOOL("ShowStartLocation") - && !gSavedSettings.getBOOL("FirstRunThisInstall"); + && gSavedSettings.getBOOL("HadFirstSuccessfulLogin"); } sInstance->childSetVisible("start_location_combo", show_start); @@ -689,6 +689,23 @@ void LLPanelLogin::refreshLocation( bool force_visible ) } // static +void LLPanelLogin::updateLocationUI() +{ + if (!sInstance) return; + + std::string sim_string = LLURLSimString::sInstance.mSimString; + if (!sim_string.empty()) + { + // Replace "<Type region name>" with this region name + LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo"); + combo->remove(2); + combo->add( sim_string ); + combo->setTextEntry(sim_string); + combo->setCurrentByIndex( 2 ); + } +} + +// static void LLPanelLogin::closePanel() { if (sInstance) @@ -830,7 +847,7 @@ void LLPanelLogin::loadLoginPage() oStr << "&auto_login=TRUE"; } if (gSavedSettings.getBOOL("ShowStartLocation") - && !gSavedSettings.getBOOL("FirstRunThisInstall")) + && gSavedSettings.getBOOL("HadFirstSuccessfulLogin")) { oStr << "&show_start_location=TRUE"; } diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 97350ce5c7..1fdc3a9361 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -71,6 +71,7 @@ public: static void addServer(const std::string& server, S32 domain_name); static void refreshLocation( bool force_visible ); + static void updateLocationUI(); static void getFields(std::string *firstname, std::string *lastname, std::string *password); @@ -102,7 +103,7 @@ private: static void onPassKey(LLLineEditor* caller, void* user_data); static void onSelectServer(LLUICtrl*, void*); static void onServerComboLostFocus(LLFocusableElement*); - + private: LLPointer<LLUIImage> mLogoImage; boost::scoped_ptr<LLPanelLoginListener> mListener; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index a5a61f0c7b..1895993a8e 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -1071,7 +1071,11 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) { const LLUUID &item_id = (*iter); LLFolderViewItem *item = folder->getItemByID(item_id); - can_delete &= item->getListener()->isItemRemovable(); + const LLFolderViewEventListener *listener = item->getListener(); + llassert(listener); + if (!listener) return FALSE; + can_delete &= listener->isItemRemovable(); + can_delete &= !listener->isItemInTrash(); } return can_delete; } diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index 0f0fb4b94e..a68552a91e 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -69,6 +69,20 @@ BOOL LLPanelMe::postBuild() void LLPanelMe::onOpen(const LLSD& key) { LLPanelProfile::onOpen(key); + + if(key.isUndefined() || key.has("edit_my_profile")) + { + // Open Edit My Profile panel by default (through Side Tray -> My Profile) (EXT-4823) + buildEditPanel(); + openPanel(mEditPanel, getAvatarId()); + } + else if(mEditPanel) + { + // When opening Me Panel through Side Tray LLPanelMe::onOpen() is called twice. + // First time key can be undefined and second time - key may contain some data. + // Lets close Edit Panel if key does contain some data on second call. + closePanel(mEditPanel); + } } bool LLPanelMe::notifyChildren(const LLSD& info) @@ -198,6 +212,10 @@ void LLPanelMyProfileEdit::processProfileProperties(const LLAvatarData* avatar_d { fillCommonData(avatar_data); + // 'Home page' was hidden in LLPanelAvatarProfile::fillCommonData() to fix EXT-4734 + // Show 'Home page' in Edit My Profile (EXT-4873) + childSetVisible("homepage_edit", true); + fillPartnerData(avatar_data); fillAccountStatus(avatar_data); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 5c5c35141e..e8ae006968 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -117,7 +117,7 @@ public: virtual BOOL isItemRenameable() const; virtual BOOL renameItem(const std::string& new_name); virtual BOOL isItemMovable() const; - virtual BOOL isItemRemovable(); + virtual BOOL isItemRemovable() const; virtual BOOL removeItem(); virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch); virtual void move(LLFolderViewEventListener* parent_listener); @@ -412,9 +412,9 @@ BOOL LLTaskInvFVBridge::isItemMovable() const return TRUE; } -BOOL LLTaskInvFVBridge::isItemRemovable() +BOOL LLTaskInvFVBridge::isItemRemovable() const { - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); if(object && (object->permModify() || object->permYouOwner())) { @@ -710,7 +710,7 @@ public: virtual BOOL isItemRenameable() const; // virtual BOOL isItemCopyable() const { return FALSE; } virtual BOOL renameItem(const std::string& new_name); - virtual BOOL isItemRemovable(); + virtual BOOL isItemRemovable() const; virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual BOOL hasChildren() const; virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; @@ -742,7 +742,7 @@ BOOL LLTaskCategoryBridge::renameItem(const std::string& new_name) return FALSE; } -BOOL LLTaskCategoryBridge::isItemRemovable() +BOOL LLTaskCategoryBridge::isItemRemovable() const { return FALSE; } diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index b01cdcc832..423ee61e25 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -516,7 +516,6 @@ BOOL LLPanelPeople::postBuild() mRecentList->setShowIcons("RecentListShowIcons"); mGroupList = getChild<LLGroupList>("group_list"); - mGroupList->setNoItemsCommentText(getString("no_groups")); mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); @@ -668,6 +667,11 @@ void LLPanelPeople::updateFriendList() lldebugs << "Friends Cards were not found" << llendl; } + // show special help text for just created account to help found friends. EXT-4836 + static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg"); + no_friends_text->setVisible(all_friendsp.size() == 0); + + LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); for (; buddy_it != all_buddies.end(); ++buddy_it) { diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 470cfca8fe..7e184c78a8 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -164,11 +164,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata) if (item == std::string("can_block")) { const LLUUID& id = mUUIDs.front(); - std::string firstname, lastname; - gCacheName->getName(id, firstname, lastname); - bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden"); - bool is_self = id == gAgentID; - return !is_self && !is_linden; + return LLAvatarActions::canBlock(id); } else if (item == std::string("can_add")) { diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 29cfbbe606..a49386cb5c 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -70,6 +70,7 @@ #include "lltoggleablemenu.h" #include "llviewerinventory.h" #include "llviewermenu.h" +#include "llviewermessage.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" #include "llviewerwindow.h" @@ -105,22 +106,35 @@ private: LLPanelPlaces* mPlaces; }; -class LLPlacesInventoryObserver : public LLInventoryObserver +class LLPlacesInventoryObserver : public LLInventoryAddedObserver { public: LLPlacesInventoryObserver(LLPanelPlaces* places_panel) : - LLInventoryObserver(), - mPlaces(places_panel) + mPlaces(places_panel), + mTabsCreated(false) {} /*virtual*/ void changed(U32 mask) { - if (mPlaces) - mPlaces->changedInventory(mask); + LLInventoryAddedObserver::changed(mask); + + if (!mTabsCreated && mPlaces) + { + mPlaces->createTabs(); + mTabsCreated = true; + } + } + +protected: + /*virtual*/ void done() + { + mPlaces->showAddedLandmarkInfo(mAdded); + mAdded.clear(); } private: LLPanelPlaces* mPlaces; + bool mTabsCreated; }; class LLPlacesRemoteParcelInfoObserver : public LLRemoteParcelInfoObserver @@ -943,7 +957,7 @@ void LLPanelPlaces::changedParcelSelection() updateVerbs(); } -void LLPanelPlaces::changedInventory(U32 mask) +void LLPanelPlaces::createTabs() { if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance())) return; @@ -979,10 +993,6 @@ void LLPanelPlaces::changedInventory(U32 mask) // Filter applied to show all items. if (mActivePanel) mActivePanel->onSearchEdit(mActivePanel->getFilterSubString()); - - // we don't need to monitor inventory changes anymore, - // so remove the observer - gInventory.removeObserver(mInventoryObserver); } void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos) @@ -991,6 +1001,33 @@ void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos) updateVerbs(); } +void LLPanelPlaces::showAddedLandmarkInfo(const std::vector<LLUUID>& items) +{ + for (std::vector<LLUUID>::const_iterator item_iter = items.begin(); + item_iter != items.end(); + ++item_iter) + { + const LLUUID& item_id = (*item_iter); + if(!highlight_offered_item(item_id)) + { + continue; + } + + LLInventoryItem* item = gInventory.getItem(item_id); + + if (LLAssetType::AT_LANDMARK == item->getType()) + { + // Created landmark is passed to Places panel to allow its editing. + // If the panel is closed we don't reopen it until created landmark is loaded. + if("create_landmark" == getPlaceInfoType() && !getItem()) + { + setItem(item); + } + break; + } + } +} + void LLPanelPlaces::updateVerbs() { bool is_place_info_visible; diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index 110d7a1054..78fcbbb11d 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -66,11 +66,15 @@ public: // Called on parcel selection change to update place information. void changedParcelSelection(); - // Called on agent inventory change to find out when inventory gets usable. - void changedInventory(U32 mask); + // Called once on agent inventory first change to find out when inventory gets usable + // and to create "My Landmarks" and "Teleport History" tabs. + void createTabs(); // Called when we receive the global 3D position of a parcel. void changedGlobalPos(const LLVector3d &global_pos); + // Opens landmark info panel when agent creates or receives landmark. + void showAddedLandmarkInfo(const std::vector<LLUUID>& items); + void setItem(LLInventoryItem* item); LLInventoryItem* getItem() { return mItem; } diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index c73ade53c8..b5d85dfd4b 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -197,11 +197,7 @@ void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key) } else { - panel->setVisible(FALSE); - if (panel->getParent() == this) - { - removeChild(panel); - } + closePanel(panel); getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId()); } @@ -248,6 +244,16 @@ void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params) panel->setRect(new_rect); } +void LLPanelProfile::closePanel(LLPanel* panel) +{ + panel->setVisible(FALSE); + + if (panel->getParent() == this) + { + removeChild(panel); + } +} + S32 LLPanelProfile::notifyParent(const LLSD& info) { std::string action = info["action"]; diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index bcf4bdd0ec..f1aa3f10f8 100644 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -55,6 +55,8 @@ public: virtual void openPanel(LLPanel* panel, const LLSD& params); + virtual void closePanel(LLPanel* panel); + S32 notifyParent(const LLSD& info); protected: diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 43e0f9a88c..90c8f2551f 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -940,6 +940,9 @@ bool LLTeleportHistoryPanel::onClearTeleportHistoryDialog(const LLSD& notificati if (0 == option) { + // order does matter, call this first or teleport history will contain one record(current location) + LLTeleportHistory::getInstance()->purgeItems(); + LLTeleportHistoryStorage *th = LLTeleportHistoryStorage::getInstance(); th->purgeItems(); th->save(); diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index f83f3eba96..1c4004c37a 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -583,7 +583,8 @@ void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(co bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata) { std::string item = userdata.asString(); - if (item == "can_mute_text" || "can_block" == item || "can_share" == item || "can_im" == item) + if (item == "can_mute_text" || "can_block" == item || "can_share" == item || "can_im" == item + || "can_pay" == item) { return mUUIDs.front() != gAgentID; } @@ -618,7 +619,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& for (;id != uuids_end; ++id) { - if ( LLAvatarActions::isFriend(*id) ) + if ( *id == gAgentID || LLAvatarActions::isFriend(*id) ) { result = false; break; diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp index 83443687c9..4fe69f295c 100644 --- a/indra/newview/llplacesinventorybridge.cpp +++ b/indra/newview/llplacesinventorybridge.cpp @@ -66,7 +66,7 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 3b9f7f9882..551e247d8c 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -74,7 +74,7 @@ public: /*virtual*/ BOOL postBuild(); - void setObjectID(const LLUUID& object_id); + virtual void setObjectID(const LLUUID& object_id); void setItem( LLInventoryItem* item ); void setAssetId(const LLUUID& asset_id); diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index fccf71f3cb..7bcbe334ff 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -1904,7 +1904,7 @@ void LLLiveLSLEditor::uploadAssetViaCaps(const std::string& url, const LLUUID& item_id, BOOL is_running) { - llinfos << "Update Task Inventory via capability" << llendl; + llinfos << "Update Task Inventory via capability " << url << llendl; LLSD body; body["task_id"] = task_id; body["item_id"] = item_id; diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 028807a6bd..dfc67d0126 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -74,22 +74,10 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) mLastHeight(0), mLastWidth(0), mAspectRatio(0.f), - mPreviewToSave(FALSE) + mPreviewToSave(FALSE), + mImage(NULL) { - const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); - if(item) - { - mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); - mImageID = item->getAssetUUID(); - mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); - } - else // not an item, assume it's an asset id - { - mImageID = mItemUUID; - mCopyToInv = TRUE; - mIsCopyable = TRUE; - } - + updateImageID(); if (key.has("save_as")) { mPreviewToSave = TRUE; @@ -97,7 +85,6 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_texture.xml", FALSE); } - LLPreviewTexture::~LLPreviewTexture() { if( mLoadingFullImage ) @@ -493,3 +480,42 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus() } return mAssetStatus; } + +void LLPreviewTexture::updateImageID() +{ + const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); + if(item) + { + mImageID = item->getAssetUUID(); + mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); + mCopyToInv = FALSE; + mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); + } + else // not an item, assume it's an asset id + { + mImageID = mItemUUID; + mShowKeepDiscard = FALSE; + mCopyToInv = TRUE; + mIsCopyable = TRUE; + } + +} + +/* virtual */ +void LLPreviewTexture::setObjectID(const LLUUID& object_id) +{ + mObjectUUID = object_id; + + const LLUUID old_image_id = mImageID; + + // Update what image we're pointing to, such as if we just specified the mObjectID + // that this mItemID is part of. + updateImageID(); + + // If the imageID has changed, start over and reload the new image. + if (mImageID != old_image_id) + { + mAssetStatus = PREVIEW_ASSET_UNLOADED; + loadAsset(); + } +} diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 980aecee6d..7cd2adad56 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -69,6 +69,8 @@ public: void openToSave(); static void onSaveAsBtn(void* data); + + /*virtual*/ void setObjectID(const LLUUID& object_id); protected: void init(); /* virtual */ BOOL postBuild(); @@ -76,6 +78,7 @@ protected: static void onAspectRatioCommit(LLUICtrl*,void* userdata); private: + void updateImageID(); // set what image is being uploaded. void updateDimensions(); LLUUID mImageID; LLPointer<LLViewerFetchedTexture> mImage; diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index a00b6a9288..7c2e7e3319 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -487,10 +487,21 @@ void LLScreenChannel::showToastsBottom() toast_rect.setOriginAndSize(getRect().mLeft, bottom + toast_margin, toast_rect.getWidth() ,toast_rect.getHeight()); (*it).toast->setRect(toast_rect); - // don't show toasts if there is not enough space if(floater && floater->overlapsScreenChannel()) { + if(it == mToastList.rbegin()) + { + // move first toast above docked floater + S32 shift = floater->getRect().getHeight(); + if(floater->getDockControl()) + { + shift += floater->getDockControl()->getTongueHeight(); + } + (*it).toast->translate(0, shift); + } + LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); + // don't show toasts if there is not enough space if(toast_rect.mTop > world_rect.mTop) { break; @@ -522,9 +533,13 @@ void LLScreenChannel::showToastsBottom() // HACK // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts (*it).toast->setVisible(TRUE); - // Show toast behind floaters. (EXT-3089) - gFloaterView->sendChildToBack((*it).toast); } + if(!(*it).toast->hasFocus()) + { + // Fixing Z-order of toasts (EXT-4862) + // Next toast will be positioned under this one. + gFloaterView->sendChildToBack((*it).toast); + } } if(it != mToastList.rend()) @@ -802,16 +817,6 @@ void LLScreenChannel::updateShowToastsState() S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");; LLRect this_rect = getRect(); - // adjust channel's height - if(floater->overlapsScreenChannel()) - { - channel_bottom += floater->getRect().getHeight(); - if(floater->getDockControl()) - { - channel_bottom += floater->getDockControl()->getTongueHeight(); - } - } - if(channel_bottom != this_rect.mBottom) { setRect(LLRect(this_rect.mLeft, this_rect.mTop, this_rect.mRight, channel_bottom)); diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 5383158cd3..3fd5309947 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -164,7 +164,21 @@ void LLSidepanelInventory::onWearButtonClicked() void LLSidepanelInventory::onPlayButtonClicked() { - performActionOnSelection("activate"); + const LLInventoryItem *item = getSelectedItem(); + if (!item) + { + return; + } + + switch(item->getInventoryType()) + { + case LLInventoryType::IT_GESTURE: + performActionOnSelection("play"); + break; + default: + performActionOnSelection("open"); + break; + } } void LLSidepanelInventory::onTeleportButtonClicked() diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 37e268ad34..3343ee88bd 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -39,7 +39,8 @@ const std::string LLSLURL::PREFIX_SL_HELP = "secondlife://app."; const std::string LLSLURL::PREFIX_SL = "sl://"; const std::string LLSLURL::PREFIX_SECONDLIFE = "secondlife://"; -const std::string LLSLURL::PREFIX_SLURL = "http://slurl.com/secondlife/"; +const std::string LLSLURL::PREFIX_SLURL_OLD = "http://slurl.com/secondlife/"; +const std::string LLSLURL::PREFIX_SLURL = "http://maps.secondlife.com/secondlife/"; const std::string LLSLURL::APP_TOKEN = "app/"; @@ -63,6 +64,11 @@ std::string LLSLURL::stripProtocol(const std::string& url) { stripped.erase(0, PREFIX_SLURL.length()); } + else if (matchPrefix(stripped, PREFIX_SLURL_OLD)) + { + stripped.erase(0, PREFIX_SLURL_OLD.length()); + } + return stripped; } @@ -74,6 +80,7 @@ bool LLSLURL::isSLURL(const std::string& url) if (matchPrefix(url, PREFIX_SL)) return true; if (matchPrefix(url, PREFIX_SECONDLIFE)) return true; if (matchPrefix(url, PREFIX_SLURL)) return true; + if (matchPrefix(url, PREFIX_SLURL_OLD)) return true; return false; } @@ -83,7 +90,8 @@ bool LLSLURL::isSLURLCommand(const std::string& url) { if (matchPrefix(url, PREFIX_SL + APP_TOKEN) || matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) || - matchPrefix(url, PREFIX_SLURL + APP_TOKEN) ) + matchPrefix(url, PREFIX_SLURL + APP_TOKEN) || + matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) ) { return true; } diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h index 05b0143e72..21b32ce409 100644 --- a/indra/newview/llslurl.h +++ b/indra/newview/llslurl.h @@ -50,6 +50,7 @@ public: static const std::string PREFIX_SL; static const std::string PREFIX_SECONDLIFE; static const std::string PREFIX_SLURL; + static const std::string PREFIX_SLURL_OLD; static const std::string APP_TOKEN; diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index 8f2c877c7a..c5c311ed33 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -66,6 +66,16 @@ void LLSpeakButton::draw() mOutputMonitor->setIsMuted(!voiceenabled); LLUICtrl::draw(); } +void LLSpeakButton::setSpeakBtnEnabled(bool enabled) +{ + LLButton* speak_btn = getChild<LLButton>("speak_btn"); + speak_btn->setEnabled(enabled); +} +void LLSpeakButton::setFlyoutBtnEnabled(bool enabled) +{ + LLButton* show_btn = getChild<LLButton>("speak_flyout_btn"); + show_btn->setEnabled(enabled); +} LLSpeakButton::LLSpeakButton(const Params& p) : LLUICtrl(p) diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index 6660b50240..85c97f1a2c 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -61,6 +61,10 @@ public: /*virtual*/ ~LLSpeakButton(); /*virtual*/ void draw(); + + // methods for enabling/disabling right and left parts of speak button separately(EXT-4648) + void setSpeakBtnEnabled(bool enabled); + void setFlyoutBtnEnabled(bool enabled); // *HACK: Need to put tooltips in a translatable location, // the panel that contains this button. diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 6f9a1ccdbe..786fa24e65 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -205,7 +205,7 @@ void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id) } } -void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id) +void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, bool delete_it) { if (mActionTimersMap.size() == 0) return; @@ -213,7 +213,10 @@ void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id) if (it_speaker != mActionTimersMap.end()) { - delete it_speaker->second; + if (delete_it) + { + delete it_speaker->second; + } mActionTimersMap.erase(it_speaker); } } @@ -230,16 +233,15 @@ void LLSpeakersDelayActionsStorage::removeAllTimers() bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_id) { - unsetActionTimer(speaker_id); + bool delete_it = false; // we're *in* this timer, return true to delete it, don't manually delete it + unsetActionTimer(speaker_id, delete_it); if (mActionCallback) { mActionCallback(speaker_id); } - // do not return true to avoid deleting of an timer twice: - // in LLSpeakersDelayActionsStorage::unsetActionTimer() & LLEventTimer::updateClass() - return false; + return true; } @@ -291,7 +293,8 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin } } - mSpeakerDelayRemover->unsetActionTimer(speakerp->mID); + bool delete_it = true; + mSpeakerDelayRemover->unsetActionTimer(speakerp->mID, delete_it); return speakerp; } diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index 63237204c8..ddc3632f07 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -176,11 +176,11 @@ public: void setActionTimer(const LLUUID& speaker_id); /** - * Removes stored LLSpeakerActionTimer for passed speaker UUID from internal map and deletes it. + * Removes stored LLSpeakerActionTimer for passed speaker UUID from internal map and optionally deletes it. * * @see onTimerActionCallback() */ - void unsetActionTimer(const LLUUID& speaker_id); + void unsetActionTimer(const LLUUID& speaker_id, bool delete_it); void removeAllTimers(); private: diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 6b816f8786..9fda77fe74 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -67,6 +67,7 @@ #include "llmemorystream.h" #include "llmessageconfig.h" #include "llmoveview.h" +#include "llnearbychat.h" #include "llnotifications.h" #include "llnotificationsutil.h" #include "llteleporthistory.h" @@ -772,8 +773,6 @@ bool idle_startup() LLPanelLogin::giveFocus(); - gSavedSettings.setBOOL("FirstRunThisInstall", FALSE); - LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input } else @@ -904,7 +903,8 @@ bool idle_startup() LLFile::mkdir(gDirUtilp->getChatLogsDir()); LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir()); - //good as place as any to create user windlight directories + + //good a place as any to create user windlight directories std::string user_windlight_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", "")); LLFile::mkdir(user_windlight_path_name.c_str()); @@ -1284,6 +1284,14 @@ bool idle_startup() LLAppViewer::instance()->loadNameCache(); } + //gCacheName is required for nearby chat history loading + //so I just moved nearby history loading a few states further + if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory")) + { + LLNearbyChat* nearby_chat = LLNearbyChat::getInstance(); + if (nearby_chat) nearby_chat->loadHistory(); + } + // *Note: this is where gWorldMap used to be initialized. // register null callbacks for audio until the audio system is initialized @@ -1849,21 +1857,6 @@ bool idle_startup() LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender ); } - - // We now have an inventory skeleton, so if this is a user's first - // login, we can start setting up their clothing and avatar - // appearance. This helps to avoid the generic "Ruth" avatar in - // the orientation island tutorial experience. JC - if (gAgent.isFirstLogin() - && !sInitialOutfit.empty() // registration set up an outfit - && !sInitialOutfitGender.empty() // and a gender - && gAgent.getAvatarObject() // can't wear clothes without object - && !gAgent.isGenderChosen() ) // nothing already loading - { - // Start loading the wearables, textures, gestures - LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender ); - } - // wait precache-delay and for agent's avatar or a lot longer. if(((timeout_frac > 1.f) && gAgent.getAvatarObject()) || (timeout_frac > 3.f)) @@ -2002,6 +1995,9 @@ bool idle_startup() LLStartUp::setStartupState( STATE_STARTED ); + // Mark that we have successfully logged in at least once + gSavedSettings.setBOOL("HadFirstSuccessfulLogin", TRUE); + // Unmute audio if desired and setup volumes. // Unmute audio if desired and setup volumes. // This is a not-uncommon crash site, so surround it with @@ -2526,6 +2522,11 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response) void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, const std::string& gender_name ) { + // Not going through the processAgentInitialWearables path, so need to set this here. + LLAppearanceManager::instance().setAttachmentInvLinkEnable(true); + // Initiate creation of COF, since we're also bypassing that. + gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); + S32 gender = 0; std::string gestures; if (gender_name == "male") @@ -2544,7 +2545,7 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; LLNameCategoryCollector has_name(outfit_folder_name); - gInventory.collectDescendentsIf(LLUUID::null, + gInventory.collectDescendentsIf(gInventory.getLibraryRootFolderID(), cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, @@ -2555,7 +2556,10 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, } else { - LLAppearanceManager::instance().wearOutfitByName(outfit_folder_name); + LLInventoryCategory* cat = cat_array.get(0); + bool do_copy = true; + bool do_append = false; + LLAppearanceManager::instance().wearInventoryCategory(cat, do_copy, do_append); } LLAppearanceManager::instance().wearOutfitByName(gestures); LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER); diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp index ce00dec802..dcc85392f7 100644 --- a/indra/newview/llteleporthistory.cpp +++ b/indra/newview/llteleporthistory.cpp @@ -173,6 +173,8 @@ void LLTeleportHistory::purgeItems() // reset the count mRequestedItem = -1; mCurrentItem = 0; + + onHistoryChanged(); } // static diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index a436dc0546..7ae2404203 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -37,6 +37,7 @@ #include "llfloaterreg.h" #include "llgroupactions.h" #include "llgroupiconctrl.h" +#include "llimview.h" #include "llnotifications.h" #include "llinstantmessage.h" #include "lltooltip.h" @@ -52,9 +53,9 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_instant_message.xml"); - LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon"); mGroupIcon = getChild<LLGroupIconCtrl>("group_icon"); mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon"); + mAdhocIcon = getChild<LLAvatarIconCtrl>("adhoc_icon"); mAvatarName = getChild<LLTextBox>("user_name"); mTime = getChild<LLTextBox>("time_box"); mMessage = getChild<LLTextBox>("message"); @@ -90,27 +91,7 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif mAvatarID = p.avatar_id; mNotification = p.notification; - mAvatarIcon->setVisible(FALSE); - mGroupIcon->setVisible(FALSE); - sys_msg_icon->setVisible(FALSE); - - if(p.from == SYSTEM_FROM) - { - sys_msg_icon->setVisible(TRUE); - } - else - { - if(LLGroupActions::isInGroup(mSessionID)) - { - mGroupIcon->setVisible(TRUE); - mGroupIcon->setValue(p.session_id); - } - else - { - mAvatarIcon->setVisible(TRUE); - mAvatarIcon->setValue(p.avatar_id); - } - } + initIcon(); S32 maxLinesCount; std::istringstream ss( getString("message_max_lines_count") ); @@ -162,13 +143,27 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask) void LLToastIMPanel::showInspector() { - if(LLGroupActions::isInGroup(mSessionID)) + LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID); + if(!im_session) { - LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID)); + llwarns << "Invalid IM session" << llendl; + return; } - else + + switch(im_session->mSessionType) { + case LLIMModel::LLIMSession::P2P_SESSION: LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID)); + break; + case LLIMModel::LLIMSession::GROUP_SESSION: + LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID)); + break; + case LLIMModel::LLIMSession::ADHOC_SESSION: + LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", im_session->mOtherParticipantID)); + break; + default: + llwarns << "Unknown IM session type" << llendl; + break; } } @@ -217,4 +212,48 @@ void LLToastIMPanel::spawnGroupIconToolTip() LLToolTipMgr::getInstance()->show(params); } +void LLToastIMPanel::initIcon() +{ + LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon"); + + mAvatarIcon->setVisible(FALSE); + mGroupIcon->setVisible(FALSE); + sys_msg_icon->setVisible(FALSE); + mAdhocIcon->setVisible(FALSE); + + if(mAvatarName->getValue().asString() == SYSTEM_FROM) + { + sys_msg_icon->setVisible(TRUE); + } + else + { + LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID); + if(!im_session) + { + llwarns << "Invalid IM session" << llendl; + return; + } + + switch(im_session->mSessionType) + { + case LLIMModel::LLIMSession::P2P_SESSION: + mAvatarIcon->setVisible(TRUE); + mAvatarIcon->setValue(mAvatarID); + break; + case LLIMModel::LLIMSession::GROUP_SESSION: + mGroupIcon->setVisible(TRUE); + mGroupIcon->setValue(mSessionID); + break; + case LLIMModel::LLIMSession::ADHOC_SESSION: + mAdhocIcon->setVisible(TRUE); + mAdhocIcon->setValue(im_session->mOtherParticipantID); + mAdhocIcon->setToolTip(im_session->mName); + break; + default: + llwarns << "Unknown IM session type" << llendl; + break; + } + } +} + // EOF diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h index 444c0af144..cf4ad80637 100644 --- a/indra/newview/lltoastimpanel.h +++ b/indra/newview/lltoastimpanel.h @@ -66,6 +66,8 @@ private: void spawnNameToolTip(); void spawnGroupIconToolTip(); + void initIcon(); + static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT; LLNotificationPtr mNotification; @@ -73,6 +75,7 @@ private: LLUUID mAvatarID; LLAvatarIconCtrl* mAvatarIcon; LLGroupIconCtrl* mGroupIcon; + LLAvatarIconCtrl* mAdhocIcon; LLTextBox* mAvatarName; LLTextBox* mTime; LLTextBox* mMessage; diff --git a/indra/newview/lltoolplacer.h b/indra/newview/lltoolplacer.h index b7422380d4..df07f1854c 100644 --- a/indra/newview/lltoolplacer.h +++ b/indra/newview/lltoolplacer.h @@ -33,7 +33,6 @@ #ifndef LL_TOOLPLACER_H #define LL_TOOLPLACER_H -#include "llprimitive.h" #include "llpanel.h" #include "lltool.h" diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 38103f9e41..934981b0ad 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -242,10 +242,29 @@ void audio_update_wind(bool force_update) // outside the fade-in. F32 master_volume = gSavedSettings.getBOOL("MuteAudio") ? 0.f : gSavedSettings.getF32("AudioLevelMaster"); F32 ambient_volume = gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient"); + F32 max_wind_volume = master_volume * ambient_volume; - F32 wind_volume = master_volume * ambient_volume; - gAudiop->mMaxWindGain = wind_volume; - + const F32 WIND_SOUND_TRANSITION_TIME = 2.f; + // amount to change volume this frame + F32 volume_delta = (LLFrameTimer::getFrameDeltaTimeF32() / WIND_SOUND_TRANSITION_TIME) * max_wind_volume; + if (force_update) + { + // initialize wind volume (force_update) by using large volume_delta + // which is sufficient to completely turn off or turn on wind noise + volume_delta = max_wind_volume; + } + + // mute wind when not flying + if (gAgent.getFlying()) + { + // volume increases by volume_delta, up to no more than max_wind_volume + gAudiop->mMaxWindGain = llmin(gAudiop->mMaxWindGain + volume_delta, max_wind_volume); + } + else + { + // volume decreases by volume_delta, down to no less than 0 + gAudiop->mMaxWindGain = llmax(gAudiop->mMaxWindGain - volume_delta, 0.f); + } last_camera_water_height = camera_water_height; gAudiop->updateWind(gRelativeWindVec, camera_water_height); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 658d1c9ddd..29114c33c5 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -200,7 +200,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>); LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>); - LLFloaterReg::add("call_info", "floater_call_info.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallInfoDialog>); LLFloaterReg::add("parcel_info", "floater_preview_url.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterParcelInfo>); LLFloaterPayUtil::registerFloater(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index f7f30a5136..a83baf7f9a 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -603,6 +603,10 @@ class LLAdvancedToggleHUDInfo : public view_listener_t { gDisplayFOV = !(gDisplayFOV); } + else if ("badge" == info_type) + { + gDisplayBadge = !(gDisplayBadge); + } return true; } }; @@ -625,6 +629,10 @@ class LLAdvancedCheckHUDInfo : public view_listener_t { new_value = gDisplayFOV; } + else if ("badge" == info_type) + { + new_value = gDisplayBadge; + } return new_value; } }; @@ -7179,25 +7187,7 @@ void handle_buy_currency_test(void*) LLStringUtil::format_map_t replace; replace["[AGENT_ID]"] = gAgent.getID().asString(); replace["[SESSION_ID]"] = gAgent.getSecureSessionID().asString(); - - // *TODO: Replace with call to LLUI::getLanguage() after windows-setup - // branch merges in. JC - std::string language = "en"; - language = gSavedSettings.getString("Language"); - if (language.empty() || language == "default") - { - language = gSavedSettings.getString("InstallLanguage"); - } - if (language.empty() || language == "default") - { - language = gSavedSettings.getString("SystemLanguage"); - } - if (language.empty() || language == "default") - { - language = "en"; - } - - replace["[LANGUAGE]"] = language; + replace["[LANGUAGE]"] = LLUI::getLanguage(); LLStringUtil::format(url, replace); llinfos << "buy currency url " << url << llendl; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 9240833632..143d95d27e 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -860,29 +860,12 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f ++item_iter) { const LLUUID& item_id = (*item_iter); - LLInventoryItem* item = gInventory.getItem(item_id); - if(!item) + if(!highlight_offered_item(item_id)) { - LL_WARNS("Messaging") << "Unable to show inventory item: " << item_id << LL_ENDL; continue; } - //////////////////////////////////////////////////////////////////////////////// - // Don't highlight if it's in certain "quiet" folders which don't need UI - // notification (e.g. trash, cof, lost-and-found). - const BOOL user_is_away = gAwayTimer.getStarted(); - if(!user_is_away) - { - const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(item_id); - if (parent) - { - const LLFolderType::EType parent_type = parent->getPreferredType(); - if (LLViewerFolderType::lookupIsQuietType(parent_type)) - { - continue; - } - } - } + LLInventoryItem* item = gInventory.getItem(item_id); //////////////////////////////////////////////////////////////////////////////// // Special handling for various types. @@ -929,10 +912,11 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f LLPanelPlaces *places_panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->getPanel("panel_places")); if (places_panel) { - // we are creating a landmark + // Landmark creation handling is moved to LLPanelPlaces::showAddedLandmarkInfo() + // TODO* LLPanelPlaces dependency is going to be removed. See EXT-4347. if("create_landmark" == places_panel->getPlaceInfoType() && !places_panel->getItem()) { - places_panel->setItem(item); + //places_panel->setItem(item); } // we are opening a group notice attachment else @@ -982,6 +966,34 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f } } +bool highlight_offered_item(const LLUUID& item_id) +{ + LLInventoryItem* item = gInventory.getItem(item_id); + if(!item) + { + LL_WARNS("Messaging") << "Unable to show inventory item: " << item_id << LL_ENDL; + return false; + } + + //////////////////////////////////////////////////////////////////////////////// + // Don't highlight if it's in certain "quiet" folders which don't need UI + // notification (e.g. trash, cof, lost-and-found). + if(!gAgent.getAFK()) + { + const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(item_id); + if (parent) + { + const LLFolderType::EType parent_type = parent->getPreferredType(); + if (LLViewerFolderType::lookupIsQuietType(parent_type)) + { + return false; + } + } + } + + return true; +} + void inventory_offer_mute_callback(const LLUUID& blocked_id, const std::string& first_name, const std::string& last_name, @@ -1466,6 +1478,11 @@ void inventory_offer_handler(LLOfferInfo* info) // Strip any SLURL from the message display. (DEV-2754) std::string msg = info->mDesc; int indx = msg.find(" ( http://slurl.com/secondlife/"); + if(indx == std::string::npos) + { + // try to find new slurl host + indx = msg.find(" ( http://maps.secondlife.com/secondlife/"); + } if(indx >= 0) { LLStringUtil::truncate(msg, indx); @@ -2169,6 +2186,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) chat.mFromID = from_id ^ gAgent.getSessionID(); } + if(SYSTEM_FROM == name) + { + // System's UUID is NULL (fixes EXT-4766) + chat.mFromID = from_id = LLUUID::null; + } + LLSD query_string; query_string["owner"] = from_id; query_string["slurl"] = location; @@ -2190,7 +2213,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); if(nearby_chat) { - nearby_chat->addMessage(chat); + LLSD args; + args["owner_id"] = from_id; + args["slurl"] = location; + nearby_chat->addMessage(chat, true, args); } diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index 1415c16090..7dd629dcfd 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -203,6 +203,11 @@ void process_initiate_download(LLMessageSystem* msg, void**); void start_new_inventory_observer(); void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name); +// Returns true if item is not in certain "quiet" folder which don't need UI +// notification (e.g. trash, cof, lost-and-found) and agent is not AFK, false otherwise. +// Returns false if item is not found. +bool highlight_offered_item(const LLUUID& item_id); + struct LLOfferInfo { LLOfferInfo() diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 7ec650629d..a075a706e1 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1597,14 +1597,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use instance->mTeleportInProgress = FALSE; instance->mTeleportFinishedSignal(gAgent.getPositionGlobal()); } - - // HACK: This makes agents drop from the sky if they enter a parcel - // which is set to no fly. - BOOL was_flying = gAgent.getFlying(); - if (was_flying && !parcel->getAllowFly()) - { - gAgent.setFlying(gAgent.canFly()); - } } } diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 2e92512b31..ea8af223c3 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -246,7 +246,7 @@ public: return FALSE; } - /*virtual*/ const LLStyleSP getStyle() const { return mStyle; } + /*virtual*/ LLStyleConstSP getStyle() const { return mStyle; } private: LLUIImagePtr mImage; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index cd6b9e2c50..315b7c52cf 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -51,6 +51,7 @@ #include "llviewquery.h" #include "llxmltree.h" +#include "llslurl.h" //#include "llviewercamera.h" #include "llrender.h" @@ -80,6 +81,9 @@ #include "timing.h" #include "llviewermenu.h" #include "lltooltip.h" +#include "llmediaentry.h" +#include "llurldispatcher.h" +#include "llurlsimstring.h" // newview includes #include "llagent.h" @@ -229,6 +233,7 @@ S32 gDebugRaycastFaceHit; BOOL gDisplayWindInfo = FALSE; BOOL gDisplayCameraPos = FALSE; BOOL gDisplayFOV = FALSE; +BOOL gDisplayBadge = FALSE; S32 CHAT_BAR_HEIGHT = 28; S32 OVERLAY_BAR_HEIGHT = 20; @@ -418,6 +423,11 @@ public: addText(xpos, ypos, llformat("FOV: %2.1f deg", RAD_TO_DEG * LLViewerCamera::getInstance()->getView())); ypos += y_inc; } + if (gDisplayBadge) + { + addText(xpos, ypos+(y_inc/2), llformat("Hippos!", RAD_TO_DEG * LLViewerCamera::getInstance()->getView())); + ypos += y_inc * 2; + } /*if (LLViewerJoystick::getInstance()->getOverrideCamera()) { @@ -795,6 +805,137 @@ BOOL LLViewerWindow::handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MAS // Always handled as far as the OS is concerned. return TRUE; } + +LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *window, LLCoordGL pos, MASK mask, LLWindowCallbacks::DragNDropAction action, std::string data) +{ + LLWindowCallbacks::DragNDropResult result = LLWindowCallbacks::DND_NONE; + + const bool prim_media_dnd_enabled = gSavedSettings.getBOOL("PrimMediaDragNDrop"); + const bool slurl_dnd_enabled = gSavedSettings.getBOOL("SLURLDragNDrop"); + + if ( prim_media_dnd_enabled || slurl_dnd_enabled ) + { + switch(action) + { + // Much of the handling for these two cases is the same. + case LLWindowCallbacks::DNDA_TRACK: + case LLWindowCallbacks::DNDA_DROPPED: + case LLWindowCallbacks::DNDA_START_TRACKING: + { + bool drop = (LLWindowCallbacks::DNDA_DROPPED == action); + + if (slurl_dnd_enabled) + { + // special case SLURLs + if ( LLSLURL::isSLURL( data ) ) + { + if (drop) + { + LLURLDispatcher::dispatch( data, NULL, true ); + LLURLSimString::setStringRaw( LLSLURL::stripProtocol( data ) ); + LLPanelLogin::refreshLocation( true ); + LLPanelLogin::updateLocationUI(); + } + return LLWindowCallbacks::DND_MOVE; + }; + } + + if (prim_media_dnd_enabled) + { + LLPickInfo pick_info = pickImmediate( pos.mX, pos.mY, TRUE /*BOOL pick_transparent*/ ); + + LLUUID object_id = pick_info.getObjectID(); + S32 object_face = pick_info.mObjectFace; + std::string url = data; + + lldebugs << "Object: picked at " << pos.mX << ", " << pos.mY << " - face = " << object_face << " - URL = " << url << llendl; + + LLVOVolume *obj = dynamic_cast<LLVOVolume*>(static_cast<LLViewerObject*>(pick_info.getObject())); + + if (obj && obj->permModify() && !obj->getRegion()->getCapability("ObjectMedia").empty()) + { + LLTextureEntry *te = obj->getTE(object_face); + if (te) + { + if (drop) + { + if (! te->hasMedia()) + { + // Create new media entry + LLSD media_data; + // XXX Should we really do Home URL too? + media_data[LLMediaEntry::HOME_URL_KEY] = url; + media_data[LLMediaEntry::CURRENT_URL_KEY] = url; + media_data[LLMediaEntry::AUTO_PLAY_KEY] = true; + obj->syncMediaData(object_face, media_data, true, true); + // XXX This shouldn't be necessary, should it ?!? + if (obj->getMediaImpl(object_face)) + obj->getMediaImpl(object_face)->navigateReload(); + obj->sendMediaDataUpdate(); + + result = LLWindowCallbacks::DND_COPY; + } + else { + // Check the whitelist + if (te->getMediaData()->checkCandidateUrl(url)) + { + // just navigate to the URL + if (obj->getMediaImpl(object_face)) + { + obj->getMediaImpl(object_face)->navigateTo(url); + } + else { + // This is very strange. Navigation should + // happen via the Impl, but we don't have one. + // This sends it to the server, which /should/ + // trigger us getting it. Hopefully. + LLSD media_data; + media_data[LLMediaEntry::CURRENT_URL_KEY] = url; + obj->syncMediaData(object_face, media_data, true, true); + obj->sendMediaDataUpdate(); + } + result = LLWindowCallbacks::DND_LINK; + } + } + LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject); + mDragHoveredObject = NULL; + + } + else { + // Check the whitelist, if there's media (otherwise just show it) + if (te->getMediaData() == NULL || te->getMediaData()->checkCandidateUrl(url)) + { + if ( obj != mDragHoveredObject) + { + // Highlight the dragged object + LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject); + mDragHoveredObject = obj; + LLSelectMgr::getInstance()->highlightObjectOnly(mDragHoveredObject); + } + result = (! te->hasMedia()) ? LLWindowCallbacks::DND_COPY : LLWindowCallbacks::DND_LINK; + } + } + } + } + } + } + break; + + case LLWindowCallbacks::DNDA_STOP_TRACKING: + // The cleanup case below will make sure things are unhilighted if necessary. + break; + } + + if (prim_media_dnd_enabled && + result == LLWindowCallbacks::DND_NONE && !mDragHoveredObject.isNull()) + { + LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject); + mDragHoveredObject = NULL; + } + } + + return result; +} BOOL LLViewerWindow::handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask) { diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index c0a9180b53..bfce65f2ba 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -166,7 +166,8 @@ public: /*virtual*/ BOOL handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask); /*virtual*/ BOOL handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask); /*virtual*/ BOOL handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask); - /*virtual*/ void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask); + /*virtual*/ LLWindowCallbacks::DragNDropResult handleDragNDrop(LLWindow *window, LLCoordGL pos, MASK mask, LLWindowCallbacks::DragNDropAction action, std::string data); + void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask); /*virtual*/ void handleMouseLeave(LLWindow *window); /*virtual*/ void handleResize(LLWindow *window, S32 x, S32 y); /*virtual*/ void handleFocus(LLWindow *window); @@ -472,6 +473,10 @@ protected: static std::string sSnapshotDir; static std::string sMovieBaseName; + +private: + // Object temporarily hovered over while dragging + LLPointer<LLViewerObject> mDragHoveredObject; }; void toggle_flying(void*); @@ -501,5 +506,6 @@ extern S32 CHAT_BAR_HEIGHT; extern BOOL gDisplayCameraPos; extern BOOL gDisplayWindInfo; extern BOOL gDisplayFOV; +extern BOOL gDisplayBadge; #endif diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 9d49fb69d6..bb09a18cc3 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -389,13 +389,16 @@ void LLVoiceChannel::setState(EState state) switch(state) { case STATE_RINGING: - LLCallInfoDialog::show("ringing", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("ringing", mNotifyArgs); break; case STATE_CONNECTED: - LLCallInfoDialog::show("connected", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("connected", mNotifyArgs); break; case STATE_HUNG_UP: - LLCallInfoDialog::show("hang_up", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("hang_up", mNotifyArgs); break; default: break; @@ -635,7 +638,8 @@ void LLVoiceChannelGroup::setState(EState state) case STATE_RINGING: if ( !mIsRetrying ) { - LLCallInfoDialog::show("ringing", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("ringing", mNotifyArgs); } doSetState(state); @@ -701,7 +705,8 @@ void LLVoiceChannelProximal::handleStatusChange(EStatusType status) //skip showing "Voice not available at your current location" when agent voice is disabled (EXT-4749) if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()) { - LLCallInfoDialog::show("unavailable", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("unavailable", mNotifyArgs); } return; default: @@ -901,7 +906,8 @@ void LLVoiceChannelP2P::setState(EState state) // so provide a special purpose message here if (mReceivedCall && state == STATE_RINGING) { - LLCallInfoDialog::show("answering", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("answering", mNotifyArgs); doSetState(state); return; } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index c062dd1732..f3bfc2e86c 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -1107,16 +1107,17 @@ public: * Sets internal voluem level for specified user. * * @param[in] speaker_id - LLUUID of user to store volume level for - * @param[in] volume - internal volume level to be stored for user. + * @param[in] volume - external (vivox) volume level to be stored for user. */ - void storeSpeakerVolume(const LLUUID& speaker_id, S32 volume); + void storeSpeakerVolume(const LLUUID& speaker_id, F32 volume); /** - * Gets stored internal volume level for specified speaker. + * Gets stored external (vivox) volume level for specified speaker and + * transforms it into internal (viewer) level. * * If specified user is not found default level will be returned. It is equivalent of * external level 0.5 from the 0.0..1.0 range. - * Default internal level is calculated as: internal = 400 * external^2 + * Internal level is calculated as: internal = 400 * external^2 * Maps 0.0 to 1.0 to internal values 0-400 with default 0.5 == 100 * * @param[in] speaker_id - LLUUID of user to get his volume level @@ -1133,7 +1134,7 @@ private: void load(); void save(); - typedef std::map<LLUUID, S32> speaker_data_map_t; + typedef std::map<LLUUID, F32> speaker_data_map_t; speaker_data_map_t mSpeakersData; }; @@ -1149,7 +1150,7 @@ LLSpeakerVolumeStorage::~LLSpeakerVolumeStorage() save(); } -void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, S32 volume) +void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, F32 volume) { mSpeakersData[speaker_id] = volume; } @@ -1163,7 +1164,10 @@ S32 LLSpeakerVolumeStorage::getSpeakerVolume(const LLUUID& speaker_id) if (it != mSpeakersData.end()) { - ret_val = it->second; + F32 f_val = it->second; + // volume can amplify by as much as 4x! + S32 ivol = (S32)(400.f * f_val * f_val); + ret_val = llclamp(ivol, 0, 400); } return ret_val; } @@ -1184,7 +1188,7 @@ void LLSpeakerVolumeStorage::load() for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); iter != settings_llsd.endMap(); ++iter) { - mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger())); + mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (F32)iter->second.asReal())); } } @@ -1258,7 +1262,6 @@ LLVoiceClient::LLVoiceClient() : mEarLocation(0), mSpeakerVolumeDirty(true), mSpeakerMuteDirty(true), - mSpeakerVolume(0), mMicVolume(0), mMicVolumeDirty(true), @@ -1271,6 +1274,8 @@ LLVoiceClient::LLVoiceClient() : mAPIVersion = LLTrans::getString("NotConnected"); + mSpeakerVolume = scale_speaker_volume(0); + #if LL_DARWIN || LL_LINUX || LL_SOLARIS // HACK: THIS DOES NOT BELONG HERE // When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us. @@ -3525,7 +3530,7 @@ void LLVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream) if(mSpeakerMuteDirty) { - const char *muteval = ((mSpeakerVolume == 0)?"true":"false"); + const char *muteval = ((mSpeakerVolume <= scale_speaker_volume(0))?"true":"false"); mSpeakerMuteDirty = false; @@ -5979,9 +5984,11 @@ bool LLVoiceClient::voiceEnabled() return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice"); } +//AD *TODO: investigate possible merge of voiceWorking() and voiceEnabled() into one non-static method bool LLVoiceClient::voiceWorking() { - return (stateLoggedIn <= mState) && (mState <= stateLeavingSession); + //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758) + return (stateLoggedIn <= mState) && (mState <= stateSessionTerminated); } void LLVoiceClient::setLipSyncEnabled(BOOL enabled) @@ -6062,7 +6069,8 @@ void LLVoiceClient::setVoiceVolume(F32 volume) if(scaled_volume != mSpeakerVolume) { - if((scaled_volume == 0) || (mSpeakerVolume == 0)) + int min_volume = scale_speaker_volume(0); + if((scaled_volume == min_volume) || (mSpeakerVolume == min_volume)) { mSpeakerMuteDirty = true; } @@ -6284,14 +6292,14 @@ void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume) participantState *participant = findParticipantByID(id); if (participant) { + // store this volume setting for future sessions + LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, volume); + // volume can amplify by as much as 4x! S32 ivol = (S32)(400.f * volume * volume); participant->mUserVolume = llclamp(ivol, 0, 400); participant->mVolumeDirty = TRUE; mAudioSession->mVolumeDirty = TRUE; - - // store this volume setting for future sessions - LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, participant->mUserVolume); } } } diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 8f668dff19..a96cf18e27 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -192,6 +192,7 @@ static void updatePosition(void); void setVoiceEnabled(bool enabled); static bool voiceEnabled(); // Checks is voice working judging from mState + // Returns true if vivox has successfully logged in and is not in error state bool voiceWorking(); void setUsePTT(bool usePTT); void setPTTIsToggle(bool PTTIsToggle); diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 7866f735c5..100ec0bb69 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -145,11 +145,20 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url, substitution["VERSION_PATCH"] = LLVersionInfo::getPatch(); substitution["VERSION_BUILD"] = LLVersionInfo::getBuild(); substitution["CHANNEL"] = LLVersionInfo::getChannel(); - substitution["LANGUAGE"] = LLUI::getLanguage(); substitution["GRID"] = LLViewerLogin::getInstance()->getGridLabel(); substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); substitution["SESSION_ID"] = gAgent.getSessionID(); + // work out the current language + std::string lang = LLUI::getLanguage(); + if (lang == "en-us") + { + // *HACK: the correct fix is to change English.lproj/language.txt, + // but we're late in the release cycle and this is a less risky fix + lang = "en"; + } + substitution["LANGUAGE"] = lang; + // find the region ID LLUUID region_id; LLViewerRegion *region = gAgent.getRegion(); @@ -159,14 +168,14 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url, } substitution["REGION_ID"] = region_id; - // find the parcel ID - LLUUID parcel_id; + // find the parcel local ID + S32 parcel_id = 0; LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); if (parcel) { - parcel_id = parcel->getID(); + parcel_id = parcel->getLocalID(); } - substitution["PARCEL_ID"] = parcel_id; + substitution["PARCEL_ID"] = llformat("%d", parcel_id); // expand all of the substitution strings and escape the url std::string expanded_url = url; diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 219b3dbeb6..ca579616d8 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -47,7 +47,7 @@ <color name="Black" value="0 0 0 1" /> - <color + <colork name="Black_10" value="0 0 0 0.1" /> <color @@ -77,6 +77,16 @@ <color name="Purple" value="1 0 1 1" /> + <color + name="Lime" + value=".8 1 .73 1" /> + <color + name="LtYellow" + value="1 1 .79 1" /> + <color + name="LtOrange" + value="1 .85 .73 1" /> + <!-- This color name makes potentially unused colors show up bright purple. Leave this here until all Unused? are removed below, otherwise the viewer generates many warnings on startup. --> @@ -97,7 +107,7 @@ value="1 0.82 0.46 1" /> <color name="AlertCautionTextColor" - reference="Yellow" /> + reference="LtYellow" /> <color name="AgentLinkColor" reference="White" /> @@ -226,10 +236,10 @@ reference="White" /> <color name="ColorPaletteEntry16" - reference="White" /> + reference="LtYellow" /> <color name="ColorPaletteEntry17" - reference="White" /> + reference="LtGreen" /> <color name="ColorPaletteEntry18" reference="LtGray" /> @@ -280,7 +290,7 @@ reference="Black" /> <color name="ContextSilhouetteColor" - value="0.94 0.61 0 1" /> + reference="EmphasisColor" /> <color name="DefaultHighlightDark" reference="White_10" /> @@ -544,7 +554,7 @@ reference="White" /> <color name="ObjectChatColor" - reference="EmphasisColor" /> + reference="EmphasisColor_35" /> <color name="OverdrivenColor" reference="Red" /> @@ -592,7 +602,7 @@ value="0.39 0.39 0.39 1" /> <color name="ScriptErrorColor" - value="0.82 0.27 0.27 1" /> + reference="Red" /> <color name="ScrollBGStripeColor" reference="Transparent" /> @@ -649,7 +659,7 @@ reference="FrogGreen" /> <color name="SystemChatColor" - reference="White" /> + reference="LtGray" /> <color name="TextBgFocusColor" reference="White" /> @@ -703,7 +713,7 @@ reference="White" /> <color name="llOwnerSayChatColor" - reference="LtGray" /> + reference="LtYellow" /> <!-- New Colors --> <color diff --git a/indra/newview/skins/default/textures/bottomtray/Move_Fly_Off.png b/indra/newview/skins/default/textures/bottomtray/Move_Fly_Off.png Binary files differindex 28ff6ba976..9e7291d6fb 100644 --- a/indra/newview/skins/default/textures/bottomtray/Move_Fly_Off.png +++ b/indra/newview/skins/default/textures/bottomtray/Move_Fly_Off.png diff --git a/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png b/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png Binary files differindex 6343ddf035..e8fe243dc7 100644 --- a/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png +++ b/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png diff --git a/indra/newview/skins/default/textures/build/Object_Cone_Selected.png b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png Binary files differnew file mode 100644 index 0000000000..d50dc69ffe --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Cube_Selected.png b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png Binary files differnew file mode 100644 index 0000000000..3d6964530d --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png Binary files differnew file mode 100644 index 0000000000..3ed0389961 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Grass_Selected.png b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png Binary files differnew file mode 100644 index 0000000000..3ebd5ea7a1 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png Binary files differnew file mode 100644 index 0000000000..3bdc4d1fd5 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png Binary files differnew file mode 100644 index 0000000000..0912442e29 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png Binary files differnew file mode 100644 index 0000000000..33db4a2de8 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Prism_Selected.png b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png Binary files differnew file mode 100644 index 0000000000..9e80fe2b84 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png Binary files differnew file mode 100644 index 0000000000..d36bfa55d4 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Ring_Selected.png b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png Binary files differnew file mode 100644 index 0000000000..962f6efb93 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png Binary files differnew file mode 100644 index 0000000000..715d597144 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png Binary files differnew file mode 100644 index 0000000000..b2ea680f23 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Torus_Selected.png b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png Binary files differnew file mode 100644 index 0000000000..1fc22686eb --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Tree_Selected.png b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png Binary files differnew file mode 100644 index 0000000000..5bd87f8a2f --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Tube_Selected.png b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png Binary files differnew file mode 100644 index 0000000000..a4c3f39e14 --- /dev/null +++ b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png diff --git a/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png Binary files differindex 0455a52fdc..e0b18b2451 100644 --- a/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png +++ b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Dark.png diff --git a/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png Binary files differindex be0c379d84..101aaa42b1 100644 --- a/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png +++ b/indra/newview/skins/default/textures/icons/Parcel_FlyNo_Light.png diff --git a/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png Binary files differindex ed4a512e04..c27f18e3c7 100644 --- a/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png +++ b/indra/newview/skins/default/textures/icons/Parcel_Fly_Dark.png diff --git a/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png Binary files differindex 2f5871b8ff..60e6a00a25 100644 --- a/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png +++ b/indra/newview/skins/default/textures/icons/Parcel_M_Dark.png diff --git a/indra/newview/skins/default/textures/icons/Parcel_M_Light.png b/indra/newview/skins/default/textures/icons/Parcel_M_Light.png Binary files differindex 724ac22744..55f97f3b4e 100644 --- a/indra/newview/skins/default/textures/icons/Parcel_M_Light.png +++ b/indra/newview/skins/default/textures/icons/Parcel_M_Light.png diff --git a/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png Binary files differindex f0565f02dd..11ab1f1e60 100644 --- a/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png +++ b/indra/newview/skins/default/textures/icons/Parcel_PG_Dark.png diff --git a/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png b/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png Binary files differindex f32b0570a1..b536762ddc 100644 --- a/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png +++ b/indra/newview/skins/default/textures/icons/Parcel_PG_Light.png diff --git a/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png Binary files differindex e0e6e14cca..bf618752f6 100644 --- a/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png +++ b/indra/newview/skins/default/textures/icons/Parcel_R_Dark.png diff --git a/indra/newview/skins/default/textures/icons/Parcel_R_Light.png b/indra/newview/skins/default/textures/icons/Parcel_R_Light.png Binary files differindex efca6776da..a67bbd0cc5 100644 --- a/indra/newview/skins/default/textures/icons/Parcel_R_Light.png +++ b/indra/newview/skins/default/textures/icons/Parcel_R_Light.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 60c1470b89..ccf49f6a9f 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -321,20 +321,35 @@ with the same filename but different name <texture name="NoEntryPassLines" file_name="world/NoEntryPassLines.png" use_mips="true" preload="false" /> <texture name="Object_Cone" file_name="build/Object_Cone.png" preload="false" /> + <texture name="Object_Cone_Selected" file_name="build/Object_Cone_Selected.png" preload="false" /> <texture name="Object_Cube" file_name="build/Object_Cube.png" preload="false" /> + <texture name="Object_Cube_Selected" file_name="build/Object_Cube_Selected.png" preload="false" /> <texture name="Object_Cylinder" file_name="build/Object_Cylinder.png" preload="false" /> + <texture name="Object_Cylinder_Selected" file_name="build/Object_Cylinder_Selected.png" preload="false" /> <texture name="Object_Grass" file_name="build/Object_Grass.png" preload="false" /> + <texture name="Object_Grass_Selected" file_name="build/Object_Grass_Selected.png" preload="false" /> <texture name="Object_Hemi_Cone" file_name="build/Object_Hemi_Cone.png" preload="false" /> + <texture name="Object_Hemi_Cone_Selected" file_name="build/Object_Hemi_Cone_Selected.png" preload="false" /> <texture name="Object_Hemi_Cylinder" file_name="build/Object_Hemi_Cylinder.png" preload="false" /> + <texture name="Object_Hemi_Cylinder_Selected" file_name="build/Object_Hemi_Cylinder_Selected.png" preload="false" /> <texture name="Object_Hemi_Sphere" file_name="build/Object_Hemi_Sphere.png" preload="false" /> + <texture name="Object_Hemi_Sphere_Selected" file_name="build/Object_Hemi_Sphere_Selected.png" preload="false" /> <texture name="Object_Prism" file_name="build/Object_Prism.png" preload="false" /> + <texture name="Object_Prism_Selected" file_name="build/Object_Prism_Selected.png" preload="false" /> <texture name="Object_Pyramid" file_name="build/Object_Pyramid.png" preload="false" /> + <texture name="Object_Pyramid_Selected" file_name="build/Object_Pyramid_Selected.png" preload="false" /> <texture name="Object_Ring" file_name="build/Object_Ring.png" preload="false" /> + <texture name="Object_Ring_Selected" file_name="build/Object_Ring_Selected.png" preload="false" /> <texture name="Object_Sphere" file_name="build/Object_Sphere.png" preload="false" /> + <texture name="Object_Sphere_Selected" file_name="build/Object_Sphere_Selected.png" preload="false" /> <texture name="Object_Tetrahedron" file_name="build/Object_Tetrahedron.png" preload="false" /> + <texture name="Object_Tetrahedron_Selected" file_name="build/Object_Tetrahedron_Selected.png" preload="false" /> <texture name="Object_Torus" file_name="build/Object_Torus.png" preload="false" /> + <texture name="Object_Torus_Selected" file_name="build/Object_Torus_Selected.png" preload="false" /> <texture name="Object_Tree" file_name="build/Object_Tree.png" preload="false" /> + <texture name="Object_Tree_Selected" file_name="build/Object_Tree_Selected.png" preload="false" /> <texture name="Object_Tube" file_name="build/Object_Tube.png" preload="false" /> + <texture name="Object_Tube_Selected" file_name="build/Object_Tube_Selected.png" preload="false" /> <texture name="OptionsMenu_Disabled" file_name="icons/OptionsMenu_Disabled.png" preload="false" /> <texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" /> @@ -353,7 +368,7 @@ with the same filename but different name <texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" /> <texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" /> - <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" /> + <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" /> <texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" /> <texture name="Parcel_Evry_Dark" file_name="icons/Parcel_Evry_Dark.png" preload="false" /> <texture name="Parcel_Exp_Dark" file_name="icons/Parcel_Exp_Dark.png" preload="false" /> @@ -361,6 +376,7 @@ with the same filename but different name <texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" /> <texture name="Parcel_ForSale_Dark" file_name="icons/Parcel_ForSale_Dark.png" preload="false" /> <texture name="Parcel_ForSaleNo_Dark" file_name="icons/Parcel_ForSaleNo_Dark.png" preload="false" /> + <texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" /> <texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" /> <texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" /> <texture name="Parcel_Push_Dark" file_name="icons/Parcel_Push_Dark.png" preload="false" /> @@ -585,10 +601,15 @@ with the same filename but different name scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" /> <texture name="Tool_Create" file_name="build/Tool_Create.png" preload="false" /> + <texture name="Tool_Create_Selected" file_name="build/Tool_Create_Selected.png" preload="false" /> <texture name="Tool_Dozer" file_name="build/Tool_Dozer.png" preload="false" /> + <texture name="Tool_Dozer_Selected" file_name="build/Tool_Dozer_Selected.png" preload="false" /> <texture name="Tool_Face" file_name="build/Tool_Face.png" preload="false" /> + <texture name="Tool_Face_Selected" file_name="build/Tool_Face_Selected.png" preload="false" /> <texture name="Tool_Grab" file_name="build/Tool_Grab.png" preload="false" /> + <texture name="Tool_Grab_Selected" file_name="build/Tool_Grab_Selected.png" preload="false" /> <texture name="Tool_Zoom" file_name="build/Tool_Zoom.png" preload="false" /> + <texture name="Tool_Zoom_Selected" file_name="build/Tool_Zoom_Selected.png" preload="false" /> <texture name="Toolbar_Divider" file_name="containers/Toolbar_Divider.png" preload="false" /> <texture name="Toolbar_Left_Off" file_name="containers/Toolbar_Left_Off.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" /> diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index 7236351f2e..b9bc45a10b 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -19,7 +19,7 @@ width="320"> <string name="nudge_parabuild" translate="false">Nudge 1</string> <string name="test_the_vlt">This string CHANGE2 is extracted.</string> - <string name="testing_eli">Just a test. change here. more change.</string> + <string name="testing_eli">Just a test. changes.</string> <chat_history allow_html="true" bg_readonly_color="ChatHistoryBgColor" diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml index 4f4288b654..1ffedde29b 100644 --- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml @@ -147,7 +147,11 @@ Maximum animation length is [MAX_LENGTH] seconds. name="E_ST_NO_XLT_EMOTE"> Cannot read emote name. </floater.string> - <text + <floater.string + name="E_ST_BAD_ROOT"> + Incorrect root joint name, use "hip". + </floater.string> + <text type="string" length="1" bottom="42" diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml index 703a02d995..961bd6b5e4 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml @@ -178,8 +178,8 @@ follows="top|left" height="16" halign="right" - left="150" - width="170" + left="140" + width="180" layout="topleft" name="buy_action"> [NAME] L$ [PRICE] diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml index 0daef29bc5..2fa112af8c 100644 --- a/indra/newview/skins/default/xui/en/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml @@ -13,20 +13,19 @@ type="string" length="1" follows="left|top" - font="SansSerif" - height="10" + height="20" layout="topleft" - left="12" + left="10" mouse_opaque="false" name="r_val_text" - top="35" + top="25" width="413"> Red: </text> <spinner decimal_digits="0" follows="left" - height="16" + height="20" increment="1" initial_value="128" layout="topleft" @@ -39,20 +38,18 @@ type="string" length="1" follows="left|top" - font="SansSerif" - height="10" + height="20" layout="topleft" - left="12" + left="10" mouse_opaque="false" name="g_val_text" - top="56" width="413"> Green: </text> <spinner decimal_digits="0" follows="left" - height="16" + height="20" increment="1" initial_value="128" layout="topleft" @@ -65,20 +62,18 @@ type="string" length="1" follows="left|top" - font="SansSerif" - height="10" + height="20" layout="topleft" - left="12" + left="10" mouse_opaque="false" name="b_val_text" - top="77" width="413"> Blue: </text> <spinner decimal_digits="0" follows="left" - height="16" + height="20" increment="1" initial_value="128" layout="topleft" @@ -91,20 +86,18 @@ type="string" length="1" follows="left|top" - font="SansSerif" - height="10" + height="20" layout="topleft" - left="12" + left="10" mouse_opaque="false" name="h_val_text" - top="108" width="413"> Hue: </text> <spinner decimal_digits="0" follows="left" - height="16" + height="20" increment="1" initial_value="180" layout="topleft" @@ -117,20 +110,18 @@ type="string" length="1" follows="left|top" - font="SansSerif" - height="10" + height="20" layout="topleft" - left="12" + left="10" mouse_opaque="false" name="s_val_text" - top="129" width="413"> Sat: </text> <spinner decimal_digits="0" follows="left" - height="16" + height="20" increment="1" initial_value="50" layout="topleft" @@ -143,20 +134,18 @@ type="string" length="1" follows="left|top" - font="SansSerif" - height="10" + height="20" layout="topleft" - left="12" + left="10" mouse_opaque="false" name="l_val_text" - top="150" width="413"> Lum: </text> <spinner decimal_digits="0" follows="left" - height="16" + height="20" increment="1" initial_value="50" layout="topleft" @@ -170,11 +159,11 @@ height="20" label="Apply now" layout="topleft" - left="12" + left="10" name="apply_immediate" top_pad="185" width="100" /> - <button + <button follows="left|bottom" height="28" image_selected="eye_button_active.tga" @@ -185,7 +174,7 @@ width="28" /> <button follows="right|bottom" - height="20" + height="23" label="OK" label_selected="OK" layout="topleft" @@ -195,7 +184,7 @@ width="100" /> <button follows="right|bottom" - height="20" + height="23" label="Cancel" label_selected="Cancel" layout="topleft" @@ -209,7 +198,7 @@ follows="left|top" height="16" layout="topleft" - left="12" + left="10" name="Current color:" top="172" width="110"> @@ -221,7 +210,7 @@ follows="left|top" height="16" layout="topleft" - left="12" + left="10" name="(Drag below to save.)" top_pad="66" width="130"> diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 9aaa660574..d2e5473157 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -12,7 +12,7 @@ can_minimize="true" can_close="true" visible="false" - width="440" + width="360" can_resize="true" min_width="250" min_height="190"> @@ -20,7 +20,7 @@ animate="false" follows="all" height="320" - width="440" + width="360" layout="topleft" orientation="horizontal" name="im_panels" @@ -38,7 +38,7 @@ left="0" top="0" height="200" - width="325" + width="245" user_resize="true"> <button height="20" @@ -65,7 +65,7 @@ parse_highlights="true" allow_html="true" left="1" - width="320"> + width="240"> </chat_history> <line_editor bottom="0" @@ -75,7 +75,7 @@ label="To" layout="bottomleft" name="chat_editor" - width="320"> + width="240"> </line_editor> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index ff9f0daee6..e187eabd3a 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -12,11 +12,11 @@ save_rect="true" save_visibility="true" single_instance="false" - title="INVENTORY" + title="MY INVENTORY" width="467"> <floater.string name="Title"> - Inventory + MY INVENTORY </floater.string> <floater.string name="TitleFetching"> diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml index e94717fe32..990be55847 100644 --- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml @@ -5,7 +5,7 @@ border_style="line" can_resize="true" follows="left|top" - height="570" + height="580" layout="topleft" min_height="271" min_width="290" @@ -13,7 +13,7 @@ help_topic="script_ed_float" save_rect="true" title="SCRIPT: NEW SCRIPT" - width="500"> + width="508"> <floater.string name="not_allowed"> You can not view or edit this script, since it has been set as "no copy". You need full permissions to view or edit a script inside an object. @@ -24,19 +24,31 @@ </floater.string> <floater.string name="Title"> - Script: [NAME] + SCRIPT: [NAME] </floater.string> + <panel + bevel_style="none" + + border_style="line" + follows="left|top|right|bottom" + height="522" + layout="topleft" + left="10" + name="script ed panel" + top="20" + width="497" /> <button - follows="right|bottom" - height="20" + follows="left|bottom" + height="23" label="Reset" label_selected="Reset" layout="topleft" - left="358" name="Reset" - top="545" - width="128" /> + left="10" + width="61" /> <check_box + left_delta="71" + top_delta="3" enabled="false" follows="left|bottom" font="SansSerif" @@ -44,30 +56,17 @@ initial_value="true" label="Running" layout="topleft" - left_delta="-350" name="running" - top_delta="2" width="100" /> <check_box - enabled="false" + left_delta="75" + enabled="true" follows="left|bottom" font="SansSerif" height="18" initial_value="true" label="Mono" layout="topleft" - left_delta="70" name="mono" - top_delta="0" width="100" /> - <panel - bevel_style="none" - border_style="line" - follows="left|top|right|bottom" - height="506" - layout="topleft" - left="1" - name="script ed panel" - top="18" - width="497" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_pay_object.xml b/indra/newview/skins/default/xui/en/floater_pay_object.xml index 455018f467..d09a0a0535 100644 --- a/indra/newview/skins/default/xui/en/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/en/floater_pay_object.xml @@ -36,7 +36,7 @@ top_delta="3" name="payee_name" width="184"> - Ericacita Moostopolison + [FIRST] [LAST] </text> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 15655a920e..05deca705a 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -56,7 +56,7 @@ help_topic="preferences_general_tab" name="general" /> <panel - class="panel_preference" + class="panel_preference_graphics" filename="panel_preferences_graphics1.xml" label="Graphics" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_preview_animation.xml b/indra/newview/skins/default/xui/en/floater_preview_animation.xml index bbfb362337..6dc073728b 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_animation.xml @@ -38,7 +38,7 @@ width="170" /> <button height="20" - label="Play in World" + label="Play Inworld" label_selected="Stop" layout="topleft" left="10" diff --git a/indra/newview/skins/default/xui/en/floater_preview_sound.xml b/indra/newview/skins/default/xui/en/floater_preview_sound.xml index 68a78d5017..f3be8c4131 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_sound.xml @@ -38,8 +38,8 @@ <button follows="left|top" height="22" - label="Play in World" - label_selected="Play in World" + label="Play Inworld" + label_selected="Play Inworld" layout="topleft" name="Sound play btn" sound_flags="0" diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index 0d155fb01e..fc6f06ffd4 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -114,7 +114,7 @@ left="6" name="Keep" top_pad="5" - width="100" /> + width="110" /> <button follows="right|bottom" height="22" @@ -123,7 +123,7 @@ left_pad="5" name="Discard" top_delta="0" - width="100" /> + width="110" /> <button follows="right|bottom" height="22" @@ -132,5 +132,5 @@ left_pad="5" name="save_tex_btn" top_delta="0" - width="100" /> + width="110" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_script_limits.xml b/indra/newview/skins/default/xui/en/floater_script_limits.xml index 98c44ad1b3..6b36cdfcc5 100644 --- a/indra/newview/skins/default/xui/en/floater_script_limits.xml +++ b/indra/newview/skins/default/xui/en/floater_script_limits.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" + can_resize="true" height="570" help_topic="scriptlimits" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_script_preview.xml b/indra/newview/skins/default/xui/en/floater_script_preview.xml index bb0702c353..d0cd00d147 100644 --- a/indra/newview/skins/default/xui/en/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_script_preview.xml @@ -3,26 +3,24 @@ legacy_header_height="18" auto_tile="true" can_resize="true" - height="550" + height="570" layout="topleft" - left_delta="343" min_height="271" min_width="290" name="preview lsl text" help_topic="preview_lsl_text" save_rect="true" title="SCRIPT: ROTATION SCRIPT" - top_delta="0" - width="500"> + width="508"> <floater.string name="Title"> - Script: [NAME] + SCRIPT: [NAME] </floater.string> <panel follows="left|top|right|bottom" - height="508" + height="522" layout="topleft" - left="0" + left="10" name="script panel" top="42" width="497" /> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 60c9810e95..2c9402f6cb 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -46,8 +46,11 @@ <ui_ctrl height="90" width="90" + layout="topleft" name="thumbnail_placeholder" top_pad="6" + follows="left|top" + left="10" /> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_test_checkbox.xml b/indra/newview/skins/default/xui/en/floater_test_checkbox.xml index c828f6b284..1935edfcc1 100644 --- a/indra/newview/skins/default/xui/en/floater_test_checkbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_checkbox.xml @@ -72,83 +72,4 @@ name="font_checkbox" top_pad="14" width="150" /> - -<chiclet_im_p2p - height="25" - name="im_p2p_chiclet" - show_speaker="false" - width="25"> - <chiclet_im_p2p.chiclet_button - height="25" - image_selected="PushButton_Selected" - image_unselected="PushButton_Off" - name="chiclet_button" - tab_stop="false" - width="25"/> - <chiclet_im_p2p.speaker - auto_update="true" - draw_border="false" - height="25" - left="25" - name="speaker" - visible="false" - width="20" /> - <chiclet_im_p2p.avatar_icon - bottom="3" - follows="left|top|bottom" - height="20" - left="2" - mouse_opaque="false" - name="avatar_icon" - width="21" /> - <chiclet_im_p2p.unread_notifications - height="25" - font_halign="center" - left="25" - mouse_opaque="false" - name="unread" - text_color="white" - v_pad="5" - visible="false" - width="20"/> - <chiclet_im_p2p.new_message_icon - bottom="11" - height="14" - image_name="Unread_Chiclet" - left="12" - name="new_message_icon" - visible="false" - width="14" /> -</chiclet_im_p2p> - - -<chiclet_offer - height="25" - name="offer_chiclet" - width="25"> - <chiclet_offer.chiclet_button - height="25" - image_selected="PushButton_Selected" - image_unselected="PushButton_Off" - name="chiclet_button" - tab_stop="false" - width="25"/> - <chiclet_offer.icon - bottom="3" - default_icon="Generic_Object_Small" - follows="all" - height="19" - left="3" - mouse_opaque="false" - name="chiclet_icon" - width="19" /> - <chiclet_offer.new_message_icon - bottom="11" - height="14" - image_name="Unread_Chiclet" - left="12" - name="new_message_icon" - visible="false" - width="14" /> -</chiclet_offer> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index f1aa5c27c1..5630dfbe8f 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -70,7 +70,7 @@ height="20" image_disabled="Tool_Zoom" image_disabled_selected="Tool_Zoom" - image_selected="Tool_Zoom" + image_selected="Tool_Zoom_Selected" image_unselected="Tool_Zoom" layout="topleft" left="10" @@ -86,7 +86,7 @@ height="20" image_disabled="Tool_Grab" image_disabled_selected="Tool_Grab" - image_selected="Tool_Grab" + image_selected="Tool_Grab_Selected" image_unselected="Tool_Grab" layout="topleft" left_pad="20" @@ -102,7 +102,7 @@ height="20" image_disabled="Tool_Face" image_disabled_selected="Tool_Face" - image_selected="Tool_Face" + image_selected="Tool_Face_Selected" image_unselected="Tool_Face" layout="topleft" left_pad="20" @@ -118,7 +118,7 @@ height="20" image_disabled="Tool_Create" image_disabled_selected="Tool_Create" - image_selected="Tool_Create" + image_selected="Tool_Create_Selected" image_unselected="Tool_Create" layout="topleft" left_pad="20" @@ -134,7 +134,7 @@ height="20" image_disabled="Tool_Dozer" image_disabled_selected="Tool_Dozer" - image_selected="Tool_Dozer" + image_selected="Tool_Dozer_Selected" image_unselected="Tool_Dozer" layout="topleft" left_pad="20" @@ -344,7 +344,7 @@ height="20" image_disabled="Object_Cube" image_disabled_selected="Object_Cube" - image_selected="Object_Cube" + image_selected="Object_Cube_Selected" image_unselected="Object_Cube" layout="topleft" left="4" @@ -357,7 +357,7 @@ height="20" image_disabled="Object_Prism" image_disabled_selected="Object_Prism" - image_selected="Object_Prism" + image_selected="Object_Prism_Selected" image_unselected="Object_Prism" layout="topleft" left_delta="26" @@ -370,7 +370,7 @@ height="20" image_disabled="Object_Pyramid" image_disabled_selected="Object_Pyramid" - image_selected="Object_Pyramid" + image_selected="Object_Pyramid_Selected" image_unselected="Object_Pyramid" layout="topleft" left_delta="26" @@ -383,7 +383,7 @@ height="20" image_disabled="Object_Tetrahedron" image_disabled_selected="Object_Tetrahedron" - image_selected="Object_Tetrahedron" + image_selected="Object_Tetrahedron_Selected" image_unselected="Object_Tetrahedron" layout="topleft" left_delta="26" @@ -396,7 +396,7 @@ height="20" image_disabled="Object_Cylinder" image_disabled_selected="Object_Cylinder" - image_selected="Object_Cylinder" + image_selected="Object_Cylinder_Selected" image_unselected="Object_Cylinder" layout="topleft" left_delta="26" @@ -409,7 +409,7 @@ height="20" image_disabled="Object_Hemi_Cylinder" image_disabled_selected="Object_Hemi_Cylinder" - image_selected="Object_Hemi_Cylinder" + image_selected="Object_Hemi_Cylinder_Selected" image_unselected="Object_Hemi_Cylinder" layout="topleft" left_delta="26" @@ -422,7 +422,7 @@ height="20" image_disabled="Object_Cone" image_disabled_selected="Object_Cone" - image_selected="Object_Cone" + image_selected="Object_Cone_Selected" image_unselected="Object_Cone" layout="topleft" left_delta="26" @@ -435,7 +435,7 @@ height="20" image_disabled="Object_Hemi_Cone" image_disabled_selected="Object_Hemi_Cone" - image_selected="Object_Hemi_Cone" + image_selected="Object_Hemi_Cone_Selected" image_unselected="Object_Hemi_Cone" layout="topleft" left_delta="26" @@ -448,7 +448,7 @@ height="20" image_disabled="Object_Sphere" image_disabled_selected="Object_Sphere" - image_selected="Object_Sphere" + image_selected="Object_Sphere_Selected" image_unselected="Object_Sphere" layout="topleft" left_delta="26" @@ -461,7 +461,7 @@ height="20" image_disabled="Object_Hemi_Sphere" image_disabled_selected="Object_Hemi_Sphere" - image_selected="Object_Hemi_Sphere" + image_selected="Object_Hemi_Sphere_Selected" image_unselected="Object_Hemi_Sphere" layout="topleft" left_delta="26" @@ -474,7 +474,7 @@ height="20" image_disabled="Object_Torus" image_disabled_selected="Object_Torus" - image_selected="Object_Torus" + image_selected="Object_Torus_Selected" image_unselected="Object_Torus" layout="topleft" left="4" @@ -487,7 +487,7 @@ height="20" image_disabled="Object_Tube" image_disabled_selected="Object_Tube" - image_selected="Object_Tube" + image_selected="Object_Tube_Selected" image_unselected="Object_Tube" layout="topleft" left_delta="26" @@ -500,7 +500,7 @@ height="20" image_disabled="Object_Ring" image_disabled_selected="Object_Ring" - image_selected="Object_Ring" + image_selected="Object_Ring_Selected" image_unselected="Object_Ring" layout="topleft" left_delta="26" @@ -513,7 +513,7 @@ height="20" image_disabled="Object_Tree" image_disabled_selected="Object_Tree" - image_selected="Object_Tree" + image_selected="Object_Tree_Selected" image_unselected="Object_Tree" layout="topleft" left_delta="26" @@ -526,8 +526,9 @@ height="20" image_disabled="Object_Grass" image_disabled_selected="Object_Grass" - image_selected="Object_Grass" + image_selected="Object_Grass_Selected" image_unselected="Object_Grass" + image_overlay_color="Red" layout="topleft" left_delta="26" name="ToolGrass" diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 65c9c2a8fa..e1df50bf58 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -403,7 +403,7 @@ height="16" image_name="map_track_16.tga" layout="topleft" - left="5" + left="3" top="11" mouse_opaque="true" name="friends_icon" @@ -415,7 +415,7 @@ label="Online Friends" layout="topleft" top_delta="-4" - left_pad="5" + left_pad="7" max_chars="60" name="friend combo" tool_tip="Show friends on map" @@ -433,7 +433,7 @@ height="16" image_name="map_track_16.tga" layout="topleft" - left="5" + left="3" top_pad="8" mouse_opaque="true" name="landmark_icon" @@ -445,7 +445,7 @@ label="My Landmarks" layout="topleft" top_delta="-3" - left_pad="5" + left_pad="7" max_chars="64" name="landmark combo" tool_tip="Landmark to show on map" @@ -463,7 +463,7 @@ height="16" image_name="map_track_16.tga" layout="topleft" - left="5" + left="3" top_pad="7" mouse_opaque="true" name="region_icon" @@ -476,7 +476,7 @@ label="Regions by Name" layout="topleft" top_delta="-2" - left_pad="5" + left_pad="7" name="location" select_on_focus="true" tool_tip="Type the name of a region" @@ -497,6 +497,19 @@ <button.commit_callback function="WMap.Location" /> </button> + <button + image_overlay="Refresh_Off" + follows="top|right" + height="23" + layout="topleft" + left="0" + name="Clear" + tool_tip="Clear tracking lines and reset map" + top_pad="5" + width="23"> + <button.commit_callback + function="WMap.Clear" /> + </button> <scroll_list draw_stripes="false" bg_writeable_color="MouseGray" @@ -505,7 +518,7 @@ layout="topleft" left="28" name="search_results" - top_pad="5" + top_pad="-23" width="209" sort_column="1"> <scroll_list.columns @@ -545,19 +558,6 @@ <button.commit_callback function="WMap.CopySLURL" /> </button> - <!-- <button - follows="right|bottom" - height="23" - label="Clear" - layout="topleft" - left="10" - name="Clear" - tool_tip="Stop tracking" - top_pad="5" - width="105"> - <button.commit_callback - function="WMap.Clear" /> - </button>--> <button enabled="false" follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index 9212d2d648..1e32cfd9df 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -13,11 +13,11 @@ function="Self.EnableStandUp" /> </menu_item_call> <context_menu - label="Take Off >" + label="Take Off ▶" layout="topleft" name="Take Off >"> <context_menu - label="Clothes >" + label="Clothes ▶" layout="topleft" name="Clothes >"> <menu_item_call @@ -151,7 +151,7 @@ <menu_item_call.on_enable function="Edit.EnableTakeOff" parameter="alpha" /> - </menu_item_call> + </menu_item_call> <menu_item_separator layout="topleft" /> <menu_item_call @@ -164,11 +164,11 @@ </menu_item_call> </context_menu> <context_menu - label="HUD >" + label="HUD ▶" layout="topleft" name="Object Detach HUD" /> <context_menu - label="Detach >" + label="Detach ▶" layout="topleft" name="Object Detach" /> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 1e10467148..1993af6730 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -516,7 +516,7 @@ layout="topleft" name="Animation Separator" /> <menu_item_call - label="Play in World" + label="Play Inworld" layout="topleft" name="Animation Play"> <menu_item_call.on_click diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index bbe6892b27..ba74104594 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -60,6 +60,7 @@ </menu_item_call> </menu> <menu + visible="false" create_jump_keys="true" label="Debug" name="Debug" diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml index 35518cd13b..5a9509e284 100644 --- a/indra/newview/skins/default/xui/en/menu_object.xml +++ b/indra/newview/skins/default/xui/en/menu_object.xml @@ -65,7 +65,7 @@ </menu_item_call> <menu_item_separator layout="topleft" /> <context_menu - label="Put On >" + label="Put On ▶" name="Put On" > <menu_item_call enabled="false" @@ -77,14 +77,14 @@ function="Object.EnableWear" /> </menu_item_call> <context_menu - label="Attach >" + label="Attach ▶" name="Object Attach" /> <context_menu - label="Attach HUD >" + label="Attach HUD ▶" name="Object Attach HUD" /> </context_menu> <context_menu - label="Remove >" + label="Remove ▶" name="Remove"> <menu_item_call enabled="false" diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml index 805ffbae66..d03a7e3d41 100644 --- a/indra/newview/skins/default/xui/en/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml @@ -78,6 +78,9 @@ name="Pay"> <menu_item_call.on_click function="Avatar.Pay" /> + <menu_item_call.on_enable + function="ParticipantList.EnableItem" + parameter="can_pay" /> </menu_item_call> <menu_item_separator layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml index 1dc1c610cf..407ce14e81 100644 --- a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml @@ -19,6 +19,19 @@ <menu_item_call.on_click function="Profile.Share" /> </menu_item_call> + <menu_item_check + label="Block/Unblock" + layout="topleft" + name="block_unblock"> + <menu_item_check.on_click + function="Profile.BlockUnblock" /> + <menu_item_check.on_check + function="Profile.CheckItem" + parameter="is_blocked" /> + <menu_item_check.on_enable + function="Profile.EnableItem" + parameter="can_block" /> + </menu_item_check> <menu_item_call label="Kick" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index a98a049c17..22f4d277a4 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -662,6 +662,18 @@ <menu_item_call.on_enable function="Tools.EnableUnlink" /> </menu_item_call> + <menu_item_check + label="Edit Linked Parts" + layout="topleft" + name="Edit Linked Parts"> + <menu_item_check.on_check + control="EditLinkedParts" /> + <menu_item_check.on_click + function="Tools.EditLinkedParts" + parameter="EditLinkedParts" /> + <menu_item_check.on_enable + function="Tools.EnableToolNotPie" /> + </menu_item_check> <menu_item_separator layout="topleft" /> <menu_item_call @@ -799,18 +811,6 @@ layout="topleft" name="Options" tear_off="true"> - <menu_item_check - label="Edit Linked Parts" - layout="topleft" - name="Edit Linked Parts"> - <menu_item_check.on_check - control="EditLinkedParts" /> - <menu_item_check.on_click - function="Tools.EditLinkedParts" - parameter="EditLinkedParts" /> - <menu_item_check.on_enable - function="Tools.EnableToolNotPie" /> - </menu_item_check> <menu_item_call label="Set Default Upload Permissions" layout="topleft" @@ -819,10 +819,10 @@ function="Floater.Toggle" parameter="perm_prefs" /> </menu_item_call> - <menu_item_check - label="Show Advanced Permissions" - layout="topleft" - name="DebugPermissions"> + <menu_item_check + label="Show Advanced Permissions" + layout="topleft" + name="DebugPermissions"> <menu_item_check.on_check function="CheckControl" parameter="DebugPermissions" /> @@ -832,13 +832,7 @@ </menu_item_check> <menu_item_separator layout="topleft" /> - <menu - create_jump_keys="true" - label="Selection" - layout="topleft" - name="Selection" - tear_off="true"> - <menu_item_check + <menu_item_check label="Select Only My Objects" layout="topleft" name="Select Only My Objects"> @@ -866,14 +860,9 @@ control="RectangleSelectInclusive" /> <menu_item_check.on_click function="Tools.SelectBySurrounding" /> - </menu_item_check> - </menu> - <menu - create_jump_keys="true" - label="Show" - layout="topleft" - name="Show" - tear_off="true"> + </menu_item_check> + <menu_item_separator + layout="topleft" /> <menu_item_check label="Show Hidden Selection" layout="topleft" @@ -902,13 +891,8 @@ function="ToggleControl" parameter="ShowSelectionBeam" /> </menu_item_check> - </menu> - <menu - create_jump_keys="true" - label="Grid" - layout="topleft" - name="Grid" - tear_off="true"> + <menu_item_separator + layout="topleft" /> <menu_item_check label="Snap to Grid" layout="topleft" @@ -953,7 +937,6 @@ <menu_item_call.on_enable function="Tools.EnableToolNotPie" /> </menu_item_call> - </menu> </menu> <menu create_jump_keys="true" @@ -2015,6 +1998,18 @@ function="Advanced.ToggleHUDInfo" parameter="fov" /> </menu_item_check> + <menu_item_check + label="Badge" + layout="topleft" + name="Badge" + shortcut="alt|control|shift|h"> + <menu_item_check.on_check + function="Advanced.CheckHUDInfo" + parameter="badge" /> + <menu_item_check.on_click + function="Advanced.ToggleHUDInfo" + parameter="badge" /> + </menu_item_check> </menu> <menu create_jump_keys="true" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 636db2b59b..d16474873f 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -391,19 +391,23 @@ Add this Ability to '[ROLE_NAME]'? notext="No" yestext="Yes"/> </notification> - <notification - icon="alertmodal.tga" - name="ClickUnimplemented" - type="alertmodal"> -Sorry, not implemented yet. + icon="alertmodal.tga" + name="JoinGroupCanAfford" + type="alertmodal"> +Joining this group costs L$[COST]. +Do you wish to proceed? + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="Join"/> </notification> <notification icon="alertmodal.tga" - name="JoinGroupCanAfford" + name="JoinGroupNoCost" type="alertmodal"> -Joining this group costs L$[COST]. +You are Joining group [NAME]. Do you wish to proceed? <usetemplate name="okcancelbuttons" @@ -411,6 +415,7 @@ Do you wish to proceed? yestext="Join"/> </notification> + <notification icon="alertmodal.tga" name="JoinGroupCannotAfford" @@ -1527,7 +1532,7 @@ Your search terms were too short so no search was performed. icon="alertmodal.tga" name="CouldNotTeleportReason" type="alertmodal"> -Could not teleport. +Teleport failed. [REASON] </notification> diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index 39c4923f12..89d632c4c6 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -21,19 +21,20 @@ width="18" /> <text_editor allow_scroll="false" - v_pad = "0" + v_pad = "7" read_only = "true" follows="left|right" font.style="BOLD" - height="12" + height="24" layout="topleft" left_pad="5" right="-120" name="user_name" text_color="white" bg_readonly_color="black" - top="8" + top="0" use_ellipses="true" + valign="bottom" value="Ericag Vader" /> <text font="SansSerifSmall" diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml index 677bdbc3d2..31719aad20 100644 --- a/indra/newview/skins/default/xui/en/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -18,6 +18,10 @@ name="type_pg"> General Content </panel.string> + <panel.string + name="l$_price"> + L$[PRICE] + </panel.string> <button follows="top|right" height="23" @@ -71,8 +75,11 @@ name="classified_snapshot" top="20" width="290" /> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top|right" + h_pad="0" height="35" width="290" layout="topleft" @@ -81,35 +88,53 @@ left="10" top_pad="10" name="classified_name" + read_only="true" text_color="white" + v_pad="0" value="[name]" use_ellipses="true" /> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top" + h_pad="0" height="25" layout="topleft" left="10" name="classified_location" + read_only="true" width="290" word_wrap="true" + v_pad="0" value="[loading...]" /> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top|right" + h_pad="0" height="18" layout="topleft" left="10" name="content_type" + read_only="true" width="290" top_pad="5" + v_pad="0" value="[content type]" /> - <text + <text_editor + allow_html="true" + allow_scroll="false" + bg_visible="false" follows="left|top|right" + h_pad="0" height="18" layout="topleft" left="10" name="category" + read_only="true" width="290" top_pad="5" + v_pad="0" value="[category]" /> <check_box enabled="false" @@ -119,26 +144,37 @@ left="10" name="auto_renew" top_pad="5" + v_pad="0" width="290" /> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top" + h_pad="0" halign="left" height="16" layout="topleft" left="10" name="price_for_listing" + read_only="true" top_pad="5" tool_tip="Price for listing." - width="105"> - L$[PRICE] - </text> - <text + v_pad="0" + width="105" /> + <text_editor + allow_html="true" + allow_scroll="false" + bg_visible="false" follows="left|top|right" + h_pad="0" height="200" layout="topleft" left="10" + max_length="1023" name="classified_desc" + read_only="true" width="290" + v_pad="0" value="[description]" word_wrap="true" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml index b881719e3a..0c1418fc2d 100644 --- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml @@ -64,6 +64,7 @@ layout="topleft" left="103" name="description" + textbox.mouse_opaque="false" top_pad="0" width="178" word_wrap="true" /> diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml index 8268937e7f..2a2199fc87 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml @@ -60,32 +60,33 @@ <scroll_container color="DkGray2" follows="all" - height="505" + height="493" min_height="300" layout="topleft" - left="0" + left="9" + width="290" name="profile_scroll" reserve_scroll_corner="true" opaque="true" - top="0"> + top="10"> <panel name="scroll_content_panel" follows="left|top|right" layout="topleft" top="0" - height="505" + height="493" min_height="300" left="0" - width="313"> + width="290"> <panel name="data_panel" follows="left|top|right" layout="topleft" top="0" - height="505" + height="493" min_height="300" left="0" - width="313"> + width="290"> <panel name="lifes_images_panel" follows="left|top|right" @@ -93,7 +94,7 @@ layout="topleft" top="0" left="0" - width="285"> + width="290"> <panel follows="left|top" height="117" @@ -101,25 +102,26 @@ left="10" name="second_life_image_panel" top="0" - width="285"> + width="280"> <text follows="left|top|right" font.style="BOLD" height="15" layout="topleft" left="0" + top="10" name="second_life_photo_title_text" text_color="white" value="[SECOND_LIFE]:" - width="170" /> + width="100" /> <texture_picker allow_no_texture="true" default_image_name="None" enabled="false" follows="top|left" - height="117" + height="124" layout="topleft" - left="0" + left="1" name="2nd_life_pic" top_pad="0" width="102" /> @@ -140,13 +142,13 @@ length="1" follows="left|top|right" font="SansSerifSmall" - height="100" + height="102" layout="topleft" - left="120" - top="18" + left="123" + top="25" max_length="512" name="sl_description_edit" - width="173" + width="157" word_wrap="true"> </text_editor> <panel @@ -163,18 +165,19 @@ height="15" layout="topleft" left="0" + top_pad="10" name="real_world_photo_title_text" text_color="white" value="Real World:" - width="173" /> + width="100" /> <texture_picker allow_no_texture="true" default_image_name="None" enabled="false" follows="top|left" - height="117" + height="124" layout="topleft" - left="0" + left="1" name="real_world_pic" top_pad="0" width="102" /> @@ -194,13 +197,13 @@ length="1" follows="left|top|right" font="SansSerifSmall" - height="100" + height="102" layout="topleft" - left="120" + left="123" max_length="512" - top="142" + top="157" name="fl_description_edit" - width="173" + width="157" word_wrap="true"> </text_editor> <text @@ -215,7 +218,7 @@ name="title_homepage_text" text_color="white" top_pad="10" - width="285"> + width="100"> Homepage: </text> <line_editor @@ -227,19 +230,19 @@ top_pad="0" value="http://" name="homepage_edit" - width="285"> + width="270"> </line_editor> <check_box follows="left|top" font="SansSerifSmall" label="Show me in Search results" layout="topleft" - left="10" + left="8" name="show_in_search_checkbox" height="15" text_enabled_color="white" - top_pad="10" - width="240" /> + top_pad="12" + width="100" /> <text follows="left|top" font="SansSerifSmall" @@ -249,9 +252,24 @@ left="10" name="title_acc_status_text" text_color="white" - top_pad="5" + top_pad="10" value="My Account:" - width="285" /> + width="100" /> + <text_editor + allow_scroll="false" + bg_visible="false" + follows="left|top|right" + h_pad="0" + height="28" + layout="topleft" + left="10" + name="acc_status_text" + read_only="true" + top_pad="5" + v_pad="0" + value="Resident. No payment info on file." + width="200" + word_wrap="true" /> <text type="string" follows="left|top" @@ -261,17 +279,7 @@ left="10" name="my_account_link" value="[[URL] Go to My Dashboard]" - width="285" /> - <text - follows="left|top|right" - height="20" - layout="topleft" - left="10" - name="acc_status_text" - top_pad="5" - value="Resident. No payment info on file." - width="285" - word_wrap="true" /> + width="200" /> <text follows="left|top" font="SansSerifSmall" @@ -281,26 +289,16 @@ left="10" name="title_partner_text" text_color="white" - top_pad="0" + top_pad="10" value="My Partner:" width="150" /> - <text - follows="left|top" - height="15" - halign="right" - layout="topleft" - left_pad="10" - right="-10" - name="partner_edit_link" - value="[[URL] Edit]" - width="50" /> <panel follows="left|top|right" height="15" layout="topleft" left="10" name="partner_data_panel" - width="285"> + width="200"> <name_box follows="left|top|right" height="30" @@ -310,36 +308,43 @@ link="true" name="partner_text" top="0" - width="285" + width="200" word_wrap="true" /> </panel> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="partner_edit_link" + value="[[URL] Edit]" + width="50" /> </panel> </panel> </scroll_container> <panel follows="bottom|left" - height="20" - left="10" + height="28" + left="0" name="profile_me_buttons_panel" - top_pad="5" - width="303"> + top_pad="0" + width="313"> <button follows="bottom|left" - height="19" + height="23" label="Save Changes" layout="topleft" - left="0" + left="9" name="save_btn" - top="0" - width="130" /> + top="5" + width="152" /> <button follows="bottom|left" - height="19" + height="23" label="Cancel" layout="topleft" - left_pad="10" + left_pad="4" name="cancel_btn" - right="-1" - width="130" /> + width="152" /> </panel> </panel> 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 b903032ed5..618167181f 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -1,12 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - follows="all" - height="395" label="General" + follows="all" + height="604" + width="313" class="panel_group_general" - layout="topleft" - name="general_tab" - width="323"> + name="general_tab"> <panel.string name="help_text"> The General tab contains general information about this group, a list of members, general Group Preferences and member options. @@ -25,12 +24,14 @@ Hover your mouse over the options for more help. type="string" follows="left|top|right" left="5" - height="60" + height="150" layout="topleft" max_length="511" name="charter" top="5" right="-1" + bg_readonly_color="DkGray2" + text_readonly_color="White" word_wrap="true"> Group Charter </text_editor> @@ -38,8 +39,8 @@ Hover your mouse over the options for more help. column_padding="0" draw_heading="true" follows="left|top|right" - heading_height="20" - height="156" + heading_height="23" + height="200" layout="topleft" left="0" name="visible_members" @@ -63,17 +64,29 @@ Hover your mouse over the options for more help. height="12" layout="left|top|right" left="5" + text_color="EmphasisColor" + name="my_group_settngs_label" + top_pad="10" + width="300"> + Me + </text> + <text + follows="left|top|right" + type="string" + height="12" + layout="left|top|right" + left="10" name="active_title_label" top_pad="5" width="300"> - My Title + My title: </text> <combo_box follows="left|top|right" - height="20" + height="23" layout="topleft" - left="5" - right="-5" + left="10" + right="-5" name="active_title" tool_tip="Sets the title that appears in your avatar's name tag when this group is active." top_pad="2" /> @@ -82,7 +95,7 @@ Hover your mouse over the options for more help. font="SansSerifSmall" label="Receive group notices" layout="topleft" - left="5" + left="10" name="receive_notices" tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you." top_pad="5" @@ -91,36 +104,46 @@ Hover your mouse over the options for more help. height="16" label="Show in my profile" layout="topleft" - left="5" + left="10" name="list_groups_in_profile" tool_tip="Sets whether you want to show this group in your profile" top_pad="5" width="295" /> - <panel + <panel background_visible="true" bevel_style="in" border="true" bg_alpha_color="FloaterUnfocusBorderColor" follows="left|top|right" - height="88" + height="140" + width="313" layout="topleft" - left="2" - right="-1" + left="0" name="preferences_container" - top_pad="2"> + top_pad="5"> + <text + follows="left|top|right" + type="string" + height="12" + layout="left|top|right" + left="5" + text_color="EmphasisColor" + name="group_settngs_label" + width="300"> + Group + </text> <check_box follows="right|top|left" height="16" - label="Open enrollment" + label="Anyone can join" layout="topleft" left="10" name="open_enrollement" tool_tip="Sets whether this group allows new members to join without being invited." - top_pad="5" width="90" /> <check_box height="16" - label="Enrollment fee" + label="Cost to join" layout="topleft" left_delta="0" name="check_enrollment_fee" @@ -129,27 +152,26 @@ Hover your mouse over the options for more help. width="300" /> <spinner decimal_digits="0" - follows="left|top|right" + follows="left|top" halign="left" - height="16" + height="23" increment="1" label_width="15" label="L$" layout="topleft" - right="-30" max_val="99999" - left_pad="0" + left="30" name="spin_enrollment_fee" tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked." - width="80" /> - <combo_box - follows="left|top|right" - height="20" + width="170" /> + <combo_box + follows="left|top" + height="23" layout="topleft" left="10" name="group_mature_check" tool_tip="Sets whether your group contains information rated as Moderate" - top_pad="0" + top_pad="4" width="190"> <combo_box.item label="General Content" @@ -161,7 +183,7 @@ Hover your mouse over the options for more help. value="Mature" /> </combo_box> <check_box - follows="left|top|right" + follows="left|top" height="16" initial_value="true" label="Show in search" @@ -171,5 +193,6 @@ Hover your mouse over the options for more help. tool_tip="Let people see this group in search results" top_pad="4" width="300" /> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index 1968d96205..9727c54c6b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -2,17 +2,17 @@ <panel background_visible="true" follows="all" - height="635" - label="Group Info" + height="570" + label="Group Profile" layout="topleft" - min_height="460" + min_height="350" left="0" top="20" name="GroupInfo" - width="323"> + width="313"> <panel.string name="default_needs_apply_text"> - There are unsaved changes to the current tab + There are unsaved changes </panel.string> <panel.string name="want_apply_text"> @@ -26,6 +26,14 @@ background_visible="true" name="group_join_free"> Free </panel.string> + <panel + name="group_info_top" + follows="top|left" + top="0" + left="0" + height="129" + width="313" + layout="topleft"> <button follows="top|right" height="23" @@ -37,18 +45,19 @@ background_visible="true" top="2" width="23" /> <text - allow_html="false" - follows="top|left|right" - font="SansSerifHugeBold" - height="26" layout="topleft" - left_pad="10" name="group_name" - text_color="white" - top="0" value="(Loading...)" + font="SansSerifHuge" + height="20" + left_pad="5" + text_color="white" + top="3" use_ellipses="true" - width="300" /> + width="270" + follows="top|left" + word_wrap="true" + mouse_opaque="false"/> <line_editor follows="left|top" font="SansSerif" @@ -58,7 +67,7 @@ background_visible="true" max_length="35" name="group_name_editor" top_delta="5" - width="250" + width="270" height="20" visible="false" /> <texture_picker @@ -66,22 +75,25 @@ background_visible="true" height="113" label="" layout="topleft" - left="20" + left="10" name="insignia" no_commit_on_selection="true" tool_tip="Click to choose a picture" top_pad="5" width="100" /> <text + font="SansSerifSmall" + text_color="White_50" + width="190" + follows="top|left" + layout="topleft" + mouse_opaque="false" type="string" - follows="left|top" height="16" length="1" - layout="topleft" left_pad="10" name="prepend_founded_by" - top_delta="0" - width="140"> + top_delta="0"> Founder: </text> <name_box @@ -94,9 +106,9 @@ background_visible="true" name="founder_name" top_pad="2" use_ellipses="true" - width="140" /> + width="190" /> <text - font="SansSerifBig" + font="SansSerifMedium" text_color="EmphasisColor" type="string" follows="left|top" @@ -106,7 +118,7 @@ background_visible="true" name="join_cost_text" top_pad="10" visible="true" - width="140"> + width="190"> Free </text> <button @@ -118,17 +130,31 @@ background_visible="true" name="btn_join" visible="true" width="120" /> + </panel> + <layout_stack + name="layout" + orientation="vertical" + follows="all" + left="0" + top_pad="0" + height="437" + width="313" + border_size="0"> + <layout_panel + name="group_accordions" + follows="all" + layout="topleft" + auto_resize="true" + > <accordion + left="0" + top="0" single_expansion="true" follows="all" - height="478" layout="topleft" - left="0" - name="groups_accordion" - top_pad="10" - width="323"> + name="groups_accordion"> <accordion_tab - expanded="false" + expanded="true" layout="topleft" name="group_general_tab" title="General"> @@ -138,12 +164,13 @@ background_visible="true" filename="panel_group_general.xml" layout="topleft" left="0" + follows="all" help_topic="group_general_tab" name="group_general_tab_panel" top="0" /> </accordion_tab> <accordion_tab - expanded="true" + expanded="false" layout="topleft" name="group_roles_tab" title="Roles"> @@ -186,28 +213,37 @@ background_visible="true" top="0" /> </accordion_tab> </accordion> - <panel + </layout_panel> + <layout_panel + height="25" + layout="topleft" + auto_resize="false" + left="0" name="button_row" - height="23" follows="bottom|left" - top_pad="-1" - width="323"> + width="313"> <button - follows="top|left" - height="22" + follows="bottom|left" + height="23" image_overlay="Refresh_Off" layout="topleft" - left="10" + left="5" + top="0" name="btn_refresh" width="23" /> <button - height="22" - label="Create" - label_selected="New group" + follows="bottom|left" + height="18" + image_selected="AddItem_Press" + image_unselected="AddItem_Off" + image_disabled="AddItem_Disabled" + layout="topleft" + left_pad="2" + top_delta="3" name="btn_create" - left_pad="10" - visible="false" - width="100" /> + visible="true" + tool_tip="Create a new Group" + width="18" /> <!-- <button left_pad="10" height="20" @@ -217,28 +253,30 @@ background_visible="true" visible="false" width="65" />--> <button - follows="bottom|right" - label="Group Chat" + follows="bottom|left" + label="Chat" name="btn_chat" - right="-184" left_pad="2" - height="22" - width="85" /> + height="23" + top_delta="-3" + width="60" /> <button - follows="bottom|right" - label="Group Call" + follows="bottom|left" + left_pad="2" + height="23" name="btn_call" - right="-97" - left_pad="2" - height="22" - width="85" /> + label="Group Call" + layout="topleft" + tool_tip="Call this group" + width="95" /> <button - height="22" + follows="bottom|left" + height="23" label="Save" label_selected="Save" name="btn_apply" - left_pad="10" - right="-10" + left_pad="2" width="85" /> - </panel> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index db156f7877..38b0f234d5 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -2,13 +2,13 @@ <panel border="false" follows="all" - height="420" + height="500" label="Land & L$" layout="topleft" left="0" name="land_money_tab" top="0" - width="310"> + width="313"> <panel.string name="help_text"> A warning appears until the Total Land in Use is less than or = to the Total Contribution. @@ -41,16 +41,24 @@ width="260"> Group Owned Land </text> --> + <panel + name="layout_panel_landmoney" + follows="top|left|right" + left="0" + right="-1" + height="250" + width="313" + > <scroll_list draw_heading="true" follows="top|left|right" - heading_height="20" height="130" layout="topleft" left="0" + right="-1" top="0" name="group_parcel_list" - width="310"> + width="313"> <scroll_list.columns label="Parcel" name="name" @@ -67,16 +75,12 @@ label="Area" name="area" width="50" /> - <scroll_list.columns - label="" - name="hidden" - width="-1" /> </scroll_list> <text type="string" follows="left|top" halign="right" - height="15" + height="16" layout="topleft" left="0" name="total_contributed_land_label" @@ -87,30 +91,30 @@ text_color="EmphasisColor" type="string" follows="left|top" - height="15" + height="16" layout="topleft" left_pad="5" name="total_contributed_land_value" top_delta="0" - width="120"> + width="90"> [AREA] m² </text> <button follows="top" - height="20" + height="23" label="Map" label_selected="Map" layout="topleft" name="map_button" - right="-5" + top_delta="-4" left_pad="0" - width="95" + width="60" enabled="false" /> <text type="string" follows="left|top" halign="right" - height="15" + height="16" layout="topleft" left="0" name="total_land_in_use_label" @@ -122,7 +126,7 @@ text_color="EmphasisColor" type="string" follows="left|top" - height="15" + height="16" layout="topleft" left_pad="5" name="total_land_in_use_value" @@ -134,7 +138,7 @@ type="string" follows="left|top" halign="right" - height="15" + height="16" layout="topleft" left="0" name="land_available_label" @@ -146,7 +150,7 @@ text_color="EmphasisColor" type="string" follows="left|top" - height="15" + height="16" layout="topleft" left_pad="5" name="land_available_value" @@ -158,7 +162,7 @@ type="string" follows="left|top" halign="right" - height="15" + height="16" layout="topleft" left="0" name="your_contribution_label" @@ -190,21 +194,22 @@ <text type="string" follows="left|top" - halign="right" - height="12" + halign="left" + height="16" layout="topleft" left="140" name="your_contribution_max_value" top_pad="2" - width="95"> + width="170"> ([AMOUNT] max) </text> <icon - height="18" - image_name="BuyArrow_Over" + height="16" + image_name="Parcel_Exp_Color" layout="topleft" left="75" name="group_over_limit_icon" + color="Green" top_pad="0" visible="true" width="18" /> @@ -212,12 +217,11 @@ follows="left|top" type="string" word_wrap="true" - font="SansSerifSmall" height="20" layout="topleft" left_pad="2" name="group_over_limit_text" - text_color="EmphasisColor" + text_color="ColorPaletteEntry29" top_delta="0" width="213"> More land credits are needed to support land in use @@ -235,39 +239,39 @@ width="100"> Group L$ </text> + </panel> <tab_container follows="all" - height="180" + height="230" halign="center" layout="topleft" left="0" + right="-1" name="group_money_tab_container" tab_position="top" - tab_height="20" top_pad="2" - tab_min_width="75" - width="310"> + tab_min_width="90" + width="313"> <panel border="false" follows="all" - height="180" label="PLANNING" layout="topleft" left="0" help_topic="group_money_planning_tab" name="group_money_planning_tab" - top="5" - width="300"> + top="0" + width="313"> <text_editor type="string" follows="all" - height="140" + height="200" layout="topleft" left="0" max_length="4096" name="group_money_planning_text" top="2" - width="300" + width="313" word_wrap="true"> Loading... </text_editor> @@ -275,92 +279,88 @@ <panel border="false" follows="all" - height="180" label="DETAILS" layout="topleft" left="0" help_topic="group_money_details_tab" name="group_money_details_tab" top="0" - width="300"> + width="313"> <text_editor type="string" follows="all" - height="140" + height="185" layout="topleft" left="0" max_length="4096" name="group_money_details_text" top="2" - width="300" + width="313" word_wrap="true"> Loading... </text_editor> - - <button - height="20" - image_overlay="Arrow_Left_Off" - layout="topleft" - left="5" - name="earlier_details_button" - tool_tip="Go back in time" - top_pad="10" - width="25" /> <button - height="20" - image_overlay="Arrow_Right_Off" - layout="topleft" - left_pad="5" - name="later_details_button" - tool_tip="Go forward in time" - top_delta="0" - width="25" /> - - - </panel> + follows="left|top" + height="18" + image_overlay="Arrow_Left_Off" + layout="topleft" + name="earlier_details_button" + tool_tip="Back" + left="200" + top_pad="0" + width="25" /> + <button + follows="left|top" + height="18" + image_overlay="Arrow_Right_Off" + layout="topleft" + name="later_details_button" + tool_tip="Next" + left_pad="15" + width="25" /> + </panel> <panel border="false" follows="all" - height="180" label="SALES" layout="topleft" - left_delta="0" + left="0" help_topic="group_money_sales_tab" - mouse_opaque="false" name="group_money_sales_tab" top="0" - width="300"> + width="313"> <text_editor type="string" follows="all" - height="130" + height="185" layout="topleft" left="0" max_length="4096" name="group_money_sales_text" top="2" - width="300" + width="313" word_wrap="true"> Loading... </text_editor> - <button - height="20" - image_overlay="Arrow_Left_Off" - layout="topleft" - left="5" - name="earlier_sales_button" - tool_tip="Go back in time" - top_pad="10" - width="25" /> - <button - height="20" - image_overlay="Arrow_Right_Off" - layout="topleft" - left_pad="5" - name="later_sales_button" - tool_tip="Go forward in time" - top_delta="0" - width="25" /> + <button + follows="left|top" + height="18" + image_overlay="Arrow_Left_Off" + layout="topleft" + name="earlier_sales_button" + tool_tip="Back" + left="200" + top_pad="0" + width="25" /> + <button + follows="left|top" + height="18" + image_overlay="Arrow_Right_Off" + layout="topleft" + left_pad="15" + name="later_sales_button" + tool_tip="Next" + width="25" /> </panel> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 0d9c2c2162..5f46ad7860 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="463" + height="530" label="Notices" layout="topleft" left="0" name="notices_tab" top="0" - width="310"> + width="313"> <panel.string name="help_text"> Notices let you send a message and an optionally attached item. @@ -23,26 +23,28 @@ You can turn off Notices on the General tab. type="string" word_wrap="true" height="24" - halign="right" + halign="left" layout="topleft" + text_color="White_50" left="5" name="lbl2" + right="-1" top="5" width="300"> Notices are kept for 14 days. Maximum 200 per group daily </text> <scroll_list - follows="left|top" + follows="left|top|right" column_padding="0" draw_heading="true" - heading_height="16" - height="125" + height="175" layout="topleft" - left="2" + left="0" + right="-1" name="notice_list" top_pad="0" - width="300"> + width="313"> <scroll_list.columns label="" name="icon" @@ -71,8 +73,8 @@ Maximum 200 per group daily visible="false"> None found </text> - <button - follows="bottom|left" + <button + follows="top|left" height="18" image_selected="AddItem_Press" image_unselected="AddItem_Off" @@ -85,24 +87,25 @@ Maximum 200 per group daily width="18" /> <button follows="top|left" - height="22" + height="23" image_overlay="Refresh_Off" layout="topleft" name="refresh_notices" - right="-5" + left_pad="230" tool_tip="Refresh list of notices" top_delta="0" width="23" /> <panel - follows="left|top" + follows="left|top|right" height="280" label="Create New Notice" layout="topleft" left="0" + right="-1" top_pad="0" visible="true" name="panel_create_new_notice" - width="300"> + width="313"> <text follows="left|top" type="string" @@ -204,13 +207,16 @@ Maximum 200 per group daily width="72" /> <button follows="left|top" - height="23" - label="Remove" layout="topleft" - left="70" + left="140" name="remove_attachment" - top_delta="45" - width="90" /> + top_delta="50" + height="18" + image_selected="TrashItem_Press" + image_unselected="TrashItem_Off" + image_disabled="TrashItem_Disabled" + tool_tip="Remove attachment from your notification" + width="18" /> <button follows="left|top" height="23" @@ -231,18 +237,19 @@ Maximum 200 per group daily width="280" /> </panel> <panel - follows="left|top" + follows="left|top|right" height="280" label="View Past Notice" layout="topleft" left="0" + right="-1" visible="false" name="panel_view_past_notice" - top="180" - width="300"> + top="230" + width="313"> <text type="string" - font="SansSerifBig" + font="SansSerifMedium" height="16" layout="topleft" left="10" @@ -280,7 +287,7 @@ Maximum 200 per group daily border_style="line" border_thickness="1" enabled="false" - height="16" + height="20" layout="topleft" left_pad="3" max_length="63" @@ -301,40 +308,35 @@ Maximum 200 per group daily Message: </text> <text_editor + follows="top|left|right" enabled="false" height="160" layout="topleft" - left="10" + left="0" + right="-1" max_length="511" name="view_message" - top_delta="-35" - width="285" + top_delta="-40" + width="313" word_wrap="true" /> <line_editor enabled="false" - height="16" + height="20" layout="topleft" - left_delta="0" + left="5" max_length="63" mouse_opaque="false" name="view_inventory_name" top_pad="8" - width="285" /> - <icon - height="16" - layout="topleft" - left_delta="0" - name="view_inv_icon" - top_delta="0" - width="16" /> + width="250"/> <button follows="left|top" height="23" - label="Open attachment" + label="Open Attachment" layout="topleft" - right="-10" + left="5" name="open_attachment" top_pad="5" - width="135" /> + width="180" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 5f6b670cd2..25a0213bde 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="552" + height="680" label="Members & Roles" layout="topleft" left="0" top="0" name="roles_tab" - width="310"> + width="313"> <panel.string name="default_needs_apply_text"> - There are unsaved changes to the current tab + There are unsaved changes </panel.string> <panel.string name="want_apply_text"> @@ -20,17 +20,18 @@ name="help_text" /> <tab_container border="false" - follows="left|top" + follows="left|top|right" height="552" halign="center" layout="topleft" left="0" + right="-1" name="roles_tab_container" tab_position="top" - tab_height="20" - tab_min_width="75" + tab_height="22" + tab_min_width="90" top="0" - width="310"> + width="313"> <panel border="false" follows="all" @@ -38,11 +39,11 @@ label="MEMBERS" layout="topleft" left="0" + right="-1" help_topic="roles_members_tab" name="members_sub_tab" tool_tip="Members" - class="panel_group_members_subtab" - width="310"> + class="panel_group_members_subtab"> <panel.string name="help_text"> You can add or remove Roles assigned to Members. @@ -65,24 +66,23 @@ clicking on their names. layout="topleft" top="5" left="5" - width="280" - height="20" - follows="top" - max_length="250" + right="-5" + height="22" + search_button_visible="false" + follows="left|top|right" label="Filter Members" name="filter_input" /> <name_list - column_padding="0" + column_padding="2" draw_heading="true" - heading_height="20" height="240" - follows="left|top" + follows="left|top|right" layout="topleft" left="0" + right="-1" multi_select="true" name="member_list" - top_pad="2" - width="300"> + top_pad="5"> <name_list.columns label="Member" name="name" @@ -94,33 +94,33 @@ clicking on their names. <name_list.columns label="Status" name="online" - relative_width="0.15" /> + relative_width="0.14" /> </name_list> <button - height="20" - follows="bottom|left" + height="23" + follows="top|left" label="Invite" - left="5" + left="0" name="member_invite" width="100" /> <button - height="20" + height="23" label="Eject" - left_pad="5" - right="-5" + follows="top|left" + left_pad="10" name="member_eject" width="100" /> </panel> <panel border="false" - height="230" + height="303" label="ROLES" layout="topleft" left="0" + right="-1" help_topic="roles_roles_tab" name="roles_sub_tab" - class="panel_group_roles_subtab" - width="310"> + class="panel_group_roles_subtab"> <!-- <button enabled="false" height="20" @@ -157,22 +157,23 @@ including the Everyone and Owner Roles. layout="topleft" top="5" left="5" - width="280" - height="20" + right="-5" + height="22" + search_button_visible="false" follows="left|top|right" - max_length="250" label="Filter Roles" name="filter_input" /> <scroll_list column_padding="0" draw_heading="true" draw_stripes="false" - follows="left|top" - heading_height="20" - height="170" + heading_height="23" + height="130" layout="topleft" search_column="1" left="0" + follows="left|top|right" + right="-1" name="role_list" top_pad="2" width="310"> @@ -190,28 +191,29 @@ including the Everyone and Owner Roles. relative_width="0.15" /> </scroll_list> <button - follows="bottom|left" - height="20" + follows="top|left" + height="23" label="New Role" layout="topleft" - left="5" + left="0" name="role_create" - width="100" /> + width="120" /> <button - height="20" + height="23" + follows="top|left" label="Delete Role" layout="topleft" - left_pad="5" - right="-5" + left_pad="10" name="role_delete" - width="100" /> + width="120" /> </panel> <panel border="false" - height="220" + height="303" label="ABILITIES" layout="topleft" left="0" + right="-1" help_topic="roles_actions_tab" name="actions_sub_tab" class="panel_group_actions_subtab" @@ -238,13 +240,12 @@ things in this group. There's a broad variety of Abilities. layout="topleft" top="5" left="5" - width="280" - height="20" + right="-5" + height="22" + search_button_visible="false" follows="left|top|right" - max_length="250" label="Filter Abilities" name="filter_input" /> - <scroll_list column_padding="0" draw_stripes="true" @@ -252,6 +253,7 @@ things in this group. There's a broad variety of Abilities. follows="left|top" layout="topleft" left="0" + right="-1" name="action_list" search_column="2" tool_tip="Select an Ability to view more details" @@ -273,35 +275,39 @@ things in this group. There's a broad variety of Abilities. </panel> </tab_container> <panel - height="252" + height="350" + background_visible="true" + bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" - follows="left|top" + follows="top|left|right" left="0" - mouse_opaque="false" + right="-1" + width="313" + mouse_opaque="false" name="members_footer" - top="300" - visible="false" - width="310"> + top="325" + visible="false"> <text type="string" - height="14" + height="16" layout="topleft" follows="left|top" - left="0" + left="5" + top="8" + text_color="EmphasisColor" name="static" - top_pad="5" width="300"> Assigned Roles </text> <scroll_list draw_stripes="true" - follows="left|top" - height="90" + follows="left|top|right" + height="150" layout="topleft" left="0" + right="-1" name="member_assigned_roles" - top_pad="0" - width="300"> + top_pad="0"> <scroll_list.columns label="" name="checkbox" @@ -311,27 +317,29 @@ things in this group. There's a broad variety of Abilities. name="role" width="270" /> </scroll_list> - <text + <text type="string" - height="14" + height="16" layout="topleft" follows="left|top" - left="0" - name="static2" + left="5" top_pad="5" + text_color="EmphasisColor" + name="static2" width="285"> Allowed Abilities </text> <scroll_list draw_stripes="true" - height="90" + follows="left|top|right" + height="150" layout="topleft" left="0" + right="-1" name="member_allowed_actions" search_column="2" tool_tip="For details of each allowed ability see the abilities tab" - top_pad="0" - width="300"> + top_pad="0"> <scroll_list.columns label="" name="icon" @@ -347,30 +355,37 @@ things in this group. There's a broad variety of Abilities. </scroll_list> </panel> <panel - height="297" + height="550" + background_visible="true" + bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" + follows="top|left|right" left="0" + right="-1" + width="313" + mouse_opaque="false" name="roles_footer" top_delta="0" - top="220" - visible="false" - width="310"> + top="209" + visible="false"> <text type="string" - height="14" + height="16" layout="topleft" - left="0" + follows="left|top" + left="5" + top="5" name="static" - top="0" width="300"> Role Name </text> <line_editor type="string" - follows="left|top" height="20" layout="topleft" left="0" + follows="left|top|right" + right="-1" max_length="295" name="role_name" top_pad="0" @@ -378,8 +393,10 @@ things in this group. There's a broad variety of Abilities. </line_editor> <text type="string" - height="14" + height="16" layout="topleft" + follows="left|top" + left="5" name="static3" top_pad="5" width="300"> @@ -387,19 +404,22 @@ things in this group. There's a broad variety of Abilities. </text> <line_editor type="string" - follows="left|top" height="20" layout="topleft" + left="0" + follows="left|top|right" + right="-1" max_length="295" name="role_title" top_pad="0" width="300"> </line_editor> - <text + <text type="string" - height="14" + height="16" layout="topleft" - left="0" + follows="left|top" + left="5" name="static2" top_pad="5" width="200"> @@ -407,11 +427,12 @@ things in this group. There's a broad variety of Abilities. </text> <text_editor type="string" - halign="left" - height="35" layout="topleft" left="0" + follows="left|top|right" + right="-1" max_length="295" + height="35" name="role_description" top_pad="0" width="300" @@ -419,10 +440,11 @@ things in this group. There's a broad variety of Abilities. </text_editor> <text type="string" - height="14" + height="16" layout="topleft" follows="left|top" - left="0" + left="5" + text_color="EmphasisColor" name="static4" top_pad="5" width="300"> @@ -430,15 +452,18 @@ things in this group. There's a broad variety of Abilities. </text> <name_list draw_stripes="true" - height="60" + height="128" layout="topleft" left="0" + follows="left|top|right" + right="-1" name="role_assigned_members" top_pad="0" width="300" /> <check_box height="15" label="Reveal members" + left="5" layout="topleft" name="role_visible_in_list" tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." @@ -446,20 +471,23 @@ things in this group. There's a broad variety of Abilities. width="300" /> <text type="string" - height="13" + height="16" layout="topleft" follows="left|top" - left="0" + left="5" + text_color="EmphasisColor" name="static5" - top_pad="5" + top_pad="2" width="300"> Allowed Abilities </text> <scroll_list draw_stripes="true" - height="60" + height="140" layout="topleft" left="0" + follows="left|top|right" + right="-1" name="role_allowed_actions" search_column="2" tool_tip="For details of each allowed ability see the abilities tab" @@ -480,14 +508,19 @@ things in this group. There's a broad variety of Abilities. </scroll_list> </panel> <panel - height="303" + height="424" + background_visible="true" + bg_alpha_color="FloaterUnfocusBorderColor" layout="topleft" + follows="top|left|right" left="0" + right="-1" + width="313" + mouse_opaque="false" name="actions_footer" top_delta="0" top="255" - visible="false" - width="310"> + visible="false"> <text_editor bg_readonly_color="Transparent" text_readonly_color="EmphasisColor" @@ -495,44 +528,54 @@ things in this group. There's a broad variety of Abilities. type="string" enabled="false" halign="left" - height="90" layout="topleft" + follows="left|top|right" + left="0" + right="-1" + height="90" max_length="512" name="action_description" - top_pad="0" - width="295" + top="0" word_wrap="true"> This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. </text_editor> <text type="string" - height="14" + height="16" layout="topleft" + follows="left|top" left="5" name="static2" - top_pad="5" + top_pad="1" width="300"> Roles with this ability </text> <scroll_list - height="65" + height="172" layout="topleft" + follows="left|top|right" left="5" + right="-1" name="action_roles" top_pad="0" width="300" /> <text type="string" - height="14" + height="16" layout="topleft" + follows="left|top" + left="5" name="static3" top_pad="5" width="300"> Members with this ability </text> <name_list - height="100" + height="122" + follows="left|top|right" layout="topleft" + left="5" + right="-1" name="action_members" top_pad="0" width="300" /> diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index 2e3d5a7320..c7e5b25e06 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -30,7 +30,7 @@ left="5" name="button_stack" orientation="vertical" - top_pad="0" + top_pad="-5" width="105"> <layout_panel mouse_opaque="false" @@ -55,7 +55,7 @@ user_resize="false"> <button follows="left|top|right" - height="20" + height="23" label="Profile" name="view_profile_btn" top="0" @@ -72,7 +72,7 @@ user_resize="false"> <button follows="left|top|right" - height="20" + height="23" label="Add Friend" name="add_friend_btn" top="5" @@ -90,9 +90,10 @@ <button auto_resize="false" follows="left|top|right" - height="20" + height="23" label="Teleport" name="teleport_btn" + tool_tip = "Offer to teleport this person" width="100" /> </layout_panel> <layout_panel @@ -107,7 +108,7 @@ <button auto_resize="true" follows="left|top|right" - height="20" + height="23" label="Share" name="share_btn" width="100" /> @@ -119,11 +120,28 @@ layout="topleft" min_height="25" width="100" + name="share_btn_panel" + user_resize="false"> + <button + auto_resize="true" + follows="left|top|right" + height="23" + label="Pay" + name="pay_btn" + width="100" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="100" name="call_btn_panel" user_resize="false"> <button follows="left|top|right" - height="20" + height="23" label="Call" name="call_btn" width="100" /> @@ -140,7 +158,7 @@ visible="false"> <button follows="left|top|right" - height="20" + height="23" label="Leave Call" name="end_call_btn" width="100" /> @@ -157,7 +175,7 @@ visible="false"> <button follows="left|top|right" - height="20" + height="23" label="Voice Controls" name="voice_ctrls_btn" width="100" /> diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml index 5a1bc32db0..a0ad38cf76 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -45,6 +45,17 @@ name="group_icon" top="3" width="18" /> + <avatar_icon + color="Green" + follows="right" + height="18" + image_name="Generic_Person" + layout="topleft" + left="3" + mouse_opaque="false" + name="adhoc_icon" + top="3" + width="18" /> <!--<icon follows="right" height="20" diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 039e1ae086..91d4cd6e83 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -38,7 +38,7 @@ <accordion_tab layout="topleft" name="tab_landmarks" - title="Landmarks"> + title="My Landmarks"> <places_inventory_panel allow_multi_select="true" border="false" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 4657d39a0f..627e616af5 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -118,15 +118,27 @@ control_name="RememberPassword" follows="left|bottom" font="SansSerifSmall" height="16" -label="Remember" +label="Remember password" top_pad="3" name="remember_check" width="135" /> +<button + follows="left|bottom" + height="23" + image_unselected="PushButton_On" + image_selected="PushButton_On_Selected" + label="Log In" + label_color="White" + layout="topleft" + left_pad="10" + name="connect_btn" + top="35" + width="90" /> <text follows="left|bottom" font="SansSerifSmall" height="15" - left_pad="8" + left_pad="18" name="start_location_text" top="20" width="130"> @@ -163,18 +175,6 @@ top_pad="2" name="server_combo" width="135" visible="false" /> -<button - follows="left|bottom" - height="23" - image_unselected="PushButton_On" - image_selected="PushButton_On_Selected" - label="Log In" - label_color="White" - layout="topleft" - left_pad="15" - name="connect_btn" - top="35" - width="90" /> </layout_panel> <layout_panel follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml index e779e37419..a30d80f101 100644 --- a/indra/newview/skins/default/xui/en/panel_me.xml +++ b/indra/newview/skins/default/xui/en/panel_me.xml @@ -4,7 +4,7 @@ border="false" follows="all" height="570" - label="My Profile" + label="My Profile!!!!!" layout="topleft" left="0" name="panel_me" @@ -29,23 +29,23 @@ height="570" halign="center" layout="topleft" - left="10" + left="6" name="tabs" tab_min_width="95" tab_height="30" tab_position="top" top_pad="10" - width="313"> + width="315"> <panel class="panel_my_profile" filename="panel_my_profile.xml" - label="PROFILE" + label="MY PROFILE" help_topic="panel_my_profile_tab" name="panel_profile" /> <panel class="panel_picks" filename="panel_picks.xml" - label="PICKS" + label="MY PICKS" help_topic="panel_my_picks_tab" name="panel_picks" /> </tab_container> diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml index 4164ce73dd..d519569543 100644 --- a/indra/newview/skins/default/xui/en/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="500" + height="535" label="Profile" layout="topleft" left="0" name="panel_profile" top="0" - width="313"> + width="315"> <string name="CaptionTextAcctInfo"> [ACCTTYPE] @@ -41,8 +41,8 @@ layout="topleft" left="0" top="0" - height="480" - width="313" + height="522" + width="315" border_size="0"> <layout_panel name="profile_stack" @@ -50,9 +50,9 @@ layout="topleft" top="0" left="0" - height="480" + height="492" user_resize="false" - width="313"> + width="315"> <scroll_container color="DkGray2" follows="all" @@ -60,13 +60,13 @@ left="0" name="profile_scroll" opaque="true" - height="480" - width="313" + height="492" + width="315" top="0"> <panel layout="topleft" follows="left|top|right" - height="505" + height="492" name="scroll_content_panel" top="0" left="0" @@ -84,9 +84,9 @@ default_image_name="None" enabled="false" follows="top|left" - height="117" + height="124" layout="topleft" - left="0" + left="3" name="2nd_life_pic" top="10" width="102" /> @@ -96,7 +96,7 @@ layout="topleft" name="2nd_life_edit_icon" label="" - left="0" + left="3" tool_tip="Click the Edit Profile button below to change image" top="10" width="102" /> @@ -130,7 +130,7 @@ follows="left|top|right" height="117" layout="topleft" - top_pad="10" + top_pad="0" left="10" name="first_life_image_panel" width="297"> @@ -139,9 +139,9 @@ default_image_name="None" enabled="false" follows="top|left" - height="117" + height="124" layout="topleft" - left="0" + left="3" name="real_world_pic" width="102" /> <icon @@ -150,7 +150,7 @@ layout="topleft" name="real_world_edit_icon" label="" - left="0" + left="3" tool_tip="Click the Edit Profile button below to change image" top="4" width="102" /> @@ -206,13 +206,18 @@ top_pad="10" value="Resident Since:" width="300" /> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top" + h_pad="0" height="15" layout="topleft" left="10" name="register_date" + read_only="true" translate="false" + v_pad="0" value="05/31/2376" width="300" word_wrap="true" /> @@ -238,19 +243,24 @@ top_delta="0" value="Go to Dashboard" width="100"/> --> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top" + h_pad="0" height="28" layout="topleft" left="10" name="acc_status_text" + read_only="true" top_pad="0" translate="false" + v_pad="0" width="300" word_wrap="true"> Resident. No payment info on file. Linden. - </text> + </text_editor> <text follows="left|top" font.style="BOLD" @@ -299,7 +309,7 @@ layout="topleft" left="7" name="sl_groups" - top_pad="0" + top_pad="0" translate="false" width="298" expanded_bg_visible="true" @@ -379,23 +389,20 @@ <button follows="bottom|right" height="23" - left="20" + left="4" top="5" label="Edit Profile" - layout="topleft" name="edit_profile_btn" tool_tip="Edit your personal information" - width="130" /> + width="152" /> <button follows="bottom|right" height="23" label="Edit Appearance" - left_pad="10" - layout="topleft" + left_pad="4" name="edit_appearance_btn" - top="5" tool_tip="Create/edit your appearance: physical data, clothes and etc." - width="130" /> + width="152" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index baa6c2e51f..b2ed51abf3 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -39,8 +39,9 @@ layout="topleft" name="navigation_panel" width="600"> - <button + <pull_button follows="left|top" + direction="down" height="23" image_overlay="Arrow_Left_Off" layout="topleft" @@ -49,8 +50,9 @@ tool_tip="Go back to previous location" top="2" width="31" /> - <button + <pull_button follows="left|top" + direction="down" height="23" image_overlay="Arrow_Right_Off" layout="topleft" @@ -143,7 +145,21 @@ name="favorite" image_drag_indication="Accordion_ArrowOpened_Off" bottom="55" - width="590"> + tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!" + width="590"> + <label + follows="left|top" + font.style="BOLD" + height="15" + layout="topleft" + left="10" + name="favorites_bar_label" + text_color="LtGray" + tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!" + top="12" + width="102"> + Favorites Bar + </label> <chevron_button name=">>" image_unselected="TabIcon_Close_Off" image_selected="TabIcon_Close_Off" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index da3a2274c9..447ac1b123 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -24,9 +24,6 @@ background_visible="true" name="no_friends" value="No friends" /> <string - name="no_groups" - value="No groups" /> - <string name="people_filter_label" value="Filter People" /> <string @@ -47,7 +44,7 @@ background_visible="true" follows="all" height="500" layout="topleft" - left="10" + left="6" name="tabs" tab_min_width="70" tab_height="30" @@ -116,7 +113,7 @@ background_visible="true" <panel follows="all" height="500" - label="FRIENDS" + label="MY FRIENDS" layout="topleft" left="0" help_topic="people_friends_tab" @@ -140,6 +137,7 @@ background_visible="true" <avatar_list allow_select="true" follows="all" + height="235" layout="topleft" left="0" multi_select="true" @@ -155,6 +153,7 @@ background_visible="true" <avatar_list allow_select="true" follows="all" + height="235" layout="topleft" left="0" multi_select="true" @@ -163,6 +162,17 @@ background_visible="true" width="313" /> </accordion_tab> </accordion> + <text + follows="all" + height="450" + left="10" + name="no_friends_msg" + top="10" + width="293" + wrap="true"> + To add friends try [secondlife:///app/search/people global search] or click on a user to add them as a friend. +If you're looking for people to hang out with, [secondlife:///app/worldmap try the Map]. + </text> <panel follows="left|right|bottom" height="30" @@ -213,7 +223,7 @@ background_visible="true" <panel follows="all" height="500" - label="GROUPS" + label="MY GROUPS" layout="topleft" left="0" help_topic="people_groups_tab" @@ -226,6 +236,8 @@ background_visible="true" layout="topleft" left="0" name="group_list" + no_filtered_groups_msg="No groups" + no_groups_msg="[secondlife:///app/search/groups Trying searching for some groups to join.]" top="0" width="313" /> <panel diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index 7489988722..375f369ba7 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -61,8 +61,11 @@ name="pick_snapshot" top="20" width="280" /> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top|right" + h_pad="0" height="35" width="280" layout="topleft" @@ -71,17 +74,24 @@ left="10" top_pad="10" name="pick_name" + read_only="true" text_color="white" + v_pad="0" value="[name]" use_ellipses="true" /> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top|right" + h_pad="0" height="25" layout="topleft" left="10" name="pick_location" + read_only="true" width="280" word_wrap="true" + v_pad="0" value="[loading...]" /> <text_editor bg_readonly_color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml index 023b1fc81d..e62c1278f9 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml @@ -64,6 +64,7 @@ layout="topleft" left="103" name="picture_descr" + textbox.mouse_opaque="false" top_pad="0" width="178" word_wrap="true" /> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 9bfd8b91d8..c4e4b9aa9b 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -17,12 +17,13 @@ background_visible="true" name="teleport_history_tab_title" value="TELEPORT HISTORY" /> <filter_editor + text_pad_left="14" follows="left|top|right" - font="SansSerif" + font="SansSerifSmall" height="23" layout="topleft" left="15" - label="Filter Places" + label="Filter My Places" max_length="300" name="Filter" top="3" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 141678f7eb..05a3771edf 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> - <panel border="true" - follows="left|top|right|bottom" + follows="all" height="408" + label="Advanced" layout="topleft" left="102" name="advanced" @@ -13,130 +13,29 @@ name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <check_box - control_name="UseChatBubbles" - follows="left|top" - height="16" - label="Bubble chat" - layout="topleft" - left="30" - top="10" - name="bubble_text_chat" - width="150" /> - <color_swatch - can_apply_immediately="true" - color="0 0 0 1" - control_name="BackgroundChatColor" - follows="left|top" - height="47" - layout="topleft" - left_delta="280" - name="background" - tool_tip="Choose color for bubble chat" - top_delta="1" - width="44"> - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="BackgroundChatColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="BackgroundChatColor" /> - </color_swatch> - <slider - control_name="ChatBubbleOpacity" - follows="left|top" - height="16" - increment="0.05" - initial_value="1" - label="Opacity" - layout="topleft" - left_delta="-230" - top_pad="-28" - label_width="50" - name="bubble_chat_opacity" - width="200" /> - <text - follows="left|top" - type="string" - length="1" - height="25" - layout="topleft" - left="30" - top_pad="5" - name="AspectRatioLabel1" - tool_tip="width / height" - label_width="50" - width="120"> - Aspect ratio - </text> - <combo_box - allow_text_entry="true" - height="23" - follows="left|top" - layout="topleft" - left_pad="0" - max_chars="100" - name="aspect_ratio" - tool_tip="width / height" - top_delta="0" - width="150"> - <combo_box.item - enabled="true" - label=" 4:3 (Standard CRT)" - name="item1" - value="1.333333" /> - <combo_box.item - enabled="true" - label=" 5:4 (1280x1024 LCD)" - name="item2" - value="1.25" /> - <combo_box.item - enabled="true" - label=" 8:5 (Widescreen)" - name="item3" - value="1.6" /> - <combo_box.item - enabled="true" - label=" 16:9 (Widescreen)" - name="item4" - value="1.7777777" /> - </combo_box> - <check_box - control_name="FullScreenAutoDetectAspectRatio" - follows="left|top" - height="25" - label="Auto-detect" - layout="topleft" - left_pad="10" - name="aspect_auto_detect" - width="256"> - <check_box.commit_callback - function="Pref.AutoDetectAspect" /> - </check_box> - <text - follows="left|top" - type="string" - length="1" - height="10" - left="30" - name="heading1" - top_pad="5" - width="270"> -Camera: - </text> + <icon + follows="left|top" + height="18" + image_name="Cam_FreeCam_Off" + layout="topleft" + name="camera_icon" + mouse_opaque="false" + visible="true" + width="18" + left="30" + top="10"/> <slider can_edit_text="true" - control_name="CameraAngle" + control_name="CameraAngle" decimal_digits="2" - top_pad="5" follows="left|top" height="16" increment="0.025" initial_value="1.57" layout="topleft" label_width="100" - label="View Angle" - left_delta="50" + label="View angle" + left_pad="30" max_val="2.97" min_val="0.17" name="camera_fov" @@ -165,11 +64,11 @@ Camera: type="string" length="1" height="10" - left="30" + left="80" name="heading2" width="270" top_pad="5"> -Automatic positioning for: +Automatic position for: </text> <check_box control_name="EditCameraMovement" @@ -177,7 +76,7 @@ Automatic positioning for: follows="left|top" label="Build/Edit" layout="topleft" - left_delta="50" + left_delta="30" name="edit_camera_movement" tool_tip="Use automatic camera positioning when entering and exiting edit mode" width="280" @@ -191,27 +90,27 @@ Automatic positioning for: name="appearance_camera_movement" tool_tip="Use automatic camera positioning while in edit mode" width="242" /> - <text - follows="left|top" - type="string" - length="1" - height="10" - left="30" - name="heading3" - top_pad="5" - width="270"> -Avatars: - </text> + <icon + follows="left|top" + height="18" + image_name="Move_Walk_Off" + layout="topleft" + name="avatar_icon" + mouse_opaque="false" + visible="true" + width="18" + top_pad="2" + left="30" + /> <check_box control_name="FirstPersonAvatarVisible" follows="left|top" height="20" label="Show me in Mouselook" layout="topleft" - left_delta="50" + left_pad="30" name="first_person_avatar_visible" - width="256" - top_pad="0"/> + width="256" /> <check_box control_name="ArrowKeysAlwaysMove" follows="left|top" @@ -242,22 +141,61 @@ Avatars: name="enable_lip_sync" width="237" top_pad="0" /> + <check_box + control_name="UseChatBubbles" + follows="left|top" + height="16" + label="Bubble chat" + layout="topleft" + left="78" + top_pad="6" + name="bubble_text_chat" + width="150" /> + <slider + control_name="ChatBubbleOpacity" + follows="left|top" + height="16" + increment="0.05" + initial_value="1" + label="Opacity" + layout="topleft" + left="80" + label_width="50" + name="bubble_chat_opacity" + width="200" /> + <color_swatch + can_apply_immediately="true" + color="0 0 0 1" + control_name="BackgroundChatColor" + follows="left|top" + height="50" + layout="topleft" + left_pad="10" + name="background" + tool_tip="Choose color for bubble chat" + width="38"> + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="BackgroundChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="BackgroundChatColor" /> + </color_swatch> <check_box control_name="ShowScriptErrors" follows="left|top" height="20" - label="Show script errors" + label="Show script errors in:" layout="topleft" left="30" name="show_script_errors" - width="256" - top_pad="5"/> + width="256" /> <radio_group enabled_control="ShowScriptErrors" control_name="ShowScriptErrorsLocation" follows="top|left" draw_border="false" - height="40" + height="16" layout="topleft" left_delta="50" name="show_location" @@ -265,7 +203,7 @@ Avatars: width="364"> <radio_item height="16" - label="In chat" + label="Nearby chat" layout="topleft" left="3" name="0" @@ -273,7 +211,7 @@ Avatars: width="315" /> <radio_item height="16" - label="In a window" + label="Separate window" layout="topleft" left_delta="175" name="1" @@ -284,49 +222,47 @@ Avatars: follows="top|left" enabled_control="EnableVoiceChat" control_name="PushToTalkToggle" - height="20" - label="Toggle mode for microphone when I press the Speak trigger key:" + height="15" + label="Toggle speak on/off when I press:" layout="topleft" left="30" name="push_to_talk_toggle_check" width="237" - top_pad="-25" tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/> <line_editor follows="top|left" control_name="PushToTalkButton" - enabled="false" + enabled="false" enabled_control="EnableVoiceChat" - height="19" - left_delta="50" - max_length="254" + height="23" + left="80" + max_length="200" name="modifier_combo" label="Push-to-Speak trigger" - top_pad="0" - width="280" /> + top_pad="5" + width="200" /> <button follows="top|left" enabled_control="EnableVoiceChat" height="23" label="Set Key" - left_delta="0" + left_pad="5" name="set_voice_hotkey_button" - width="115" - top_pad="5"> + width="100"> <button.commit_callback function="Pref.VoiceSetKey" /> </button> <button - bottom_delta="0" enabled_control="EnableVoiceChat" - follows="left" + follows="top|left" halign="center" height="23" - label="Middle Mouse Button" - left_delta="120" + image_overlay="Refresh_Off" + tool_tip="Reset to Middle Mouse Button" mouse_opaque="true" name="set_voice_middlemouse_button" - width="160"> + left_pad="5" + width="25"> <button.commit_callback function="Pref.VoiceSetMiddleMouse" /> </button> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index ace8281b4e..188fd3b7bc 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="true" - height="500" + height="408" label="Popups" layout="topleft" left="0" @@ -14,7 +14,7 @@ follows="top|left" height="12" layout="topleft" - left="30" + left="10" name="tell_me_label" top="10" width="300"> @@ -32,7 +32,7 @@ <check_box control_name="ChatOnlineNotification" height="16" - label="When my friends log out or in" + label="When my friends log in or out" layout="topleft" left_delta="0" name="friends_online_notify_checkbox" @@ -42,38 +42,33 @@ type="string" length="1" follows="top|left" - font="SansSerifBold" height="12" layout="topleft" - left="30" + left="10" name="show_label" - top_pad="14" + top_pad="8" width="450"> - Always show these notifications: + Always show: </text> <scroll_list follows="top|left" - height="92" + height="140" layout="topleft" left="10" - multi_select="true" + multi_select="true" name="enabled_popups" width="475" /> <button enabled_control="FirstSelectedDisabledPopups" follows="top|left" height="23" - image_disabled="PushButton_Disabled" - image_disabled_selected="PushButton_Disabled" image_overlay="Arrow_Up" - image_selected="PushButton_Selected" - image_unselected="PushButton_Off" hover_glow_amount="0.15" layout="topleft" - left_delta="137" + left="180" name="enable_this_popup" - top_pad="10" - width="43"> + top_pad="5" + width="40"> <button.commit_callback function="Pref.ClickEnablePopup" /> </button> @@ -81,17 +76,13 @@ enabled_control="FirstSelectedEnabledPopups" follows="top|left" height="23" - image_disabled="PushButton_Disabled" - image_disabled_selected="PushButton_Disabled" image_overlay="Arrow_Down" - image_selected="PushButton_Selected" - image_unselected="PushButton_Off" hover_glow_amount="0.15" layout="topleft" - left_pad="50" + left_pad="40" name="disable_this_popup" top_delta="0" - width="43"> + width="40"> <button.commit_callback function="Pref.ClickDisablePopup" /> </button> @@ -99,21 +90,20 @@ type="string" length="1" follows="top|left" - font="SansSerifBold" height="12" layout="topleft" - left="30" + left="10" name="dont_show_label" - top_pad="10" + top_pad="-10" width="450"> - Never show these notifications: + Never show: </text> <scroll_list follows="top|left" - height="92" + height="140" layout="topleft" left="10" - multi_select="true" + multi_select="true" name="disabled_popups" width="475" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 6e0b94ac2b..433dfc17fe 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -23,7 +23,7 @@ layout="topleft" left="0" name="radio" - value="0" + value="0" top="10" width="125" /> <radio_item @@ -32,7 +32,7 @@ layout="topleft" left_delta="145" name="radio2" - value="1" + value="1" top_delta="0" width="125" /> <radio_item @@ -41,7 +41,7 @@ layout="topleft" left_delta="170" name="radio3" - value="2" + value="2" top_delta="0" width="125" /> </radio_group> @@ -105,7 +105,7 @@ </text> <color_swatch can_apply_immediately="true" - color="0.6 0.6 1 1" + color="LtGray" follows="left|top" height="47" label_width="60" @@ -136,7 +136,7 @@ </text> <color_swatch can_apply_immediately="true" - color="0.8 1 1 1" + color="LtGray" follows="left|top" height="47" label_width="44" @@ -167,7 +167,7 @@ </text> <color_swatch can_apply_immediately="true" - color="0.82 0.82 0.99 1" + color="Red" follows="left|top" height="47" layout="topleft" @@ -197,7 +197,7 @@ </text> <color_swatch can_apply_immediately="true" - color="0.7 0.9 0.7 1" + color="EmphasisColor_35" follows="left|top" height="47" layout="topleft" @@ -227,7 +227,7 @@ </text> <color_swatch can_apply_immediately="true" - color="0.7 0.9 0.7 1" + color="LtYellow" follows="left|top" height="47" layout="topleft" @@ -257,7 +257,7 @@ </text> <color_swatch can_apply_immediately="true" - color="0.6 0.6 1 1" + color="EmphasisColor" follows="left|top" height="47" layout="topleft" @@ -316,22 +316,30 @@ <text left="30" height="20" - width="300" + width="120" top_pad="20"> - Show IMs in: (Requires restart) + Show IMs in: </text> + <text + left_pad="6" + height="20" + width="100" + text_color="White_25" + > + (requires restart) + </text> <radio_group height="30" layout="topleft" - left_delta="30" + left="30" control_name="ChatWindow" name="chat_window" top_pad="0" - tool_tip="Show your Instant Messages in separate windows, or in one window with many tabs (Requires restart)" + tool_tip="Show your Instant Messages in separate floaters, or in one floater with many tabs (Requires restart)" width="331"> <radio_item height="16" - label="Multiple windows" + label="Separate windows" layout="topleft" left="0" name="radio" @@ -340,7 +348,7 @@ width="150" /> <radio_item height="16" - label="One window" + label="Tabs" layout="topleft" left_delta="0" name="radio2" 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 22c75a595e..099c789e4b 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -89,11 +89,12 @@ <text font="SansSerifSmall" type="string" + text_color="White_50" length="1" follows="left|top" height="18" layout="topleft" - left_pad="5" + left_pad="10" name="language_textbox2" width="200"> (Requires restart) @@ -179,7 +180,7 @@ left_pad="5" name="show_location_checkbox" top_delta="5" - width="256" /> + width="256" /> <text type="string" length="1" @@ -203,21 +204,21 @@ layout="topleft" name="radio" value="0" - width="100" /> + width="75" /> <radio_item label="On" layout="topleft" left_pad="12" name="radio2" value="1" - width="100" /> + width="75" /> <radio_item label="Show briefly" layout="topleft" left_pad="12" name="radio3" - value="2" - width="100" /> + value="2" + width="160" /> </radio_group> <check_box enabled_control="AvatarNameTagMode" @@ -323,11 +324,10 @@ follows="left|top" height="13" layout="topleft" - text_color="white" left="30" mouse_opaque="false" name="text_box3" - top_pad="15" + top_pad="10" width="240"> Busy mode response: </text> @@ -336,18 +336,16 @@ text_readonly_color="LabelDisabledColor" bg_writeable_color="LtGray" use_ellipses="false" - bg_visible="true" - border_visible="true" hover="false" commit_on_focus_lost = "true" follows="left|top" - height="50" + height="60" layout="topleft" left="50" name="busy_response" - width="400" + width="440" word_wrap="true"> log_in_to_change </text_editor> - + </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index d8e3f4ccfb..8bff865eb1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -33,16 +33,15 @@ <button control_name="MuteAudio" follows="top|right" - height="18" - image_selected="Parcel_VoiceNo_Dark" - image_unselected="Parcel_Voice_Dark" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" + left_pad="10" name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <check_box control_name="MuteWhenMinimized" height="15" @@ -74,20 +73,19 @@ function="Pref.setControlFalse" parameter="MuteAmbient" /> </slider> - <button - control_name="MuteAmbient" + <button + control_name="MuteAmbient" disabled_control="MuteAudio" follows="top|right" - height="18" - image_selected="Parcel_VoiceNo_Dark" - image_unselected="Parcel_Voice_Dark" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_wind" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <slider control_name="AudioLevelUI" disabled_control="MuteAudio" @@ -113,16 +111,15 @@ control_name="MuteUI" disabled_control="MuteAudio" follows="top|right" - height="18" - image_selected="Parcel_VoiceNo_Dark" - image_unselected="Parcel_Voice_Dark" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_ui" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <slider control_name="AudioLevelMedia" disabled_control="MuteAudio" @@ -144,20 +141,19 @@ function="Pref.setControlFalse" parameter="MuteMedia" /> </slider> - <button + <button control_name="MuteMedia" disabled_control="MuteAudio" follows="top|right" - height="18" - image_selected="Parcel_VoiceNo_Dark" - image_unselected="Parcel_Voice_Dark" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_media" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <slider control_name="AudioLevelSFX" disabled_control="MuteAudio" @@ -179,20 +175,19 @@ function="Pref.setControlFalse" parameter="MuteSounds" /> </slider> - <button + <button control_name="MuteSounds" disabled_control="MuteAudio" follows="top|right" - height="18" - image_selected="Parcel_VoiceNo_Dark" - image_unselected="Parcel_Voice_Dark" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_sfx" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <slider control_name="AudioLevelMusic" disabled_control="MuteAudio" @@ -214,20 +209,19 @@ function="Pref.setControlFalse" parameter="MuteMusic" /> </slider> - <button + <button control_name="MuteMusic" disabled_control="MuteAudio" follows="top|right" - height="18" - image_selected="Parcel_VoiceNo_Dark" - image_unselected="Parcel_Voice_Dark" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_music" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <check_box label_text.halign="left" follows="left|top" @@ -264,21 +258,19 @@ function="Pref.setControlFalse" parameter="MuteVoice" /> </slider> - <button + <button control_name="MuteVoice" - enabled_control="EnableVoiceChat" disabled_control="MuteAudio" follows="top|right" - height="18" - image_selected="Parcel_VoiceNo_Dark" - image_unselected="Parcel_Voice_Dark" + height="16" + image_selected="AudioMute_Off" + image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_voice" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 1f0ace5843..351df22042 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -7,7 +7,7 @@ left="0" name="panel_profile" top="0" - width="313"> + width="317"> <string name="CaptionTextAcctInfo"> [ACCTTYPE] @@ -41,8 +41,8 @@ layout="topleft" left="0" top="0" - height="517" - width="313" + height="524" + width="317" border_size="0"> <layout_panel name="profile_stack" @@ -50,8 +50,8 @@ layout="topleft" top="0" left="0" - height="505" - width="313"> + height="524" + width="317"> <scroll_container color="DkGray2" follows="all" @@ -59,8 +59,8 @@ left="0" name="profile_scroll" opaque="true" - height="505" - width="313" + height="524" + width="317" top="0"> <panel layout="topleft" @@ -73,9 +73,9 @@ width="297"> <panel follows="left|top|right" - height="117" + height="124" layout="topleft" - left="10" + left="13" name="second_life_image_panel" top="0" width="297"> @@ -84,7 +84,7 @@ default_image_name="None" enabled="false" follows="top|left" - height="117" + height="124" layout="topleft" left="0" name="2nd_life_pic" @@ -103,7 +103,7 @@ width="180" /> <expandable_text follows="left|top|right" - height="95" + height="97" layout="topleft" left="107" textbox.max_length="512" @@ -118,10 +118,10 @@ </panel> <panel follows="left|top|right" - height="117" + height="124" layout="topleft" - top_pad="10" - left="10" + top_pad="0" + left="13" name="first_life_image_panel" width="297"> <texture_picker @@ -129,7 +129,7 @@ default_image_name="None" enabled="false" follows="top|left" - height="117" + height="124" layout="topleft" left="0" name="real_world_pic" @@ -147,7 +147,7 @@ width="180" /> <expandable_text follows="left|top|right" - height="95" + height="97" layout="topleft" left="107" textbox.max_length="512" @@ -173,8 +173,7 @@ value="http://librarianavengers.org" width="300" word_wrap="false" - use_ellipses="true" - /> + use_ellipses="true" /> <text follows="left|top" font.style="BOLD" @@ -186,13 +185,18 @@ top_pad="10" value="Resident Since:" width="300" /> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top" + h_pad="0" height="15" layout="topleft" left="10" name="register_date" + read_only="true" translate="false" + v_pad="0" value="05/31/2376" width="300" word_wrap="true" /> @@ -218,19 +222,24 @@ top_delta="0" value="Go to Dashboard" width="100"/> --> - <text + <text_editor + allow_scroll="false" + bg_visible="false" follows="left|top" + h_pad="0" height="28" layout="topleft" left="10" name="acc_status_text" + read_only="true" top_pad="0" translate="false" + v_pad="0" width="300" word_wrap="true"> Resident. No payment info on file. Linden. - </text> + </text_editor> <text follows="left|top" font.style="BOLD" @@ -295,13 +304,13 @@ layout="topleft" name="profile_buttons_panel" auto_resize="false" - width="313"> + width="317"> <button follows="bottom|left" height="23" label="Add Friend" layout="topleft" - left="0" + left="2" mouse_opaque="false" name="add_friend" tool_tip="Offer friendship to the Resident" @@ -316,7 +325,7 @@ tool_tip="Open instant message session" top="5" left_pad="3" - width="45" /> + width="39" /> <button follows="bottom|left" height="23" @@ -326,7 +335,7 @@ tool_tip="Call this Resident" left_pad="3" top="5" - width="45" /> + width="43" /> <button enabled="false" follows="bottom|left" @@ -337,7 +346,7 @@ tool_tip="Show the Resident on the map" top="5" left_pad="3" - width="45" /> + width="41" /> <button follows="bottom|left" height="23" @@ -347,8 +356,8 @@ tool_tip="Offer teleport" left_pad="3" top="5" - width="85" /> - <!-- <button + width="69" /> + <button follows="bottom|right" height="23" label="▼" @@ -357,8 +366,8 @@ tool_tip="Pay money to or share inventory with the Resident" right="-1" top="5" - left_pad="3" - width="23" />--> + left_pad="3" + width="23" /> </layout_panel> <layout_panel follows="bottom|left" diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index d46e1f9852..f5396951ca 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -54,14 +54,14 @@ height="535" halign="center" layout="topleft" - left="10" + left="5" min_width="333" name="tabs" tab_min_width="80" tab_height="30" tab_position="top" top_pad="5" - width="313"> + width="317"> <panel class="panel_profile" filename="panel_profile.xml" diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index 765e2ae623..d14355b9f4 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -2,13 +2,12 @@ <panel bevel_style="none" border_style="line" - bottom="550" follows="left|top|right|bottom" - height="508" + height="522" layout="topleft" left="0" name="script panel" - width="500"> + width="497"> <panel.string name="loading"> Loading... @@ -29,71 +28,17 @@ name="Title"> Script: [NAME] </panel.string> - <text_editor - type="string" - length="1" - bottom="393" - follows="left|top|right|bottom" - font="Monospace" - height="376" - ignore_tab="false" - layout="topleft" - left="4" - max_length="65536" - name="Script Editor" - width="492" - show_line_numbers="true" - handle_edit_keys_directly="true" - word_wrap="true"> - Loading... - </text_editor> - <button - bottom="499" - follows="right|bottom" - height="20" - label="Save" - label_selected="Save" - layout="topleft" - left="360" - name="Save_btn" - width="128" /> - <scroll_list - bottom="457" - follows="left|right|bottom" - height="60" - layout="topleft" - left="4" - name="lsl errors" - width="492" /> - <combo_box - bottom="499" - follows="left|bottom" - height="20" - label="Insert..." - layout="topleft" - left="12" - name="Insert..." - width="128" /> - <text - bottom="473" - follows="left|bottom" - height="12" - layout="topleft" - left="12" - name="line_col" - width="128" /> <menu_bar bg_visible="false" - bottom="18" - follows="left|top|right" + follows="left|top" height="18" layout="topleft" - left="8" + left="0" mouse_opaque="false" name="script_menu" width="476"> <menu - bottom="18" + top="0" height="62" label="File" layout="topleft" @@ -113,11 +58,10 @@ name="Revert All Changes" /> </menu> <menu - bottom="-647" + top="0" height="198" label="Edit" layout="topleft" - left="222" mouse_opaque="false" name="Edit" width="139"> @@ -169,11 +113,10 @@ name="Search / Replace..." /> </menu> <menu - bottom="18" + top="0" height="34" label="Help" layout="topleft" - left="0" mouse_opaque="false" name="Help" width="112"> @@ -187,4 +130,53 @@ name="Keyword Help..." /> </menu> </menu_bar> + <text_editor + left="0" + type="string" + length="1" + follows="left|top|right|bottom" + font="Monospace" + height="376" + ignore_tab="false" + layout="topleft" + max_length="65536" + name="Script Editor" + width="487" + show_line_numbers="true" + handle_edit_keys_directly="true" + word_wrap="true"> + Loading... + </text_editor> + <scroll_list + top_pad="10" + left="0" + follows="left|right|bottom" + height="60" + layout="topleft" + name="lsl errors" + width="487" /> + <text + follows="left|bottom" + height="12" + layout="topleft" + left="0" + name="line_col" + width="128" /> + <combo_box + follows="left|bottom" + height="23" + label="Insert..." + layout="topleft" + name="Insert..." + width="128" /> + <button + follows="right|bottom" + height="23" + label="Save" + label_selected="Save" + layout="topleft" + top_pad="-35" + right="487" + name="Save_btn" + width="61" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml index d98f690339..629d8567d1 100644 --- a/indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml +++ b/indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml @@ -9,7 +9,44 @@ name="script_limits_my_avatar_panel" top="0" width="480"> - <text + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="script_memory" + top_pad="24" + text_color="White" + width="480"> + Avatar Script Usage + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="30" + name="memory_used" + top_delta="18" + width="480"> + + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="30" + name="urls_used" + top_delta="18" + width="480"> + + </text> + <text type="string" length="1" follows="left|top" @@ -17,7 +54,7 @@ layout="topleft" left="10" name="loading_text" - top="10" + top="80" text_color="EmphasisColor" width="480"> Loading... @@ -25,12 +62,12 @@ <scroll_list draw_heading="true" follows="all" - height="500" + height="415" layout="topleft" left_delta="0" multi_select="true" name="scripts_list" - top_delta="17" + top="100" width="460"> <scroll_list.columns label="Size (kb)" diff --git a/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml index 0fa3c1cf2e..9dff00fa0b 100644 --- a/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml +++ b/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml @@ -33,7 +33,7 @@ top_delta="18" visible="true" width="480"> - Parcels Owned: + </text> <text type="string" @@ -45,7 +45,19 @@ name="memory_used" top_delta="18" width="480"> - Memory used: + </text> + + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="30" + name="urls_used" + top_delta="18" + width="480"> + </text> <text type="string" @@ -55,7 +67,7 @@ layout="topleft" left="10" name="loading_text" - top_delta="32" + top_delta="12" text_color="EmphasisColor" width="480"> Loading... @@ -73,7 +85,11 @@ <scroll_list.columns label="Size (kb)" name="size" - width="70" /> + width="72" /> + <scroll_list.columns + label="URLs" + name="urls" + width="48" /> <scroll_list.columns label="Object Name" name="name" @@ -83,11 +99,13 @@ name="owner" width="100" /> <scroll_list.columns - label="Parcel / Location" - name="location" + label="Parcel" + name="parcel" width="130" /> -<!-- <scroll_list.commit_callback - function="TopObjects.CommitObjectsList" />--> + <scroll_list.columns + label="Location" + name="location" + width="80" /> </scroll_list> <button follows="bottom|left" @@ -102,8 +120,8 @@ <button follows="bottom|right" height="19" - visible="false" label="Highlight" + visible="false" layout="bottomright" left="370" name="highlight_btn" @@ -112,8 +130,8 @@ <button follows="bottom|right" height="19" - visible="false" label="Return" + visible="false" layout="bottomright" name="return_btn" top="34" diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index 3f836a661d..eb95de3a7c 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -91,7 +91,7 @@ class="panel_group_info_sidetray" name="panel_group_info_sidetray" filename="panel_group_info_sidetray.xml" - label="Group Info" + label="Group Profile" font="SansSerifBold" /> <panel 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 7a6089c74e..5754f67045 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -49,7 +49,7 @@ image_unselected="spacer35.tga" image_pressed="spacer35.tga" height="16" - right="-228" + right="-204" label_shadow="false" name="buycurrency" tool_tip="My Balance" @@ -69,15 +69,16 @@ left_pad="0" label_shadow="false" name="buyL" - pad_right="20px" + pad_right="20" + pad_bottom="2" tool_tip="Click to buy more L$" top="2" - width="100" /> + width="71" /> <text type="string" font="SansSerifSmall" text_readonly_color="TimeTextColor" - follows="right|bottom" + follows="right|top" halign="right" height="16" top="5" @@ -85,11 +86,11 @@ left_pad="0" name="TimeText" tool_tip="Current time (Pacific)" - width="85"> - 12:00 AM + width="89"> + 24:00 AM PST </text> <button - follows="right|bottom" + follows="right|top" height="15" image_selected="AudioMute_Off" image_pressed="Audio_Press" @@ -101,7 +102,7 @@ tool_tip="Global Volume Control" width="16" /> <text - follows="right|bottom" + follows="right|top" halign="center" height="12" layout="topleft" 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 74f97dca4e..d2c9e56bc3 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -85,7 +85,7 @@ left="45" name="where" text_color="LtGray_50" - value="(In World)" + value="(inworld)" width="150" /> <panel follows="all" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index b378944e48..d6db451286 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -115,9 +115,6 @@ <!-- Avatar name: More than one avatar is selected/used here --> <string name="AvatarNameMultiple">(multiple)</string> - <!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. --> - <string name="AvatarNameHippos">(hippos)</string> - <!-- Group name: text shown for LLUUID::null --> <string name="GroupNameNone">(none)</string> @@ -2051,6 +2048,7 @@ this texture in your inventory <string name="ScriptLimitsURLsUsed">URLs used: [COUNT] out of [MAX]; [AVAILABLE] available</string> <string name="ScriptLimitsURLsUsedSimple">URLs used: [COUNT]</string> <string name="ScriptLimitsRequestError">Error requesting information</string> + <string name="ScriptLimitsRequestNoParcelSelected">No Parcel Selected</string> <string name="ScriptLimitsRequestWrongRegion">Error: script information is only available in your current region</string> <string name="ScriptLimitsRequestWaiting">Retrieving information...</string> <string name="ScriptLimitsRequestDontOwnParcel">You do not have permission to examine this parcel</string> diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml new file mode 100644 index 0000000000..ed8df69bf4 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<avatar_list_item + height="0" + layout="topleft" + left="0" + name="avatar_list_item" + top="0" + width="0"> + <!-- DEFAULT styles for avatar item --> + <default_style + font="SansSerifSmall" + font.style="NORMAL" + color="DkGray"/> + + <!-- styles for avatar item INVITED to voice call --> + <voice_call_invited_style + font="SansSerifSmall" + font.style="NORMAL" + color="0.5 0.5 0.5 0.5"/> + + <!-- styles for avatar item JOINED to voice call --> + <voice_call_joined_style + font="SansSerifSmall" + font.style="NORMAL" + color="white"/> + + <!-- styles for avatar item which HAS LEFT voice call --> + <voice_call_left_style + font="SansSerifSmall" + font.style="ITALIC" + color="LtGray_50"/> + + <!-- styles for ONLINE avatar item --> + <online_style + font="SansSerifSmall" + font.style="NORMAL" + color="white"/> + + <!-- styles for OFFLINE avatar item --> + <offline_style + font="SansSerifSmall" + font.style="NORMAL" + color="0.5 0.5 0.5 1.0"/> +</avatar_list_item> diff --git a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml index f59c46b2f5..d9b6387f0d 100644 --- a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml +++ b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml @@ -2,10 +2,13 @@ <expandable_text max_height="300" > <textbox - more_label="More" + allow_html="true" + allow_scroll="true" + bg_visible="false" + more_label="More" follows="left|top|right" name="text" - allow_scroll="true" + read_only="true" use_ellipses="true" word_wrap="true" tab_stop="true" @@ -16,4 +19,4 @@ name="scroll" follows="all" /> -</expandable_text>
\ No newline at end of file +</expandable_text> diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml index 48baa2812d..1228f6be3d 100644 --- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <filter_editor clear_button_visible="true" - search_button_visible="true" + search_button_visible="false" text_pad_left="7" select_on_focus="true" text_tentative_color="TextFgTentativeColor" diff --git a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml index 888b4eaf7c..a71b293f31 100644 --- a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml +++ b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml @@ -5,4 +5,12 @@ item_pad="0" keep_one_selected="true" multi_select="false" - opaque="true" />
\ No newline at end of file + opaque="true"> + <flat_list_view.no_items_text + follows="all" + name="no_items_msg" + v_pad="10" + h_pad="10" + value="There are no any items in the list" + wrap="true" /> +</flat_list_view>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 70a58b8e03..626135642b 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -96,17 +96,17 @@ name="damage_icon" width="14" height="13" - top="21" + top="19" left="2" follows="right|top" - image_name="Parcel_Damage_Dark" + image_name="Parcel_Health_Dark" /> <!-- Default text color is invisible on top of nav bar background --> <damage_text name="damage_text" width="35" height="18" - top="16" + top="17" follows="right|top" halign="right" font="SansSerifSmall" diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item.xml b/indra/newview/skins/default/xui/en/widgets/menu_item.xml index c65244ae22..563f3dc5c2 100644 --- a/indra/newview/skins/default/xui/en/widgets/menu_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/menu_item.xml @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <!-- Use this for the top-level menu styling --> -<menu_item font="SansSerif" /> +<menu_item font="SansSerifSmall" /> diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 3f5a4b8379..597c4e83b6 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -14,8 +14,8 @@ label_pad_left - padding to the left of tab button labels tab_top_image_selected="TabTop_Left_Selected" tab_bottom_image_unselected="Toolbar_Left_Off" tab_bottom_image_selected="Toolbar_Left_Selected" - tab_left_image_unselected="TabTop_Middle_Off" - tab_left_image_selected="TabTop_Middle_Selected"/> + tab_left_image_unselected="SegmentedBtn_Left_Disabled" + tab_left_image_selected="SegmentedBtn_Left_Off"/> <middle_tab tab_top_image_unselected="TabTop_Middle_Off" tab_top_image_selected="TabTop_Middle_Selected" tab_bottom_image_unselected="Toolbar_Middle_Off" |