summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt1
-rw-r--r--indra/newview/app_settings/settings.xml24
-rw-r--r--indra/newview/installers/darwin/firstlook-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/installers/darwin/fix_application_icon_position.sh17
-rw-r--r--indra/newview/installers/darwin/publicnightly-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/installers/darwin/release-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/installers/darwin/releasecandidate-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/llagentwearables.cpp2
-rw-r--r--indra/newview/llappearancemgr.cpp5
-rw-r--r--indra/newview/llavataractions.cpp10
-rw-r--r--indra/newview/llavataractions.h5
-rw-r--r--indra/newview/llbottomtray.cpp14
-rw-r--r--indra/newview/llcallfloater.cpp19
-rw-r--r--indra/newview/llcallfloater.h2
-rw-r--r--indra/newview/llchathistory.cpp87
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp4
-rw-r--r--indra/newview/lldrawable.h1
-rw-r--r--indra/newview/llexpandabletextbox.cpp11
-rw-r--r--indra/newview/llexpandabletextbox.h11
-rw-r--r--indra/newview/llfavoritesbar.cpp7
-rw-r--r--indra/newview/llfavoritesbar.h3
-rw-r--r--indra/newview/llfloateranimpreview.cpp64
-rw-r--r--indra/newview/llfloaterland.cpp22
-rw-r--r--indra/newview/llfloaterscriptlimits.cpp987
-rw-r--r--indra/newview/llfloaterscriptlimits.h76
-rw-r--r--indra/newview/llfolderviewitem.cpp4
-rw-r--r--indra/newview/llgrouplist.cpp22
-rw-r--r--indra/newview/llgrouplist.h11
-rw-r--r--indra/newview/llgroupmgr.cpp21
-rw-r--r--indra/newview/llimfloater.cpp8
-rw-r--r--indra/newview/llimfloatercontainer.cpp16
-rw-r--r--indra/newview/llimfloatercontainer.h4
-rw-r--r--indra/newview/llimview.cpp46
-rw-r--r--indra/newview/llimview.h10
-rw-r--r--indra/newview/llinspect.cpp24
-rw-r--r--indra/newview/llinspect.h3
-rw-r--r--indra/newview/llinspectavatar.cpp13
-rw-r--r--indra/newview/llinspectobject.cpp11
-rw-r--r--indra/newview/llinspectremoteobject.cpp5
-rw-r--r--indra/newview/llinventorybridge.cpp29
-rw-r--r--indra/newview/llinventorybridge.h2
-rw-r--r--indra/newview/llinventorymodel.cpp140
-rw-r--r--indra/newview/lllogchat.cpp12
-rw-r--r--indra/newview/llnavigationbar.cpp137
-rw-r--r--indra/newview/llnavigationbar.h59
-rw-r--r--indra/newview/llnearbychat.cpp52
-rw-r--r--indra/newview/llnearbychat.h6
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp6
-rw-r--r--indra/newview/llpanelavatar.cpp28
-rw-r--r--indra/newview/llpanelavatar.h8
-rw-r--r--indra/newview/llpanelclassified.cpp4
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp10
-rw-r--r--indra/newview/llpanellogin.cpp17
-rw-r--r--indra/newview/llpanellogin.h3
-rw-r--r--indra/newview/llpanelme.cpp4
-rw-r--r--indra/newview/llpanelpeople.cpp6
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp6
-rw-r--r--indra/newview/llpanelplaces.cpp57
-rw-r--r--indra/newview/llpanelplaces.h8
-rw-r--r--indra/newview/llpanelteleporthistory.cpp3
-rw-r--r--indra/newview/llparticipantlist.cpp3
-rw-r--r--indra/newview/llpreviewscript.cpp2
-rw-r--r--indra/newview/llscreenchannel.cpp23
-rw-r--r--indra/newview/llsidepanelinventory.cpp16
-rw-r--r--indra/newview/llslurl.cpp12
-rw-r--r--indra/newview/llslurl.h1
-rw-r--r--indra/newview/llspeakbutton.cpp10
-rw-r--r--indra/newview/llspeakbutton.h4
-rw-r--r--indra/newview/llstartup.cpp39
-rw-r--r--indra/newview/llteleporthistory.cpp2
-rw-r--r--indra/newview/lltoastimpanel.cpp89
-rw-r--r--indra/newview/lltoastimpanel.h3
-rw-r--r--indra/newview/lltoolplacer.h1
-rw-r--r--indra/newview/llviewerfloaterreg.cpp1
-rw-r--r--indra/newview/llviewermessage.cpp70
-rw-r--r--indra/newview/llviewermessage.h5
-rw-r--r--indra/newview/llviewerparcelmgr.cpp8
-rw-r--r--indra/newview/llviewerwindow.cpp135
-rw-r--r--indra/newview/llviewerwindow.h7
-rw-r--r--indra/newview/llvoicechannel.cpp18
-rw-r--r--indra/newview/llvoiceclient.cpp12
-rw-r--r--indra/newview/llvoiceclient.h1
-rw-r--r--indra/newview/skins/default/colors.xml4
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.pngbin328 -> 334 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Cone_Selected.pngbin0 -> 576 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Cube_Selected.pngbin0 -> 477 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Cylinder_Selected.pngbin0 -> 443 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Grass_Selected.pngbin0 -> 757 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.pngbin0 -> 531 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.pngbin0 -> 463 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.pngbin0 -> 696 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Prism_Selected.pngbin0 -> 485 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Pyramid_Selected.pngbin0 -> 594 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Ring_Selected.pngbin0 -> 738 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Sphere_Selected.pngbin0 -> 1003 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.pngbin0 -> 558 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Torus_Selected.pngbin0 -> 825 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Tree_Selected.pngbin0 -> 839 bytes
-rw-r--r--indra/newview/skins/default/textures/build/Object_Tube_Selected.pngbin0 -> 552 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml20
-rw-r--r--indra/newview/skins/default/xui/en/floater_aaa.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_animation_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_pay_object.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_limits.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml41
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_self.xml10
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml28
-rw-r--r--indra/newview/skins/default/xui/en/menu_participant_list.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_profile_overflow.xml13
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_classified_info.xml54
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml18
-rw-r--r--indra/newview/skins/default/xui/en/panel_instant_message.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml32
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml14
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml307
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_alerts.xml46
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml23
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml81
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml45
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml38
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/expandable_text.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/filter_editor.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml4
134 files changed, 2289 insertions, 1264 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..793d7b6207 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -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
index 9d9fd897e7..495ec37f53 100644
--- a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/firstlook-dmg/_DS_Store
Binary files differ
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
index 9d9fd897e7..495ec37f53 100644
--- a/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store
Binary files differ
diff --git a/indra/newview/installers/darwin/release-dmg/_DS_Store b/indra/newview/installers/darwin/release-dmg/_DS_Store
index 9d9fd897e7..495ec37f53 100644
--- a/indra/newview/installers/darwin/release-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/release-dmg/_DS_Store
Binary files differ
diff --git a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
index 9d9fd897e7..495ec37f53 100644
--- a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
Binary files differ
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index b0ff3a5626..41f2ff29e6 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -2300,7 +2300,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..585d42f66d 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)
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/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..8cb240c7c2 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);
@@ -731,11 +732,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 +749,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 581c210bd5..1dc0e8c0a7 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();
@@ -579,19 +610,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 +702,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 +741,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 e0a9e080fa..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
@@ -201,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..a5b62439f4 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -370,7 +370,8 @@ struct LLFavoritesSort
LLFavoritesBarCtrl::Params::Params()
: image_drag_indication("image_drag_indication"),
- chevron_button("chevron_button")
+ chevron_button("chevron_button"),
+ label("label")
{
}
@@ -401,6 +402,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()
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/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/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/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..1a5795a2ae 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -575,10 +575,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()
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..f68550d8fd 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3773,6 +3773,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);
}
@@ -3858,6 +3873,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 |
// +=================================================+
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index eeb8246b11..6fffec96a0 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -491,6 +491,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) {}
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/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/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 71dc0f9011..59708fcfb5 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,77 @@ 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)
+ , mClickDraggingSignal(NULL)
+{
+ setDirectionFromName(params.direction);
+}
+boost::signals2::connection LLPullButton::setClickDraggingCallback( const commit_signal_t::slot_type& cb )
+{
+ if (!mClickDraggingSignal) mClickDraggingSignal = new commit_signal_t();
+ return mClickDraggingSignal->connect(cb);
+}
+
+/*virtual*/
+void LLPullButton::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLButton::onMouseLeave(x, y, mask);
+
+ if(mMouseDownTimer.getStarted() )
+ {
+ const LLVector2 cursor_direction = LLVector2(F32(x),F32(y)) - mLastMouseDown;
+ if( angle_between(mDraggingDirection, cursor_direction) < 0.5 * F_PI_BY_TWO)//call if angle < pi/4
+ {
+ if(mClickDraggingSignal)
+ {
+ (*mClickDraggingSignal)(this, LLSD());
+ }
+ }
+ }
+
+}
+
+/*virtual*/
+BOOL LLPullButton::handleMouseDown(S32 x, S32 y, MASK mask)
+ {
+ BOOL handled = LLButton::handleMouseDown(x,y, mask);
+ if(handled)
+ {
+ mLastMouseDown.set(F32(x), F32(y));
+ }
+ return handled;
+}
+
+/*virtual*/
+BOOL LLPullButton::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ mLastMouseDown.clear();
+ return LLButton::handleMouseUp(x, y, mask);
+}
+
+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 +288,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 +297,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 +400,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 +639,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 +653,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..9d0abc7a3a 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -34,14 +34,61 @@
#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 by 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 );
+
+ /* virtual*/ ~LLPullButton()
+ {
+ delete mClickDraggingSignal;
+ }
+
+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 +117,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 +142,8 @@ private:
void fillSearchComboBox();
LLMenuGL* mTeleportHistoryMenu;
- LLButton* mBtnBack;
- LLButton* mBtnForward;
+ LLPullButton* mBtnBack;
+ LLPullButton* mBtnForward;
LLButton* mBtnHome;
LLSearchComboBox* mSearchComboBox;
LLLocationInputCtrl* mCmbLocation;
@@ -103,6 +151,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..6de47fccd2 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)
@@ -194,6 +200,18 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args)
mMessageArchive.push_back(chat);
if(mMessageArchive.size()>200)
mMessageArchive.erase(mMessageArchive.begin());
+
+ if (gSavedPerAccountSettings.getBOOL("LogChat"))
+ {
+ if (chat.mChatType != CHAT_TYPE_WHISPER && chat.mChatType != CHAT_TYPE_SHOUT)
+ {
+ LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText);
+ }
+ else
+ {
+ LLLogChat::saveHistory("chat", "", chat.mFromID, chat.mFromName + " " + chat.mText);
+ }
+ }
}
}
@@ -262,6 +280,39 @@ void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
nearby_chat->updateChatHistoryStyle();
}
+void LLNearbyChat::loadHistory()
+{
+ 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);
+
+ it++;
+ }
+}
+
+//static
+LLNearbyChat* LLNearbyChat::getInstance()
+{
+ return LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+}
////////////////////////////////////////////////////////////////////////////////
//
@@ -278,3 +329,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/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/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 87d101b00f..af9e791223 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -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)
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/llpanelme.cpp b/indra/newview/llpanelme.cpp
index 0f0fb4b94e..ea66ef7d2c 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -198,6 +198,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/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/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..ad47e351ee 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 || "can_add" == item)
{
return mUUIDs.front() != gAgentID;
}
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/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index a00b6a9288..8f36c0e88a 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;
@@ -802,16 +813,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/llstartup.cpp b/indra/newview/llstartup.cpp
index 6b816f8786..b5cd5b73ce 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"
@@ -904,7 +905,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 +1286,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 +1859,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))
@@ -2526,6 +2521,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 +2544,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 +2555,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/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/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/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index cd6b9e2c50..fdc6675db1 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"
@@ -795,6 +799,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..98d2958d9a 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*);
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..b6e7e73b9d 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -1258,7 +1258,6 @@ LLVoiceClient::LLVoiceClient() :
mEarLocation(0),
mSpeakerVolumeDirty(true),
mSpeakerMuteDirty(true),
- mSpeakerVolume(0),
mMicVolume(0),
mMicVolumeDirty(true),
@@ -1271,6 +1270,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 +3526,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 +5980,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 +6065,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;
}
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/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index ec196245a1..ca579616d8 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -290,7 +290,7 @@
reference="Black" />
<color
name="ContextSilhouetteColor"
- value="0.94 0.61 0 1" />
+ reference="EmphasisColor" />
<color
name="DefaultHighlightDark"
reference="White_10" />
@@ -602,7 +602,7 @@
value="0.39 0.39 0.39 1" />
<color
name="ScriptErrorColor"
- value="Red" />
+ reference="Red" />
<color
name="ScrollBGStripeColor"
reference="Transparent" />
diff --git a/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png b/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png
index 6343ddf035..e8fe243dc7 100644
--- a/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png
+++ b/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Cone_Selected.png b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png
new file mode 100644
index 0000000000..d50dc69ffe
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Cube_Selected.png b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png
new file mode 100644
index 0000000000..3d6964530d
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png
new file mode 100644
index 0000000000..3ed0389961
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Grass_Selected.png b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png
new file mode 100644
index 0000000000..3ebd5ea7a1
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png
Binary files differ
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
new file mode 100644
index 0000000000..3bdc4d1fd5
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png
Binary files differ
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
new file mode 100644
index 0000000000..0912442e29
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png
Binary files differ
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
new file mode 100644
index 0000000000..33db4a2de8
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Prism_Selected.png b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png
new file mode 100644
index 0000000000..9e80fe2b84
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png
new file mode 100644
index 0000000000..d36bfa55d4
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Ring_Selected.png b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png
new file mode 100644
index 0000000000..962f6efb93
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png
new file mode 100644
index 0000000000..715d597144
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png
new file mode 100644
index 0000000000..b2ea680f23
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Torus_Selected.png b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png
new file mode 100644
index 0000000000..1fc22686eb
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Tree_Selected.png b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png
new file mode 100644
index 0000000000..5bd87f8a2f
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/build/Object_Tube_Selected.png b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png
new file mode 100644
index 0000000000..a4c3f39e14
--- /dev/null
+++ b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 60c1470b89..ea66897b35 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" />
@@ -585,10 +600,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_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_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_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_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_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/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 &gt;"
+ label="Take Off ▶"
layout="topleft"
name="Take Off &gt;">
<context_menu
- label="Clothes &gt;"
+ label="Clothes ▶"
layout="topleft"
name="Clothes &gt;">
<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 &gt;"
+ label="HUD ▶"
layout="topleft"
name="Object Detach HUD" />
<context_menu
- label="Detach &gt;"
+ label="Detach ▶"
layout="topleft"
name="Object Detach" />
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index 56028bb2e5..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 &gt;"
+ label="Put On ▶"
name="Put On" >
<menu_item_call
enabled="false"
@@ -77,16 +77,26 @@
function="Object.EnableWear" />
</menu_item_call>
<context_menu
- label="Attach &gt;"
+ label="Attach ▶"
name="Object Attach" />
<context_menu
- label="Attach HUD &gt;"
+ label="Attach HUD ▶"
name="Object Attach HUD" />
</context_menu>
<context_menu
- label="Remove &gt;"
+ label="Remove ▶"
name="Remove">
<menu_item_call
+ enabled="false"
+ label="Take"
+ name="Pie Object Take">
+ <menu_item_call.on_click
+ function="Tools.BuyOrTake" />
+ <menu_item_call.on_enable
+ function="Tools.EnableBuyOrTake"
+ parameter="Buy,Take" />
+ </menu_item_call>
+ <menu_item_call
enabled="false"
label="Report Abuse"
name="Report Abuse...">
@@ -124,16 +134,6 @@
</menu_item_call>
</context_menu>
<menu_item_separator layout="topleft" />
- <menu_item_call
- enabled="false"
- label="Take"
- name="Pie Object Take">
- <menu_item_call.on_click
- function="Tools.BuyOrTake" />
- <menu_item_call.on_enable
- function="Tools.EnableBuyOrTake"
- parameter="Buy,Take" />
- </menu_item_call>
<menu_item_call
enabled="false"
label="Take Copy"
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/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_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index 8f7750628e..2a2199fc87 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -255,13 +255,18 @@
top_pad="10"
value="My Account:"
width="100" />
- <text
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
follows="left|top|right"
- height="15"
+ 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" />
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 f19057cae3..25a0213bde 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -495,6 +495,10 @@ things in this group. There&apos;s a broad variety of Abilities.
width="300">
<scroll_list.columns
label=""
+ name="icon"
+ width="2" />
+ <scroll_list.columns
+ label=""
name="checkbox"
width="20" />
<scroll_list.columns
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 9279d1e686..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
@@ -93,6 +93,7 @@
height="23"
label="Teleport"
name="teleport_btn"
+ tool_tip = "Offer to teleport this person"
width="100" />
</layout_panel>
<layout_panel
@@ -119,6 +120,23 @@
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
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_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
index a0734d3dca..d519569543 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -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"
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 5fe5db892a..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"
@@ -139,12 +141,25 @@
font="SansSerifSmall"
height="15"
layout="topleft"
- left="102"
+ left="0"
name="favorite"
image_drag_indication="Accordion_ArrowOpened_Off"
bottom="55"
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"
@@ -155,15 +170,4 @@
top="15"
height="15"/>
</favorites_bar>
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- top_pad="-12"
- name="favorites_bar_label"
- text_color="LtGray"
- tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
- width="102">Favorites Bar</text>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index ac98bb9bd9..3b5add33a8 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
@@ -163,6 +160,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"
@@ -226,6 +234,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_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..4d14d46743 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,50 +222,105 @@ 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>
+ <text
+ follows="left|top"
+ type="string"
+ length="1"
+ height="13"
+ layout="topleft"
+ left="30"
+ top_pad="8"
+ 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="80"
+ max_chars="100"
+ name="aspect_ratio"
+ tool_tip="width / height"
+ 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="Automatic"
+ layout="topleft"
+ left_pad="10"
+ name="aspect_auto_detect"
+ width="256">
+ <check_box.commit_callback
+ function="Pref.AutoDetectAspect" />
+ </check_box>
</panel>
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_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index b496f95422..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"
@@ -326,7 +327,7 @@
left="30"
mouse_opaque="false"
name="text_box3"
- top_pad="15"
+ top_pad="10"
width="240">
Busy mode response:
</text>
@@ -335,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 39a8e53c7f..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"
+ 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"
+ 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"
+ 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"
+ 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"
+ 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"
+ 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"
@@ -236,10 +230,9 @@
disabled_control="CmdLineDisableVoice"
label="Enable voice"
layout="topleft"
- font.style="BOLD"
- left="101"
+ left="28"
name="enable_voice_check"
- top_pad="13"
+ top_pad="5"
width="110"
>
</check_box>
@@ -265,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"
+ 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"
@@ -366,7 +357,7 @@
name="device_settings_panel"
class="panel_voice_device_settings"
width="501"
- top="280">
+ top="285">
<panel.string
name="default_text">
Default
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 27461571da..351df22042 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -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"
@@ -306,7 +315,7 @@
name="add_friend"
tool_tip="Offer friendship to the Resident"
top="5"
- width="81" />
+ width="80" />
<button
follows="bottom|left"
height="23"
@@ -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="46" />
+ 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="46" />
+ width="41" />
<button
follows="bottom|left"
height="23"
@@ -347,8 +356,8 @@
tool_tip="Offer teleport"
left_pad="3"
top="5"
- width="78" />
- <!-- <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_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/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index b378944e48..b4a12cfb32 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2051,6 +2051,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/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/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 70a58b8e03..2163660206 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -96,7 +96,7 @@
name="damage_icon"
width="14"
height="13"
- top="21"
+ top="19"
left="2"
follows="right|top"
image_name="Parcel_Damage_Dark"
@@ -106,7 +106,7 @@
name="damage_text"
width="35"
height="18"
- top="16"
+ top="17"
follows="right|top"
halign="right"
font="SansSerifSmall"