summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/app_settings/settings.xml2
-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.cpp68
-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/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/llimview.cpp46
-rw-r--r--indra/newview/llimview.h10
-rw-r--r--indra/newview/llinventorymodel.cpp140
-rw-r--r--indra/newview/llnavigationbar.cpp137
-rw-r--r--indra/newview/llnavigationbar.h59
-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/llpanelme.cpp4
-rw-r--r--indra/newview/llpanelpeople.cpp6
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp6
-rw-r--r--indra/newview/llpanelteleporthistory.cpp3
-rw-r--r--indra/newview/llsidepanelinventory.cpp2
-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.cpp27
-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.cpp11
-rw-r--r--indra/newview/llviewerparcelmgr.cpp8
-rw-r--r--indra/newview/llvoicechannel.cpp18
-rw-r--r--indra/newview/llvoiceclient.cpp4
-rw-r--r--indra/newview/llvoiceclient.h1
-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/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_profile.xml19
-rw-r--r--indra/newview/skins/default/xui/en/widgets/expandable_text.xml9
70 files changed, 797 insertions, 407 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 62197406b6..793d7b6207 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -7802,7 +7802,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>ShowCrosshairs</key>
<map>
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 7c22ac9e36..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();
@@ -671,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
@@ -682,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/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/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/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/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/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/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/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/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/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 7b923f4b0b..3fd5309947 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -176,7 +176,7 @@ void LLSidepanelInventory::onPlayButtonClicked()
performActionOnSelection("play");
break;
default:
- performActionOnSelection("activate");
+ performActionOnSelection("open");
break;
}
}
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 522adc05ce..b5cd5b73ce 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1859,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))
@@ -2536,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")
@@ -2554,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,
@@ -2565,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 adbe28e9a7..143d95d27e 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1478,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);
@@ -2181,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;
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/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 3914064d72..b6e7e73b9d 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -5980,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)
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/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/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_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 40b9b56903..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"
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>