summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorSteven Bennetts <steve@lindenlab.com>2009-08-26 20:47:27 +0000
committerSteven Bennetts <steve@lindenlab.com>2009-08-26 20:47:27 +0000
commitaf98aad98d43ec8b128ecac3089426d6ae6edc3f (patch)
tree5971f87afc04580df470a003793dcc8c974e29a7 /indra
parent6a364e6f32c12c1ab2c0f33e8ef07d885a8765a2 (diff)
svn merge https://svn.aws.productengine.com/secondlife/export-from-ll/viewer-2-0@1471 https://svn.aws.productengine.com/secondlife/pe/stable-1@1476 -> viewer-2.0.0-3
EXT-65 EXT-270 EXT-359 EXT-361 EXT-367 EXT-367 EXT-368 EXT-455 EXT-468 EXT-530 EXT-539 EXT-540 EXT-542 EXT-545 EXT-555 EXT-557 EXT-558 EXT-559 EXT-559 EXT-560 EXT-561 EXT-562 EXT-563 EXT-564 EXT-566 EXT-568 EXT-569 EXT-570 EXT-571 EXT-581 EXT-590 EXT-594 EXT-596 EXT-597 EXT-601 EXT-602 EXT-603 EXT-613 EXT-620 EXT-624 EXT-628 EXT-630 EXT-631 EXT-632 EXT-639 EXT-640 EXT-641 EXT-642 EXT-662 EXT-671 EXT-672 EXT-676 EXT-682 EXT-692 EXT-703 EXT-717
Diffstat (limited to 'indra')
-rw-r--r--indra/llui/llmenugl.cpp43
-rw-r--r--indra/llui/llmenugl.h3
-rw-r--r--indra/llui/llsearcheditor.h8
-rw-r--r--indra/newview/CMakeLists.txt5
-rw-r--r--indra/newview/app_settings/settings.xml44
-rw-r--r--indra/newview/llagent.cpp171
-rw-r--r--indra/newview/llagent.h7
-rw-r--r--indra/newview/llagentui.cpp179
-rw-r--r--indra/newview/llagentui.h51
-rw-r--r--indra/newview/llchannelmanager.cpp68
-rw-r--r--indra/newview/llchannelmanager.h35
-rw-r--r--indra/newview/llchiclet.cpp94
-rw-r--r--indra/newview/llchiclet.h18
-rw-r--r--indra/newview/llclassifiedstatsresponder.cpp1
-rw-r--r--indra/newview/lldrawpoolalpha.cpp1
-rw-r--r--indra/newview/lldrawpoolavatar.cpp1
-rw-r--r--indra/newview/lldrawpoolbump.cpp1
-rw-r--r--indra/newview/lldrawpoolsimple.cpp1
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp1
-rw-r--r--indra/newview/llemote.cpp1
-rw-r--r--indra/newview/llfavoritesbar.cpp90
-rw-r--r--indra/newview/llfloatergroups.cpp13
-rw-r--r--indra/newview/llfloateropenobject.cpp1
-rw-r--r--indra/newview/llfloaterpostcard.cpp3
-rw-r--r--indra/newview/llfloaterregioninfo.cpp5
-rw-r--r--indra/newview/llfloaterreporter.cpp7
-rw-r--r--indra/newview/llfloatersnapshot.cpp5
-rw-r--r--indra/newview/llfloatertos.cpp1
-rw-r--r--indra/newview/llfloatervoicedevicesettings.cpp1
-rw-r--r--indra/newview/llfolderview.cpp1
-rw-r--r--indra/newview/llgroupactions.cpp36
-rw-r--r--indra/newview/llgroupactions.h14
-rw-r--r--indra/newview/llgroupmgr.cpp2
-rw-r--r--indra/newview/llhudview.cpp1
-rw-r--r--indra/newview/llimhandler.cpp127
-rw-r--r--indra/newview/llimpanel.cpp2
-rw-r--r--indra/newview/llimview.cpp132
-rw-r--r--indra/newview/llimview.h15
-rw-r--r--indra/newview/lllandmarkactions.cpp58
-rw-r--r--indra/newview/lllandmarkactions.h11
-rw-r--r--indra/newview/lllocationhistory.cpp34
-rw-r--r--indra/newview/lllocationhistory.h1
-rw-r--r--indra/newview/lllocationinputctrl.cpp90
-rw-r--r--indra/newview/lllocationinputctrl.h13
-rw-r--r--indra/newview/llmoveview.cpp33
-rw-r--r--indra/newview/llmoveview.h1
-rw-r--r--indra/newview/llnamebox.cpp1
-rw-r--r--indra/newview/llnameeditor.cpp1
-rw-r--r--indra/newview/llnamelistctrl.cpp1
-rw-r--r--indra/newview/llnavigationbar.cpp86
-rw-r--r--indra/newview/llnavigationbar.h9
-rw-r--r--indra/newview/llnearbychat.cpp12
-rw-r--r--indra/newview/llnearbychathandler.cpp22
-rw-r--r--indra/newview/llnearbychathandler.h1
-rw-r--r--indra/newview/llnotificationalerthandler.cpp5
-rw-r--r--indra/newview/llnotificationgrouphandler.cpp24
-rw-r--r--indra/newview/llnotificationhandler.h23
-rw-r--r--indra/newview/llnotificationmanager.cpp3
-rw-r--r--indra/newview/llpanelavatar.h10
-rw-r--r--indra/newview/llpanelgroup.cpp21
-rw-r--r--indra/newview/llpanelgroupinvite.cpp18
-rw-r--r--indra/newview/llpanelgrouplandmoney.cpp13
-rw-r--r--indra/newview/llpanelgroupnotices.cpp50
-rw-r--r--indra/newview/llpanelgroupnotices.h2
-rw-r--r--indra/newview/llpanelgrouproles.cpp103
-rw-r--r--indra/newview/llpanelgrouproles.h14
-rw-r--r--indra/newview/llpanelpeople.cpp1
-rw-r--r--indra/newview/llpanelpick.cpp31
-rw-r--r--indra/newview/llpanelpick.h7
-rw-r--r--indra/newview/llpanelpicks.cpp8
-rw-r--r--indra/newview/llpanelpicks.h5
-rw-r--r--indra/newview/llpanelplaceinfo.cpp51
-rw-r--r--indra/newview/llpanelplaceinfo.h5
-rw-r--r--indra/newview/llpanelplaces.cpp71
-rw-r--r--indra/newview/llpanelprofile.cpp3
-rw-r--r--indra/newview/llpanelprofileview.cpp5
-rw-r--r--indra/newview/llpanelvolume.cpp1
-rw-r--r--indra/newview/llscreenchannel.cpp49
-rw-r--r--indra/newview/llscreenchannel.h25
-rw-r--r--indra/newview/llsidetray.cpp5
-rw-r--r--indra/newview/llsidetraypanelcontainer.cpp6
-rw-r--r--indra/newview/llsky.cpp15
-rw-r--r--indra/newview/llslurl.cpp27
-rw-r--r--indra/newview/llslurl.h12
-rw-r--r--indra/newview/llspatialpartition.cpp1
-rw-r--r--indra/newview/llstartup.cpp4
-rw-r--r--indra/newview/llstatusbar.cpp196
-rw-r--r--indra/newview/llsyswellwindow.cpp13
-rw-r--r--indra/newview/llteleporthistory.cpp13
-rw-r--r--indra/newview/llteleporthistory.h6
-rw-r--r--indra/newview/lltoast.cpp1
-rw-r--r--indra/newview/lltoast.h2
-rw-r--r--indra/newview/lltoastalertpanel.cpp12
-rw-r--r--indra/newview/lltoastalertpanel.h3
-rw-r--r--indra/newview/lltoastimpanel.cpp94
-rw-r--r--indra/newview/lltoastimpanel.h79
-rw-r--r--indra/newview/lltooldraganddrop.cpp6
-rw-r--r--indra/newview/lltoolface.cpp1
-rw-r--r--indra/newview/lltoolselectland.cpp1
-rw-r--r--indra/newview/llviewerjointmesh.cpp1
-rw-r--r--indra/newview/llviewermessage.cpp29
-rw-r--r--indra/newview/llviewerparcelmgr.cpp33
-rw-r--r--indra/newview/llviewerparcelmgr.h10
-rw-r--r--indra/newview/llviewertexturelist.cpp1
-rw-r--r--indra/newview/llviewerwindow.cpp3
-rw-r--r--indra/newview/llvlmanager.cpp1
-rw-r--r--indra/newview/llvoground.cpp1
-rw-r--r--indra/newview/llvotextbubble.cpp1
-rw-r--r--indra/newview/llvovolume.cpp2
-rw-r--r--indra/newview/llvowater.cpp1
-rw-r--r--indra/newview/llwind.cpp1
-rw-r--r--indra/newview/llwlparammanager.cpp1
-rw-r--r--indra/newview/skins/default/textures/textures.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_general.xml32
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml27
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_invite.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_land_money.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notify.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_instant_message.xml80
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml230
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml15
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml41
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml175
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml76
-rw-r--r--indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml46
-rw-r--r--indra/newview/skins/default/xui/en/panel_sys_well_item.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_toast.xml1
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml5
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml2
134 files changed, 2165 insertions, 1299 deletions
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index b6c3ffc61c..4edae46f32 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -1353,23 +1353,26 @@ void LLMenuItemBranchDownGL::openMenu( void )
// set the hover status (called by it's menu)
void LLMenuItemBranchDownGL::setHighlight( BOOL highlight )
{
- if (highlight == getHighlight()) return;
-
- LLMenuGL* branch = getBranch();
- if (!branch) return;
+ if (highlight == getHighlight())
+ return;
//NOTE: Purposely calling all the way to the base to bypass auto-open.
LLMenuItemGL::setHighlight(highlight);
+
+ LLMenuGL* branch = getBranch();
+ if (!branch)
+ return;
+
if( !highlight)
{
- if (getBranch()->getTornOff())
+ if (branch->getTornOff())
{
- ((LLFloater*)getBranch()->getParent())->setFocus(FALSE);
- getBranch()->clearHoverItem();
+ ((LLFloater*)branch->getParent())->setFocus(FALSE);
+ branch->clearHoverItem();
}
else
{
- getBranch()->setVisible( FALSE );
+ branch->setVisible( FALSE );
}
}
}
@@ -1638,6 +1641,7 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)
mDropShadowed( p.drop_shadow ),
mHorizontalLayout( p.horizontal_layout ),
mScrollable(mHorizontalLayout ? FALSE : p.scrollable), // Scrolling is supported only for vertical layout
+ mMaxScrollableItems(p.max_scrollable_items),
mKeepFixedSize( p.keep_fixed_size ),
mLabel (p.label),
mLastMouseX(0),
@@ -1911,6 +1915,7 @@ void LLMenuGL::arrange( void )
item_list_t::iterator first_hidden_item_iter = mItems.end();
S32 height_before_first_visible_item = -1;
S32 visible_items_height = 0;
+ U32 scrollable_items_cnt = 0;
if (mHorizontalLayout)
{
@@ -2005,12 +2010,16 @@ void LLMenuGL::arrange( void )
{
height_before_first_visible_item = height - (*item_iter)->getNominalHeight();
first_visible_item_iter = item_iter;
+ scrollable_items_cnt = 0;
}
- if (-1 != height_before_first_visible_item && 0 == visible_items_height && height - height_before_first_visible_item > max_height - spillover_item_height * 2)
+ if (-1 != height_before_first_visible_item && 0 == visible_items_height &&
+ (++scrollable_items_cnt > mMaxScrollableItems ||
+ height - height_before_first_visible_item > max_height - spillover_item_height * 2 ))
{
first_hidden_item_iter = item_iter;
visible_items_height = height - height_before_first_visible_item - (*item_iter)->getNominalHeight();
+ scrollable_items_cnt--;
}
}
}
@@ -2020,16 +2029,16 @@ void LLMenuGL::arrange( void )
{
S32 max_items_height = max_height - spillover_item_height * 2;
+ if (visible_items_height == 0)
+ visible_items_height = height - height_before_first_visible_item;
+
// Fix mFirstVisibleItem value, if it doesn't allow to display all items, that can fit
- if (visible_items_height < max_items_height)
+ if (visible_items_height < max_items_height && scrollable_items_cnt < mMaxScrollableItems)
{
- if (visible_items_height == 0)
- {
- visible_items_height = height - height_before_first_visible_item;
- }
-
item_list_t::iterator tmp_iter(first_visible_item_iter);
- while (visible_items_height < max_items_height && first_visible_item_iter != mItems.begin())
+ while (visible_items_height < max_items_height &&
+ scrollable_items_cnt < mMaxScrollableItems &&
+ first_visible_item_iter != mItems.begin())
{
if ((*first_visible_item_iter)->getVisible())
{
@@ -2043,6 +2052,7 @@ void LLMenuGL::arrange( void )
{
visible_items_height += (*first_visible_item_iter)->getNominalHeight();
height_before_first_visible_item -= (*first_visible_item_iter)->getNominalHeight();
+ scrollable_items_cnt++;
}
}
@@ -2051,6 +2061,7 @@ void LLMenuGL::arrange( void )
{
visible_items_height -= (*first_visible_item_iter)->getNominalHeight();
height_before_first_visible_item += (*first_visible_item_iter)->getNominalHeight();
+ scrollable_items_cnt--;
first_visible_item_iter = tmp_iter;
}
if (!(*first_visible_item_iter)->getVisible())
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 2e7f61c2dd..44459a6c0e 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -382,6 +382,7 @@ public:
create_jump_keys,
keep_fixed_size,
scrollable;
+ Optional<U32> max_scrollable_items;
Optional<LLUIColor> bg_color;
Optional<S32> shortcut_pad;
@@ -394,6 +395,7 @@ public:
create_jump_keys("create_jump_keys", false),
bg_color("bg_color", LLUIColorTable::instance().getColor( "MenuDefaultBgColor" )),
scrollable("scrollable", false),
+ max_scrollable_items("max_scrollable_items", U32_MAX),
shortcut_pad("shortcut_pad")
{
addSynonym(bg_visible, "opaque");
@@ -541,6 +543,7 @@ protected:
S32 mLastMouseY;
S32 mMouseVelX;
S32 mMouseVelY;
+ U32 mMaxScrollableItems;
BOOL mHorizontalLayout;
BOOL mScrollable;
BOOL mKeepFixedSize;
diff --git a/indra/llui/llsearcheditor.h b/indra/llui/llsearcheditor.h
index 368b68baa3..cd2867b493 100644
--- a/indra/llui/llsearcheditor.h
+++ b/indra/llui/llsearcheditor.h
@@ -67,6 +67,8 @@ public:
virtual ~LLSearchEditor() {}
void setText(const LLStringExplicit &new_text) { mSearchEditor->setText(new_text); }
+ const std::string& getText() const { return mSearchEditor->getText(); }
+
// LLUICtrl interface
virtual void setValue(const LLSD& value );
@@ -75,6 +77,12 @@ public:
virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
virtual void clear();
+ void setKeystrokeCallback(LLLineEditor::callback_t callback, void* user_data)
+ {
+ if(mSearchEditor)
+ mSearchEditor->setKeystrokeCallback(callback,user_data);
+ }
+
private:
LLLineEditor* mSearchEditor;
LLButton* mSearchButton;
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index d7eabf33c4..30904bd6c9 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -73,6 +73,7 @@ set(viewer_SOURCE_FILES
llagentdata.cpp
llagentlanguage.cpp
llagentpilot.cpp
+ llagentui.cpp
llagentwearables.cpp
llanimstatelabels.cpp
llappviewer.cpp
@@ -235,6 +236,7 @@ set(viewer_SOURCE_FILES
llhudrender.cpp
llhudtext.cpp
llhudview.cpp
+ llimhandler.cpp
llimpanel.cpp
llimview.cpp
llimcontrolpanel.cpp
@@ -374,6 +376,7 @@ set(viewer_SOURCE_FILES
lltoast.cpp
lltoastalertpanel.cpp
lltoastgroupnotifypanel.cpp
+ lltoastimpanel.cpp
lltoastnotifypanel.cpp
lltoastpanel.cpp
lltoggleablemenu.cpp
@@ -518,6 +521,7 @@ set(viewer_HEADER_FILES
llagentdata.h
llagentlanguage.h
llagentpilot.h
+ llagentui.h
llagentwearables.h
llanimstatelabels.h
llappearance.h
@@ -824,6 +828,7 @@ set(viewer_HEADER_FILES
lltoast.h
lltoastalertpanel.h
lltoastgroupnotifypanel.h
+ lltoastimpanel.h
lltoastnotifypanel.h
lltoastpanel.h
lltoggleablemenu.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 4e7b3e2f68..9835c5a4cf 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -7243,17 +7243,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowSearchBar</key>
- <map>
- <key>Comment</key>
- <string>Show the Search Bar in the Status Overlay</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>ShowNetStats</key>
<map>
<key>Comment</key>
@@ -8153,6 +8142,17 @@
<key>Value</key>
<string>5748decc-f629-461c-9a36-a35a221fe21f</string>
</map>
+ <key>StartUpChannelUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>B56AF90D-6684-48E4-B1E4-722D3DEB2CB6</string>
+ </map>
<key>NearByChatChannelUUID</key>
<map>
<key>Comment</key>
@@ -8164,6 +8164,28 @@
<key>Value</key>
<string>E1158BD6-661C-4981-9DAD-4DCBFF062502</string>
</map>
+ <key>NotificationChannelUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>AEED3193-8709-4693-8558-7452CCA97AE5</string>
+ </map>
+ <key>AlertChannelUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>F3E07BC8-A973-476D-8C7F-F3B7293975D1</string>
+ </map>
<key>UIImgWhiteUUID</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 4166d96219..ae30c1959c 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -104,6 +104,7 @@
#include "llcapabilitylistener.h"
#include "llnavigationbar.h" //to show/hide navigation bar when changing mouse look state
+#include "llagentui.h"
using namespace LLVOAvatarDefines;
@@ -912,6 +913,8 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
mRegionsVisited.insert(handle);
LLSelectMgr::getInstance()->updateSelectionCenter();
+
+ LLFloaterMove::sUpdateFlyingStatus();
}
@@ -937,42 +940,6 @@ LLHost LLAgent::getRegionHost() const
}
//-----------------------------------------------------------------------------
-// getSLURL()
-// returns empty() if getRegion() == NULL
-//-----------------------------------------------------------------------------
-std::string LLAgent::getSLURL() const
-{
- return buildSLURL(true);
-}
-
-//-----------------------------------------------------------------------------
-// getUnescapedSLURL()
-// returns empty() if getRegion() == NULL
-//-----------------------------------------------------------------------------
-std::string LLAgent::getUnescapedSLURL() const
-{
- return buildSLURL(false);
-}
-
-std::string LLAgent::buildSLURL(const bool escape) const
-{
- std::string slurl;
- LLViewerRegion *regionp = getRegion();
- if (regionp)
- {
- LLVector3d agentPos = getPositionGlobal();
- S32 x = llround( (F32)fmod( agentPos.mdV[VX], (F64)REGION_WIDTH_METERS ) );
- S32 y = llround( (F32)fmod( agentPos.mdV[VY], (F64)REGION_WIDTH_METERS ) );
- S32 z = llround( (F32)agentPos.mdV[VZ] );
- if (escape)
- slurl = LLSLURL::buildSLURL(regionp->getName(), x, y, z);
- else
- slurl = LLSLURL::buildUnescapedSLURL(regionp->getName(), x, y, z);
- }
- return slurl;
-}
-
-//-----------------------------------------------------------------------------
// inPrelude()
//-----------------------------------------------------------------------------
BOOL LLAgent::inPrelude()
@@ -2854,6 +2821,8 @@ void LLAgent::endAnimationUpdateUI()
LLSideTray::getInstance()->setVisible(TRUE);
+ LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
+
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
LLFloaterCamera::toPrevModeIfInAvatarViewMode();
@@ -2946,6 +2915,8 @@ void LLAgent::endAnimationUpdateUI()
LLSideTray::getInstance()->setVisible(FALSE);
+ LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
+
// clear out camera lag effect
mCameraLag.clearVec();
@@ -5062,14 +5033,7 @@ void LLAgent::handleMaturity(const LLSD& newvalue)
//----------------------------------------------------------------------------
-void LLAgent::buildFullname(std::string& name) const
-{
- if (mAvatarObject.notNull())
- {
- name = mAvatarObject->getFullname();
- }
-}
-
+//*TODO remove, is not used anywhere as of August 20, 2009
void LLAgent::buildFullnameAndTitle(std::string& name) const
{
if (isGroupMember())
@@ -5223,97 +5187,6 @@ BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOO
return FALSE;
}
-// utility to build a location string
-BOOL LLAgent::buildLocationString(std::string& str, ELocationFormat fmt)
-{
- LLViewerRegion* region = getRegion();
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
-
- if (!region || !parcel)
- return FALSE;
-
- const LLVector3& agent_pos_region = getPositionAgent();
- S32 pos_x = S32(agent_pos_region.mV[VX]);
- S32 pos_y = S32(agent_pos_region.mV[VY]);
- S32 pos_z = S32(agent_pos_region.mV[VZ]);
-
- // Round the numbers based on the velocity
- LLVector3 agent_velocity = getVelocity();
- F32 velocity_mag_sq = agent_velocity.magVecSquared();
-
- const F32 FLY_CUTOFF = 6.f; // meters/sec
- const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
- const F32 WALK_CUTOFF = 1.5f; // meters/sec
- const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
-
- if (velocity_mag_sq > FLY_CUTOFF_SQ)
- {
- pos_x -= pos_x % 4;
- pos_y -= pos_y % 4;
- }
- else if (velocity_mag_sq > WALK_CUTOFF_SQ)
- {
- pos_x -= pos_x % 2;
- pos_y -= pos_y % 2;
- }
-
- // create a defult name and description for the landmark
- std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName();
- std::string region_name = region->getName();
- std::string buffer;
- if( LLViewerParcelMgr::getInstance()->getAgentParcelName().empty() )
- {
- // the parcel doesn't have a name
- switch (fmt)
- {
- case LOCATION_FORMAT_LANDMARK:
- buffer = llformat("%.100s", region_name.c_str());
- break;
- case LOCATION_FORMAT_NORMAL:
- buffer = llformat("%s", region_name.c_str());
- break;
- case LOCATION_FORMAT_WITHOUT_SIM:
- case LOCATION_FORMAT_FULL:
- buffer = llformat("%s (%d, %d, %d)",
- region_name.c_str(),
- pos_x, pos_y, pos_z);
- break;
- }
- }
- else
- {
- // the parcel has a name, so include it in the landmark name
- switch (fmt)
- {
- case LOCATION_FORMAT_LANDMARK:
- buffer = llformat("%.100s", parcel_name.c_str());
- break;
- case LOCATION_FORMAT_NORMAL:
- buffer = llformat("%s, %s",
- region_name.c_str(),
- parcel_name.c_str());
- break;
- case LOCATION_FORMAT_WITHOUT_SIM:
- buffer = llformat("%s, %s (%d, %d, %d)",
- region_name.c_str(),
- parcel_name.c_str(),
- pos_x, pos_y, pos_z);
- break;
- case LOCATION_FORMAT_FULL:
- std::string sim_access_string = region->getSimAccessString();
- buffer = llformat("%s, %s (%d, %d, %d)%s%s",
- region_name.c_str(),
- parcel_name.c_str(),
- pos_x, pos_y, pos_z,
- sim_access_string.empty() ? "" : " - ",
- sim_access_string.c_str());
- break;
- }
- }
- str = buffer;
- return TRUE;
-}
-
LLQuaternion LLAgent::getHeadRotation()
{
if (mAvatarObject.isNull() || !mAvatarObject->mPelvisp || !mAvatarObject->mHeadp)
@@ -5475,30 +5348,6 @@ BOOL LLAgent::allowOperation(PermissionBit op,
return perm.allowOperationBy(op, agent_proxy, group_proxy);
}
-
-void LLAgent::getName(std::string& name) const
-{
- name.clear();
-
- if (mAvatarObject.notNull())
- {
- LLNameValue *first_nv = mAvatarObject->getNVPair("FirstName");
- LLNameValue *last_nv = mAvatarObject->getNVPair("LastName");
- if (first_nv && last_nv)
- {
- name = first_nv->printData() + " " + last_nv->printData();
- }
- else
- {
- llwarns << "Agent is missing FirstName and/or LastName nv pair." << llendl;
- }
- }
- else
- {
- name = gSavedSettings.getString("FirstName") + " " + gSavedSettings.getString("LastName");
- }
-}
-
const LLColor4 &LLAgent::getEffectColor()
{
return mEffectColor;
@@ -6308,12 +6157,12 @@ void LLAgent::setTeleportState(ETeleportState state)
if (mTeleportState == TELEPORT_MOVING)
{
// We're outa here. Save "back" slurl.
- mTeleportSourceSLURL = getSLURL();
+ mTeleportSourceSLURL = LLAgentUI::buildSLURL();
}
else if(mTeleportState == TELEPORT_ARRIVING)
{
// Let the interested parties know we've teleported.
- LLViewerParcelMgr::getInstance()->onTeleportFinished();
+ LLViewerParcelMgr::getInstance()->onTeleportFinished(false, getPositionGlobal());
}
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 3a8cf5fd97..9f71def63e 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -169,8 +169,7 @@ public:
// Name
//--------------------------------------------------------------------
public:
- void getName(std::string& name) const;
- void buildFullname(std::string &name) const;
+ //*TODO remove, is not used as of August 20, 2009
void buildFullnameAndTitle(std::string &name) const;
//--------------------------------------------------------------------
@@ -274,13 +273,9 @@ public:
void setRegion(LLViewerRegion *regionp);
LLViewerRegion *getRegion() const;
LLHost getRegionHost() const;
- std::string getSLURL() const;
- std::string getUnescapedSLURL() const;
BOOL inPrelude();
- BOOL buildLocationString(std::string& str, ELocationFormat fmt = LOCATION_FORMAT_LANDMARK); // Utility to build a location string
private:
LLViewerRegion *mRegionp;
- std::string buildSLURL(const bool escape) const;
//--------------------------------------------------------------------
// History
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
new file mode 100644
index 0000000000..93d88bf3df
--- /dev/null
+++ b/indra/newview/llagentui.cpp
@@ -0,0 +1,179 @@
+/**
+ * @file llagentui.cpp
+ * @brief Utility methods to process agent's data as slurl's etc. before displaying
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llagentui.h"
+
+// Library includes
+#include "llparcel.h"
+
+// Viewer includes
+#include "llagent.h"
+#include "llviewercontrol.h"
+#include "llviewerregion.h"
+#include "llviewerparcelmgr.h"
+#include "llvoavatarself.h"
+#include "llslurl.h"
+
+//static
+void LLAgentUI::buildName(std::string& name)
+{
+ name.clear();
+
+ LLVOAvatarSelf* avatar_object = gAgent.getAvatarObject();
+ if (avatar_object)
+ {
+ LLNameValue *first_nv = avatar_object->getNVPair("FirstName");
+ LLNameValue *last_nv = avatar_object->getNVPair("LastName");
+ if (first_nv && last_nv)
+ {
+ name = first_nv->printData() + " " + last_nv->printData();
+ }
+ else
+ {
+ llwarns << "Agent is missing FirstName and/or LastName nv pair." << llendl;
+ }
+ }
+ else
+ {
+ name = gSavedSettings.getString("FirstName") + " " + gSavedSettings.getString("LastName");
+ }
+}
+
+//static
+void LLAgentUI::buildFullname(std::string& name)
+{
+ if (gAgent.getAvatarObject()) name = gAgent.getAvatarObject()->getFullname();
+}
+
+//static
+std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/)
+{
+ std::string slurl;
+ LLViewerRegion *regionp = gAgent.getRegion();
+ if (regionp)
+ {
+ LLVector3d agentPos = gAgent.getPositionGlobal();
+ slurl = LLSLURL::buildSLURLfromPosGlobal(regionp->getName(), agentPos, escaped);
+ }
+ return slurl;
+}
+
+BOOL LLAgentUI::buildLocationString(std::string& str, LLAgent::ELocationFormat fmt,const LLVector3& agent_pos_region)
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+
+ if (!region || !parcel) return FALSE;
+
+ S32 pos_x = S32(agent_pos_region.mV[VX]);
+ S32 pos_y = S32(agent_pos_region.mV[VY]);
+ S32 pos_z = S32(agent_pos_region.mV[VZ]);
+
+ // Round the numbers based on the velocity
+ F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
+
+ const F32 FLY_CUTOFF = 6.f; // meters/sec
+ const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
+ const F32 WALK_CUTOFF = 1.5f; // meters/sec
+ const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
+
+ if (velocity_mag_sq > FLY_CUTOFF_SQ)
+ {
+ pos_x -= pos_x % 4;
+ pos_y -= pos_y % 4;
+ }
+ else if (velocity_mag_sq > WALK_CUTOFF_SQ)
+ {
+ pos_x -= pos_x % 2;
+ pos_y -= pos_y % 2;
+ }
+
+ // create a default name and description for the landmark
+ std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName();
+ std::string region_name = region->getName();
+ std::string buffer;
+ if( parcel_name.empty() )
+ {
+ // the parcel doesn't have a name
+ switch (fmt)
+ {
+ case LLAgent::LOCATION_FORMAT_LANDMARK:
+ buffer = llformat("%.100s", region_name.c_str());
+ break;
+ case LLAgent::LOCATION_FORMAT_NORMAL:
+ buffer = llformat("%s", region_name.c_str());
+ break;
+ case LLAgent::LOCATION_FORMAT_WITHOUT_SIM:
+ case LLAgent::LOCATION_FORMAT_FULL:
+ buffer = llformat("%s (%d, %d, %d)",
+ region_name.c_str(),
+ pos_x, pos_y, pos_z);
+ break;
+ }
+ }
+ else
+ {
+ // the parcel has a name, so include it in the landmark name
+ switch (fmt)
+ {
+ case LLAgent::LOCATION_FORMAT_LANDMARK:
+ buffer = llformat("%.100s", parcel_name.c_str());
+ break;
+ case LLAgent::LOCATION_FORMAT_NORMAL:
+ buffer = llformat("%s, %s", region_name.c_str(), parcel_name.c_str());
+ break;
+ case LLAgent::LOCATION_FORMAT_WITHOUT_SIM:
+ buffer = llformat("%s, %s (%d, %d, %d)",
+ region_name.c_str(),
+ parcel_name.c_str(),
+ pos_x, pos_y, pos_z);
+ break;
+ case LLAgent::LOCATION_FORMAT_FULL:
+ std::string sim_access_string = region->getSimAccessString();
+ buffer = llformat("%s, %s (%d, %d, %d)%s%s",
+ region_name.c_str(),
+ parcel_name.c_str(),
+ pos_x, pos_y, pos_z,
+ sim_access_string.empty() ? "" : " - ",
+ sim_access_string.c_str());
+ break;
+ }
+ }
+ str = buffer;
+ return TRUE;
+}
+BOOL LLAgentUI::buildLocationString(std::string& str, LLAgent::ELocationFormat fmt)
+{
+ return buildLocationString(str,fmt, gAgent.getPositionAgent());
+}
diff --git a/indra/newview/llagentui.h b/indra/newview/llagentui.h
new file mode 100644
index 0000000000..c3bc58d791
--- /dev/null
+++ b/indra/newview/llagentui.h
@@ -0,0 +1,51 @@
+/**
+ * @file llagentui.h
+ * @brief Utility methods to process agent's data as slurl's etc. before displaying
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLAGENTUI_H
+#define LLAGENTUI_H
+
+#include "llagent.h"
+
+class LLAgentUI
+{
+public:
+ static void buildName(std::string& name);
+ static void buildFullname(std::string &name);
+
+ static std::string buildSLURL(const bool escaped = true);
+ //build location string using the current position of gAgent.
+ static BOOL buildLocationString(std::string& str, LLAgent::ELocationFormat fmt = LLAgent::LOCATION_FORMAT_LANDMARK);
+ //build location string using a region position of the avatar.
+ static BOOL buildLocationString(std::string& str, LLAgent::ELocationFormat fmt,const LLVector3& agent_pos_region);
+};
+
+#endif //LLAGENTUI_H
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 57ea6064a4..a8373491cf 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -36,6 +36,7 @@
#include "llappviewer.h"
#include "llviewercontrol.h"
+#include "llimview.h"
#include <algorithm>
@@ -62,44 +63,66 @@ void LLChannelManager::onLoginCompleted()
for(std::vector<ChannelElem>::iterator it = mChannelList.begin(); it != mChannelList.end(); ++it)
{
+ if((*it).channel->getChannelID() == LLUUID(gSavedSettings.getString("NearByChatChannelUUID")))
+ {
+ continue;
+ }
+
if(!(*it).channel->getDisplayToastsAlways())
{
away_notifications +=(*it).channel->getNumberOfHiddenToasts();
}
}
+ // *TODO: calculate IM notifications
+ away_notifications += gIMMgr->getNumberOfUnreadIM();
+
if(!away_notifications)
{
- LLScreenChannel::setStartUpToastShown();
+ onStartUpToastClose();
return;
}
LLChannelManager::Params p;
- p.id = LLUUID(STARTUP_CHANNEL_ID);
+ p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));
p.channel_right_bound = getRootView()->getRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
p.channel_width = gSavedSettings.getS32("NotifyBoxWidth");
mStartUpChannel = createChannel(p);
if(!mStartUpChannel)
+ {
+ onStartUpToastClose();
return;
+ }
- static_cast<LLUICtrl*>(mStartUpChannel)->setCommitCallback(boost::bind(&LLChannelManager::removeStartUpChannel, this));
+ mStartUpChannel->setShowToasts(true);
+ static_cast<LLUICtrl*>(mStartUpChannel)->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("ChannelBottomPanelMargin"), gSavedSettings.getS32("StartUpToastTime"));
}
//--------------------------------------------------------------------------
-void LLChannelManager::removeStartUpChannel()
+void LLChannelManager::onStartUpToastClose()
{
- if(!mStartUpChannel)
- return;
+ if(mStartUpChannel)
+ {
+ mStartUpChannel->setVisible(FALSE);
+ mStartUpChannel->closeStartUpToast();
+ getRootView()->removeChild(mStartUpChannel);
+ removeChannelByID(LLUUID(gSavedSettings.getString("StartUpChannelUUID")));
+ delete mStartUpChannel;
+ mStartUpChannel = NULL;
+ }
- mStartUpChannel->setVisible(FALSE);
- mStartUpChannel->closeStartUpToast();
- getRootView()->removeChild(mStartUpChannel);
- delete mStartUpChannel;
- mStartUpChannel = NULL;
+ // set StartUp Toast Flag
+ LLScreenChannel::setStartUpToastShown();
+
+ // allow all other channels to show incoming toasts
+ for(std::vector<ChannelElem>::iterator it = mChannelList.begin(); it != mChannelList.end(); ++it)
+ {
+ (*it).channel->setShowToasts(true);
+ }
- //force NEARBY CHAT CHANNEL to repost all toasts if present
+ // force NEARBY CHAT CHANNEL to repost all toasts if present
LLScreenChannel* nearby_channel = getChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
nearby_channel->loadStoredToastsToChannel();
nearby_channel->setCanStoreToasts(false);
@@ -122,7 +145,7 @@ LLScreenChannel* LLChannelManager::createChannel(LLChannelManager::Params& p)
if(new_channel)
return new_channel;
- new_channel = new LLScreenChannel();
+ new_channel = new LLScreenChannel(p.id);
getRootView()->addChild(new_channel);
new_channel->init(p.channel_right_bound - p.channel_width, p.channel_right_bound);
new_channel->setToastAlignment(p.align);
@@ -179,15 +202,26 @@ void LLChannelManager::reshape(S32 width, S32 height, BOOL called_from_parent)
}
//--------------------------------------------------------------------------
-
-LLScreenChannel* LLChannelManager::getStartUpChannel()
+void LLChannelManager::removeChannelByID(const LLUUID id)
{
- return mStartUpChannel;
+ std::vector<ChannelElem>::iterator it = find(mChannelList.begin(), mChannelList.end(), id);
+ if(it != mChannelList.end())
+ {
+ mChannelList.erase(it);
+ }
}
//--------------------------------------------------------------------------
+void LLChannelManager::removeChannelByChiclet(const LLChiclet* chiclet)
+{
+ std::vector<ChannelElem>::iterator it = find(mChannelList.begin(), mChannelList.end(), chiclet);
+ if(it != mChannelList.end())
+ {
+ mChannelList.erase(it);
+ }
+}
-
+//--------------------------------------------------------------------------
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index dbd2e0b422..e26c96b62e 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -44,9 +44,6 @@
namespace LLNotificationsUI
{
-
-#define STARTUP_CHANNEL_ID "AEED3193-8709-4693-8558-7452CCA97AE5"
-
/**
* Manager for screen channels.
* Responsible for instantiating and retrieving screen channels.
@@ -56,19 +53,16 @@ class LLChannelManager : public LLUICtrl, public LLSingleton<LLChannelManager>
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<LLUUID> id;
- Optional<LLChiclet*> chiclet;
- Optional<S32> channel_right_bound;
- Optional<S32> channel_width;
- Optional<bool> display_toasts_always;
- Optional<EToastAlignment> align;
-
- Params(): id("id", LLUUID("")),
- chiclet("chiclet", NULL),
- channel_right_bound("channel_right_bound", 0),
- channel_width("channel_width", 0),
- display_toasts_always("display_toasts_always", false),
- align("align", NA_BOTTOM)
+ LLUUID id;
+ LLChiclet* chiclet;
+ S32 channel_right_bound;
+ S32 channel_width;
+ bool display_toasts_always;
+ EToastAlignment align;
+
+ Params(): id(LLUUID("")), chiclet(NULL),
+ channel_right_bound(0), channel_width(0),
+ display_toasts_always(false), align(NA_BOTTOM)
{}
};
@@ -104,7 +98,8 @@ public:
// On LoginCompleted - show StartUp toast
void onLoginCompleted();
- void removeStartUpChannel();
+ // removes a channel intended for the startup toast and allows other channels to show their toasts
+ void onStartUpToastClose();
//TODO: make protected? in order to be shure that channels are created only by notification handlers
LLScreenChannel* createChannel(LLChannelManager::Params& p);
@@ -112,9 +107,11 @@ public:
LLScreenChannel* getChannelByID(const LLUUID id);
LLScreenChannel* getChannelByChiclet(const LLChiclet* chiclet);
- void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+ // remove channel methods
+ void removeChannelByID(const LLUUID id);
+ void removeChannelByChiclet(const LLChiclet* chiclet);
- LLScreenChannel* getStartUpChannel();
+ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
private:
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index c844d70d89..6b4dfa73a4 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -55,6 +55,10 @@ static LLDefaultChildRegistry::Register<LLTalkButton> t2("chiclet_talk");
static LLDefaultChildRegistry::Register<LLNotificationChiclet> t3("chiclet_notification");
static LLDefaultChildRegistry::Register<LLIMChiclet> t4("chiclet_im");
+S32 LLNotificationChiclet::mUreadSystemNotifications = 0;
+S32 LLNotificationChiclet::mUreadIMNotifications = 0;
+
+
boost::signals2::signal<LLChiclet* (const LLUUID&),
LLIMChiclet::CollectChicletCombiner<std::list<LLChiclet*> > >
LLIMChiclet::sFindChicletsSignal;
@@ -115,6 +119,12 @@ boost::signals2::connection LLNotificationChiclet::setClickCallback(
return mButton->setClickedCallback(cb);
}
+void LLNotificationChiclet::updateUreadIMNotifications()
+{
+ mUreadIMNotifications = gIMMgr->getNumberOfUnreadIM();
+ setCounter(mUreadSystemNotifications + mUreadIMNotifications);
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -269,6 +279,12 @@ void LLIMChiclet::setCounter(S32 counter)
}
}
+void LLIMChiclet::onMouseDown()
+{
+ LLIMFloater::toggle(getSessionId());
+ setCounter(0);
+}
+
LLRect LLIMChiclet::getRequiredRect()
{
LLRect rect(0, 0, mAvatarCtrl->getRect().getWidth(), 0);
@@ -296,6 +312,38 @@ void LLIMChiclet::setShowCounter(bool show)
}
}
+
+void LLIMChiclet::setSessionId(const LLUUID& session_id)
+{
+ LLChiclet::setSessionId(session_id);
+
+ //for a group chat session_id = group_id
+ LLFloaterIMPanel* im = LLIMMgr::getInstance()->findFloaterBySession(session_id);
+ if (!im) return; //should never happen
+
+ EInstantMessage type = im->getDialogType();
+ if (type == IM_SESSION_INVITE || type == IM_SESSION_GROUP_START)
+ {
+ if (!gAgent.isInGroup(session_id)) return;
+
+ if (mGroupInsignia) {
+ LLGroupMgr* grp_mgr = LLGroupMgr::getInstance();
+ LLGroupMgrGroupData* group_data = grp_mgr->getGroupData(session_id);
+ if (group_data && group_data->mInsigniaID.notNull())
+ {
+ mGroupInsignia->setVisible(TRUE);
+ mGroupInsignia->setValue(group_data->mInsigniaID);
+ }
+ else
+ {
+ mID = session_id; //needed for LLGroupMgrObserver
+ grp_mgr->addObserver(this);
+ grp_mgr->sendGroupPropertiesRequest(session_id);
+ }
+ }
+ }
+}
+
void LLIMChiclet::setIMSessionName(const std::string& name)
{
setToolTip(name);
@@ -311,48 +359,13 @@ void LLIMChiclet::setOtherParticipantId(const LLUUID& other_participant_id)
//all alive sessions have alive floater, haven't they?
llassert(floater);
- //in case participant id is being replaced with different id for a group chat
- if (mOtherParticipantId.notNull() && mOtherParticipantId != other_participant_id &&
- mID.notNull() && mGroupInsignia->getValue().isUUID())
- {
- LLGroupMgr::getInstance()->removeObserver(this);
- }
-
mOtherParticipantId = other_participant_id;
- switch (floater->getDialogType())
+ if (mAvatarCtrl && floater->getDialogType() == IM_NOTHING_SPECIAL)
{
- case IM_NOTHING_SPECIAL:
- if (mAvatarCtrl) {
- mAvatarCtrl->setVisible(TRUE);
- mAvatarCtrl->setValue(other_participant_id);
- }
- break;
- case IM_SESSION_GROUP_START:
- {
- if (mGroupInsignia) {
- LLGroupMgr* grp_mgr = LLGroupMgr::getInstance();
- LLGroupMgrGroupData* group_data = grp_mgr->getGroupData(other_participant_id);
- if (group_data && group_data->mInsigniaID.notNull())
- {
- mGroupInsignia->setVisible(TRUE);
- mGroupInsignia->setValue(group_data->mInsigniaID);
- }
- else
- {
- mID = mOtherParticipantId; //needed for LLGroupMgrObserver
- grp_mgr->addObserver(this);
- grp_mgr->sendGroupPropertiesRequest(mOtherParticipantId);
- }
- }
- }
-
- break;
- default:
- llwarning("Unsupported dialog type", 0);
- break;
+ mAvatarCtrl->setVisible(TRUE);
+ mAvatarCtrl->setValue(other_participant_id);
}
-
}
@@ -363,7 +376,7 @@ void LLIMChiclet::changed(LLGroupChange gc)
if (GC_PROPERTIES == gc)
{
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mOtherParticipantId);
+ LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(getSessionId());
if (group_data && group_data->mInsigniaID.notNull())
{
mGroupInsignia->setVisible(TRUE);
@@ -395,8 +408,7 @@ void LLIMChiclet::updateMenuItems()
BOOL LLIMChiclet::handleMouseDown(S32 x, S32 y, MASK mask)
{
- LLIMFloater::toggle(getSessionId());
- setCounter(0);
+ onMouseDown();
return LLChiclet::handleMouseDown(x, y, mask);
}
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index c83caf8ff9..b1e73c9d8d 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -256,6 +256,8 @@ public:
/*virtual*/ ~LLIMChiclet();
+ virtual void setSessionId(const LLUUID& session_id);
+
/*
* Sets IM session name. This name will be displayed in chiclet tooltip.
*/
@@ -303,6 +305,14 @@ public:
*/
/*virtual*/ void draw();
+ /**
+ * The action taken on mouse down event.
+ *
+ * Made public so that it can be triggered from outside
+ * (more specifically, from the Active IM window).
+ */
+ void onMouseDown();
+
/*
* Returns rect, required to display chiclet.
* Width is the only valid value.
@@ -407,12 +417,20 @@ public:
// Notification Chiclet Window
void setNotificationChicletWindow(LLFloater* wnd) { mNotificationChicletWindow = wnd; }
+ // methods for updating a number of unread System or IM notifications
+ void incUreadSystemNotifications() { setCounter(++mUreadSystemNotifications + mUreadIMNotifications); }
+ void decUreadSystemNotifications() { setCounter(--mUreadSystemNotifications + mUreadIMNotifications); }
+ void updateUreadIMNotifications();
+
protected:
LLNotificationChiclet(const Params& p);
friend class LLUICtrlFactory;
LLFloater* mNotificationChicletWindow;
+ static S32 mUreadSystemNotifications;
+ static S32 mUreadIMNotifications;
+
protected:
LLButton* mButton;
LLChicletNotificationCounterCtrl* mCounterCtrl;
diff --git a/indra/newview/llclassifiedstatsresponder.cpp b/indra/newview/llclassifiedstatsresponder.cpp
index a218e2b4e5..ecd1879090 100644
--- a/indra/newview/llclassifiedstatsresponder.cpp
+++ b/indra/newview/llclassifiedstatsresponder.cpp
@@ -33,7 +33,6 @@
#include "llviewerprecompiledheaders.h"
-#include "llagent.h"
#include "llclassifiedstatsresponder.h"
#include "llpanelclassified.h"
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index de97e2406d..88f79fc1b9 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -42,7 +42,6 @@
#include "llcubemap.h"
#include "llsky.h"
-#include "llagent.h"
#include "lldrawable.h"
#include "llface.h"
#include "llviewercamera.h"
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index a2d8c965ec..565f906a3b 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -38,7 +38,6 @@
#include "llvoavatar.h"
#include "m3math.h"
-#include "llagent.h"
#include "lldrawable.h"
#include "llface.h"
#include "llsky.h"
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 2cb4d5d6d5..331ba67d36 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -43,7 +43,6 @@
#include "llglheaders.h"
#include "llrender.h"
-#include "llagent.h"
#include "llcubemap.h"
#include "lldrawable.h"
#include "llface.h"
diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp
index d084bda2ea..331536fdca 100644
--- a/indra/newview/lldrawpoolsimple.cpp
+++ b/indra/newview/lldrawpoolsimple.cpp
@@ -35,7 +35,6 @@
#include "lldrawpoolsimple.h"
#include "llviewercamera.h"
-#include "llagent.h"
#include "lldrawable.h"
#include "llface.h"
#include "llsky.h"
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index 9b52ddb73c..c14ca2473b 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -42,7 +42,6 @@
#include "llwlparammanager.h"
#include "llsky.h"
#include "llvowlsky.h"
-#include "llagent.h"
#include "llviewerregion.h"
#include "llface.h"
#include "llrender.h"
diff --git a/indra/newview/llemote.cpp b/indra/newview/llemote.cpp
index bacf3daf5a..c83846215e 100644
--- a/indra/newview/llemote.cpp
+++ b/indra/newview/llemote.cpp
@@ -39,7 +39,6 @@
#include "llcharacter.h"
#include "m3math.h"
#include "llvoavatar.h"
-#include "llagent.h"
//-----------------------------------------------------------------------------
// Constants
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 9c1a7ecb04..70ee5d395e 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -38,6 +38,8 @@
#include "llfloaterreg.h"
#include "llfocusmgr.h"
#include "llinventory.h"
+#include "lllandmarkactions.h"
+#include "lltrans.h"
#include "lluictrlfactory.h"
#include "llmenugl.h"
@@ -56,6 +58,71 @@
static LLDefaultChildRegistry::Register<LLFavoritesBarCtrl> r("favorites_bar");
+const S32 DROP_DOWN_MENU_WIDTH = 250;
+
+/**
+ * This class is needed to override LLButton default handleToolTip function and
+ * show SLURL as button tooltip.
+ * *NOTE: dzaporozhan: This is a workaround. We could set tooltips for buttons
+ * in createButtons function but landmark data is not available when Favorites Bar is
+ * created. Thats why we are requesting landmark data after
+ */
+class LLFavoriteLandmarkButton : public LLButton
+{
+public:
+
+ /**
+ * Requests landmark data from server and shows landmark SLURL as tooltip.
+ */
+ BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect)
+ {
+ if(LLUI::sShowXUINames)
+ {
+ return LLButton::handleToolTip(x, y, msg, sticky_rect);
+ }
+
+ if(!mLoaded)
+ {
+ LLVector3d g_pos;
+ if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos))
+ {
+ LLLandmarkActions::getSLURLfromPosGlobal(g_pos,
+ boost::bind(&LLFavoriteLandmarkButton::landmarkNameCallback, this, _1), false);
+ }
+ }
+
+ msg = mSLURL;
+ return TRUE;
+ }
+
+ void landmarkNameCallback(const std::string& name)
+ {
+ mSLURL = name;
+ mLoaded = true;
+ }
+
+ void setLandmarkID(const LLUUID& id){ mLandmarkID = id; }
+
+protected:
+
+ LLFavoriteLandmarkButton(const LLButton::Params& p)
+ : LLButton(p)
+ , mLandmarkID(LLUUID::null)
+ , mSLURL("(Loading...)")
+ , mLoaded(false)
+ {
+ static std::string loading_tooltip = LLTrans::getString("favorite_landmark_loading_tooltip");
+ mSLURL = loading_tooltip;
+ }
+
+ friend class LLUICtrlFactory;
+
+private:
+ LLUUID mLandmarkID;
+ std::string mSLURL;
+ bool mLoaded;
+};
+
// updateButtons's helper
struct LLFavoritesSort
{
@@ -353,13 +420,15 @@ void LLFavoritesBarCtrl::createButtons(const LLInventoryModel::item_array_t &ite
{
LLInventoryItem* item = items.get(i);
- LLButton* fav_btn = LLUICtrlFactory::defaultBuilder<LLButton>(buttonXMLNode, this, NULL);
+ LLFavoriteLandmarkButton* fav_btn = LLUICtrlFactory::defaultBuilder<LLFavoriteLandmarkButton>(buttonXMLNode, this, NULL);
if (NULL == fav_btn)
{
llwarns << "Unable to create button for landmark: " << item->getName() << llendl;
continue;
}
+ fav_btn->setLandmarkID(item->getUUID());
+
// change only left and save bottom
fav_btn->setOrigin(curr_x, fav_btn->getRect().mBottom);
fav_btn->setFont(mFont);
@@ -413,6 +482,7 @@ void LLFavoritesBarCtrl::showDropDownMenu()
menu_p.can_tear_off(false);
menu_p.visible(false);
menu_p.scrollable(true);
+ menu_p.max_scrollable_items = 10;
LLToggleableMenu* menu = LLUICtrlFactory::create<LLToggleableMenu>(menu_p);
@@ -471,10 +541,8 @@ void LLFavoritesBarCtrl::showDropDownMenu()
menu->empty();
- U32 max_width = 0;
-
- // Menu will not be wider, than bar
- S32 bar_width = getRect().getWidth();
+ U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
+ U32 widest_item = 0;
for(S32 i = mFirstDropDownItem; i < count; i++)
{
@@ -489,12 +557,12 @@ void LLFavoritesBarCtrl::showDropDownMenu()
LLMenuItemCallGL *menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this,item->getUUID(),_1,_2,_3,_4));
// Check whether item name wider than menu
- if ((S32) menu_item->getNominalWidth() > bar_width)
+ if (menu_item->getNominalWidth() > max_width)
{
S32 chars_total = item_name.length();
S32 chars_fitted = 1;
menu_item->setLabel(LLStringExplicit(""));
- S32 label_space = bar_width - menu_item->getFont()->getWidth("...") -
+ S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
menu_item->getNominalWidth(); // This returns width of menu item with empty label (pad pixels)
while (chars_fitted < chars_total && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
@@ -505,21 +573,17 @@ void LLFavoritesBarCtrl::showDropDownMenu()
menu_item->setLabel(item_name.substr(0, chars_fitted) + "...");
}
-
- max_width = llmax(max_width, menu_item->getNominalWidth());
+ widest_item = llmax(widest_item, menu_item->getNominalWidth());
menu->addChild(menu_item);
}
- // Menu will not be wider, than bar
- max_width = llmin((S32)max_width, bar_width);
-
menu->buildDrawLabels();
menu->updateParent(LLMenuGL::sMenuContainer);
menu->setButtonRect(mChevronRect, this);
- LLMenuGL::showPopup(this, menu, getRect().getWidth() - max_width, 0);
+ LLMenuGL::showPopup(this, menu, getRect().getWidth() - widest_item, 0);
}
}
diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp
index f49f854620..7a88612f1a 100644
--- a/indra/newview/llfloatergroups.cpp
+++ b/indra/newview/llfloatergroups.cpp
@@ -81,7 +81,18 @@ void LLFloaterGroupPicker::setPowersMask(U64 powers_mask)
BOOL LLFloaterGroupPicker::postBuild()
{
- init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID(), mPowersMask);
+ LLScrollListCtrl* list_ctrl = getChild<LLScrollListCtrl>("group list");
+ init_group_list(list_ctrl, gAgent.getGroupID(), mPowersMask);
+
+ // Remove group "none" from list. Group "none" is added in init_group_list().
+ // Some UI elements use group "none", we need to manually delete it here.
+ // Group "none" ID is LLUUID:null.
+ LLCtrlListInterface* group_list = list_ctrl->getListInterface();
+ if(group_list)
+ {
+ group_list->selectByValue(LLUUID::null);
+ group_list->operateOnSelection(LLCtrlListInterface::OP_DELETE);
+ }
childSetAction("OK", onBtnOK, this);
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index ba23a58b37..aa82dc34b7 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -43,7 +43,6 @@
#include "llbutton.h"
#include "lltextbox.h"
-#include "llagent.h" // for agent id
#include "llalertdialog.h"
#include "llinventorybridge.h"
#include "llfloaterinventory.h"
diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp
index ac687ed3e9..a27070de39 100644
--- a/indra/newview/llfloaterpostcard.cpp
+++ b/indra/newview/llfloaterpostcard.cpp
@@ -64,6 +64,7 @@
#include "llvfs.h"
#include "llviewertexture.h"
#include "llassetuploadresponders.h"
+#include "llagentui.h"
#include <boost/regex.hpp> //boost.regex lib
@@ -101,7 +102,7 @@ BOOL LLFloaterPostcard::postBuild()
childDisable("from_form");
std::string name_string;
- gAgent.buildFullname(name_string);
+ LLAgentUI::buildFullname(name_string);
childSetValue("name_form", LLSD(name_string));
// For the first time a user focusess to .the msg box, all text will be selected.
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index a50bcaa098..10276ba36d 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -84,6 +84,7 @@
#include "llviewerwindow.h"
#include "llvlcomposition.h"
#include "lltrans.h"
+#include "llagentui.h"
#define ELAR_ENABLED 0 // Enable when server support is implemented
@@ -714,7 +715,7 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
gAgent.getID().toString(buffer);
strings.push_back(buffer);
std::string name;
- gAgent.buildFullname(name);
+ LLAgentUI::buildFullname(name);
strings.push_back(strings_t::value_type(name));
strings.push_back(strings_t::value_type(text));
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
@@ -2659,7 +2660,7 @@ bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& re
strings_t strings;
//integers_t integers;
std::string name;
- gAgent.buildFullname(name);
+ LLAgentUI::buildFullname(name);
strings.push_back(strings_t::value_type(name));
strings.push_back(strings_t::value_type(text));
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index e2176350c9..818381b561 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -85,6 +85,7 @@
#include "llviewernetwork.h"
#include "llassetuploadresponders.h"
+#include "llagentui.h"
const U32 INCLUDE_SCREENSHOT = 0x01 << 0;
@@ -137,7 +138,7 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
// virtual
BOOL LLFloaterReporter::postBuild()
{
- childSetText("abuse_location_edit", gAgent.getSLURL() );
+ childSetText("abuse_location_edit", LLAgentUI::buildSLURL());
enableControls(TRUE);
@@ -190,7 +191,7 @@ BOOL LLFloaterReporter::postBuild()
// grab the user's name
std::string fullname;
- gAgent.buildFullname(fullname);
+ LLAgentUI::buildFullname(fullname);
childSetText("reporter_field", fullname);
center();
@@ -499,7 +500,7 @@ void LLFloaterReporter::showFromObject(const LLUUID& object_id)
// grab the user's name
std::string fullname;
- gAgent.buildFullname(fullname);
+ LLAgentUI::buildFullname(fullname);
f->childSetText("reporter_field", fullname);
// Request info for this object
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 814395395c..dd73ebbd8f 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -59,6 +59,7 @@
#include "lltoolfocus.h"
#include "lltoolmgr.h"
#include "llworld.h"
+#include "llagentui.h"
// Linden library includes
#include "llfontgl.h"
@@ -967,9 +968,9 @@ void LLSnapshotLivePreview::saveTexture()
{
LLVFile::writeFile(formatted->getData(), formatted->getDataSize(), gVFS, new_asset_id, LLAssetType::AT_TEXTURE);
std::string pos_string;
- gAgent.buildLocationString(pos_string, LLAgent::LOCATION_FORMAT_FULL);
+ LLAgentUI::buildLocationString(pos_string, LLAgent::LOCATION_FORMAT_FULL);
std::string who_took_it;
- gAgent.buildFullname(who_took_it);
+ LLAgentUI::buildFullname(who_took_it);
LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
void *userdata = NULL;
diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp
index f61d5cb077..c20b3f34b2 100644
--- a/indra/newview/llfloatertos.cpp
+++ b/indra/newview/llfloatertos.cpp
@@ -35,7 +35,6 @@
#include "llfloatertos.h"
// viewer includes
-#include "llagent.h"
#include "llappviewer.h"
#include "llstartup.h"
#include "llviewerstats.h"
diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp
index 37da4a6ba6..a7658d90e9 100644
--- a/indra/newview/llfloatervoicedevicesettings.cpp
+++ b/indra/newview/llfloatervoicedevicesettings.cpp
@@ -36,7 +36,6 @@
#include "llfloatervoicedevicesettings.h"
// Viewer includes
-#include "llagent.h"
#include "llbutton.h"
#include "llcombobox.h"
#include "llfocusmgr.h"
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index d1f0f94fa0..2a29566120 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -34,7 +34,6 @@
#include "llfolderview.h"
-#include "llagent.h"
#include "llcallbacklist.h"
#include "llinventorybridge.h"
#include "llinventoryclipboard.h" // *TODO: remove this once hack below gone.
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 7af77e2056..24e9615f0d 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -37,6 +37,7 @@
#include "llagent.h"
#include "llfloaterreg.h"
+#include "llgroupmgr.h"
#include "llimview.h" // for gIMMgr
#include "llsidetray.h"
@@ -162,6 +163,19 @@ void LLGroupActions::show(const LLUUID& group_id)
LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
}
+void LLGroupActions::refresh_notices()
+{
+ if(!isGroupUIVisible())
+ return;
+
+ LLSD params;
+ params["group_id"] = LLUUID::null;
+ params["open_tab_name"] = "panel_group_info_sidetray";
+ params["action"] = "refresh_notices";
+
+ LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+}
+
//static
void LLGroupActions::refresh(const LLUUID& group_id)
{
@@ -225,6 +239,28 @@ void LLGroupActions::startChat(const LLUUID& group_id)
}
}
+// static
+bool LLGroupActions::isAvatarMemberOfGroup(const LLUUID& group_id, const LLUUID& avatar_id)
+{
+ if(group_id.isNull() || avatar_id.isNull())
+ {
+ return false;
+ }
+
+ LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
+ if(!group_data)
+ {
+ return false;
+ }
+
+ if(group_data->mMembers.end() == group_data->mMembers.find(avatar_id))
+ {
+ return false;
+ }
+
+ return true;
+}
+
//-- Private methods ----------------------------------------------------------
// static
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index eb366bd779..9fe1da8af2 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -68,6 +68,11 @@ public:
static void refresh(const LLUUID& group_id);
/**
+ * Refresh group notices panel.
+ */
+ static void refresh_notices();
+
+ /**
* Refresh group information panel.
*/
static void createGroup();
@@ -81,6 +86,15 @@ public:
* Start group instant messaging session.
*/
static void startChat(const LLUUID& group_id);
+
+ /**
+ * Returns true if avatar is in group.
+ *
+ * Note that data about group members is loaded from server.
+ * If data has not been loaded yet, function will return inaccurate result.
+ * See LLGroupMgr::sendGroupMembersRequest
+ */
+ static bool isAvatarMemberOfGroup(const LLUUID& group_id, const LLUUID& avatar_id);
private:
static bool onLeaveGroup(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 0ba1019765..5e50fad008 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -809,7 +809,7 @@ static void formatDateString(std::string &date_string)
std::string day = result[2];
// ISO 8601 date format
- date_string = llformat("%04s-%02s-%02s", year.c_str(), month.c_str(), day.c_str());
+ date_string = llformat("%02s/%02s/%04s", month.c_str(), day.c_str(), year.c_str());
}
}
diff --git a/indra/newview/llhudview.cpp b/indra/newview/llhudview.cpp
index 6f22a68327..0a6938f4f8 100644
--- a/indra/newview/llhudview.cpp
+++ b/indra/newview/llhudview.cpp
@@ -39,7 +39,6 @@
#include "llcoord.h"
// viewer includes
-#include "llagent.h"
#include "llcallingcard.h"
#include "llviewercontrol.h"
#include "llfloaterworldmap.h"
diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp
new file mode 100644
index 0000000000..0262e40803
--- /dev/null
+++ b/indra/newview/llimhandler.cpp
@@ -0,0 +1,127 @@
+/**
+ * @file llimhandler.cpp
+ * @brief Notification Handler Class for IM notifications
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llnotificationhandler.h"
+
+#include "llbottomtray.h"
+#include "llviewercontrol.h"
+#include "lltoastimpanel.h"
+
+using namespace LLNotificationsUI;
+
+//--------------------------------------------------------------------------
+LLIMHandler::LLIMHandler()
+{
+
+ // getting a Chiclet and creating params for a channel
+ LLBottomTray* tray = LLBottomTray::getInstance();
+ mChiclet = tray->getSysWell();
+
+ LLChannelManager::Params p;
+ // *TODO: createNotificationChannel method
+ p.id = LLUUID(gSavedSettings.getString("NotificationChannelUUID"));
+ p.channel_right_bound = tray->getRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+ p.channel_width = gSavedSettings.getS32("NotifyBoxWidth");
+
+ // Getting a Channel for our notifications
+ mChannel = LLChannelManager::getInstance()->createChannel(p);
+
+}
+
+//--------------------------------------------------------------------------
+LLIMHandler::~LLIMHandler()
+{
+}
+
+//--------------------------------------------------------------------------
+void LLIMHandler::processNotification(const LLSD& notify)
+{
+ LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
+
+ if(!notification)
+ return;
+
+ if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
+ {
+ LLSD substitutions = notification->getSubstitutions();
+
+ LLToastIMPanel::Params im_p;
+ im_p.notification = notification;
+ im_p.avatar_id = substitutions["FROM_ID"].asUUID();
+ im_p.from = substitutions["FROM"].asString();
+ im_p.time = substitutions["TIME"].asString();
+ im_p.message = substitutions["MESSAGE"].asString();
+ im_p.session_id = substitutions["SESSION_ID"].asUUID();
+
+ LLToastIMPanel* im_box = new LLToastIMPanel(im_p);
+
+ LLToast::Params p;
+ p.id = notification->getID();
+ p.notification = notification;
+ p.panel = im_box;
+ p.can_be_stored = false;
+ p.on_toast_destroy = boost::bind(&LLIMHandler::onToastDestroy, this, _1);
+ mChannel->addToast(p);
+
+
+ static_cast<LLNotificationChiclet*>(mChiclet)->updateUreadIMNotifications();
+ }
+ else if (notify["sigtype"].asString() == "delete")
+ {
+ mChannel->killToastByNotificationID(notification->getID());
+ }
+}
+
+//--------------------------------------------------------------------------
+void LLIMHandler::onToastDestroy(LLToast* toast)
+{
+ toast->closeFloater();
+ static_cast<LLNotificationChiclet*>(mChiclet)->updateUreadIMNotifications();
+}
+
+//--------------------------------------------------------------------------
+void LLIMHandler::onChicletClick(void)
+{
+}
+
+//--------------------------------------------------------------------------
+void LLIMHandler::onChicletClose(void)
+{
+}
+
+//--------------------------------------------------------------------------
+
+
+
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 72e2bb02d5..8c24962897 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -2235,6 +2235,8 @@ bool LLIMFloater::toggle(const LLUUID& session_id)
{
// ensure the list of messages is updated when floater is made visible
show(session_id);
+ // update number of unread notifications in the SysWell
+ LLBottomTray::getInstance()->getSysWell()->updateUreadIMNotifications();
return true;
}
}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index e3902bffa0..4cbf88f3da 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -72,6 +72,7 @@
#include "lltrans.h"
#include "llfirstuse.h"
+#include "llagentui.h"
//
// Globals
@@ -104,6 +105,8 @@ void toast_callback(const LLSD& msg){
args["MESSAGE"] = msg["message"];
args["TIME"] = msg["time"];
args["FROM"] = msg["from"];
+ args["FROM_ID"] = msg["from_id"];
+ args["SESSION_ID"] = msg["session_id"];
LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLFloaterChatterBox::onOpen, LLFloaterChatterBox::getInstance(), msg["session_id"].asUUID()));
}
@@ -124,7 +127,7 @@ void LLIMModel::testMessages()
bot1_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot1_id);
newSession(bot1_session_id, from, IM_NOTHING_SPECIAL, bot1_id);
- addMessage(bot1_session_id, from, "Test Message: Hi from testerbot land!");
+ addMessage(bot1_session_id, from, bot1_id, "Test Message: Hi from testerbot land!");
LLUUID bot2_id;
std::string firstname[] = {"Roflcopter", "Joe"};
@@ -137,8 +140,8 @@ void LLIMModel::testMessages()
bot2_id.generate(from);
LLUUID bot2_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot2_id);
newSession(bot2_session_id, from, IM_NOTHING_SPECIAL, bot2_id);
- addMessage(bot2_session_id, from, "Test Message: Can I haz bear? ");
- addMessage(bot2_session_id, from, "Test Message: OMGWTFBBQ.");
+ addMessage(bot2_session_id, from, bot2_id, "Test Message: Can I haz bear? ");
+ addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ.");
}
@@ -218,7 +221,7 @@ bool LLIMModel::addToHistory(LLUUID session_id, std::string from, std::string ut
}
-bool LLIMModel::addMessage(LLUUID session_id, std::string from, std::string utf8_text) {
+bool LLIMModel::addMessage(LLUUID session_id, std::string from, LLUUID from_id, std::string utf8_text) {
LLIMSession* session = get_if_there(sSessionsMap, session_id, (LLIMSession*)NULL);
@@ -231,7 +234,7 @@ bool LLIMModel::addMessage(LLUUID session_id, std::string from, std::string utf8
addToHistory(session_id, from, utf8_text);
std::string agent_name;
- gAgent.buildFullname(agent_name);
+ LLAgentUI::buildFullname(agent_name);
session->mNumUnread++;
@@ -240,6 +243,9 @@ bool LLIMModel::addMessage(LLUUID session_id, std::string from, std::string utf8
arg["session_id"] = session_id;
arg["num_unread"] = session->mNumUnread;
arg["message"] = utf8_text;
+ arg["from"] = from;
+ arg["from_id"] = from_id;
+ arg["time"] = LLLogChat::timestamp(false);
mChangedSignal(arg);
return true;
@@ -264,7 +270,7 @@ const std::string& LLIMModel::getName(LLUUID session_id)
void LLIMModel::sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing)
{
std::string name;
- gAgent.buildFullname(name);
+ LLAgentUI::buildFullname(name);
pack_instant_message(
gMessageSystem,
@@ -285,7 +291,7 @@ void LLIMModel::sendLeaveSession(LLUUID session_id, LLUUID other_participant_id)
if(session_id.notNull())
{
std::string name;
- gAgent.buildFullname(name);
+ LLAgentUI::buildFullname(name);
pack_instant_message(
gMessageSystem,
gAgent.getID(),
@@ -310,7 +316,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
{
std::string name;
bool sent = false;
- gAgent.buildFullname(name);
+ LLAgentUI::buildFullname(name);
const LLRelationship* info = NULL;
info = LLAvatarTracker::instance().getBuddyInfo(other_participant_id);
@@ -377,13 +383,13 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
{
// Do we have to replace the /me's here?
std::string from;
- gAgent.buildFullname(from);
+ LLAgentUI::buildFullname(from);
LLIMModel::instance().addToHistory(im_session_id, from, utf8_text);
//local echo for the legacy communicate panel
std::string history_echo;
std::string utf8_copy = utf8_text;
- gAgent.buildFullname(history_echo);
+ LLAgentUI::buildFullname(history_echo);
// Look for IRC-style emotes here.
@@ -433,7 +439,7 @@ void session_starter_helper(
msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
std::string name;
- gAgent.buildFullname(name);
+ LLAgentUI::buildFullname(name);
msg->addStringFast(_PREHASH_FromAgentName, name);
msg->addStringFast(_PREHASH_Message, LLStringUtil::null);
@@ -1231,7 +1237,7 @@ void LLIMMgr::addMessage(
//<< "*** position: " << position << std::endl;
floater->addHistoryLine(bonus_info.str(), LLUIColorTable::instance().getColor("SystemChatColor"));
- LLIMModel::instance().addMessage(new_session_id, from, bonus_info.str());
+ LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, bonus_info.str());
}
make_ui_sound("UISndNewIncomingIMSession");
@@ -1251,7 +1257,7 @@ void LLIMMgr::addMessage(
floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message
}
- LLIMModel::instance().addMessage(new_session_id, from, msg);
+ LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
if( !LLFloaterReg::instanceVisible("communicate") && !floater->getVisible())
{
@@ -1311,6 +1317,19 @@ void LLIMMgr::notifyNewIM()
}
}
+S32 LLIMMgr::getNumberOfUnreadIM()
+{
+ std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it;
+
+ S32 num = 0;
+ for(it = LLIMModel::sSessionsMap.begin(); it != LLIMModel::sSessionsMap.end(); ++it)
+ {
+ num += (*it).second->mNumUnread;
+ }
+
+ return num;
+}
+
void LLIMMgr::clearNewIMNotification()
{
mIMReceived = FALSE;
@@ -1356,44 +1375,9 @@ LLUUID LLIMMgr::addSession(
EInstantMessage dialog,
const LLUUID& other_participant_id)
{
- LLUUID session_id = computeSessionID(dialog, other_participant_id);
-
- LLFloaterIMPanel* floater = findFloaterBySession(session_id);
- if(!floater)
- {
- LLDynamicArray<LLUUID> ids;
- ids.put(other_participant_id);
-
- floater = createFloater(
- session_id,
- other_participant_id,
- name,
- ids,
- dialog,
- TRUE);
-
- noteOfflineUsers(floater, ids);
- //LLFloaterReg::showInstance("communicate", session_id);
- // *NOTE: Is this right? Or should we only do it for
- // dialog == IM_NOTHING_SPECIAL and some group types?
-
- // Only warn for regular IMs - not group IMs
- if( dialog == IM_NOTHING_SPECIAL )
- {
- noteMutedUsers(floater, ids);
- }
- }
- else
- {
- // *TODO: Remove this? Otherwise old communicate window opens on
- // second initiation of IM session from People panel?
- // floater->openFloater();
- }
- //mTabContainer->selectTabPanel(panel);
- floater->setInputFocus(TRUE);
- LLIMFloater::show(session_id);
- notifyObserverSessionAdded(floater->getSessionID(), name, other_participant_id);
- return floater->getSessionID();
+ LLDynamicArray<LLUUID> ids;
+ ids.put(other_participant_id);
+ return addSession(name, dialog, other_participant_id, ids);
}
// Adds a session using the given session_id. If the session already exists
@@ -1409,9 +1393,7 @@ LLUUID LLIMMgr::addSession(
return LLUUID::null;
}
- LLUUID session_id = computeSessionID(
- dialog,
- other_participant_id);
+ LLUUID session_id = computeSessionID(dialog,other_participant_id);
LLFloaterIMPanel* floater = findFloaterBySession(session_id);
if(!floater)
@@ -1422,15 +1404,13 @@ LLUUID LLIMMgr::addSession(
session_id,
other_participant_id,
name,
- ids,
dialog,
- TRUE);
+ TRUE,
+ ids);
if ( !floater ) return LLUUID::null;
noteOfflineUsers(floater, ids);
- // *BUG: Is this correct? What do we want to spawn for group IMs?
- // LLFloaterReg::showInstance("communicate", session_id);
// Only warn for regular IMs - not group IMs
if( dialog == IM_NOTHING_SPECIAL )
@@ -1440,10 +1420,13 @@ LLUUID LLIMMgr::addSession(
}
else
{
- floater->openFloater();
+ // *TODO: Remove this? Otherwise old communicate window opens on
+ // second initiation of IM session from People panel?
+ // floater->openFloater();
}
//mTabContainer->selectTabPanel(panel);
floater->setInputFocus(TRUE);
+ LLIMFloater::show(session_id);
notifyObserverSessionAdded(floater->getSessionID(), name, other_participant_id);
return floater->getSessionID();
}
@@ -1772,35 +1755,8 @@ LLFloaterIMPanel* LLIMMgr::createFloater(
const LLUUID& other_participant_id,
const std::string& session_label,
EInstantMessage dialog,
- BOOL user_initiated)
-{
- if (session_id.isNull())
- {
- llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl;
- }
-
- llinfos << "LLIMMgr::createFloater: from " << other_participant_id
- << " in session " << session_id << llendl;
- std::vector<LLUUID> ids;
- LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label,
- session_id,
- other_participant_id,
- ids,
- dialog);
- LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
- LLFloaterChatterBox::getInstance()->addFloater(floater, FALSE, i_pt);
- mFloaters.insert(floater->getHandle());
- LLIMModel::instance().newSession(session_id, session_label, dialog, other_participant_id);
- return floater;
-}
-
-LLFloaterIMPanel* LLIMMgr::createFloater(
- const LLUUID& session_id,
- const LLUUID& other_participant_id,
- const std::string& session_label,
- const LLDynamicArray<LLUUID>& ids,
- EInstantMessage dialog,
- BOOL user_initiated)
+ BOOL user_initiated,
+ const LLDynamicArray<LLUUID>& ids)
{
if (session_id.isNull())
{
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index b3b821f2ac..777d68978e 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -71,7 +71,7 @@ public:
bool newSession(LLUUID session_id, std::string name, EInstantMessage type, LLUUID other_participant_id);
std::list<LLSD> getMessages(LLUUID session_id, int start_index = 0);
- bool addMessage(LLUUID session_id, std::string from, std::string utf8_text);
+ bool addMessage(LLUUID session_id, std::string from, LLUUID other_participant_id, std::string utf8_text);
bool addToHistory(LLUUID session_id, std::string from, std::string utf8_text);
//used to get the name of the session, for use as the title
//currently just the other avatar name
@@ -189,6 +189,9 @@ public:
// IM received that you haven't seen yet
BOOL getIMReceived() const;
+ // Calc number of unread IMs
+ S32 getNumberOfUnreadIM();
+
// This method is used to go through all active sessions and
// disable all of them. This method is usally called when you are
// forced to log out or similar situations where you do not have a
@@ -231,14 +234,8 @@ private:
const LLUUID& target_id,
const std::string& name,
EInstantMessage dialog,
- BOOL user_initiated = FALSE);
-
- LLFloaterIMPanel* createFloater(const LLUUID& session_id,
- const LLUUID& target_id,
- const std::string& name,
- const LLDynamicArray<LLUUID>& ids,
- EInstantMessage dialog,
- BOOL user_initiated = FALSE);
+ BOOL user_initiated = FALSE,
+ const LLDynamicArray<LLUUID>& ids = LLDynamicArray<LLUUID>());
// This simple method just iterates through all of the ids, and
// prints a simple message if they are not online. Used to help
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index aa5432740c..2c56a70ced 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -50,6 +50,7 @@
#include "llworldmap.h"
#include "lllandmark.h"
#include "llinventorymodel.h"
+#include "llagentui.h"
// Returns true if the given inventory item is a landmark pointing to the current parcel.
// Used to filter inventory items.
@@ -78,6 +79,8 @@ class LLFetchLandmarksByName : public LLInventoryCollectFunctor
private:
std::string name;
BOOL use_substring;
+ //this member will be contain copy of founded items to keep the result unique
+ std::set<std::string> check_duplicate;
public:
LLFetchLandmarksByName(std::string &landmark_name, BOOL if_use_substring)
@@ -97,28 +100,35 @@ public:
if (!landmark) // the landmark not been loaded yet
return false;
+ bool acceptable = false;
std::string landmark_name = item->getName();
LLStringUtil::toLower(landmark_name);
if(use_substring)
{
- if ( landmark_name.find( name ) != std::string::npos)
- return true;
+ acceptable = landmark_name.find( name ) != std::string::npos;
}
else
{
- if ( landmark_name == name )
- return true;
+ acceptable = landmark_name == name;
+ }
+ if(acceptable){
+ if(check_duplicate.find(landmark_name) != check_duplicate.end()){
+ // we have duplicated items in landmarks
+ acceptable = false;
+ }else{
+ check_duplicate.insert(landmark_name);
+ }
}
- return false;
+ return acceptable;
}
};
-LLInventoryModel::item_array_t LLLandmarkActions::fetchLandmarksByName(std::string& name, BOOL if_starts_with)
+LLInventoryModel::item_array_t LLLandmarkActions::fetchLandmarksByName(std::string& name, BOOL use_substring)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- LLFetchLandmarksByName fetchLandmarks(name, if_starts_with);
+ LLFetchLandmarksByName fetchLandmarks(name, use_substring);
gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
cats,
items,
@@ -135,6 +145,27 @@ bool LLLandmarkActions::landmarkAlreadyExists()
return !items.empty();
}
+
+LLViewerInventoryItem* LLLandmarkActions::findLandmarkForAgentParcel()
+{
+ // Determine whether there are landmarks pointing to the current parcel.
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLIsAgentParcelLandmark is_current_parcel_landmark;
+ gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_current_parcel_landmark);
+
+ if(items.empty())
+ {
+ return NULL;
+ }
+
+ return items[0];
+}
+
bool LLLandmarkActions::canCreateLandmarkHere()
{
LLParcel* agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
@@ -187,21 +218,20 @@ void LLLandmarkActions::createLandmarkHere()
{
std::string landmark_name, landmark_desc;
- gAgent.buildLocationString(landmark_name, LLAgent::LOCATION_FORMAT_LANDMARK);
- gAgent.buildLocationString(landmark_desc, LLAgent::LOCATION_FORMAT_FULL);
+ LLAgentUI::buildLocationString(landmark_name, LLAgent::LOCATION_FORMAT_LANDMARK);
+ LLAgentUI::buildLocationString(landmark_desc, LLAgent::LOCATION_FORMAT_FULL);
LLUUID folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
createLandmarkHere(landmark_name, landmark_desc, folder_id);
}
-void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slurl_callback_t cb)
+void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slurl_callback_t cb, bool escaped /* = true */)
{
std::string sim_name;
bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name);
if (gotSimName)
{
- std::string slurl = LLSLURL::buildSLURLfromPosGlobal(sim_name, global_pos);
-
+ std::string slurl = LLSLURL::buildSLURLfromPosGlobal(sim_name, global_pos, escaped);
cb(slurl);
return;
@@ -213,6 +243,7 @@ void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slur
LLWorldMap::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponse,
cb,
global_pos,
+ escaped,
_1, _2, _3, _4);
LLWorldMap::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false);
@@ -221,6 +252,7 @@ void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slur
void LLLandmarkActions::onRegionResponse(slurl_callback_t cb,
const LLVector3d& global_pos,
+ bool escaped,
U64 region_handle,
const std::string& url,
const LLUUID& snapshot_id,
@@ -231,7 +263,7 @@ void LLLandmarkActions::onRegionResponse(slurl_callback_t cb,
bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name);
if (gotSimName)
{
- slurl = LLSLURL::buildSLURLfromPosGlobal(sim_name, global_pos);
+ slurl = LLSLURL::buildSLURLfromPosGlobal(sim_name, global_pos, escaped);
}
else
{
diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h
index 3c2a0a5522..c74072c0f4 100644
--- a/indra/newview/lllandmarkactions.h
+++ b/indra/newview/lllandmarkactions.h
@@ -53,6 +53,14 @@ public:
static bool landmarkAlreadyExists();
/**
+ * @brief Searches landmark for parcel agent is currently in.
+ * @return Returns landmark for agent parcel or NULL.
+ *
+ * *TODO: dzaporozhan: There can be many landmarks for single parcel.
+ */
+ static LLViewerInventoryItem* findLandmarkForAgentParcel();
+
+ /**
* @brief Checks whether agent has rights to create landmark for current parcel.
*/
static bool canCreateLandmarkHere();
@@ -80,7 +88,7 @@ public:
/**
* @brief Creates SLURL for given global position.
*/
- static void getSLURLfromPosGlobal(const LLVector3d& global_pos, slurl_callback_t cb);
+ static void getSLURLfromPosGlobal(const LLVector3d& global_pos, slurl_callback_t cb, bool escaped = true);
/**
* @brief Gets landmark global position specified by inventory LLUUID.
@@ -98,6 +106,7 @@ private:
static void onRegionResponse(slurl_callback_t cb,
const LLVector3d& global_pos,
+ bool escaped,
U64 region_handle,
const std::string& url,
const LLUUID& snapshot_id,
diff --git a/indra/newview/lllocationhistory.cpp b/indra/newview/lllocationhistory.cpp
index 03d6953521..c83cde9d83 100644
--- a/indra/newview/lllocationhistory.cpp
+++ b/indra/newview/lllocationhistory.cpp
@@ -49,8 +49,15 @@ void LLLocationHistory::addItem(const std::string & item, const std::string & to
static LLUICachedControl<S32> max_items("LocationHistoryMaxSize", 100);
// check if this item doesn't duplicate any existing one
- if (touchItem(item)) {
- return;
+ std::vector<std::string>::iterator item_iter = std::find_if(mItems.begin(), mItems.end(),
+ boost::bind(&LLLocationHistory::equalByRegionParcel,this,_1,item));
+ if(item_iter != mItems.end()){
+ /*replace duplicate.
+ * If an item's region and item's parcel are equal.
+ */
+ mToolTips.erase(*item_iter);
+ mItems.erase(item_iter);
+
}
mItems.push_back(item);
@@ -65,6 +72,21 @@ void LLLocationHistory::addItem(const std::string & item, const std::string & to
}
}
+/**
+ * check if the history item is equal.
+ * @return true - if region name and parcel is equal.
+ */
+bool LLLocationHistory::equalByRegionParcel(const std::string& item, const std::string& newItem){
+
+
+ S32 itemIndex = item.find('(');
+ S32 newItemIndex = newItem.find('(');
+
+ std::string region_parcel = item.substr(0,itemIndex);
+ std::string new_region_parcel = newItem.substr(0,newItemIndex);
+
+ return region_parcel == new_region_parcel;
+}
bool LLLocationHistory::touchItem(const std::string & item) {
bool result = false;
std::vector<std::string>::iterator item_iter = std::find(mItems.begin(), mItems.end(), item);
@@ -135,7 +157,13 @@ void LLLocationHistory::save() const
}
for (location_list_t::const_iterator it = mItems.begin(); it != mItems.end(); ++it)
- file << (*it) << delimiter << mToolTips.find(*it)->second << std::endl;
+ {
+ std::string tooltip = getToolTip(*it);
+ if(!tooltip.empty())
+ {
+ file << (*it) << delimiter << tooltip << std::endl;
+ }
+ }
file.close();
}
diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h
index 67eabcdaca..060a6b2fe8 100644
--- a/indra/newview/lllocationhistory.h
+++ b/indra/newview/lllocationhistory.h
@@ -65,6 +65,7 @@ public:
void dump() const;
private:
+ bool equalByRegionParcel(const std::string& item, const std::string& item_to_add);
const static char delimiter;
std::vector<std::string> mItems;
std::map<std::string, std::string> mToolTips;
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 63a40e40a0..1542c7483a 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -40,6 +40,7 @@
#include "llfocusmgr.h"
#include "llmenugl.h"
#include "llstring.h"
+#include "lltrans.h"
#include "lluictrlfactory.h"
// newview includes
@@ -56,6 +57,8 @@
#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llurllineeditorctrl.h"
+#include "llagentui.h"
+
//============================================================================
/*
* "ADD LANDMARK" BUTTON UPDATING LOGIC
@@ -151,6 +154,8 @@ static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input")
LLLocationInputCtrl::Params::Params()
: add_landmark_image_enabled("add_landmark_image_enabled"),
add_landmark_image_disabled("add_landmark_image_disabled"),
+ add_landmark_image_hover("add_landmark_image_hover"),
+ add_landmark_image_selected("add_landmark_image_selected"),
add_landmark_button("add_landmark_button"),
add_landmark_hpad("add_landmark_hpad", 0),
info_button("info_button")
@@ -162,7 +167,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mAddLandmarkHPad(p.add_landmark_hpad),
mInfoBtn(NULL),
mLocationContextMenu(NULL),
- mAddLandmarkBtn(NULL)
+ mAddLandmarkBtn(NULL),
+ mLandmarkImageOn(NULL),
+ mLandmarkImageOff(NULL)
{
// Lets replace default LLLineEditor with LLLocationLineEditor
// to make needed escaping while copying and cutting url
@@ -198,16 +205,27 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
// "Add landmark" button.
LLButton::Params al_params = p.add_landmark_button;
+
+ // Image for unselected state will be set in updateAddLandmarkButton(),
+ // it will be either mLandmarkOn or mLandmarkOff
if (p.add_landmark_image_enabled())
{
- al_params.image_unselected = p.add_landmark_image_enabled;
- al_params.image_selected = p.add_landmark_image_enabled;
+ mLandmarkImageOn = p.add_landmark_image_enabled;
}
if (p.add_landmark_image_disabled())
{
- al_params.image_disabled = p.add_landmark_image_disabled;
- al_params.image_disabled_selected = p.add_landmark_image_disabled;
+ mLandmarkImageOff = p.add_landmark_image_disabled;
+ }
+
+ if(p.add_landmark_image_selected)
+ {
+ al_params.image_selected = p.add_landmark_image_selected;
+ }
+ if (p.add_landmark_image_hover())
+ {
+ al_params.image_hover_unselected = p.add_landmark_image_hover;
}
+
al_params.click_callback.function(boost::bind(&LLLocationInputCtrl::onAddLandmarkButtonClicked, this));
mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params);
enableAddLandmarkButton(true);
@@ -233,7 +251,7 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
// - Make the "Add landmark" button updated when either current parcel gets changed
// or a landmark gets created or removed from the inventory.
// - Update the location string on parcel change.
- mParcelMgrConnection = LLViewerParcelMgr::getInstance()->setAgentParcelChangedCallback(
+ mParcelMgrConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
boost::bind(&LLLocationInputCtrl::onAgentParcelChange, this));
mLocationHistoryConnection = LLLocationHistory::getInstance()->setLoadedCallback(
@@ -243,6 +261,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mAddLandmarkObserver = new LLAddLandmarkObserver(this);
gInventory.addObserver(mRemoveLandmarkObserver);
gInventory.addObserver(mAddLandmarkObserver);
+
+ mAddLandmarkTooltip = LLTrans::getString("location_ctrl_add_landmark");
+ mEditLandmarkTooltip = LLTrans::getString("location_ctrl_edit_landmark");
}
LLLocationInputCtrl::~LLLocationInputCtrl()
@@ -389,7 +410,21 @@ void LLLocationInputCtrl::onInfoButtonClicked()
void LLLocationInputCtrl::onAddLandmarkButtonClicked()
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
+ LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentParcel();
+
+ // Landmark exists, open it for preview and edit
+ if(landmark && landmark->getUUID().notNull())
+ {
+ LLSD key;
+ key["type"] = "landmark";
+ key["id"] = landmark->getUUID();
+
+ LLSideTray::getInstance()->showPanel("panel_places", key);
+ }
+ else
+ {
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
+ }
}
void LLLocationInputCtrl::onAgentParcelChange()
@@ -414,11 +449,14 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)
rebuildLocationHistory(filter);
//Let's add landmarks to the top of the list if any
- LLInventoryModel::item_array_t landmark_items = LLLandmarkActions::fetchLandmarksByName(filter, TRUE);
-
- for(U32 i=0; i < landmark_items.size(); i++)
+ if( filter.size() !=0 )
{
- mList->addSimpleElement(landmark_items[i]->getName(), ADD_TOP);
+ LLInventoryModel::item_array_t landmark_items = LLLandmarkActions::fetchLandmarksByName(filter, TRUE);
+
+ for(U32 i=0; i < landmark_items.size(); i++)
+ {
+ mList->addSimpleElement(landmark_items[i]->getName(), ADD_TOP);
+ }
}
mList->mouseOverHighlightNthItem(-1); // Clear highlight on the last selected item.
}
@@ -459,9 +497,7 @@ void LLLocationInputCtrl::refreshLocation()
LLAgent::ELocationFormat format = (gSavedSettings.getBOOL("ShowCoordinatesOption") ?
LLAgent::LOCATION_FORMAT_WITHOUT_SIM: LLAgent::LOCATION_FORMAT_NORMAL);
- if (!gAgent.buildLocationString(location_name,format))
- location_name = "Unknown";
-
+ if (!LLAgentUI::buildLocationString(location_name, format)) location_name = "Unknown";
setText(location_name);
}
@@ -499,15 +535,32 @@ void LLLocationInputCtrl::focusTextEntry()
void LLLocationInputCtrl::enableAddLandmarkButton(bool val)
{
- // Enable/disable the button.
- mAddLandmarkBtn->setEnabled(val);
+ // We don't want to disable the button because it should be click able at any time,
+ // instead switch images.
+ LLUIImage* img = val ? mLandmarkImageOn : mLandmarkImageOff;
+ if(img)
+ {
+ mAddLandmarkBtn->setImageUnselected(img);
+ }
}
// Change the "Add landmark" button image
// depending on whether current parcel has been landmarked.
void LLLocationInputCtrl::updateAddLandmarkButton()
{
- enableAddLandmarkButton(!LLLandmarkActions::landmarkAlreadyExists());
+ bool landmark_exists = LLLandmarkActions::landmarkAlreadyExists();
+ enableAddLandmarkButton(!landmark_exists);
+
+ std::string tooltip;
+ if(landmark_exists)
+ {
+ tooltip = mEditLandmarkTooltip;
+ }
+ else
+ {
+ tooltip = mAddLandmarkTooltip;
+ }
+ mAddLandmarkBtn->setToolTip(tooltip);
}
void LLLocationInputCtrl::updateContextMenu(){
@@ -554,7 +607,8 @@ void LLLocationInputCtrl::changeLocationPresentation()
if(mTextEntry && !mTextEntry->hasSelection() &&
!LLSLURL::isSLURL(mTextEntry->getText()))
{
- mTextEntry->setText(gAgent.getUnescapedSLURL());
+ //needs unescaped one
+ mTextEntry->setText(LLAgentUI::buildSLURL(false));
mTextEntry->selectAll();
}
}
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 1b26a07d83..d967df8257 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -59,7 +59,9 @@ public:
: public LLInitParam::Block<Params, LLComboBox::Params>
{
Optional<LLUIImage*> add_landmark_image_enabled,
- add_landmark_image_disabled;
+ add_landmark_image_disabled,
+ add_landmark_image_hover,
+ add_landmark_image_selected;
Optional<S32> add_landmark_hpad;
Optional<LLButton::Params> add_landmark_button,
info_button;
@@ -93,6 +95,10 @@ private:
virtual ~LLLocationInputCtrl();
void focusTextEntry();
+ /**
+ * Changes the "Add landmark" button image
+ * depending on whether current parcel has been landmarked.
+ */
void enableAddLandmarkButton(bool val);
void refresh();
void refreshLocation();
@@ -124,6 +130,11 @@ private:
boost::signals2::connection mParcelMgrConnection;
boost::signals2::connection mLocationHistoryConnection;
+ LLUIImage* mLandmarkImageOn;
+ LLUIImage* mLandmarkImageOff;
+
+ std::string mAddLandmarkTooltip;
+ std::string mEditLandmarkTooltip;
};
#endif
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 92b1ecfd16..11c8b03f7f 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -36,6 +36,7 @@
// Library includes
#include "indra_constants.h"
+#include "llparcel.h"
// Viewer includes
@@ -51,6 +52,8 @@
#include "llviewerwindow.h"
#include "llviewercontrol.h"
#include "llselectmgr.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
//
// Constants
@@ -137,6 +140,8 @@ BOOL LLFloaterMove::postBuild()
initMovementMode();
+ LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(LLFloaterMove::sUpdateFlyingStatus);
+
return TRUE;
}
@@ -385,6 +390,15 @@ void LLFloaterMove::updatePosition()
}
setOrigin(x, y);
}
+
+//static
+void LLFloaterMove::sUpdateFlyingStatus()
+{
+ LLFloaterMove *floater = LLFloaterReg::findTypedInstance<LLFloaterMove>("moveview");
+ if (floater) floater->mModeControlButtonMap[MM_FLY]->setEnabled(gAgent.canFly());
+
+}
+
void LLFloaterMove::showModeButtons(BOOL bShow)
{
if (mModeActionsPanel->getVisible() == bShow)
@@ -421,6 +435,8 @@ void LLFloaterMove::enableInstance(BOOL bEnable)
void LLFloaterMove::onOpen(const LLSD& key)
{
updatePosition();
+
+ sUpdateFlyingStatus();
}
void LLFloaterMove::showQuickTips(const EMovementMode mode)
@@ -476,11 +492,12 @@ inline LLPanelStandStopFlying* LLPanelStandStopFlying::getInstance()
void LLPanelStandStopFlying::setStandStopFlyingMode(EStandStopFlyingMode mode)
{
LLPanelStandStopFlying* panel = getInstance();
- panel->setVisible(TRUE);
- BOOL standVisible = SSFM_STAND == mode;
- panel->mStandButton->setVisible(standVisible);
- panel->mStopFlyingButton->setVisible(!standVisible);
+ panel->mStandButton->setVisible(SSFM_STAND == mode);
+ panel->mStopFlyingButton->setVisible(SSFM_STOP_FLYING == mode);
+
+ //visibility of it should be updated after updating visibility of the buttons
+ panel->setVisible(TRUE);
}
//static
@@ -505,11 +522,12 @@ BOOL LLPanelStandStopFlying::postBuild()
mStandButton = getChild<LLButton>("stand_btn");
mStandButton->setCommitCallback(boost::bind(&LLPanelStandStopFlying::onStandButtonClick, this));
mStandButton->setCommitCallback(boost::bind(&LLFloaterMove::enableInstance, TRUE));
+ mStandButton->setVisible(FALSE);
mStopFlyingButton = getChild<LLButton>("stop_fly_btn");
mStopFlyingButton->setCommitCallback(boost::bind(&LLFloaterMove::setFlyingMode, FALSE));
mStopFlyingButton->setCommitCallback(boost::bind(&LLPanelStandStopFlying::onStopFlyingButtonClick, this));
-
+ mStopFlyingButton->setVisible(FALSE);
return TRUE;
}
@@ -517,6 +535,11 @@ BOOL LLPanelStandStopFlying::postBuild()
//virtual
void LLPanelStandStopFlying::setVisible(BOOL visible)
{
+ //we dont need to show the panel if these buttons are not activated
+ if (visible && !mStandButton->getVisible() && !mStopFlyingButton->getVisible()) visible = false;
+
+ if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false;
+
if (visible)
{
updatePosition();
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index fd9cf9f4c1..6e6af9b693 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -67,6 +67,7 @@ public:
// let update its position in each frame
/*virtual*/ void draw(){updatePosition(); LLFloater::draw();}
+ static void sUpdateFlyingStatus();
protected:
void turnLeft();
diff --git a/indra/newview/llnamebox.cpp b/indra/newview/llnamebox.cpp
index 56648d3218..2f4a266198 100644
--- a/indra/newview/llnamebox.cpp
+++ b/indra/newview/llnamebox.cpp
@@ -41,7 +41,6 @@
#include "lluuid.h"
#include "llcachename.h"
-#include "llagent.h"
// statics
std::set<LLNameBox*> LLNameBox::sInstances;
diff --git a/indra/newview/llnameeditor.cpp b/indra/newview/llnameeditor.cpp
index ccb33c770a..65601da7da 100644
--- a/indra/newview/llnameeditor.cpp
+++ b/indra/newview/llnameeditor.cpp
@@ -34,7 +34,6 @@
#include "llnameeditor.h"
#include "llcachename.h"
-#include "llagent.h"
#include "llfontgl.h"
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 087fdda14a..1b82c2dc18 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -37,7 +37,6 @@
#include "llnamelistctrl.h"
#include "llcachename.h"
-#include "llagent.h"
#include "llinventory.h"
#include "llscrolllistitem.h"
#include "llscrolllistcell.h"
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 713c44d366..7cb0456e8a 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -40,6 +40,7 @@
#include <llmenugl.h>
#include "llagent.h"
+#include "llviewerregion.h"
#include "lllocationhistory.h"
#include "lllocationinputctrl.h"
#include "llteleporthistory.h"
@@ -57,6 +58,7 @@
#include "lllandmarkactions.h"
#include "llfavoritesbar.h"
+#include "llagentui.h"
//-- LLTeleportHistoryMenuItem -----------------------------------------------
@@ -180,19 +182,15 @@ LLNavigationBar::LLNavigationBar()
mBtnHome(NULL),
mCmbLocation(NULL),
mLeSearch(NULL),
- mPurgeTPHistoryItems(false),
- mUpdateTypedLocationHistory(false)
+ mPurgeTPHistoryItems(false)
{
setIsChrome(TRUE);
- mParcelMgrConnection = LLViewerParcelMgr::getInstance()->setAgentParcelChangedCallback(
- boost::bind(&LLNavigationBar::onTeleportFinished, this));
+ mParcelMgrConnection = LLViewerParcelMgr::getInstance()->setTeleportFinishedCallback(
+ boost::bind(&LLNavigationBar::onTeleportFinished, this, _1));
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_navigation_bar.xml");
- // navigation bar can never get a tab
- setFocusRoot(FALSE);
-
// set a listener function for LoginComplete event
LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLNavigationBar::handleLoginComplete, this));
@@ -314,19 +312,18 @@ void LLNavigationBar::onLocationSelection()
}
else
{
+ //If it is not slurl let's look for landmarks
LLInventoryModel::item_array_t landmark_items = LLLandmarkActions::fetchLandmarksByName(typed_location, FALSE);
if ( !landmark_items.empty() )
{
- mUpdateTypedLocationHistory = true;
gAgent.teleportViaLandmark(landmark_items[0]->getAssetUUID());
return;
}
- else
- {
- region_name = extractLocalCoordsFromRegName(typed_location, &x, &y, &z);
- if (region_name != typed_location)
- local_coords.set(x, y, z);
- }
+ //No landmark match, check if it is a region name
+ region_name = parseLocation(typed_location, &x, &y, &z);
+ if (region_name != typed_location)
+ local_coords.set(x, y, z);
+
// Treat it as region name.
// region_name = typed_location;
}
@@ -339,31 +336,30 @@ void LLNavigationBar::onLocationSelection()
LLWorldMap::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false);
}
-void LLNavigationBar::onTeleportFinished()
+void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)
{
+ // Location is valid. Add it to the typed locations history.
+ LLLocationHistory* lh = LLLocationHistory::getInstance();
- if (mUpdateTypedLocationHistory) {
- LLLocationHistory* lh = LLLocationHistory::getInstance();
-
- // Location is valid. Add it to the typed locations history.
- // If user has typed text this variable will contain -1.
- if (mCmbLocation->getCurrentIndex() != -1) {
- lh->touchItem(mCmbLocation->getSelectedItemLabel());
- } else {
- std::string region_name;
- std::string url = gAgent.getSLURL();
- S32 x = 0, y = 0, z = 0;
-
- if (LLSLURL::isSLURL(url)) {
- LLURLSimString::parse(LLSLURL::stripProtocol(url), &region_name, &x, &y, &z);
- appendLocalCoordsToRegName(&region_name, x, y, z);
- lh->addItem(region_name, url);
- }
- }
-
- lh->save();
- mUpdateTypedLocationHistory = false;
+ std::string location;
+ /*NOTE:
+ * We can't use gAgent.getPositionAgent() in case of local teleport to build location.
+ * At this moment gAgent.getPositionAgent() contains previous coordinates.
+ * according to EXT-65 agent position is being reseted on each frame.
+ */
+ LLAgentUI::buildLocationString(location, LLAgent::LOCATION_FORMAT_WITHOUT_SIM,
+ gAgent.getPosAgentFromGlobal(global_agent_pos));
+
+ //Touch it, if it is at list already, add new location otherwise
+ if ( !lh->touchItem(location) ) {
+ std::string tooltip = LLSLURL::buildSLURLfromPosGlobal(
+ gAgent.getRegion()->getName(), global_agent_pos, false);
+
+ lh->addItem(location, tooltip);
}
+ llinfos << "Saving after on teleport finish" << llendl;
+ lh->save();
+
}
void LLNavigationBar::onTeleportHistoryChanged()
@@ -436,7 +432,6 @@ void LLNavigationBar::onRegionNameResponse(
LLVector3d region_pos = from_region_handle(region_handle);
LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
- mUpdateTypedLocationHistory = true;
llinfos << "Teleporting to: " << global_pos << llendl;
gAgent.teleportViaLocation(global_pos);
}
@@ -475,12 +470,7 @@ void LLNavigationBar::invokeSearch(std::string search_text)
LLFloaterReg::showInstance("search", LLSD().insert("panel", "all").insert("id", LLSD(search_text)));
}
-void LLNavigationBar::appendLocalCoordsToRegName(std::string* reg_name, S32 x, S32 y, S32 z) {
- std::string fmt = *reg_name + " (%d, %d, %d)";
- *reg_name = llformat(fmt.c_str(), x, y, z);
-}
-
-std::string LLNavigationBar::extractLocalCoordsFromRegName(const std::string & reg_name, S32* x, S32* y, S32* z) {
+std::string LLNavigationBar::parseLocation(const std::string & location, S32* x, S32* y, S32* z) {
/*
* This regular expression extracts numbers from the following string
* construct: "(num1, num2, num3)", where num1, num2 and num3 are decimal
@@ -489,7 +479,7 @@ std::string LLNavigationBar::extractLocalCoordsFromRegName(const std::string & r
const boost::regex re("\\s*\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)\\s*");
boost::smatch m;
- if (boost::regex_search(reg_name, m, re)) {
+ if (boost::regex_search(location, m, re)) {
// string representations of parsed by regex++ numbers
std::string xstr(m[1].first, m[1].second);
std::string ystr(m[2].first, m[2].second);
@@ -498,13 +488,15 @@ std::string LLNavigationBar::extractLocalCoordsFromRegName(const std::string & r
*x = atoi(xstr.c_str());
*y = atoi(ystr.c_str());
*z = atoi(zstr.c_str());
-
- return boost::regex_replace(reg_name, re, "");
+ //erase commas in coordinates
+ std::string region_parcel = boost::regex_replace(location, re, "");
+ // cut region name
+ return region_parcel.substr(0, region_parcel.find_first_of(','));
}
*x = *y = *z = 0;
- return reg_name;
+ return location;
}
void LLNavigationBar::clearHistoryCache()
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index eeaec4e668..6932847854 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -70,8 +70,10 @@ private:
void showTeleportHistoryMenu();
void invokeSearch(std::string search_text);
- static void appendLocalCoordsToRegName(std::string* reg_name, S32 x, S32 y, S32 z);
- static std::string extractLocalCoordsFromRegName(const std::string & reg_name, S32* x, S32* y, S32* z);
+ /**
+ * Get region name and local coordinates from typed location
+ */
+ static std::string parseLocation(const std::string & location, S32* x, S32* y, S32* z);
// callbacks
void onTeleportHistoryMenuItemClicked(const LLSD& userdata);
@@ -84,7 +86,7 @@ private:
void onLocationSelection();
void onLocationPrearrange(const LLSD& data);
void onSearchCommit();
- void onTeleportFinished();
+ void onTeleportFinished(const LLVector3d& global_agent_pos);
void onRegionNameResponse(
std::string typed_location,
std::string region_name,
@@ -104,7 +106,6 @@ private:
LLRect mDefaultFpRect;
boost::signals2::connection mParcelMgrConnection;
bool mPurgeTPHistoryItems;
- bool mUpdateTypedLocationHistory;
};
#endif
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index da9f50a2bc..3856a86da0 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -211,7 +211,17 @@ void nearbychat_add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, cons
edit->appendStyledText(start_line, false, prepend_newline, LLStyleMap::instance().lookup(chat.mFromID,chat.mURL));
prepend_newline = false;
}
- edit->appendColoredText(line, false, prepend_newline, color);
+
+ S32 font_size = gSavedSettings.getS32("ChatFontSize");
+
+ std::string font_name = "";
+
+ if (0 == font_size)
+ font_name = "small";
+ else if (2 == font_size)
+ font_name = "sansserifbig";
+
+ edit->appendColoredText(line, false, prepend_newline, color, font_name);
}
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 8124d4b36a..a1912655a3 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -97,20 +97,15 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
LLToast::Params p;
p.id = id;
p.panel = item;
- p.on_mouse_enter = boost::bind(&LLNearbyChatHandler::onToastDestroy, this, _1);
+ p.on_toast_destroy = boost::bind(&LLNearbyChatHandler::onToastDestroy, this, _1);
+ p.on_mouse_enter = boost::bind(&LLNearbyChatHandler::removeNearbyToastsAndShowChat, this);
mChannel->addToast(p);
}
void LLNearbyChatHandler::onToastDestroy(LLToast* toast)
{
- //TODO: what should be done to toasts here? may be htey are to be destroyed?
- //toast->hide();
- if(mChannel)
- mChannel->removeToastsFromChannel();
- else if(toast)
- toast->hide();
-
- LLFloaterReg::showTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ if(toast)
+ toast->closeFloater();
}
void LLNearbyChatHandler::onChicletClick(void)
@@ -118,7 +113,16 @@ void LLNearbyChatHandler::onChicletClick(void)
}
void LLNearbyChatHandler::onChicletClose(void)
{
+}
+void LLNearbyChatHandler::removeNearbyToastsAndShowChat()
+{
+ /*
+ if(mChannel)
+ mChannel->removeToastsFromChannel();
+
+ LLFloaterReg::showTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ */
}
}
diff --git a/indra/newview/llnearbychathandler.h b/indra/newview/llnearbychathandler.h
index 53436a92b0..8fcd03689d 100644
--- a/indra/newview/llnearbychathandler.h
+++ b/indra/newview/llnearbychathandler.h
@@ -51,6 +51,7 @@ public:
virtual void onChicletClose(void);
protected:
+ void removeNearbyToastsAndShowChat();
};
}
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index f485152d3a..bd6c6b2308 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -49,7 +49,7 @@ LLAlertHandler::LLAlertHandler(e_notification_type type, const LLSD& id) : mIsMo
LLBottomTray* tray = LLBottomTray::getInstance();
LLChannelManager::Params p;
- p.id = LLUUID(ALERT_CHANNEL_ID);
+ p.id = LLUUID(gSavedSettings.getString("AlertChannelUUID"));
p.channel_right_bound = tray->getRect().getWidth() / 2;
p.channel_width = 0;
p.display_toasts_always = true;
@@ -58,6 +58,7 @@ LLAlertHandler::LLAlertHandler(e_notification_type type, const LLSD& id) : mIsMo
// Getting a Channel for our notifications
mChannel = LLChannelManager::getInstance()->createChannel(p);
mChannel->setFollows(FOLLOWS_BOTTOM | FOLLOWS_TOP);
+ mChannel->setShowToasts(true);
}
//--------------------------------------------------------------------------
@@ -98,7 +99,7 @@ void LLAlertHandler::processNotification(const LLSD& notify)
void LLAlertHandler::onToastDestroy(LLToast* toast)
{
- toast->close();
+ toast->closeFloater();
}
//--------------------------------------------------------------------------
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index 9a6a041c35..31753efec9 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -34,8 +34,8 @@
#include "llnotificationhandler.h"
#include "lltoastgroupnotifypanel.h"
-#include "llagent.h"
#include "llbottomtray.h"
+#include "llgroupactions.h"
#include "llviewercontrol.h"
#include "llfloaterreg.h"
#include "llsyswellwindow.h"
@@ -51,7 +51,7 @@ LLGroupHandler::LLGroupHandler(e_notification_type type, const LLSD& id)
LLBottomTray* tray = LLBottomTray::getInstance();
mChiclet = tray->getSysWell();
LLChannelManager::Params p;
- p.chiclet = mChiclet;
+ p.id = LLUUID(gSavedSettings.getString("NotificationChannelUUID"));
p.channel_right_bound = tray->getRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
p.channel_width = gSavedSettings.getS32("NotifyBoxWidth");
@@ -77,7 +77,10 @@ void LLGroupHandler::processNotification(const LLSD& notify)
p.panel = notify_box;
p.on_toast_destroy = boost::bind(&LLGroupHandler::onToastDestroy, this, _1);
mChannel->addToast(p);
- mChiclet->setCounter(mChiclet->getCounter() + 1);
+ static_cast<LLNotificationChiclet*>(mChiclet)->incUreadSystemNotifications();
+
+ LLGroupActions::refresh_notices();
+
}
else if (notify["sigtype"].asString() == "delete")
{
@@ -88,7 +91,7 @@ void LLGroupHandler::processNotification(const LLSD& notify)
//--------------------------------------------------------------------------
void LLGroupHandler::onToastDestroy(LLToast* toast)
{
- mChiclet->setCounter(mChiclet->getCounter() - 1);
+ static_cast<LLNotificationChiclet*>(mChiclet)->decUreadSystemNotifications();
LLToastPanel* panel = dynamic_cast<LLToastPanel*>(toast->getPanel());
LLFloaterReg::getTypedInstance<LLSysWellWindow>("syswell_window")->removeItemByID(panel->getID());
@@ -97,7 +100,7 @@ void LLGroupHandler::onToastDestroy(LLToast* toast)
if(toast->hasFocus())
mChannel->setHovering(false);
- toast->close();
+ toast->closeFloater();
}
//--------------------------------------------------------------------------
@@ -113,14 +116,3 @@ void LLGroupHandler::onChicletClose(void)
//--------------------------------------------------------------------------
-//--------------------------------------------------------------------------
-
-
-//--------------------------------------------------------------------------
-
-
-//--------------------------------------------------------------------------
-
-
-//--------------------------------------------------------------------------
-
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 2e5fdd9ed5..6982ab7096 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -42,9 +42,6 @@
namespace LLNotificationsUI
{
-// ID for channel that displays Alert Notifications
-#define ALERT_CHANNEL_ID "F3E07BC8-A973-476D-8C7F-F3B7293975D1"
-
// ENotificationType enumerates all possible types of notifications that could be met
//
typedef enum e_notification_type
@@ -118,6 +115,25 @@ public:
};
/**
+ * Handler for IM notifications.
+ * It manages life time of tip and script notices.
+ */
+class LLIMHandler : public LLSysHandler
+{
+public:
+ LLIMHandler();
+ virtual ~LLIMHandler();
+
+ // base interface functions
+ virtual void processNotification(const LLSD& notify);
+ virtual void onToastDestroy(LLToast* toast);
+ virtual void onChicletClick(void);
+ virtual void onChicletClose(void);
+
+protected:
+};
+
+/**
* Handler for system informational notices.
* It manages life time of tip and script notices.
*/
@@ -135,6 +151,7 @@ public:
// own handlers
void onStoreToast(LLPanel* info_panel, LLUUID id);
+ void onRejectToast(LLToast::Params p);
protected:
};
diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp
index 3eda0d0d14..31266fdecf 100644
--- a/indra/newview/llnotificationmanager.cpp
+++ b/indra/newview/llnotificationmanager.cpp
@@ -62,18 +62,21 @@ void LLNotificationManager::init()
LLNotificationChannel::buildChannel("Group Notifications", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "groupnotify"));
LLNotificationChannel::buildChannel("Alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
LLNotificationChannel::buildChannel("AlertModal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal"));
+ LLNotificationChannel::buildChannel("IM Notifications", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "notifytoast"));
LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
LLNotifications::instance().getChannel("Group Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
LLNotifications::instance().getChannel("Alerts")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
+ LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
mNotifyHandlers["notify"] = boost::shared_ptr<LLEventHandler>(new LLInfoHandler(NT_NOTIFY, LLSD()));
mNotifyHandlers["notifytip"] = mNotifyHandlers["notify"];
mNotifyHandlers["groupnotify"] = boost::shared_ptr<LLEventHandler>(new LLGroupHandler(NT_GROUPNOTIFY, LLSD()));
mNotifyHandlers["alert"] = boost::shared_ptr<LLEventHandler>(new LLAlertHandler(NT_ALERT, LLSD()));
mNotifyHandlers["alertmodal"] = mNotifyHandlers["alert"];
+ mNotifyHandlers["notifytoast"] = boost::shared_ptr<LLEventHandler>(new LLIMHandler());
mNotifyHandlers["nearbychat"] = boost::shared_ptr<LLEventHandler>(new LLNearbyChatHandler(NT_NEARBYCHAT, LLSD()));
}
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index a6cf2a2d27..51bd619901 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -75,6 +75,16 @@ public:
virtual void onOpen(const LLSD& key);
/**
+ * Profile tabs should close any opened panels here.
+ *
+ * Called from LLPanelProfile::onOpen() before opening new profile.
+ * See LLPanelpicks::onClose for example. LLPanelPicks closes picture info panel
+ * before new profile is displayed, otherwise new profile will
+ * be hidden behind picture info panel.
+ */
+ virtual void onClose() {}
+
+ /**
* Resets controls visibility, state, etc.
*/
virtual void resetControls(){};
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index a7c05af50b..2e87f0b65b 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -33,7 +33,6 @@
#include "llpanelgroup.h"
-#include "llagent.h"
#include "llbutton.h"
#include "lltabcontainer.h"
#include "lltextbox.h"
@@ -116,6 +115,9 @@ LLPanelGroup::~LLPanelGroup()
void LLPanelGroup::onOpen(const LLSD& key)
{
+ if(!key.has("group_id"))
+ return;
+
LLUUID group_id = key["group_id"];
if(!key.has("action"))
{
@@ -127,7 +129,7 @@ void LLPanelGroup::onOpen(const LLSD& key)
if(str_action == "refresh")
{
- if(mID == group_id)
+ if(mID == group_id || group_id == LLUUID::null)
refreshData();
}
else if(str_action == "close")
@@ -138,6 +140,12 @@ void LLPanelGroup::onOpen(const LLSD& key)
{
setGroupID(LLUUID::null);
}
+ else if(str_action == "refresh_notices")
+ {
+ LLPanelGroupNotices* panel_notices = findChild<LLPanelGroupNotices>("group_notices_tab_panel");
+ if(panel_notices)
+ panel_notices->refreshNotices();
+ }
}
@@ -314,6 +322,15 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
}
else
{
+ if(!tab_general->getDisplayChildren())
+ tab_general->changeOpenClose(tab_general->getDisplayChildren());
+ if(!tab_roles->getDisplayChildren())
+ tab_roles->changeOpenClose(tab_roles->getDisplayChildren());
+ if(!tab_notices->getDisplayChildren())
+ tab_notices->changeOpenClose(tab_notices->getDisplayChildren());
+ if(!tab_land->getDisplayChildren())
+ tab_land->changeOpenClose(tab_land->getDisplayChildren());
+
tab_roles->canOpenClose(true);
tab_notices->canOpenClose(true);
tab_land->canOpenClose(true);
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 1e6eb8ed44..c5eaa34204 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -37,6 +37,7 @@
#include "llfloateravatarpicker.h"
#include "llbutton.h"
#include "llcombobox.h"
+#include "llgroupactions.h"
#include "llgroupmgr.h"
#include "llnamelistctrl.h"
#include "llscrolllistitem.h"
@@ -80,6 +81,7 @@ public:
LLButton *mRemoveButton;
LLTextBox *mGroupName;
std::string mOwnerWarning;
+ std::string mAlreadyInGroup;
bool mConfirmedOwnerInvite;
void (*mCloseCallback)(void* data);
@@ -167,16 +169,29 @@ void LLPanelGroupInvite::impl::submitInvitations()
}
}
+ bool already_in_group = false;
//loop over the users
std::vector<LLScrollListItem*> items = mInvitees->getAllData();
for (std::vector<LLScrollListItem*>::iterator iter = items.begin();
iter != items.end(); ++iter)
{
LLScrollListItem* item = *iter;
+ if(LLGroupActions::isAvatarMemberOfGroup(mGroupID, item->getUUID()))
+ {
+ already_in_group = true;
+ continue;
+ }
role_member_pairs[item->getUUID()] = role_id;
}
-
+
LLGroupMgr::getInstance()->sendGroupMemberInvites(mGroupID, role_member_pairs);
+
+ if(already_in_group)
+ {
+ LLSD msg;
+ msg["MESSAGE"] = mAlreadyInGroup;
+ LLNotifications::instance().add("GenericAlert", msg);
+ }
//then close
(*mCloseCallback)(mCloseCallbackUserData);
@@ -550,6 +565,7 @@ BOOL LLPanelGroupInvite::postBuild()
}
mImplementation->mOwnerWarning = getString("confirm_invite_owner_str");
+ mImplementation->mAlreadyInGroup = getString("already_in_group");
update();
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index 8caa7d85eb..e40fa19bb6 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -1515,16 +1515,15 @@ void LLPanelGroupLandMoney::setGroupID(const LLUUID& id)
mImplementationp->mGroupOverLimitIconp->setVisible(FALSE);
}
- if ( !can_view )
+ if ( mImplementationp->mGroupParcelsp )
{
- if ( mImplementationp->mGroupParcelsp )
- {
- mImplementationp->mGroupParcelsp->setCommentText(
- mImplementationp->mCantViewParcelsText);
- mImplementationp->mGroupParcelsp->setEnabled(FALSE);
- }
+ mImplementationp->mGroupParcelsp->setEnabled(can_view);
}
+ if ( !can_view && mImplementationp->mGroupParcelsp )
+ {
+ mImplementationp->mGroupParcelsp->setEnabled(FALSE);
+ }
LLButton* earlierp, *laterp;
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 56042f6bff..0ce85818dd 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -41,6 +41,7 @@
#include "llinventorymodel.h"
#include "llfloaterinventory.h"
#include "llagent.h"
+#include "llagentui.h"
#include "lltooldraganddrop.h"
#include "lllineeditor.h"
@@ -379,13 +380,38 @@ void LLPanelGroupNotices::onClickSendMessage(void* data)
self->mCreateMessage->getText(),
self->mInventoryItem);
+
+ //instantly add new notice. actual notice will be added after ferreshNotices call
+ LLUUID id = LLUUID::generateNewID();
+ std::string subj = self->mCreateSubject->getText();
+ std::string name ;
+ LLAgentUI::buildFullname(name);
+ U32 timestamp = 0;
+
+ LLSD row;
+ row["id"] = id;
+
+ row["columns"][0]["column"] = "icon";
+
+ row["columns"][1]["column"] = "subject";
+ row["columns"][1]["value"] = subj;
+
+ row["columns"][2]["column"] = "from";
+ row["columns"][2]["value"] = name;
+
+ row["columns"][3]["column"] = "date";
+ row["columns"][3]["value"] = build_notice_date(timestamp);
+
+ row["columns"][4]["column"] = "sort";
+ row["columns"][4]["value"] = llformat( "%u", timestamp);
+
+ self->mNoticesList->addElement(row, ADD_BOTTOM);
+
self->mCreateMessage->clear();
self->mCreateSubject->clear();
onClickRemoveAttachment(data);
self->arrangeNoticeView(VIEW_PAST_NOTICE);
- onClickRefreshNotices(self);
-
}
//static
@@ -407,6 +433,26 @@ void LLPanelGroupNotices::onClickNewMessage(void* data)
self->mNoticesList->deselectAllItems(TRUE); // TRUE == don't commit on chnage
}
+void LLPanelGroupNotices::refreshNotices()
+{
+ onClickRefreshNotices(this);
+ /*
+ lldebugs << "LLPanelGroupNotices::onClickGetPastNotices" << llendl;
+
+ mNoticesList->deleteAllItems();
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("GroupNoticesListRequest");
+ msg->nextBlock("AgentData");
+ msg->addUUID("AgentID",gAgent.getID());
+ msg->addUUID("SessionID",gAgent.getSessionID());
+ msg->nextBlock("Data");
+ msg->addUUID("GroupID",self->mGroupID);
+ gAgent.sendReliableMessage();
+ */
+
+}
+
void LLPanelGroupNotices::onClickRefreshNotices(void* data)
{
lldebugs << "LLPanelGroupNotices::onClickGetPastNotices" << llendl;
diff --git a/indra/newview/llpanelgroupnotices.h b/indra/newview/llpanelgroupnotices.h
index c41a5f501b..4bda38c897 100644
--- a/indra/newview/llpanelgroupnotices.h
+++ b/indra/newview/llpanelgroupnotices.h
@@ -69,6 +69,8 @@ public:
const std::string& inventory_name,
LLOfferInfo* inventory_offer);
+ void refreshNotices();
+
virtual void setGroupID(const LLUUID& id);
private:
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index ab614fea53..4618b49df4 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -49,6 +49,7 @@
#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lltexteditor.h"
+#include "llsearcheditor.h"
#include "llviewertexturelist.h"
#include "llviewerwindow.h"
#include "llfocusmgr.h"
@@ -464,9 +465,7 @@ LLPanelGroupSubTab::LLPanelGroupSubTab()
: LLPanelGroupTab(),
mHeader(NULL),
mFooter(NULL),
- mSearchLineEditor(NULL),
- mSearchButton(NULL),
- mShowAllButton(NULL)
+ mSearchEditor(NULL)
{
}
@@ -478,22 +477,14 @@ BOOL LLPanelGroupSubTab::postBuild()
{
// Hook up the search widgets.
bool recurse = true;
- mSearchLineEditor = getChild<LLLineEditor>("search_text", recurse);
+ mSearchEditor = getChild<LLSearchEditor>("filter_input", recurse);
- if (!mSearchLineEditor) return FALSE;
- mSearchLineEditor->setKeystrokeCallback(onSearchKeystroke, this);
-
- mSearchButton = getChild<LLButton>("search_button", recurse);
-
- if (!mSearchButton) return FALSE;
- mSearchButton->setClickedCallback(onClickSearch, this);
- mSearchButton->setEnabled(FALSE);
+ if (!mSearchEditor)
+ return FALSE;
- mShowAllButton = getChild<LLButton>("show_all_button", recurse);
+ mSearchEditor->setCommitCallback(boost::bind(&LLPanelGroupSubTab::onClickSearch, this));
+ mSearchEditor->setKeystrokeCallback(onSearchKeystroke, this);
- if (!mShowAllButton) return FALSE;
- mShowAllButton->setClickedCallback(onClickShowAll, this);
- mShowAllButton->setEnabled(FALSE);
// Get icons for later use.
mActionIcons.clear();
@@ -516,63 +507,35 @@ BOOL LLPanelGroupSubTab::postBuild()
return LLPanelGroupTab::postBuild();
}
-// static
-void LLPanelGroupSubTab::onSearchKeystroke(LLLineEditor* caller, void* user_data)
-{
- LLPanelGroupSubTab* self = static_cast<LLPanelGroupSubTab*>(user_data);
- self->handleSearchKeystroke(caller);
-}
-
-void LLPanelGroupSubTab::handleSearchKeystroke(LLLineEditor* caller)
+void LLPanelGroupSubTab::setGroupID(const LLUUID& id)
{
- if (caller->getText().size())
- {
- setDefaultBtn( mSearchButton );
- mSearchButton->setEnabled(TRUE);
- }
- else
+ LLPanelGroupTab::setGroupID(id);
+ if(mSearchEditor)
{
- setDefaultBtn( NULL );
- mSearchButton->setEnabled(FALSE);
+ mSearchEditor->clear();
+ setSearchFilter("");
}
}
-// static
-void LLPanelGroupSubTab::onClickSearch(void* user_data)
+// static
+void LLPanelGroupSubTab::onSearchKeystroke(LLLineEditor* caller, void* user_data)
{
LLPanelGroupSubTab* self = static_cast<LLPanelGroupSubTab*>(user_data);
- self->handleClickSearch();
-}
-
-void LLPanelGroupSubTab::handleClickSearch()
-{
- lldebugs << "LLPanelGroupSubTab::handleClickSearch()" << llendl;
-
- if (0 == mSearchLineEditor->getText().size())
- {
- // No search text. (This shouldn't happen... the search button should have been disabled).
- llwarns << "handleClickSearch with no search text!" << llendl;
- mSearchButton->setEnabled(FALSE);
- return;
- }
+ self->handleSearchKeystroke(caller);
- setSearchFilter( mSearchLineEditor->getText() );
- mShowAllButton->setEnabled(TRUE);
}
-// static
-void LLPanelGroupSubTab::onClickShowAll(void* user_data)
+void LLPanelGroupSubTab::handleSearchKeystroke(LLLineEditor* caller)
{
- LLPanelGroupSubTab* self = static_cast<LLPanelGroupSubTab*>(user_data);
- self->handleClickShowAll();
+ setSearchFilter( caller->getText() );
}
-void LLPanelGroupSubTab::handleClickShowAll()
+// static
+void LLPanelGroupSubTab::onClickSearch()
{
- lldebugs << "LLPanelGroupSubTab::handleClickShowAll()" << llendl;
- setSearchFilter( LLStringUtil::null );
- mShowAllButton->setEnabled(FALSE);
+ setSearchFilter( mSearchEditor->getText() );
}
+
void LLPanelGroupSubTab::setSearchFilter(const std::string& filter)
{
@@ -892,6 +855,12 @@ BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
return TRUE;
}
+void LLPanelGroupMembersSubTab::setGroupID(const LLUUID& id)
+{
+ LLPanelGroupSubTab::setGroupID(id);
+
+}
+
// static
void LLPanelGroupMembersSubTab::onMemberSelect(LLUICtrl* ctrl, void* user_data)
@@ -2583,19 +2552,15 @@ void LLPanelGroupRoles::setGroupID(const LLUUID& id)
if(group_members_tab) group_members_tab->setGroupID(id);
if(group_roles_tab) group_roles_tab->setGroupID(id);
if(group_actions_tab) group_actions_tab->setGroupID(id);
-
- activate();
- if (!mSubTabContainer) return ;
+ LLButton* button = getChild<LLButton>("member_invite");
+ if ( button )
+ button->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_INVITE));
- // Hook up each sub-tabs callback and widgets.
- for (S32 i = 0; i < mSubTabContainer->getTabCount(); ++i)
- {
- LLPanel* panel = mSubTabContainer->getPanelByIndex(i);
- LLPanelGroupSubTab* subtabp = dynamic_cast<LLPanelGroupSubTab*>(panel);
- if (subtabp)
- subtabp->postBuildSubTab(this);
- }
+ if(mSubTabContainer)
+ mSubTabContainer->selectTab(0);
+
+ activate();
}
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index 9519263bba..2a0f31fa0f 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -43,6 +43,7 @@ class LLPanelGroupActionsSubTab;
class LLScrollListCtrl;
class LLScrollListItem;
class LLTextEditor;
+class LLSearchEditor;
// Forward declare for friend usage.
//virtual BOOL LLPanelGroupSubTab::postBuildSubTab(LLView*);
@@ -113,10 +114,7 @@ public:
static void onSearchKeystroke(LLLineEditor* caller, void* user_data);
void handleSearchKeystroke(LLLineEditor* caller);
- static void onClickSearch(void*);
- void handleClickSearch();
- static void onClickShowAll(void*);
- void handleClickShowAll();
+ void onClickSearch();
virtual void setSearchFilter( const std::string& filter );
@@ -144,13 +142,13 @@ public:
BOOL is_owner_role);
void setFooterEnabled(BOOL enable);
+
+ virtual void setGroupID(const LLUUID& id);
protected:
LLPanel* mHeader;
LLPanel* mFooter;
- LLLineEditor* mSearchLineEditor;
- LLButton* mSearchButton;
- LLButton* mShowAllButton;
+ LLSearchEditor* mSearchEditor;
std::string mSearchFilter;
@@ -196,6 +194,8 @@ public:
virtual void draw();
+ virtual void setGroupID(const LLUUID& id);
+
protected:
typedef std::map<LLUUID, LLRoleMemberChangeType> role_change_data_map_t;
typedef std::map<LLUUID, role_change_data_map_t*> member_role_changes_map_t;
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 8770abcee3..698f442d7c 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -373,7 +373,6 @@ BOOL LLPanelPeople::postBuild()
buttonSetAction("call_btn", boost::bind(&LLPanelPeople::onCallButtonClicked, this));
buttonSetAction("teleport_btn", boost::bind(&LLPanelPeople::onTeleportButtonClicked, this));
buttonSetAction("share_btn", boost::bind(&LLPanelPeople::onShareButtonClicked, this));
- buttonSetAction("more_btn", boost::bind(&LLPanelPeople::onMoreButtonClicked, this));
getChild<LLPanel>(NEARBY_TAB_NAME)->childSetAction("nearby_view_sort_btn",boost::bind(&LLPanelPeople::onNearbyViewSortButtonClicked, this));
getChild<LLPanel>(RECENT_TAB_NAME)->childSetAction("recent_viewsort_btn",boost::bind(&LLPanelPeople::onRecentViewSortButtonClicked, this));
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index cda1a9e7e7..f7ca54c732 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -66,7 +66,7 @@
LLPanelPick::LLPanelPick(BOOL edit_mode/* = FALSE */)
-: LLPanel(), LLAvatarPropertiesObserver(),
+: LLPanel(), LLAvatarPropertiesObserver(), LLRemoteParcelInfoObserver(),
mEditMode(edit_mode),
mSnapshotCtrl(NULL),
mPickId(LLUUID::null),
@@ -111,6 +111,8 @@ void LLPanelPick::reset()
mDataReceived = FALSE;
mPosGlobal.clearVec();
+
+ childSetValue("maturity", "");
}
BOOL LLPanelPick::postBuild()
@@ -211,6 +213,12 @@ void LLPanelPick::createNewPick()
init(pick_data);
mDataReceived = TRUE;
LLAvatarPropertiesProcessor::instance().removeObserver(mCreatorId, this);
+
+ if (!mEditMode)
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->addObserver(pick_data->parcel_id, this);
+ LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(pick_data->parcel_id);
+ }
}
@@ -450,3 +458,24 @@ void LLPanelPick::showOnMap(const LLVector3d& position)
LLFloaterWorldMap::getInstance()->trackLocation(position);
LLFloaterReg::showInstance("world_map", "center");
}
+
+void LLPanelPick::processParcelInfo(const LLParcelData& parcel_data)
+{
+ if (mEditMode) return;
+
+ // HACK: Flag 0x2 == adult region,
+ // Flag 0x1 == mature region, otherwise assume PG
+ std::string rating_icon = "icon_event.tga";
+ if (parcel_data.flags & 0x2)
+ {
+ rating_icon = "icon_event_adult.tga";
+ }
+ else if (parcel_data.flags & 0x1)
+ {
+ rating_icon = "icon_event_mature.tga";
+ }
+
+ childSetValue("maturity", rating_icon);
+
+ //*NOTE we don't removeObserver(...) ourselves cause LLRemoveParcelProcessor does it for us
+}
diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h
index 15b0d6c541..2cd4706dfe 100644
--- a/indra/newview/llpanelpick.h
+++ b/indra/newview/llpanelpick.h
@@ -38,12 +38,13 @@
#define LL_LLPANELPICK_H
#include "llpanel.h"
+#include "llremoteparcelrequest.h"
class LLTextureCtrl;
class LLMessageSystem;
class LLAvatarPropertiesObserver;
-class LLPanelPick : public LLPanel, public LLAvatarPropertiesObserver
+class LLPanelPick : public LLPanel, public LLAvatarPropertiesObserver, LLRemoteParcelInfoObserver
{
LOG_CLASS(LLPanelPick);
public:
@@ -79,6 +80,10 @@ public:
static void teleport(const LLVector3d& position);
static void showOnMap(const LLVector3d& position);
+ //This stuff we got from LLRemoteParcelObserver, in the last two we intentionally do nothing
+ /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+ /*virtual*/ void setParcelID(const LLUUID& parcel_id) {};
+ /*virtual*/ void setErrorStatus(U32 status, const std::string& reason) {};
protected:
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 45a00b7fd2..973afae73b 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -593,3 +593,11 @@ void LLPickItem::processProperties(void *data, EAvatarProcessorType type)
LLAvatarPropertiesProcessor::instance().removeObserver(mCreatorID, this);
}
+void LLPanelPicks::onClose()
+{
+ // Toggle off Pick Info panel if it is visible.
+ if(mPickPanel && mPickPanel->getVisible())
+ {
+ getProfilePanel()->togglePanel(mPickPanel);
+ }
+}
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index e0e7f69532..da7bc32ab1 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -83,6 +83,11 @@ public:
// parent panels failed to work (picks related code was in me profile panel)
void setProfilePanel(LLPanelProfile* profile_panel);
+ /**
+ * Closes LLPanelPick if it is visible.
+ */
+ /*virtual*/ void onClose();
+
private:
void onClickDelete();
void onClickTeleport();
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index c8e0a53764..a01977c9b5 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -98,6 +98,10 @@ BOOL LLPanelPlaceInfo::postBuild()
mDescEditor = getChild<LLTextEditor>("description");
mRating = getChild<LLIconCtrl>("maturity");
+ mRegionInfoDrillIn = getChild<LLButton>("region_info_drill_in");
+ mMediaDrillIn = getChild<LLButton>("media_drill_in");
+ mMediaDrillIn->setClickedCallback(boost::bind(&LLPanelPlaceInfo::toggleMediaPanel, this, TRUE));
+
mOwner = getChild<LLTextBox>("owner");
mCreator = getChild<LLTextBox>("creator");
mCreated = getChild<LLTextBox>("created");
@@ -241,13 +245,18 @@ void LLPanelPlaceInfo::setParcelID(const LLUUID& parcel_id)
}
void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)
-{
- bool is_landmark_info_type = type == LANDMARK;
+{
LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel");
- if (landmark_info_panel)
- {
- landmark_info_panel->setVisible(is_landmark_info_type);
- }
+ LLPanel* landmark_edit_panel = getChild<LLPanel>("landmark_edit_panel");
+
+ bool is_info_type_agent = type == AGENT;
+ bool is_info_type_landmark = type == LANDMARK;
+
+ landmark_info_panel->setVisible(is_info_type_landmark);
+ landmark_edit_panel->setVisible(is_info_type_landmark || type == CREATE_LANDMARK);
+
+ mRegionInfoDrillIn->setVisible(is_info_type_agent);
+ mMediaDrillIn->setVisible(is_info_type_agent);
switch(type)
{
@@ -255,6 +264,7 @@ void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)
mCurrentTitle = getString("title_create_landmark");
break;
+ case AGENT:
case PLACE:
mCurrentTitle = getString("title_place");
@@ -366,6 +376,11 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
}
mRating->setValue(rating_icon);
+ //update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE
+ //because we deal with remote parcel response format
+ bool isForSale = (parcel_data.flags & DFQ_FOR_SALE)? TRUE : FALSE;
+ getChild<LLIconCtrl>("icon_for_sale")->setVisible(isForSale);
+
// Just use given region position for display
S32 region_x = llround(mPosRegion.mV[0]);
S32 region_y = llround(mPosRegion.mV[1]);
@@ -436,8 +451,28 @@ void LLPanelPlaceInfo::displayAgentParcelInfo()
return;
LLParcelData parcel_data;
+
+ // HACK: Converting sim access flags to the format
+ // returned by remote parcel response.
+ switch(region->getSimAccess())
+ {
+ case SIM_ACCESS_MATURE:
+ parcel_data.flags = 0x1;
+
+ case SIM_ACCESS_ADULT:
+ parcel_data.flags = 0x2;
+
+ default:
+ parcel_data.flags = 0;
+ }
+
+ // Adding "For Sale" flag in remote parcel response format.
+ if (parcel->getForSale())
+ {
+ parcel_data.flags |= DFQ_FOR_SALE;
+ }
+
parcel_data.desc = parcel->getDesc();
- parcel_data.flags = region->getSimAccess();
parcel_data.name = parcel->getName();
parcel_data.sim_name = gAgent.getRegion()->getName();
parcel_data.snapshot_id = parcel->getSnapshotID();
@@ -446,6 +481,8 @@ void LLPanelPlaceInfo::displayAgentParcelInfo()
parcel_data.global_y = global_pos.mdV[1];
parcel_data.global_z = global_pos.mdV[2];
+
+
processParcelInfo(parcel_data);
}
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index 71c268c6c4..77ce2c6619 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -55,9 +55,10 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
public:
enum INFO_TYPE
{
+ AGENT,
CREATE_LANDMARK,
- PLACE,
LANDMARK,
+ PLACE,
TELEPORT_HISTORY
};
@@ -133,6 +134,8 @@ private:
LLTextBox* mParcelName;
LLTextEditor* mDescEditor;
LLIconCtrl* mRating;
+ LLButton* mRegionInfoDrillIn;
+ LLButton* mMediaDrillIn;
LLTextBox* mOwner;
LLTextBox* mCreator;
LLTextBox* mCreated;
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index cf91972e8b..a712c9b9cf 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -55,6 +55,7 @@
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
+static const S32 LANDMARK_FOLDERS_MENU_WIDTH = 250;
static const std::string AGENT_INFO_TYPE = "agent";
static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark";
static const std::string LANDMARK_INFO_TYPE = "landmark";
@@ -84,7 +85,7 @@ LLPanelPlaces::LLPanelPlaces()
{
gInventory.addObserver(this);
- LLViewerParcelMgr::getInstance()->setAgentParcelChangedCallback(
+ LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
boost::bind(&LLPanelPlaces::onAgentParcelChange, this));
//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
@@ -174,7 +175,7 @@ void LLPanelPlaces::onOpen(const LLSD& key)
if (mPlaceInfoType == AGENT_INFO_TYPE)
{
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::PLACE);
+ mPlaceInfo->setInfoType(LLPanelPlaceInfo::AGENT);
mPlaceInfo->displayAgentParcelInfo();
mPosGlobal = gAgent.getPositionGlobal();
@@ -218,12 +219,12 @@ void LLPanelPlaces::onOpen(const LLSD& key)
const LLTeleportHistory::slurl_list_t& hist_items =
LLTeleportHistory::getInstance()->getItems();
- LLVector3d pos_global = hist_items[index].mGlobalPos;
+ mPosGlobal = hist_items[index].mGlobalPos;
mPlaceInfo->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
- mPlaceInfo->displayParcelInfo(get_pos_local_from_global(pos_global),
+ mPlaceInfo->displayParcelInfo(get_pos_local_from_global(mPosGlobal),
hist_items[index].mRegionID,
- pos_global);
+ mPosGlobal);
}
@@ -312,7 +313,9 @@ void LLPanelPlaces::onTeleportButtonClicked()
payload["asset_id"] = mItem->getAssetUUID();
LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
}
- else if (mPlaceInfoType == AGENT_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
+ else if (mPlaceInfoType == AGENT_INFO_TYPE ||
+ mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
+ mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
{
LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
if (!mPosGlobal.isExactlyZero() && worldmap_instance)
@@ -341,7 +344,8 @@ void LLPanelPlaces::onShowOnMapButtonClicked()
if (mPlaceInfoType == AGENT_INFO_TYPE ||
mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
- mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
+ mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
+ mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
{
if (!mPosGlobal.isExactlyZero())
{
@@ -374,16 +378,22 @@ void LLPanelPlaces::onShowOnMapButtonClicked()
void LLPanelPlaces::onOverflowButtonClicked()
{
- bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE;
- bool is_landmark_info_visible = mPlaceInfoType == LANDMARK_INFO_TYPE;
-
LLToggleableMenu* menu;
- if (is_agent_place_info_visible && mPlaceMenu != NULL)
+ bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE;
+
+ if ((is_agent_place_info_visible ||
+ mPlaceInfoType == "remote_place" ||
+ mPlaceInfoType == "teleport_history") && mPlaceMenu != NULL)
{
menu = mPlaceMenu;
+
+ // Enable adding a landmark only for agent current parcel and if
+ // there is no landmark already pointing to that parcel in agent's inventory.
+ menu->getChild<LLMenuItemCallGL>("landmark")->setEnabled(is_agent_place_info_visible &&
+ !LLLandmarkActions::landmarkAlreadyExists());
}
- else if (is_landmark_info_visible && mLandmarkMenu != NULL)
+ else if (mPlaceInfoType == LANDMARK_INFO_TYPE && mLandmarkMenu != NULL)
{
menu = mLandmarkMenu;
@@ -446,17 +456,24 @@ void LLPanelPlaces::onCreateLandmarkButtonClicked(const LLUUID& folder_id)
return;
mPlaceInfo->createLandmark(folder_id);
-
- onBackButtonClicked();
- LLSideTray::getInstance()->collapseSideBar();
}
void LLPanelPlaces::onBackButtonClicked()
{
- togglePlaceInfoPanel(FALSE);
+ if (!mPlaceInfo)
+ return;
+
+ if (mPlaceInfo->isMediaPanelVisible())
+ {
+ toggleMediaPanel();
+ }
+ else
+ {
+ togglePlaceInfoPanel(FALSE);
- // Resetting mPlaceInfoType when Place Info panel is closed.
- mPlaceInfoType = LLStringUtil::null;
+ // Resetting mPlaceInfoType when Place Info panel is closed.
+ mPlaceInfoType = LLStringUtil::null;
+ }
updateVerbs();
}
@@ -578,6 +595,14 @@ void LLPanelPlaces::updateVerbs()
!mPosGlobal.isExactlyZero() &&
!LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal));
}
+ else if (is_create_landmark_visible)
+ {
+ // Enable "Create Landmark" only if there is no landmark
+ // for the current parcel.
+ bool no_landmark = !LLLandmarkActions::landmarkAlreadyExists();
+ mCreateLandmarkBtn->setEnabled(no_landmark);
+ mFolderMenuBtn->setEnabled(no_landmark);
+ }
else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
mTeleportBtn->setEnabled(TRUE);
@@ -600,6 +625,7 @@ void LLPanelPlaces::showLandmarkFoldersMenu()
menu_p.can_tear_off(false);
menu_p.visible(false);
menu_p.scrollable(true);
+ menu_p.max_scrollable_items = 10;
LLToggleableMenu* menu = LLUICtrlFactory::create<LLToggleableMenu>(menu_p);
@@ -666,7 +692,6 @@ void LLPanelPlaces::showLandmarkFoldersMenu()
mLandmarkFoldersCache = folders;
menu->empty();
- U32 max_width = 0;
// Menu width must not exceed the root view limits,
// so we assume the space between the left edge of
@@ -674,6 +699,7 @@ void LLPanelPlaces::showLandmarkFoldersMenu()
LLRect screen_btn_rect;
localRectToScreen(btn_rect, &screen_btn_rect);
S32 free_space = screen_btn_rect.mRight;
+ U32 max_width = llmin(LANDMARK_FOLDERS_MENU_WIDTH, free_space);
for(folder_vec_t::const_iterator it = mLandmarkFoldersCache.begin(); it != mLandmarkFoldersCache.end(); it++)
{
@@ -687,13 +713,14 @@ void LLPanelPlaces::showLandmarkFoldersMenu()
LLMenuItemCallGL *menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
+ // *TODO: Use a separate method for menu width calculation.
// Check whether item name wider than menu
- if ((S32) menu_item->getNominalWidth() > free_space)
+ if (menu_item->getNominalWidth() > max_width)
{
S32 chars_total = item_name.length();
S32 chars_fitted = 1;
menu_item->setLabel(LLStringExplicit(""));
- S32 label_space = free_space - menu_item->getFont()->getWidth("...") -
+ S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
menu_item->getNominalWidth(); // This returns width of menu item with empty label (pad pixels)
while (chars_fitted < chars_total && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
@@ -705,8 +732,6 @@ void LLPanelPlaces::showLandmarkFoldersMenu()
menu_item->setLabel(item_name.substr(0, chars_fitted) + "...");
}
- max_width = llmax(max_width, menu_item->getNominalWidth());
-
menu->addChild(menu_item);
}
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 0af996fac0..2895a68683 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -95,6 +95,8 @@ void LLPanelProfile::onOpen(const LLSD& key)
{
if (key.has("open_tab_name"))
{
+ getTabContainer()[PANEL_PICKS]->onClose();
+
// onOpen from selected panel will be called from onTabSelected callback
getTabCtrl()->selectTabByName(key["open_tab_name"]);
}
@@ -139,6 +141,7 @@ void LLPanelProfile::togglePanel(LLPanel* panel)
else
{
this->setAllChildrenVisible(TRUE);
+ panel->setVisible(FALSE);
if (panel->getParent() == this)
{
removeChild(panel);
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
index 1235340f57..18184a6476 100644
--- a/indra/newview/llpanelprofileview.cpp
+++ b/indra/newview/llpanelprofileview.cpp
@@ -41,6 +41,7 @@
static LLRegisterPanelClassWrapper<LLPanelProfileView> t_panel_target_profile("panel_profile_view");
static std::string PANEL_NOTES = "panel_notes";
+static const std::string PANEL_PROFILE = "panel_profile";
LLPanelProfileView::LLPanelProfileView()
: LLPanelProfile()
@@ -72,6 +73,10 @@ BOOL LLPanelProfileView::postBuild()
LLPanelProfile::postBuild();
getTabContainer()[PANEL_NOTES] = getChild<LLPanelAvatarNotes>(PANEL_NOTES);
+
+ //*TODO remove this, according to style guide we don't use status combobox
+ getTabContainer()[PANEL_PROFILE]->childSetVisible("online_me_status_text", FALSE);
+ getTabContainer()[PANEL_PROFILE]->childSetVisible("status_combo", FALSE);
childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL);
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 1e44a294b0..ce16b95bc0 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -49,7 +49,6 @@
#include "material_codes.h"
// project includes
-#include "llagent.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcolorswatch.h"
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 50110da70c..68996673be 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -49,15 +49,14 @@ using namespace LLNotificationsUI;
bool LLScreenChannel::mWasStartUpToastShown = false;
//--------------------------------------------------------------------------
-LLScreenChannel::LLScreenChannel(): mOverflowToastPanel(NULL),
- mStartUpToastPanel(NULL),
- mToastAlignment(NA_BOTTOM),
- mCanStoreToasts(true),
- mHiddenToastsNum(0),
- mOverflowToastHidden(false),
- mIsHovering(false),
- mControlHovering(false)
+LLScreenChannel::LLScreenChannel(LLUUID& id): mOverflowToastPanel(NULL), mStartUpToastPanel(NULL),
+ mToastAlignment(NA_BOTTOM), mCanStoreToasts(true),
+ mHiddenToastsNum(0), mOverflowToastHidden(false),
+ mIsHovering(false), mControlHovering(false),
+ mShowToasts(false)
{
+ mID = id;
+
setFollows(FOLLOWS_RIGHT | FOLLOWS_BOTTOM | FOLLOWS_TOP);
mOverflowFormatString = LLTrans::getString("OverflowInfoChannelString");
@@ -89,22 +88,11 @@ void LLScreenChannel::reshape(S32 width, S32 height, BOOL called_from_parent)
//--------------------------------------------------------------------------
void LLScreenChannel::addToast(LLToast::Params p)
{
- bool isSysWellWndShown = LLFloaterReg::getInstance("syswell_window")->getVisible();
- // we show toast in the following cases:
- // - the StartUp Toast is already hidden and the SysWell's window is hidden
- // - the SysWell's window is shown, but notification is a tip. We can't store it, so we show it
- // - the channel is intended for displaying of toasts always, e.g. alerts
- bool show_toast = (mWasStartUpToastShown && !isSysWellWndShown) || (isSysWellWndShown && p.is_tip) || mDisplayToastsAlways;
- bool store_toast = !show_toast && !p.is_tip && mCanStoreToasts;
-
- // if we can't show or store a toast, then do nothing, just send ignore to a notification
- if(!show_toast && !store_toast)
+ bool store_toast = !mShowToasts && p.can_be_stored && mCanStoreToasts;
+
+ if(!mShowToasts && !store_toast)
{
- if(p.notification)
- {
- p.notification->setIgnored(TRUE);
- p.notification->respond(p.notification->getResponseTemplate());
- }
+ mOnRejectToast(p);
return;
}
@@ -112,14 +100,13 @@ void LLScreenChannel::addToast(LLToast::Params p)
mOverflowToastHidden = false;
- getRootView()->addChild(new_toast_elem.toast);
new_toast_elem.toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, new_toast_elem.toast));
if(mControlHovering)
{
new_toast_elem.toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2));
}
- if(show_toast)
+ if(mShowToasts)
{
mToastList.push_back(new_toast_elem);
showToasts();
@@ -393,7 +380,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
mOverflowToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);
toast_rect.setLeftTopAndSize(getRect().mLeft, bottom + toast_rect.getHeight()+gSavedSettings.getS32("ToastMargin"), getRect().getWidth(), toast_rect.getHeight());
mOverflowToastPanel->setRect(toast_rect);
- getRootView()->addChild(mOverflowToastPanel);
text_box->setValue(text);
text_box->setVisible(TRUE);
@@ -406,7 +392,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
void LLScreenChannel::onOverflowToastHide()
{
mOverflowToastHidden = true;
- // *TODO: check whether it is needed: closeOverflowToastPanel();
}
//--------------------------------------------------------------------------
@@ -414,7 +399,7 @@ void LLScreenChannel::closeOverflowToastPanel()
{
if(mOverflowToastPanel != NULL)
{
- mOverflowToastPanel->close();
+ mOverflowToastPanel->closeFloater();
mOverflowToastPanel = NULL;
}
}
@@ -453,7 +438,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, S32 bottom, F32 timer)
mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);
toast_rect.setLeftTopAndSize(getRect().mLeft, bottom + toast_rect.getHeight()+gSavedSettings.getS32("ToastMargin"), getRect().getWidth(), toast_rect.getHeight());
mStartUpToastPanel->setRect(toast_rect);
- getRootView()->addChild(mStartUpToastPanel);
text_box->setValue(text);
text_box->setVisible(TRUE);
@@ -479,8 +463,7 @@ void LLScreenChannel::closeStartUpToast()
{
if(mStartUpToastPanel != NULL)
{
- LLScreenChannel::setStartUpToastShown();
- mStartUpToastPanel->close();
+ mStartUpToastPanel->closeFloater();
mStartUpToastPanel = NULL;
}
}
@@ -499,8 +482,8 @@ void LLScreenChannel::removeToastsFromChannel()
hideToastsFromScreen();
for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++)
{
- (*it).toast->close();
- //toast->mOnToastDestroy(toast, LLSD()); //TODO: check OnToastDestroy handler for chat
+ // *TODO: ivestigate mOnToastDestroy callback - change name or/and place
+ (*it).toast->mOnToastDestroy((*it).toast);
}
mToastList.clear();
}
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index 0845c32ee5..746580b574 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -56,7 +56,7 @@ class LLScreenChannel : public LLUICtrl
{
friend class LLChannelManager;
public:
- LLScreenChannel();
+ LLScreenChannel(LLUUID& id);
virtual ~LLScreenChannel();
// Channel's outfit-functions
@@ -96,11 +96,11 @@ public:
// Channel's behavior-functions
// set whether a channel will control hovering inside itself or not
- void setControlHovering(bool control) { mControlHovering = control; }
+ void setControlHovering(bool control) { mControlHovering = control; }
// set Hovering flag for a channel
- void setHovering(bool hovering) { mIsHovering = hovering; }
+ void setHovering(bool hovering) { mIsHovering = hovering; }
// set whether a channel will store faded toasts or not
- void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
+ void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
// tell all channels that the StartUp toast was shown and allow them showing of toasts
static void setStartUpToastShown() { mWasStartUpToastShown = true; }
// get StartUp Toast's state
@@ -109,13 +109,20 @@ public:
void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; }
// get mode for dislaying of toasts
bool getDisplayToastsAlways() { return mDisplayToastsAlways; }
+ // tell a channel to show toasts or not
+ void setShowToasts(bool show) { mShowToasts = show; }
+ // determine whether channel shows toasts or not
+ bool getShowToasts() { return mShowToasts; }
// Channel's other interface functions functions
// get number of hidden notifications from a channel
S32 getNumberOfHiddenToasts() { return mHiddenToastsNum;}
// update number of notifications in the StartUp Toast
void updateStartUpString(S32 num);
+ // get toast allignment preset for a channel
e_notification_toast_alignment getToastAlignment() {return mToastAlignment;}
+ // get ID of a channel
+ LLUUID getChannelID() { return mID; }
// Channel's callbacks
// callback for storing of faded toasts
@@ -123,6 +130,11 @@ public:
typedef boost::signals2::signal<void (LLPanel* info_panel, const LLUUID id)> store_tost_signal_t;
store_tost_signal_t mOnStoreToast;
boost::signals2::connection setOnStoreToastCallback(store_tost_callback_t cb) { return mOnStoreToast.connect(cb); }
+ // callback for discarding of a rejected toast
+ typedef boost::function<void (LLToast::Params p)> reject_tost_callback_t;
+ typedef boost::signals2::signal<void (LLToast::Params p)> reject_tost_signal_t;
+ reject_tost_signal_t mOnRejectToast;
+ boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mOnRejectToast.connect(cb); }
private:
struct ToastElem
@@ -179,6 +191,8 @@ private:
bool mCanStoreToasts;
bool mDisplayToastsAlways;
bool mOverflowToastHidden;
+ // controls whether a channel shows toasts or not
+ bool mShowToasts;
//
e_notification_toast_alignment mToastAlignment;
@@ -190,6 +204,9 @@ private:
// attributes for the StartUp Toast
LLToast* mStartUpToastPanel;
+ // channel's ID
+ LLUUID mID;
+
std::vector<ToastElem> mToastList;
std::vector<ToastElem> mStoredToastList;
std::map<LLToast*, bool> mToastEventStack;
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 2e005834b5..5e5608460c 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -110,12 +110,15 @@ bool LLSideTray::instanceCreated ()
}
LLSideTrayTab::LLSideTrayTab(const Params& params):mMainPanel(0)
-
{
mImagePath = params.image_path;
mTabTitle = params.tab_title;
mDescription = params.description;
+
+ // Necessary for focus movement among child controls
+ setFocusRoot(TRUE);
}
+
LLSideTrayTab::~LLSideTrayTab()
{
}
diff --git a/indra/newview/llsidetraypanelcontainer.cpp b/indra/newview/llsidetraypanelcontainer.cpp
index 21061a802a..3024492ab9 100644
--- a/indra/newview/llsidetraypanelcontainer.cpp
+++ b/indra/newview/llsidetraypanelcontainer.cpp
@@ -85,5 +85,9 @@ BOOL LLSideTrayPanelContainer::handleKeyHere(KEY key, MASK mask)
{
// No key press handling code for Panel Container - this disables
// Tab Container's Alt + Left/Right Button tab switching.
- return TRUE;
+
+ // Let default handler process key presses, don't simply return TRUE or FALSE
+ // as this may brake some functionality as it did with Copy/Paste for
+ // text_editor (ticket EXT-642).
+ return LLPanel::handleKeyHere(key, mask);
}
diff --git a/indra/newview/llsky.cpp b/indra/newview/llsky.cpp
index b779aa0f83..a49b07c5d9 100644
--- a/indra/newview/llsky.cpp
+++ b/indra/newview/llsky.cpp
@@ -52,7 +52,6 @@
#include "llviewerobject.h"
#include "llviewercamera.h"
#include "pipeline.h"
-#include "llagent.h"
#include "lldrawpool.h"
#include "llvosky.h"
@@ -422,20 +421,6 @@ void LLSky::updateFog(const F32 distance)
void LLSky::updateCull()
{
- /*if (mVOSkyp.notNull() && mVOSkyp->mDrawable.notNull())
- {
- gPipeline.markVisible(mVOSkyp->mDrawable);
- }
- else
- {
- llinfos << "No sky drawable!" << llendl;
- }*/
-
- /*if (mVOGroundp.notNull() && mVOGroundp->mDrawable.notNull())
- {
- gPipeline.markVisible(mVOGroundp->mDrawable);
- }*/
-
// *TODO: do culling for wl sky properly -Brad
}
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index f6c4710d60..836fe9729d 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -114,15 +114,19 @@ std::string LLSLURL::buildUnescapedSLURL(const std::string& regionname, S32 x, S
// static
std::string LLSLURL::buildSLURLfromPosGlobal(const std::string& regionname,
- const LLVector3d& global_pos)
+ const LLVector3d& global_pos,
+ bool escaped /*= true*/)
{
- F32 region_x = (F32)fmod(global_pos.mdV[VX], (F64)REGION_WIDTH_METERS);
- F32 region_y = (F32)fmod(global_pos.mdV[VY], (F64)REGION_WIDTH_METERS);
-
- return buildSLURL(regionname,
- llround(region_x),
- llround(region_y),
- llround((F32)global_pos.mdV[VZ]));
+ S32 x, y, z;
+ globalPosToXYZ(global_pos, x, y, z);
+ if(escaped)
+ {
+ return buildSLURL(regionname, x, y, z);
+ }
+ else
+ {
+ return buildUnescapedSLURL(regionname, x, y, z);
+ }
}
// static
@@ -132,3 +136,10 @@ bool LLSLURL::matchPrefix(const std::string& url, const std::string& prefix)
LLStringUtil::toLower(test_prefix);
return test_prefix == prefix;
}
+
+void LLSLURL::globalPosToXYZ(const LLVector3d& pos, S32& x, S32& y, S32& z)
+{
+ x = llround((F32)fmod(pos.mdV[VX], (F64)REGION_WIDTH_METERS));
+ y = llround((F32)fmod(pos.mdV[VY], (F64)REGION_WIDTH_METERS));
+ z = llround((F32)pos.mdV[VZ]);
+}
diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h
index cb1b8cca9e..8af2bdfb83 100644
--- a/indra/newview/llslurl.h
+++ b/indra/newview/llslurl.h
@@ -79,17 +79,25 @@ public:
static std::string buildUnescapedSLURL(const std::string& regionname, S32 x, S32 y, S32 z);
/**
- * builds SLURL from global position escaping result url.
+ * builds SLURL from global position. Returns escaped or unescaped url.
+ * Returns escaped url by default.
*/
static std::string buildSLURLfromPosGlobal(const std::string& regionname,
- const LLVector3d& global_pos);
+ const LLVector3d& global_pos,
+ bool escaped = true);
/**
* Strip protocol part from the URL.
*/
static std::string stripProtocol(const std::string& url);
+ /**
+ * Convert global position to X, Y Z
+ */
+ static void globalPosToXYZ(const LLVector3d& pos, S32& x, S32& y, S32& z);
+
private:
static bool matchPrefix(const std::string& url, const std::string& prefix);
+
};
#endif
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index c2fce08ae4..dea9af0657 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -41,7 +41,6 @@
#include "llviewercamera.h"
#include "llface.h"
#include "llviewercontrol.h"
-#include "llagent.h"
#include "llviewerregion.h"
#include "llcamera.h"
#include "pipeline.h"
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index bcaf5f2947..2975053289 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1003,6 +1003,8 @@ bool idle_startup()
// Load URL History File
LLURLHistory::loadFile("url_history.xml");
+ // Load location history
+ LLLocationHistory::getInstance()->load();
//-------------------------------------------------
// Handle startup progress screen
@@ -2571,7 +2573,7 @@ bool idle_startup()
// reset timers now that we are running "logged in" logic
LLFastTimer::reset();
- LLLocationHistory::getInstance()->load();
+
return TRUE;
}
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 8a5de61280..b3a820080f 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -43,7 +43,6 @@
#include "llfloaterchat.h"
#include "llfloaterdirectory.h" // to spawn search
#include "llfloaterlagmeter.h"
-#include "llfloaterland.h"
#include "llfloaterregioninfo.h"
#include "llfloaterscriptdebug.h"
#include "llhudicon.h"
@@ -70,7 +69,6 @@
#include "llviewerparcelmgr.h"
#include "llviewerthrottle.h"
#include "lluictrlfactory.h"
-#include "llvoiceclient.h" // for gVoiceClient
#include "lltoolmgr.h"
#include "llfocusmgr.h"
@@ -112,12 +110,6 @@ const S32 TEXT_HEIGHT = 18;
static void onClickBuyCurrency(void*);
static void onClickHealth(void*);
-static void onClickFly(void*);
-static void onClickPush(void*);
-static void onClickVoice(void*);
-static void onClickBuild(void*);
-static void onClickScripts(void*);
-static void onClickBuyLand(void*);
static void onClickScriptDebug(void*);
std::vector<std::string> LLStatusBar::sDays;
@@ -160,19 +152,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
childSetAction("scriptout", onClickScriptDebug, this);
childSetAction("health", onClickHealth, this);
- childSetAction("no_fly", onClickFly, this);
- childSetAction("buyland", onClickBuyLand, this );
- childSetAction("no_build", onClickBuild, this );
- childSetAction("no_scripts", onClickScripts, this );
- childSetAction("restrictpush", onClickPush, this );
- childSetAction("status_no_voice", onClickVoice, this );
-
- childSetCommitCallback("search_editor", onCommitSearch, this);
- childSetAction("search_btn", onClickSearch, this);
-
- childSetVisible("search_editor", gSavedSettings.getBOOL("ShowSearchBar"));
- childSetVisible("search_btn", gSavedSettings.getBOOL("ShowSearchBar"));
- childSetVisible("menubar_search_bevel_bg", gSavedSettings.getBOOL("ShowSearchBar"));
// Adding Net Stat Graph
S32 x = getRect().getWidth() - 2;
@@ -331,8 +310,8 @@ void LLStatusBar::refresh()
childSetVisible("scriptout", false);
}
- if ((region && region->getAllowDamage()) ||
- (parcel && parcel->getAllowDamage()) )
+ if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK &&
+ ((region && region->getAllowDamage()) || (parcel && parcel->getAllowDamage())))
{
// set visibility based on flashing
if( mHealthTimer->hasExpired() )
@@ -364,116 +343,6 @@ void LLStatusBar::refresh()
mTextHealth->setVisible(FALSE);
}
- if ((region && region->getBlockFly()) ||
- (parcel && !parcel->getAllowFly()) )
- {
- // No Fly Zone
- childGetRect( "no_fly", buttonRect );
- childSetVisible( "no_fly", true );
- r.setOriginAndSize( x, y, buttonRect.getWidth(), buttonRect.getHeight());
- childSetRect( "no_fly", r );
- x += buttonRect.getWidth();
- }
- else
- {
- // Fly Zone
- childSetVisible("no_fly", false);
- }
-
- BOOL no_build = parcel && !parcel->getAllowModify();
- if (no_build)
- {
- childSetVisible("no_build", TRUE);
- childGetRect( "no_build", buttonRect );
- // No Build Zone
- r.setOriginAndSize( x, y, buttonRect.getWidth(), buttonRect.getHeight());
- childSetRect( "no_build", r );
- x += buttonRect.getWidth();
- }
- else
- {
- childSetVisible("no_build", FALSE);
- }
-
- BOOL no_scripts = FALSE;
- if((region
- && ((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)
- || (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS)))
- || (parcel && !parcel->getAllowOtherScripts()))
- {
- no_scripts = TRUE;
- }
- if (no_scripts)
- {
- // No scripts
- childSetVisible("no_scripts", TRUE);
- childGetRect( "no_scripts", buttonRect );
- r.setOriginAndSize( x, y, buttonRect.getWidth(), buttonRect.getHeight());
- childSetRect( "no_scripts", r );
- x += buttonRect.getWidth();
- }
- else
- {
- // Yes scripts
- childSetVisible("no_scripts", FALSE);
- }
-
- BOOL no_region_push = (region && region->getRestrictPushObject());
- BOOL no_push = no_region_push || (parcel && parcel->getRestrictPushObject());
- if (no_push)
- {
- childSetVisible("restrictpush", TRUE);
- childGetRect( "restrictpush", buttonRect );
- r.setOriginAndSize( x, y, buttonRect.getWidth(), buttonRect.getHeight());
- childSetRect( "restrictpush", r );
- x += buttonRect.getWidth();
- }
- else
- {
- childSetVisible("restrictpush", FALSE);
- }
-
- BOOL have_voice = parcel && parcel->getParcelFlagAllowVoice();
- if (have_voice)
- {
- childSetVisible("status_no_voice", FALSE);
- }
- else
- {
- childSetVisible("status_no_voice", TRUE);
- childGetRect( "status_no_voice", buttonRect );
- r.setOriginAndSize( x, y, buttonRect.getWidth(), buttonRect.getHeight());
- childSetRect( "status_no_voice", r );
- x += buttonRect.getWidth();
- }
-
- BOOL canBuyLand = parcel
- && !parcel->isPublic()
- && LLViewerParcelMgr::getInstance()->canAgentBuyParcel(parcel, false);
- childSetVisible("buyland", canBuyLand);
- if (canBuyLand)
- {
- //HACK: layout tweak until this is all xml
- x += 9;
- childGetRect( "buyland", buttonRect );
- r.setOriginAndSize( x, y, buttonRect.getWidth(), buttonRect.getHeight());
- childSetRect( "buyland", r );
- x += buttonRect.getWidth();
- }
-
- bool search_visible = gSavedSettings.getBOOL("ShowSearchBar");
-
- // Set search bar visibility
-
- if (gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK)
- {
- // don't monkey with search visibility in mouselook - it will be set
- // with setVisibleForMouselook() below
- childSetVisible("search_editor", search_visible);
- childSetVisible("search_btn", search_visible);
- childSetVisible("menubar_search_bevel_bg", search_visible);
- }
-
mSGBandwidth->setVisible(net_stats_visible);
mSGPacketLoss->setVisible(net_stats_visible);
childSetEnabled("stat_btn", net_stats_visible);
@@ -483,9 +352,6 @@ void LLStatusBar::setVisibleForMouselook(bool visible)
{
mTextTime->setVisible(visible);
mBtnBuyCurrency->setVisible(visible);
- childSetVisible("search_editor", visible);
- childSetVisible("search_btn", visible);
- childSetVisible("menubar_search_bevel_bg", visible);
mSGBandwidth->setVisible(visible);
mSGPacketLoss->setVisible(visible);
setBackgroundVisible(visible);
@@ -635,49 +501,6 @@ static void onClickScriptDebug(void*)
LLFloaterScriptDebug::show(LLUUID::null);
}
-static void onClickFly(void* )
-{
- LLNotifications::instance().add("NoFly");
-}
-
-static void onClickPush(void* )
-{
- LLNotifications::instance().add("PushRestricted");
-}
-
-static void onClickVoice(void* )
-{
- LLNotifications::instance().add("NoVoice");
-}
-
-static void onClickBuild(void*)
-{
- LLNotifications::instance().add("NoBuild");
-}
-
-static void onClickScripts(void*)
-{
- LLViewerRegion* region = gAgent.getRegion();
- if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS)
- {
- LLNotifications::instance().add("ScriptsStopped");
- }
- else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)
- {
- LLNotifications::instance().add("ScriptsNotRunning");
- }
- else
- {
- LLNotifications::instance().add("NoOutsideScripts");
- }
-}
-
-static void onClickBuyLand(void*)
-{
- LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal());
- LLViewerParcelMgr::getInstance()->startBuyLand();
-}
-
// sets the static variables necessary for the date
void LLStatusBar::setupDate()
{
@@ -784,21 +607,6 @@ void LLStatusBar::onMainMenuRightClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask
}
// static
-void LLStatusBar::onCommitSearch(LLUICtrl*, void* data)
-{
- // committing is the same as clicking "search"
- onClickSearch(data);
-}
-
-// static
-void LLStatusBar::onClickSearch(void* data)
-{
- LLStatusBar* self = (LLStatusBar*)data;
- std::string search_text = self->childGetText("search_editor");
- LLFloaterReg::showInstance("search", LLSD().insert("panel", "all").insert("id", LLSD(search_text)));
-}
-
-// static
void LLStatusBar::onClickStatGraph(void* data)
{
LLFloaterReg::showInstance("lagmeter");
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index a26b1c14af..2bbb5a2767 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -131,7 +131,8 @@ void LLSysWellWindow::removeItemByID(const LLUUID& id)
void LLSysWellWindow::onItemClick(LLSysWellItem* item)
{
LLUUID id = item->getID();
- mChannel->loadStoredToastByIDToChannel(id);
+ if(mChannel)
+ mChannel->loadStoredToastByIDToChannel(id);
}
//---------------------------------------------------------------------------------
@@ -139,7 +140,8 @@ void LLSysWellWindow::onItemClose(LLSysWellItem* item)
{
LLUUID id = item->getID();
removeItemByID(id);
- mChannel->killToastByNotificationID(id);
+ if(mChannel)
+ mChannel->killToastByNotificationID(id);
}
//---------------------------------------------------------------------------------
@@ -154,10 +156,15 @@ void LLSysWellWindow::setVisible(BOOL visible)
// on Show adjust position of SysWell chiclet's window
if(visible)
{
- mChannel->removeAndStoreAllVisibleToasts();
+ if(mChannel)
+ mChannel->removeAndStoreAllVisibleToasts();
+
adjustWindowPosition(); // *TODO: won't be necessary after docking is realized
}
+ if(mChannel)
+ mChannel->setShowToasts(!visible);
+
LLFloater::setVisible(visible);
}
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index 9754568f56..5235dc9358 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -43,6 +43,7 @@
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llworldmap.h"
+#include "llagentui.h"
//////////////////////////////////////////////////////////////////////////////
// LLTeleportHistoryItem
@@ -74,7 +75,7 @@ LLTeleportHistory::LLTeleportHistory():
mGotInitialUpdate(false)
{
mTeleportFinishedConn = LLViewerParcelMgr::getInstance()->
- setTeleportFinishedCallback(boost::bind(&LLTeleportHistory::updateCurrentLocation, this));
+ setTeleportFinishedCallback(boost::bind(&LLTeleportHistory::updateCurrentLocation, this, _1));
mTeleportFailedConn = LLViewerParcelMgr::getInstance()->
setTeleportFailedCallback(boost::bind(&LLTeleportHistory::onTeleportFailed, this));
}
@@ -118,7 +119,7 @@ void LLTeleportHistory::onTeleportFailed()
}
}
-void LLTeleportHistory::updateCurrentLocation()
+void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
{
if (mRequestedItem != -1) // teleport within the history in progress?
{
@@ -149,7 +150,7 @@ void LLTeleportHistory::updateCurrentLocation()
return;
}
mItems[mCurrentItem].mTitle = getCurrentLocationTitle();
- mItems[mCurrentItem].mGlobalPos = gAgent.getPositionGlobal();
+ mItems[mCurrentItem].mGlobalPos = new_pos;
mItems[mCurrentItem].mRegionID = gAgent.getRegion()->getRegionID();
}
@@ -184,10 +185,7 @@ void LLTeleportHistory::purgeItems()
std::string LLTeleportHistory::getCurrentLocationTitle()
{
std::string location_name;
-
- if (!gAgent.buildLocationString(location_name, LLAgent::LOCATION_FORMAT_NORMAL))
- location_name = "Unknown";
-
+ if (!LLAgentUI::buildLocationString(location_name, LLAgent::LOCATION_FORMAT_NORMAL)) location_name = "Unknown";
return location_name;
}
@@ -201,6 +199,7 @@ void LLTeleportHistory::dump() const
line << ((i == mCurrentItem) ? " * " : " ");
line << i << ": " << mItems[i].mTitle;
line << " REGION_ID: " << mItems[i].mRegionID;
+ line << ", pos: " << mItems[i].mGlobalPos;
llinfos << line.str() << llendl;
}
}
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index 775b21e24c..060534635d 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -147,6 +147,10 @@ private:
/**
* Update current location.
*
+ * @param new_pos Current agent global position. After local teleports we
+ * cannot rely on gAgent.getPositionGlobal(),
+ * so the new position gets passed explicitly.
+ *
* Called when a teleport finishes.
* Called via callback set on the LLViewerParcelMgr "teleport finished" signal.
*
@@ -158,7 +162,7 @@ private:
* @see mRequestedItem
* @see mGotInitialUpdate
*/
- void updateCurrentLocation();
+ void updateCurrentLocation(const LLVector3d& new_pos);
/**
* Invokes the "history changed" callback(s).
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 07f802cf54..85814a98c9 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -225,7 +225,6 @@ void LLToast::onMouseEnter(S32 x, S32 y, MASK mask)
{
mOnToastHover(this, MOUSE_ENTER);
- setVisibleAndFrontmost();
setBackgroundOpaque(TRUE);
if(mCanFade)
{
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index f1a9f2ec46..969f3fd1cb 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -107,8 +107,6 @@ public:
//
void stopTimer() { mTimer.stop(); }
//
- void close() { die(); }
- //
virtual void draw();
//
virtual void setVisible(BOOL show);
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index 69c384835d..4309f56710 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -66,8 +66,7 @@ static const S32 HPAD = 25;
static const S32 BTN_HPAD = 8;
LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal)
- : LLFloater(LLSD()),
- LLToastPanel(notification),
+ : LLToastPanel(notification),
mDefaultOption( 0 ),
mCheck(NULL),
mCaution(notification->getPriority() >= NOTIFICATION_PRIORITY_HIGH),
@@ -304,8 +303,8 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
setCheckBox(LLNotifications::instance().getGlobalString("alwayschoose"), ignore_label);
}
- gFloaterView->adjustToFitScreen(this, FALSE);
- LLFloater::setFocus(TRUE);
+ // *TODO: check necessity of this code
+ //gFloaterView->adjustToFitScreen(this, FALSE);
if (mLineEditor)
{
mLineEditor->setFocus(TRUE);
@@ -368,9 +367,13 @@ LLToastAlertPanel::~LLToastAlertPanel()
BOOL LLToastAlertPanel::hasTitleBar() const
{
+ // *TODO: check necessity of this code
+ /*
return (getCurrentTitle() != "" && getCurrentTitle() != " ") // has title
|| isMinimizeable()
|| isCloseable();
+ */
+ return false;
}
BOOL LLToastAlertPanel::handleKeyHere(KEY key, MASK mask )
@@ -455,7 +458,6 @@ void LLToastAlertPanel::onButtonPressed( const LLSD& data, S32 button )
}
mNotification->respond(response); // new notification reponse
- closeFloater(); // deletes self
}
void LLToastAlertPanel::onClickIgnore(LLUICtrl* ctrl)
diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h
index 543c14d404..af0c9a9ddd 100644
--- a/indra/newview/lltoastalertpanel.h
+++ b/indra/newview/lltoastalertpanel.h
@@ -52,8 +52,7 @@ class LLLineEditor;
*/
class LLToastAlertPanel
- : public LLToastPanel,
- public LLFloater
+ : public LLToastPanel
{
public:
typedef bool (*display_callback_t)(S32 modal);
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
new file mode 100644
index 0000000000..e41181c9e1
--- /dev/null
+++ b/indra/newview/lltoastimpanel.cpp
@@ -0,0 +1,94 @@
+/**
+ * @file lltoastimpanel.cpp
+ * @brief Panel for IM toasts.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "lltoastimpanel.h"
+#include "llimpanel.h"
+
+const S32 LLToastIMPanel::MAX_MESSAGE_HEIGHT = 50;
+const S32 LLToastIMPanel::CAPTION_HEIGHT = 30;
+const S32 LLToastIMPanel::TOP_PAD = 5;
+
+//--------------------------------------------------------------------------
+LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notification),
+ mAvatar(NULL), mUserName(NULL),
+ mTime(NULL), mMessage(NULL),
+ mReplyBtn(NULL)
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_instant_message.xml");
+
+ mAvatar = getChild<LLAvatarIconCtrl>("avatar");
+ mUserName = getChild<LLTextBox>("user_name");
+ mTime = getChild<LLTextBox>("time_box");
+ mMessage = getChild<LLTextBox>("message");
+ mReplyBtn = getChild<LLButton>("reply");
+
+ mMessage->setValue(p.message);
+ mAvatar->setValue(p.avatar_id);
+ mUserName->setValue(p.from);
+ mTime->setValue(p.time);
+ mSessionID = p.session_id;
+
+ mReplyBtn->setClickedCallback(boost::bind(&LLToastIMPanel::onClickReplyBtn, this));
+
+ snapToMessageHeight();
+}
+
+//--------------------------------------------------------------------------
+LLToastIMPanel::~LLToastIMPanel()
+{
+}
+
+//--------------------------------------------------------------------------
+void LLToastIMPanel::snapToMessageHeight()
+{
+ S32 required_text_height = mMessage->getTextPixelHeight();
+ S32 text_height = llmin(required_text_height, MAX_MESSAGE_HEIGHT);
+ LLRect text_rect = mMessage->getRect();
+ LLRect btn_rect = mReplyBtn->getRect();
+
+
+ mMessage->reshape( text_rect.getWidth(), text_height, TRUE);
+ mMessage->setValue(mMessage->getText());
+
+ S32 panel_height = CAPTION_HEIGHT + text_height + btn_rect.getHeight() + TOP_PAD*5;
+ reshape( getRect().getWidth(), panel_height, TRUE);
+}
+
+//--------------------------------------------------------------------------
+void LLToastIMPanel::onClickReplyBtn()
+{
+ LLIMFloater::toggle(mSessionID);
+}
+
+//--------------------------------------------------------------------------
+
diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h
new file mode 100644
index 0000000000..7f5d6eca1d
--- /dev/null
+++ b/indra/newview/lltoastimpanel.h
@@ -0,0 +1,79 @@
+/**
+ * @file lltoastimpanel.h
+ * @brief Panel for IM toasts.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLTOASTIMPANEL_H_
+#define LLTOASTIMPANEL_H_
+
+
+#include "lltoastpanel.h"
+#include "lltextbox.h"
+#include "llbutton.h"
+#include "llavatariconctrl.h"
+
+
+class LLToastIMPanel: public LLToastPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params>
+ {
+ LLNotificationPtr notification;
+ LLUUID avatar_id;
+ LLUUID session_id;
+ std::string from;
+ std::string time;
+ std::string message;
+
+ Params() {}
+ };
+
+ LLToastIMPanel(LLToastIMPanel::Params &p);
+ virtual ~LLToastIMPanel();
+
+private:
+ static const S32 MAX_MESSAGE_HEIGHT;
+ static const S32 CAPTION_HEIGHT;
+ static const S32 TOP_PAD;
+
+ void onClickReplyBtn();
+ void snapToMessageHeight();
+
+ LLUUID mSessionID;
+ LLAvatarIconCtrl* mAvatar;
+ LLTextBox* mUserName;
+ LLTextBox* mTime;
+ LLTextBox* mMessage;
+ LLButton* mReplyBtn;
+};
+
+#endif // LLTOASTIMPANEL_H_
+
+
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 70fa2f715b..b5dd34df15 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -72,7 +72,7 @@
#include "object_flags.h"
#include "llimview.h"
#include "llrootview.h"
-
+#include "llagentui.h"
// MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES
// or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a
@@ -1563,7 +1563,7 @@ void LLToolDragAndDrop::commitGiveInventoryItem(const LLUUID& to_agent,
{
if(!item) return;
std::string name;
- gAgent.buildFullname(name);
+ LLAgentUI::buildFullname(name);
LLUUID transaction_id;
transaction_id.generate();
const S32 BUCKET_SIZE = sizeof(U8) + UUID_BYTES;
@@ -1762,7 +1762,7 @@ void LLToolDragAndDrop::commitGiveInventoryCategory(const LLUUID& to_agent,
else
{
std::string name;
- gAgent.buildFullname(name);
+ LLAgentUI::buildFullname(name);
LLUUID transaction_id;
transaction_id.generate();
S32 bucket_size = (sizeof(U8) + UUID_BYTES) * (count + 1);
diff --git a/indra/newview/lltoolface.cpp b/indra/newview/lltoolface.cpp
index b335d7125a..1d78dc5019 100644
--- a/indra/newview/lltoolface.cpp
+++ b/indra/newview/lltoolface.cpp
@@ -40,7 +40,6 @@
#include "v3math.h"
// Viewer includes
-#include "llagent.h"
#include "llviewercontrol.h"
#include "llselectmgr.h"
#include "llviewerobject.h"
diff --git a/indra/newview/lltoolselectland.cpp b/indra/newview/lltoolselectland.cpp
index 07c996a84f..5c8b08db3b 100644
--- a/indra/newview/lltoolselectland.cpp
+++ b/indra/newview/lltoolselectland.cpp
@@ -38,7 +38,6 @@
#include "llparcel.h"
// Viewer includes
-#include "llagent.h"
#include "llviewercontrol.h"
#include "llfloatertools.h"
#include "llselectmgr.h"
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index 8fbb59bc74..28f883312a 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -39,7 +39,6 @@
#include "llfasttimer.h"
#include "llrender.h"
-#include "llagent.h"
#include "llapr.h"
#include "llbox.h"
#include "lldrawable.h"
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index d83f3d9207..7303605915 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -101,6 +101,7 @@
#include "llnotify.h"
#include "llpanelgrouplandmoney.h"
#include "llselectmgr.h"
+#include "llsidetray.h"
#include "llstartup.h"
#include "llsky.h"
#include "llstatenums.h"
@@ -136,6 +137,7 @@
#include "llviewerdisplay.h"
#include "llkeythrottle.h"
#include "llgroupactions.h"
+#include "llagentui.h"
#include <boost/tokenizer.hpp>
#include <boost/algorithm/string/split.hpp>
@@ -902,12 +904,17 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)
break;
case LLAssetType::AT_LANDMARK:
{
- // *TODO: Embed a link to the Places panel so that user can edit the landmark right away.
LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());
LLSD args;
args["LANDMARK_NAME"] = item->getName();
args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unnkown");
LLNotifications::instance().add("LandmarkCreated", args);
+
+ // Open new landmark for editing in Places panel.
+ LLSD key;
+ key["type"] = "landmark";
+ key["id"] = item->getUUID();
+ LLSideTray::getInstance()->showPanel("panel_places", key);
}
break;
case LLAssetType::AT_TEXTURE:
@@ -1079,7 +1086,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
msg->addUUIDFast(_PREHASH_ID, mTransactionID);
msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
std::string name;
- gAgent.buildFullname(name);
+ LLAgentUI::buildFullname(name);
msg->addStringFast(_PREHASH_FromAgentName, name);
msg->addStringFast(_PREHASH_Message, "");
msg->addU32Fast(_PREHASH_ParentEstateID, 0);
@@ -1526,7 +1533,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// if there is not a panel for this conversation (i.e. it is a new IM conversation
// initiated by the other party) then...
std::string my_name;
- gAgent.buildFullname(my_name);
+ LLAgentUI::buildFullname(my_name);
std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2");
pack_instant_message(
gMessageSystem,
@@ -2131,7 +2138,7 @@ void busy_message (LLMessageSystem* msg, LLUUID from_id)
if (gAgent.getBusy())
{
std::string my_name;
- gAgent.buildFullname(my_name);
+ LLAgentUI::buildFullname(my_name);
std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2");
pack_instant_message(
gMessageSystem,
@@ -4735,7 +4742,7 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
// so we'll reuse the same namespace for both throttle types.
std::string throttle_name = owner_name;
std::string self_name;
- gAgent.getName( self_name );
+ LLAgentUI::buildName( self_name );
if( owner_name == self_name )
{
throttle_name = taskid.getString();
@@ -5040,9 +5047,6 @@ void process_teleport_local(LLMessageSystem *msg,void**)
gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
}
- // Let the interested parties know we've teleported.
- LLViewerParcelMgr::getInstance()->onTeleportFinished();
-
// Sim tells us whether the new position is off the ground
if (teleport_flags & TELEPORT_FLAGS_IS_FLYING)
{
@@ -5063,6 +5067,11 @@ void process_teleport_local(LLMessageSystem *msg,void**)
gAgent.updateCamera();
send_agent_update(TRUE, TRUE);
+
+ // Let the interested parties know we've teleported.
+ // Vadim *HACK: Agent position seems to get reset (to render position?)
+ // on each frame, so we have to pass the new position manually.
+ LLViewerParcelMgr::getInstance()->onTeleportFinished(true, gAgent.getPosGlobalFromAgent(pos));
}
void send_simple_im(const LLUUID& to_id,
@@ -5071,7 +5080,7 @@ void send_simple_im(const LLUUID& to_id,
const LLUUID& id)
{
std::string my_name;
- gAgent.buildFullname(my_name);
+ LLAgentUI::buildFullname(my_name);
send_improved_im(to_id,
my_name,
message,
@@ -5092,7 +5101,7 @@ void send_group_notice(const LLUUID& group_id,
// This will mean converting the item to a binary bucket,
// and the subject/message into a single field.
std::string my_name;
- gAgent.buildFullname(my_name);
+ LLAgentUI::buildFullname(my_name);
// Combine subject + message into a single string.
std::ostringstream subject_and_message;
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 8497a45466..9dafc4b9f5 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1530,7 +1530,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
if (instance->mTeleportInProgress)
{
instance->mTeleportInProgress = FALSE;
- instance->mTeleportFinishedSignal();
+ instance->mTeleportFinishedSignal(gAgent.getPositionGlobal());
}
}
}
@@ -2398,12 +2398,19 @@ LLViewerTexture* LLViewerParcelMgr::getPassImage() const
return sPassImage;
}
-boost::signals2::connection LLViewerParcelMgr::setAgentParcelChangedCallback(parcel_changed_callback_t cb)
+boost::signals2::connection LLViewerParcelMgr::addAgentParcelChangedCallback(parcel_changed_callback_t cb)
{
return mAgentParcelChangedSignal.connect(cb);
}
-
-boost::signals2::connection LLViewerParcelMgr::setTeleportFinishedCallback(parcel_changed_callback_t cb)
+/*
+ * Set finish teleport callback. You can use it to observe all teleport events.
+ * NOTE:
+ * After local( in one region) teleports we
+ * cannot rely on gAgent.getPositionGlobal(),
+ * so the new position gets passed explicitly.
+ * Use args of this callback to get global position of avatar after teleport event.
+ */
+boost::signals2::connection LLViewerParcelMgr::setTeleportFinishedCallback(teleport_finished_callback_t cb)
{
return mTeleportFinishedSignal.connect(cb);
}
@@ -2416,12 +2423,22 @@ boost::signals2::connection LLViewerParcelMgr::setTeleportFailedCallback(parcel_
/* Ok, we're notified that teleport has been finished.
* We should now propagate the notification via mTeleportFinishedSignal
* to all interested parties.
- * However the agent parcel data has not been updated yet.
- * Let's wait for the update and then emit the signal.
*/
-void LLViewerParcelMgr::onTeleportFinished()
+void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos)
{
- mTeleportInProgress = TRUE;
+ if (local)
+ {
+ // Local teleport. We already have the agent parcel data.
+ // Emit the signal immediately.
+ getInstance()->mTeleportFinishedSignal(new_pos);
+ }
+ else
+ {
+ // Non-local teleport.
+ // The agent parcel data has not been updated yet.
+ // Let's wait for the update and then emit the signal.
+ mTeleportInProgress = TRUE;
+ }
}
void LLViewerParcelMgr::onTeleportFailed()
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 427ed4a6f2..917f28fd29 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -82,6 +82,8 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
{
public:
+ typedef boost::function<void (const LLVector3d&)> teleport_finished_callback_t;
+ typedef boost::signals2::signal<void (const LLVector3d&)> teleport_finished_signal_t;
typedef boost::function<void()> parcel_changed_callback_t;
typedef boost::signals2::signal<void()> parcel_changed_signal_t;
@@ -262,10 +264,10 @@ public:
// the agent is banned or not in the allowed group
BOOL isCollisionBanned();
- boost::signals2::connection setAgentParcelChangedCallback(parcel_changed_callback_t cb);
- boost::signals2::connection setTeleportFinishedCallback(parcel_changed_callback_t cb);
+ boost::signals2::connection addAgentParcelChangedCallback(parcel_changed_callback_t cb);
+ boost::signals2::connection setTeleportFinishedCallback(teleport_finished_callback_t cb);
boost::signals2::connection setTeleportFailedCallback(parcel_changed_callback_t cb);
- void onTeleportFinished();
+ void onTeleportFinished(bool local, const LLVector3d& new_pos);
void onTeleportFailed();
static BOOL isParcelOwnedByAgent(const LLParcel* parcelp, U64 group_proxy_power);
@@ -316,7 +318,7 @@ private:
LLDynamicArray<LLParcelObserver*> mObservers;
BOOL mTeleportInProgress;
- parcel_changed_signal_t mTeleportFinishedSignal;
+ teleport_finished_signal_t mTeleportFinishedSignal;
parcel_changed_signal_t mTeleportFailedSignal;
parcel_changed_signal_t mAgentParcelChangedSignal;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 83442dc2bb..1b926e2db6 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -53,7 +53,6 @@
#include "llxmltree.h"
#include "message.h"
-#include "llagent.h"
#include "lltexturecache.h"
#include "lltexturefetch.h"
#include "llviewercontrol.h"
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 74ed5b12fe..01756a0d82 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -186,6 +186,7 @@
#include "llpostprocess.h"
#include "llbottomtray.h"
#include "llnearbychatbar.h"
+#include "llagentui.h"
#include "llnotificationmanager.h"
@@ -1105,7 +1106,7 @@ BOOL LLViewerWindow::handlePaint(LLWindow *window, S32 x, S32 y, S32 width, S
FillRect(hdc, &wnd_rect, CreateSolidBrush(RGB(255, 255, 255)));
std::string name_str;
- gAgent.getName(name_str);
+ LLAgentUI::buildName(name_str);
std::string temp_str;
temp_str = llformat( "%s FPS %3.1f Phy FPS %2.1f Time Dil %1.3f", /* Flawfinder: ignore */
diff --git a/indra/newview/llvlmanager.cpp b/indra/newview/llvlmanager.cpp
index 177093c4d1..07ef262668 100644
--- a/indra/newview/llvlmanager.cpp
+++ b/indra/newview/llvlmanager.cpp
@@ -40,7 +40,6 @@
#include "patch_dct.h"
#include "llviewerregion.h"
#include "llframetimer.h"
-#include "llagent.h"
#include "llsurface.h"
LLVLManager gVLManager;
diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp
index fe19e18151..ac2484ddfd 100644
--- a/indra/newview/llvoground.cpp
+++ b/indra/newview/llvoground.cpp
@@ -37,7 +37,6 @@
#include "llviewercontrol.h"
-#include "llagent.h"
#include "lldrawable.h"
#include "llface.h"
#include "llsky.h"
diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp
index 9871965458..f5094c025e 100644
--- a/indra/newview/llvotextbubble.cpp
+++ b/indra/newview/llvotextbubble.cpp
@@ -39,7 +39,6 @@
#include "llprimitive.h"
#include "llrendersphere.h"
-#include "llagent.h"
#include "llbox.h"
#include "lldrawable.h"
#include "llface.h"
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index f7a16571d1..6a209ecabf 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -47,7 +47,7 @@
#include "material_codes.h"
#include "message.h"
#include "object_flags.h"
-#include "llagent.h"
+#include "llagentconstants.h"
#include "lldrawable.h"
#include "lldrawpoolbump.h"
#include "llface.h"
diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp
index 332c9dd952..e2357957ab 100644
--- a/indra/newview/llvowater.cpp
+++ b/indra/newview/llvowater.cpp
@@ -37,7 +37,6 @@
#include "imageids.h"
#include "llviewercontrol.h"
-#include "llagent.h"
#include "lldrawable.h"
#include "lldrawpoolwater.h"
#include "llface.h"
diff --git a/indra/newview/llwind.cpp b/indra/newview/llwind.cpp
index ae98bead98..cbee4ddae1 100644
--- a/indra/newview/llwind.cpp
+++ b/indra/newview/llwind.cpp
@@ -49,7 +49,6 @@
// viewer
#include "noise.h"
#include "v4color.h"
-#include "llagent.h"
#include "llworld.h"
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index ae476c88c9..7d9d0a6191 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -52,7 +52,6 @@
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "lldrawpoolwater.h"
-#include "llagent.h"
#include "llviewerregion.h"
#include "llwlparamset.h"
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index ad208806b7..29492ebbdf 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -381,6 +381,7 @@
<texture name="icon_groupnoticeinventory.tga"/>
<texture name="icon_lock.tga"/>
<texture name="icon_place.tga"/>
+ <texture name="icon_place_for_sale.tga"/>
<texture name="icon_popular.tga"/>
<texture name="icon_top_pick.tga"/>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index a74f560753..28cb3bc551 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -19,7 +19,7 @@
left="10"
name="title"
text_color="white"
- top="0"
+ top="17"
width="250">
Edit Pick
</text>
@@ -28,11 +28,11 @@
bg_alpha_color="DkGray2"
width="280"
follows="left|right|top|bottom"
- height="570"
+ height="560"
layout="topleft"
left="10"
right="-10"
- top="30">
+ top_pad="5">
<panel
follows="left|top|right"
height="150"
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 b336c86e95..c870e24e59 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -13,8 +13,8 @@
top="10"
width="305">
<text
- top="0"
- left="9"
+ top="16"
+ left="11"
height="20"
follows="left|top"
font="SansSerifHugeBold"
@@ -28,7 +28,7 @@
background_visible="true"
bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="620"
+ height="604"
layout="topleft"
left="9"
name="data_panel"
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index a38d7eee36..2243df951e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -2,7 +2,7 @@
<panel
border="true"
follows="all"
- height="500"
+ height="470"
label="General"
class="panel_group_general"
layout="topleft"
@@ -43,39 +43,17 @@ Hover your mouse over the options for more help.
<text_editor
type="string"
follows="left|top"
- left="10"
+ left="95"
height="75"
hide_scrollbar="true"
layout="topleft"
max_length="511"
name="charter"
- top_pad="4"
- width="260"
+ top="30"
+ width="170"
word_wrap="true">
Group Charter
</text_editor>
- <!--<button
- follows="left|top"
- height="20"
- font="SansSerifSmall"
- label="Join (L$0)"
- label_selected="Join (L$0)"
- layout="topleft"
- left="10"
- name="join_button"
- top_pad="10"
- width="85" />
- <button
- follows="left|top"
- height="20"
- font="SansSerifSmall"
- label="Details"
- label_selected="Detailed View"
- layout="topleft"
- left_delta="0"
- name="info_button"
- top_delta="0"
- width="85" /> -->
<text
follows="left|top"
type="string"
@@ -83,7 +61,7 @@ Hover your mouse over the options for more help.
tool_tip="Owners are shown in bold."
height="16"
layout="topleft"
- left_delta="0"
+ left="5"
name="text_owners_and_visible_members"
top_pad="10"
width="270">
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index be68187eaf..65d1e3c3a7 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -16,26 +16,25 @@
name="want_apply_text">
Do you want to apply these changes?
</panel.string>
-
- <button
+
+ <button
layout="topleft"
name="back"
- left="5"
- top="5"
- width="20"
- height="20"
+ right="-9"
+ top="0"
+ width="25"
+ height="25"
label=""
follows="top|left"
- image_selected="navbar_bg_button.tga"
- image_unselected="navbar_bg_button.tga"
- image_overlay="navbar_back.tga"/>
+ image_overlay="BackArrow_Off"
+ tab_stop="false" />
<text
layout="topleft"
- top="5"
- left_pad="15"
- width="200"
+ top="0"
+ left="10"
+ width="250"
height="20"
- font="SansSerifBold"
+ font="SansSerifHugeBold"
text_color="white"
follows="top|left|right"
mouse_opaque="true"
@@ -100,7 +99,7 @@
left="5"
visible="false"
width="65" />
- <accordion layout="topleft" left="2" width="296" top="135" height="600" follows="all" name="panel_me_profile">
+ <accordion layout="topleft" left="2" width="296" top="135" height="600" follows="all" name="group_accordion">
<accordion_tab min_height="515" title="Group General" name="group_general_tab">
<panel class="panel_group_general" filename="panel_group_general.xml" name="group_general_tab_panel"/>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/en/panel_group_invite.xml b/indra/newview/skins/default/xui/en/panel_group_invite.xml
index 43457ddd61..68b30faa1c 100644
--- a/indra/newview/skins/default/xui/en/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml
@@ -15,6 +15,10 @@
name="loading">
(loading...)
</panel.string>
+ <panel.string
+ name="already_in_group">
+ Some avatars are already in group and were not invited.
+ </panel.string>
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 4d373fbf3a..069cf1d7bd 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -2,7 +2,7 @@
<panel
border="true"
follows="all"
- height="490"
+ height="410"
label="Land &amp; L$"
layout="topleft"
left="1"
@@ -59,7 +59,7 @@
heading_height="14"
height="100"
layout="topleft"
- left_delta="0"
+ left="5"
name="group_parcel_list"
top_pad="10"
width="265">
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index a39a681f83..8ebf1b69a7 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -9,7 +9,7 @@
top="5" left="5" mouse_opaque="true" name="group_icon"/>
<text type="string" length="1" follows="left|top|right|bottom"
font="SansSerifBigBold" height="20" layout="topleft" left="60" name="title"
- text_color="GroupNotifyTextColor" top="20" width="300">
+ text_color="GroupNotifyTextColor" top="20" width="275" use_ellipses="true">
Sender Name / Group Name
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 37c332b2b7..9ae165cbb9 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -193,7 +193,7 @@ clicking on their names.
height="20"
follows="left|top|right"
max_length="250"
- label="Filter Roles"
+ label="Filter People"
name="filter_input"
font="SansSerif"
background_image="TextField_Search_Off"
@@ -326,7 +326,7 @@ including the Everyone and Owner Roles.
height="20"
follows="left|top|right"
max_length="250"
- label="Filter People"
+ label="Filter Roles"
name="filter_input"
font="SansSerif"
background_image="TextField_Search_Off"
@@ -507,7 +507,7 @@ things in this group. There&apos;s a broad variety of Abilities.
</panel>
</tab_container>
<panel
- height="50"
+ height="170"
layout="topleft"
follows="left|top"
left="10"
@@ -540,7 +540,6 @@ things in this group. There&apos;s a broad variety of Abilities.
</text>
<scroll_list
draw_stripes="false"
- enabled="false"
follows="left|top"
height="150"
layout="topleft"
@@ -559,7 +558,6 @@ things in this group. There&apos;s a broad variety of Abilities.
</scroll_list>
<scroll_list
draw_stripes="false"
- enabled="false"
height="150"
layout="topleft"
follows="left|top"
@@ -686,7 +684,6 @@ things in this group. There&apos;s a broad variety of Abilities.
</text>
<name_list
draw_stripes="false"
- enabled="false"
height="150"
layout="topleft"
left="0"
@@ -783,7 +780,6 @@ things in this group. There&apos;s a broad variety of Abilities.
Members with Ability
</text>
<scroll_list
- enabled="false"
height="150"
layout="topleft"
left="0"
@@ -791,7 +787,6 @@ things in this group. There&apos;s a broad variety of Abilities.
top="90"
width="130" />
<name_list
- enabled="false"
height="150"
layout="topleft"
left_pad="5"
diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
new file mode 100644
index 0000000000..169fde7b47
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bevel_style="in"
+ bg_alpha_color="0.3 0.3 0.3 0"
+ height="140"
+ label="im_panel"
+ layout="topleft"
+ left="0"
+ name="im_panel"
+ top="0"
+ width="350">
+ <panel
+ background_visible="true"
+ bevel_style="in"
+ bg_alpha_color="black"
+ follows="top"
+ height="30"
+ label="im_header"
+ layout="topleft"
+ left="5"
+ name="im_header"
+ top="5"
+ width="340">
+ <avatar_icon
+ follows="right"
+ height="20"
+ image_name="icon_avatar_online.tga"
+ layout="topleft"
+ left="5"
+ mouse_opaque="true"
+ name="avatar"
+ top="5"
+ width="20" />
+ <text
+ follows="left|right"
+ font="SansSerifBigBold"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="user_name"
+ text_color="white"
+ top="5"
+ value="Darth Vader"
+ width="250" />
+ <text
+ follows="right"
+ font="SansSerifBig"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="time_box"
+ text_color="white"
+ top="5"
+ value="23:30"
+ width="50" />
+ </panel>
+ <text
+ follows="left|bottom|right"
+ height="60"
+ layout="topleft"
+ left="10"
+ name="message"
+ text_color="white"
+ top="40"
+ use_ellipses="true"
+ value="MESSAGE"
+ width="330"
+ word_wrap="true" />
+ <button
+ follows="bottom"
+ font="SansSerifBigBold"
+ height="25"
+ label="reply"
+ layout="topleft"
+ left="120"
+ name="reply"
+ top="110"
+ width="110" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index f821dcd839..dee911a45d 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -116,12 +116,12 @@
follows="right|top"
halign="right"
height="22"
- label="Search All"
+ label="Search"
layout="topleft"
left_pad="7"
mouse_opaque="false"
name="search_input"
- tool_tip="Search All"
+ tool_tip="Search"
top_delta="0"
width="200" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
index 188f405e13..12badfccf0 100644
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ b/indra/newview/skins/default/xui/en/panel_notes.xml
@@ -9,114 +9,136 @@
name="panel_notes"
top="0"
width="285">
- <scroll_container
- color="DkGray2"
- follows="left|top|right|bottom"
- height="350"
+ <layout_stack
+ name="layout"
+ orientation="vertical"
+ follows="all"
layout="topleft"
- left="2"
- name="profile_scroll"
- opaque="true"
+ left="0"
top="0"
- width="284">
- <panel
- height="350"
- layout="topleft"
- name="profile_scroll_panel"
- top="0"
- width="284">
- <text
- follows="left|top"
- font="SansSerifBold"
- height="16"
+ height="420"
+ width="285"
+ border_size="0">
+ <panel
+ name="notes_stack"
+ follows="all"
layout="topleft"
- left="10"
- name="status_message"
- text_color="white"
top="0"
- value="My private notes:"
- width="230" />
- <text_editor
- follows="left|top"
- height="200"
- hide_scrollbar="true"
- layout="topleft"
- left="10"
- max_length="1000"
- name="notes_edit"
- text_color="black"
- top_pad="10"
- width="255"
- word_wrap="true" />
- <text
- follows="left|top"
- font="SansSerifBold"
- height="16"
- layout="topleft"
- left="10"
- name="status_message2"
- text_color="white"
- top_pad="10"
- value="Let this person:"
- width="225" />
- <check_box
- enabled="false"
- height="20"
- label="See my online status"
- layout="topleft"
- left="20"
- name="status_check"
- top_pad="0"
- width="230" />
- <check_box
- enabled="false"
- height="20"
- label="See me on the map"
- layout="topleft"
- left="20"
- name="map_check"
- top_pad="0"
- width="230" />
- <check_box
- enabled="false"
- height="20"
- label="Edit, delete or take my objects"
- layout="topleft"
- left="20"
- name="objects_check"
- top_pad="0"
- width="230" />
- </panel>
- </scroll_container>
- <panel
- follows="bottom|left"
- height="30"
- layout="topleft"
- left="10"
- name="notes_buttons_panel"
- top_pad="5"
- width="280">
- <button
- enabled="false"
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="Teleport"
- layout="topleft"
left="0"
- name="teleport_btn"
- top="0"
- width="75" />
- <button
- enabled="false"
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="Map"
+ height="390"
+ width="285">
+ <scroll_container
+ color="DkGray2"
+ follows="left|top|right|bottom"
+ height="390"
+ layout="topleft"
+ left="0"
+ name="profile_scroll"
+ opaque="true"
+ top="0"
+ width="285">
+ <panel
+ height="350"
+ layout="topleft"
+ name="profile_scroll_panel"
+ top="0"
+ left="0"
+ width="240">
+ <text
+ follows="left|top"
+ font="SansSerifBold"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="status_message"
+ text_color="white"
+ top="0"
+ value="My private notes:"
+ width="230" />
+ <text_editor
+ follows="left|top"
+ height="200"
+ hide_scrollbar="true"
+ layout="topleft"
+ left="10"
+ max_length="1000"
+ name="notes_edit"
+ text_color="black"
+ top_pad="10"
+ width="235"
+ word_wrap="true" />
+ <text
+ follows="left|top"
+ font="SansSerifBold"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="status_message2"
+ text_color="white"
+ top_pad="10"
+ value="Let this person:"
+ width="225" />
+ <check_box
+ enabled="false"
+ height="20"
+ label="See my online status"
+ layout="topleft"
+ left="20"
+ name="status_check"
+ top_pad="0"
+ width="230" />
+ <check_box
+ enabled="false"
+ height="20"
+ label="See me on the map"
+ layout="topleft"
+ left="20"
+ name="map_check"
+ top_pad="0"
+ width="230" />
+ <check_box
+ enabled="false"
+ height="20"
+ label="Edit, delete or take my objects"
+ layout="topleft"
+ left="20"
+ name="objects_check"
+ top_pad="0"
+ width="230" />
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel
+ follows="bottom"
+ height="30"
layout="topleft"
- name="show_on_map_btn"
- top="0"
- left_pad="5"
- width="85" />
- </panel>
+ left="10"
+ name="notes_buttons_panel"
+ top_pad="5"
+ width="280"
+ auto_resize="false">
+ <button
+ enabled="false"
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Teleport"
+ layout="topleft"
+ left="0"
+ name="teleport_btn"
+ top="0"
+ width="75" />
+ <button
+ enabled="false"
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Map"
+ layout="topleft"
+ name="show_on_map_btn"
+ top="0"
+ left_pad="5"
+ width="85" />
+ </panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index a62d2a5cdb..fce31a2c68 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -102,6 +102,7 @@
left="20"
name="nearby_view_sort_btn"
picture_style="true"
+ tool_tip="Change sort and view of Residents list"
top="7"
width="18" />
</panel>
@@ -195,6 +196,7 @@
left="20"
name="friends_viewsort_btn"
picture_style="true"
+ tool_tip="Change sort and view of Friends list"
top="7"
width="18" />
<button
@@ -207,6 +209,7 @@
left_pad="5"
name="add_btn"
picture_style="true"
+ tool_tip="Offer friendship to a resident"
top_delta="0"
width="18" />
<button
@@ -219,6 +222,7 @@
left_pad="180"
name="del_btn"
picture_style="true"
+ tool_tip="Remove selected person from your Friends list"
top_delta="0"
width="18" />
</panel>
@@ -262,6 +266,7 @@
left="20"
name="gear_btn"
picture_style="true"
+ tool_tip="Change sort and view of Groups list"
top="7"
width="18" />
<button
@@ -274,6 +279,7 @@
left_pad="5"
name="plus_btn"
picture_style="true"
+ tool_tip="Join group/Create new group"
top_delta="0"
width="18" />
<button
@@ -287,6 +293,7 @@
left_pad="24"
name="activate_btn"
picture_style="true"
+ tool_tip="Activate selected group"
top_delta="5"
width="10" />
<button
@@ -299,6 +306,7 @@
left_pad="146"
name="minus_btn"
picture_style="true"
+ tool_tip="Leave selected group"
top_delta="-5"
width="18" />
</panel>
@@ -341,6 +349,7 @@
left="20"
name="recent_viewsort_btn"
picture_style="true"
+ tool_tip="Change sort and view of Residents list"
top="7"
width="18" />
</panel>
@@ -372,6 +381,7 @@
label="Profile"
layout="topleft"
name="view_profile_btn"
+ tool_tip="Show picture, groups, and other residents information"
width="65" />
</layout_panel>
<layout_panel
@@ -391,6 +401,7 @@
label="Add Friend"
layout="topleft"
name="add_friend_btn"
+ tool_tip="Add selected resident to your Friends List"
width="85" />
</layout_panel>
<layout_panel
@@ -408,6 +419,7 @@
label="Group Profile"
layout="topleft"
name="group_info_btn"
+ tool_tip="Show group information"
width="80" />
</layout_panel>
<layout_panel
@@ -426,6 +438,7 @@
label="Chat"
layout="topleft"
name="chat_btn"
+ tool_tip="Open chat session"
width="45" />
</layout_panel>
<layout_panel
@@ -444,6 +457,7 @@
label="IM"
layout="topleft"
name="im_btn"
+ tool_tip="Open instant message session"
width="35" />
</layout_panel>
<layout_panel
@@ -482,6 +496,7 @@
label="Teleport"
layout="topleft"
name="teleport_btn"
+ tool_tip="Offer teleport"
width="65" />
</layout_panel>
<layout_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 b4d2bbb194..c8bde77a94 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -2,7 +2,7 @@
<panel
bevel_style="in"
follows="left|top|right|bottom"
- height="625"
+ height="480"
layout="topleft"
left="0"
name="panel_pick_info"
@@ -16,29 +16,41 @@
left="10"
name="title"
text_color="white"
- top="5"
+ top="16"
value="Pick Info"
width="150" />
<button
follows="top|right"
- height="20"
+ height="25"
image_overlay="BackArrow_Off"
layout="topleft"
name="back_btn"
picture_style="true"
- right="-20"
- top="7"
- width="20" />
+ right="-11"
+ top="16"
+ width="25"
+ tab_stop="false" />
+
+ <scroll_container
+ color="DkGray2"
+ follows="left|top|right|bottom"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="pick_info_scroll"
+ opaque="true"
+ reserve_scroll_corner="true"
+ width="265">
<panel
background_visible="true"
bg_alpha_color="DkGray2"
- follows="left|right|top|bottom"
+ follows="left|right|top"
height="550"
layout="topleft"
left="0"
- min_height="300"
- top="30"
- width="265">
+ min_height="550"
+ top_pad="0"
+ width="263">
<texture_picker
enabled="false"
follows="left|top|right"
@@ -110,7 +122,16 @@
text_color="white"
valign="center"
value="[loading...]" />
+ <icon
+ follows="top|left"
+ height="15"
+ image_name=""
+ layout="topleft"
+ mouse_opaque="true"
+ name="maturity"
+ width="15" />
</panel>
+ </scroll_container>
<panel
follows="left|right|bottom"
height="30"
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 47cfd8e129..ff161cc2ab 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -8,92 +8,105 @@
name="panel_picks"
top="0"
width="285">
- <scroll_container
- color="DkGray2"
- follows="left|top|right|bottom"
- height="350"
+ <layout_stack
+ name="layout"
+ orientation="vertical"
+ follows="all"
layout="topleft"
- left="2"
- name="profile_scroll"
- opaque="true"
+ left="0"
top="0"
- width="284">
- <panel
- height="115"
+ height="420"
+ width="284"
+ border_size="0">
+ <scroll_container
+ color="DkGray2"
+ follows="left|top|right|bottom"
+ height="350"
layout="topleft"
- left="0"
- name="back_panel"
+ left="2"
+ name="profile_scroll"
+ opaque="true"
top="0"
- width="284" />
- </scroll_container>
- <panel
- background_visible="true"
- bevel_style="none"
- enabled="false"
- follows="left|right|bottom"
- height="30"
- label="bottom_panel"
- layout="topleft"
- name="edit_panel"
- top_pad="5"
- width="284">
- <button
+ width="284">
+ <panel
+ height="115"
+ layout="topleft"
+ left="0"
+ name="back_panel"
+ top="0"
+ width="284" />
+ </scroll_container>
+ <panel
+ background_visible="true"
+ bevel_style="none"
enabled="false"
- follows="bottom|left"
- font="SansSerifBigBold"
- height="18"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
- layout="topleft"
- left="10"
- name="gear_menu_btn"
- picture_style="true"
- top="5"
- width="18" />
- <button
- follows="bottom|left"
- font="SansSerifBigBold"
- height="18"
- image_disabled="AddItem_Off"
- image_disabled_selected="AddItem_Press"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
+ auto_resize="false"
+ follows="bottom"
+ height="30"
+ label="bottom_panel"
layout="topleft"
- left="35"
- name="new_btn"
- picture_style="true"
- tool_tip="Create New Pick at Current Location"
- top="5"
- width="18" />
- <button
- follows="bottom|right"
- font="SansSerifBigBold"
- height="18"
- image_disabled="TrashItem_Off"
- image_disabled_selected="TrashItem_Press"
- image_selected="TrashItem_Press"
- image_unselected="TrashItem_Off"
- layout="topleft"
- name="trash_btn"
- picture_style="true"
- right="-10"
- top="5"
- width="18" />
- </panel>
- <panel
- follows="bottom|left"
- height="30"
- layout="topleft"
- name="buttons_cucks"
- width="284">
- <button
- enabled="false"
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="Map"
+ name="edit_panel"
+ top_pad="5"
+ width="284">
+ <button
+ enabled="false"
+ follows="bottom|left"
+ font="SansSerifBigBold"
+ height="18"
+ image_selected="OptionsMenu_Press"
+ image_unselected="OptionsMenu_Off"
+ layout="topleft"
+ left="10"
+ name="gear_menu_btn"
+ picture_style="true"
+ top="5"
+ width="18" />
+ <button
+ follows="bottom|left"
+ font="SansSerifBigBold"
+ height="18"
+ image_disabled="AddItem_Off"
+ image_disabled_selected="AddItem_Press"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ layout="topleft"
+ left="35"
+ name="new_btn"
+ picture_style="true"
+ tool_tip="Create New Pick at Current Location"
+ top="5"
+ width="18" />
+ <button
+ follows="bottom|right"
+ font="SansSerifBigBold"
+ height="18"
+ image_disabled="TrashItem_Off"
+ image_disabled_selected="TrashItem_Press"
+ image_selected="TrashItem_Press"
+ image_unselected="TrashItem_Off"
+ layout="topleft"
+ name="trash_btn"
+ picture_style="true"
+ right="-10"
+ top="5"
+ width="18" />
+ </panel>
+ <panel
+ follows="bottom"
+ height="30"
+ auto_resize="false"
layout="topleft"
- name="show_on_map_btn"
- width="85" />
- </panel>
+ name="buttons_cucks"
+ width="284">
+ <button
+ enabled="false"
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Map"
+ layout="topleft"
+ name="show_on_map_btn"
+ width="85" />
+ </panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
index 6d7cabc5c0..e710774232 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -40,33 +40,53 @@
tab_stop="false"
top="0"
width="25" />
- <tab_container
- follows="left|top|right|bottom"
- height="420"
- layout="topleft"
- left="10"
- name="tabs"
- tab_min_width="75"
- tab_position="top"
- top_pad="15"
- width="285">
- <panel
- class="panel_profile"
- filename="panel_profile.xml"
- label="Profile"
- layout="topleft"
- name="panel_profile" />
- <panel
- class="panel_picks"
- filename="panel_picks.xml"
- label="Picks"
- layout="topleft"
- name="panel_picks" />
- <panel
- class="panel_notes"
- filename="panel_notes.xml"
- label="Notes &amp; Privacy"
+ <layout_stack
+ name="layout_stack"
+ orientation="vertical"
layout="topleft"
- name="panel_notes" />
- </tab_container>
+ follows="all"
+ left="0"
+ top="50"
+ height="500"
+ width="305"
+ border_size="0">
+ <panel
+ name="stack_panel"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ height="500"
+ width="305">
+ <tab_container
+ follows="all"
+ height="500"
+ layout="topleft"
+ left="10"
+ name="tabs"
+ tab_min_width="75"
+ tab_position="top"
+ top="0"
+ width="280">
+ <panel
+ class="panel_profile"
+ filename="panel_profile.xml"
+ label="Profile"
+ layout="topleft"
+ name="panel_profile" />
+ <panel
+ class="panel_picks"
+ filename="panel_picks.xml"
+ label="Picks"
+ layout="topleft"
+ name="panel_picks" />
+ <panel
+ class="panel_notes"
+ filename="panel_notes.xml"
+ label="Notes &amp; Privacy"
+ layout="topleft"
+ name="panel_notes" />
+ </tab_container>
+ </panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
index 445c9cc288..4d91a544c3 100644
--- a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
@@ -15,6 +15,7 @@
name="stand_btn"
tool_tip="Click here to stand up."
top="2"
+ visible="false"
width="115" />
<button
follows="left|bottom"
@@ -24,5 +25,6 @@
name="stop_fly_btn"
tool_tip="Stop Flying"
top="2"
+ visible="false"
width="115" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 3ad5cbe018..f597211ec9 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -197,52 +197,6 @@
top_delta="-3"
visible="false"
width="16" />
- <button
- follows="right|bottom"
- height="16"
- image_disabled="sm_rounded_corners_simple.tga"
- image_disabled_selected="sm_rounded_corners_simple.tga"
- image_hover_selected="sm_rounded_corners_simple.tga"
- image_hover_unselected="sm_rounded_corners_simple.tga"
- image_selected="sm_rounded_corners_simple.tga"
- image_unselected="sm_rounded_corners_simple.tga"
- layout="topleft"
- left_pad="313"
- mouse_opaque="false"
- name="menubar_search_bevel_bg"
- picture_style="true"
- top_delta="0"
- width="94" />
- <line_editor
- bevel_style="none"
- border_style="line"
- commit_on_focus_lost="false"
- follows="right|bottom"
- height="11"
- label="Search"
- layout="topleft"
- left_delta="1"
- name="search_editor"
- tab_group="1"
- tool_tip="Search [SECOND_LIFE]"
- top_delta="4"
- width="78" />
- <button
- follows="right|bottom"
- font="SansSerifSmall"
- height="16"
- image_disabled="status_search_btn.png"
- image_disabled_selected="status_search_btn_pressed.png"
- image_selected="status_search_btn_pressed.png"
- image_unselected="status_search_btn.png"
- layout="topleft"
- left_delta="78"
- name="search_btn"
- picture_style="true"
- scale_image="false"
- tool_tip="Search [SECOND_LIFE]"
- top_delta="-4"
- width="16" />
<text
enabled="false"
follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
index 3c49ce311a..3ac15fe550 100644
--- a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
@@ -54,6 +54,7 @@
name="close_btn"
mouse_opaque="true"
label=""
+ tab_stop="false"
image_unselected="toast_hide_btn.tga"
image_disabled="toast_hide_btn.tga"
image_selected="toast_hide_btn.tga"
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index f7d8cf948e..441caffa28 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -62,6 +62,7 @@
mouse_opaque="true"
name="hide_btn"
label=""
+ tab_stop="false"
image_unselected="toast_hide_btn.tga"
image_disabled="toast_hide_btn.tga"
image_selected="toast_hide_btn.tga"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 655cf2b40f..df328118a2 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -937,6 +937,11 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="tight skirt">tight skirt</string>
<string name="wrinkles">wrinkles</string>
+ <!-- Favorites Bar -->
+ <string name="location_ctrl_add_landmark">Add to My Landmarks</string>
+ <string name="location_ctrl_edit_landmark">Edit My Landmark</string>
+ <string name="favorite_landmark_loading_tooltip">(Loading...)</string>
+
<!-- Strings used by the (currently Linux) auto-updater app -->
<string name="UpdaterWindowTitle">
[SECOND_LIFE_VIEWER] Update
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 b249451247..8f4d0edf95 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -9,6 +9,8 @@
<location_input font="SansSerifSmall"
add_landmark_image_enabled="Favorite_Star_Active"
add_landmark_image_disabled="Favorite_Star_Off"
+ add_landmark_image_hover="Favorite_Star_Over"
+ add_landmark_image_selected="Favorite_Star_Press"
add_landmark_hpad="2"
allow_text_entry="true"
list_position="below"