summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennetts <steve@lindenlab.com>2009-11-03 18:19:45 -0800
committerSteve Bennetts <steve@lindenlab.com>2009-11-03 18:19:45 -0800
commit3e3ef5c53d2e73c0836ef6056d222c4c35b8ac2d (patch)
tree81c0151e33702653fb5533e9e10ca41cc906fa7a
parentce3dfcee3bec1ad782128ea891e21130911c9984 (diff)
parentde2fe92bb9df5f5f64dff79a4e6df35330c15329 (diff)
merge from https://hg.aws.productengine.com/secondlife/viewer-2-0/
-rw-r--r--indra/llui/llfloater.cpp6
-rw-r--r--indra/llui/llfloater.h3
-rw-r--r--indra/llui/llfloaterreg.cpp3
-rw-r--r--indra/newview/CMakeLists.txt4
-rw-r--r--indra/newview/llagentpicksinfo.cpp3
-rw-r--r--indra/newview/llagentui.cpp5
-rw-r--r--indra/newview/llavatarlist.cpp35
-rw-r--r--indra/newview/llavatarlist.h7
-rw-r--r--indra/newview/llchiclet.cpp11
-rw-r--r--indra/newview/llimfloater.cpp7
-rw-r--r--indra/newview/llinventorypanel.cpp13
-rw-r--r--indra/newview/lllandmarkactions.cpp6
-rw-r--r--indra/newview/lllandmarkactions.h2
-rw-r--r--indra/newview/llnavigationbar.cpp7
-rw-r--r--indra/newview/llnavigationbar.h1
-rw-r--r--indra/newview/llnearbychat.cpp37
-rw-r--r--indra/newview/llnearbychat.h7
-rw-r--r--indra/newview/llnearbychatbar.cpp9
-rw-r--r--indra/newview/llnearbychatbar.h2
-rw-r--r--indra/newview/lloutputmonitorctrl.cpp12
-rw-r--r--indra/newview/lloutputmonitorctrl.h3
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp35
-rw-r--r--indra/newview/llpanelimcontrolpanel.h3
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp437
-rw-r--r--indra/newview/llpanellandmarkinfo.h85
-rw-r--r--indra/newview/llpanellandmarks.cpp31
-rw-r--r--indra/newview/llpanelpeople.cpp67
-rw-r--r--indra/newview/llpanelpeople.h6
-rw-r--r--indra/newview/llpanelplaceinfo.cpp931
-rw-r--r--indra/newview/llpanelplaceinfo.h146
-rw-r--r--indra/newview/llpanelplaceprofile.cpp541
-rw-r--r--indra/newview/llpanelplaceprofile.h114
-rw-r--r--indra/newview/llpanelplaces.cpp227
-rw-r--r--indra/newview/llpanelplaces.h11
-rw-r--r--indra/newview/llpanelprofileview.h14
-rw-r--r--indra/newview/llparticipantlist.cpp110
-rw-r--r--indra/newview/llparticipantlist.h58
-rw-r--r--indra/newview/llviewermessage.cpp6
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml22
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml27
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmark_info.xml257
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml979
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml18
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml10
52 files changed, 3109 insertions, 1236 deletions
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 8c72b079ee..99aebbcb30 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -772,6 +772,12 @@ LLMultiFloater* LLFloater::getHost()
return (LLMultiFloater*)mHostHandle.get();
}
+void LLFloater::applySavedVariables()
+{
+ applyRectControl();
+ applyDockState();
+}
+
void LLFloater::applyRectControl()
{
if (mRectControl.size() > 1)
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index ef0d06a58e..95c8dd84f6 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -280,6 +280,9 @@ public:
protected:
void setRectControl(const std::string& rectname) { mRectControl = rectname; };
+
+ virtual void applySavedVariables();
+
void applyRectControl();
void applyDockState();
void storeRectControl();
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index aca4dc56ee..f8e07913fb 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -134,8 +134,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
// Note: key should eventually be a non optional LLFloater arg; for now, set mKey to be safe
res->mKey = key;
res->setInstanceName(name);
- res->applyRectControl(); // Can't apply rect control until setting instance name
- res->applyDockState();//same...
+ res->applySavedVariables(); // Can't apply rect and dock state until setting instance name
if (res->mAutoTile && !res->getHost() && index > 0)
{
const LLRect& cur_rect = res->getRect();
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index a3d09403cb..643f89068f 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -316,6 +316,7 @@ set(viewer_SOURCE_FILES
llpanelimcontrolpanel.cpp
llpanelland.cpp
llpanellandaudio.cpp
+ llpanellandmarkinfo.cpp
llpanellandmarks.cpp
llpanellandmedia.cpp
llpanellogin.cpp
@@ -336,6 +337,7 @@ set(viewer_SOURCE_FILES
llpanelpicks.cpp
llpanelplace.cpp
llpanelplaceinfo.cpp
+ llpanelplaceprofile.cpp
llpanelplaces.cpp
llpanelplacestab.cpp
llpanelprimmediacontrols.cpp
@@ -800,6 +802,7 @@ set(viewer_HEADER_FILES
llpanelimcontrolpanel.h
llpanelland.h
llpanellandaudio.h
+ llpanellandmarkinfo.h
llpanellandmarks.h
llpanellandmedia.h
llpanellogin.h
@@ -820,6 +823,7 @@ set(viewer_HEADER_FILES
llpanelpicks.h
llpanelplace.h
llpanelplaceinfo.h
+ llpanelplaceprofile.h
llpanelplaces.h
llpanelplacestab.h
llpanelprimmediacontrols.h
diff --git a/indra/newview/llagentpicksinfo.cpp b/indra/newview/llagentpicksinfo.cpp
index 6e5835bace..3c8d0dac42 100644
--- a/indra/newview/llagentpicksinfo.cpp
+++ b/indra/newview/llagentpicksinfo.cpp
@@ -47,7 +47,8 @@ public:
~LLAgentPicksObserver()
{
- LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this);
+ if (LLAvatarPropertiesProcessor::instanceExists())
+ LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this);
}
void sendAgentPicksRequest()
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index 09f7c49f23..2911a35581 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -92,7 +92,10 @@ std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/)
//static
BOOL LLAgentUI::checkAgentDistance(const LLVector3& pole, F32 radius)
{
- return (gAgent.getPositionAgent() - pole).length() < radius;
+ F32 delta_x = gAgent.getPositionAgent().mV[VX] - pole.mV[VX];
+ F32 delta_y = gAgent.getPositionAgent().mV[VY] - pole.mV[VY];
+
+ return sqrt( delta_x* delta_x + delta_y* delta_y ) < radius;
}
BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const LLVector3& agent_pos_region)
{
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 7b2dc02864..8609ba8b1c 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -239,11 +239,46 @@ void LLAvatarList::refresh()
bool dirty = add_limit_exceeded || (have_filter && !have_names);
setDirty(dirty);
+ // Refreshed all items, lets send refresh_complete signal.
+ if(!dirty)
+ {
+ std::vector<LLSD> cur_values;
+ getValues(cur_values);
+ mRefreshCompleteSignal(this, LLSD((S32)cur_values.size()));
+ }
+
// Commit if we've added/removed items.
if (modified)
onCommit();
}
+bool LLAvatarList::filterHasMatches()
+{
+ uuid_vector_t values = getIDs();
+
+ for (uuid_vector_t::const_iterator it=values.begin(); it != values.end(); it++)
+ {
+ std::string name;
+ const LLUUID& buddy_id = *it;
+ BOOL have_name = gCacheName->getFullName(buddy_id, name);
+
+ // If name has not been loaded yet we consider it as a match.
+ // When the name will be loaded the filter will be applied again(in refresh()).
+
+ if (have_name && !findInsensitive(name, mNameFilter))
+ {
+ continue;
+ }
+
+ return true;
+ }
+ return false;
+}
+
+boost::signals2::connection LLAvatarList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb)
+{
+ return mRefreshCompleteSignal.connect(cb);
+}
void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
{
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 51d3760d39..195d9e5b55 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -82,6 +82,11 @@ public:
const std::string getIconParamName() const{return mIconParamName;}
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ // Return true if filter has at least one match.
+ bool filterHasMatches();
+
+ boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb);
+
protected:
void refresh();
@@ -107,6 +112,8 @@ private:
uuid_vector_t mIDs;
LLAvatarListItem::ContextMenu* mContextMenu;
+
+ commit_signal_t mRefreshCompleteSignal;
};
/** Abstract comparator for avatar items */
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 21514b17d9..b9e8c5394d 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -830,13 +830,21 @@ LLChicletPanel::~LLChicletPanel()
void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
LLUUID session_id = data["session_id"].asUUID();
+ S32 unread = data["num_unread"].asInteger();
+
+ LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ if (im_floater && im_floater->getVisible())
+ {
+ unread = 0;
+ }
+
std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id);
std::list<LLChiclet *>::iterator iter;
for (iter = chiclets.begin(); iter != chiclets.end(); iter++) {
LLChiclet* chiclet = *iter;
if (chiclet != NULL)
{
- chiclet->setCounter(data["num_unread"].asInteger());
+ chiclet->setCounter(unread);
}
else
{
@@ -1313,6 +1321,7 @@ LLTalkButton::LLTalkButton(const Params& p)
// never show "muted" because you can't mute yourself
mOutputMonitor->setIsMuted(false);
+ mOutputMonitor->setIsAgentControl(true);
}
LLTalkButton::~LLTalkButton()
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index dee86f4a22..19fa66fd0e 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -106,6 +106,8 @@ void LLIMFloater::onFocusReceived()
// virtual
void LLIMFloater::onClose(bool app_quitting)
{
+ if (!gIMMgr->hasSession(mSessionID)) return;
+
setTyping(false);
gIMMgr->leaveSession(mSessionID);
}
@@ -234,7 +236,10 @@ BOOL LLIMFloater::postBuild()
mChatHistory = getChild<LLChatHistory>("chat_history");
- setTitle(LLIMModel::instance().getName(mSessionID));
+ std::string session_name(LLIMModel::instance().getName(mSessionID));
+ LLStringUtil::toUpper(session_name);
+ setTitle(session_name);
+
setDocked(true);
mTypingStart = LLTrans::getString("IM_typing_start_string");
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index f8ee345836..178e7d0823 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -383,6 +383,19 @@ void LLInventoryPanel::modelChanged(U32 mask)
view_item->getParentFolder()->extractItem(view_item);
view_item->addToFolder(new_parent, mFolders);
}
+/*
+ on the other side in case Inventory Panel has content of the any folder
+ it is possible that item moved to some folder which is absent in current
+ Panel. For ex. removing item (via moving to trash).
+ In this case we need to check if new parent is other then inventory start folder
+ and simply remove its View from the hierarchy.
+ See details in EXT-2098.
+*/
+ // So, let check if item was moved into folder out of this Inventory Panel.
+ else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
+ {
+ view_item->getParentFolder()->extractItem(view_item);
+ }
}
}
else
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index 2f909928ed..b1829b3945 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -135,13 +135,13 @@ public:
// Returns true if the given inventory item is a landmark pointing to the current parcel.
// Used to find out if there is at least one landmark from current parcel.
-class LLFistAgentParcelLandmark : public LLInventoryCollectFunctor
+class LLFirstAgentParcelLandmark : public LLInventoryCollectFunctor
{
private:
bool mFounded;// to avoid unnecessary check
public:
- LLFistAgentParcelLandmark(): mFounded(false){}
+ LLFirstAgentParcelLandmark(): mFounded(false){}
/*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
@@ -200,7 +200,7 @@ bool LLLandmarkActions::landmarkAlreadyExists()
//static
bool LLLandmarkActions::hasParcelLandmark()
{
- LLFistAgentParcelLandmark get_first_agent_landmark;
+ LLFirstAgentParcelLandmark get_first_agent_landmark;
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
fetch_landmarks(cats, items, get_first_agent_landmark);
diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h
index 312426cab0..1c524c820c 100644
--- a/indra/newview/lllandmarkactions.h
+++ b/indra/newview/lllandmarkactions.h
@@ -55,7 +55,7 @@ public:
static bool landmarkAlreadyExists();
/**
- * @brief Checks whether landmark exists for current parcel.
+ * @brief Checks whether landmark exists for current agent parcel.
*/
static bool hasParcelLandmark();
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index e63daac4af..b35fd6134b 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -50,6 +50,7 @@
#include "llslurl.h"
#include "llurlsimstring.h"
#include "llviewerinventory.h"
+#include "llviewermenu.h"
#include "llviewerparcelmgr.h"
#include "llworldmap.h"
#include "llappviewer.h"
@@ -271,6 +272,12 @@ void LLNavigationBar::draw()
LLPanel::draw();
}
+BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ show_navbar_context_menu(this,x,y);
+ return TRUE;
+}
+
void LLNavigationBar::onBackButtonClicked()
{
LLTeleportHistory::getInstance()->goBack();
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 04707d8d48..52f5a827e4 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -54,6 +54,7 @@ public:
virtual ~LLNavigationBar();
/*virtual*/ void draw();
+ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL postBuild();
void handleLoginComplete();
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 12638ab855..81d033d7f9 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -97,14 +97,39 @@ BOOL LLNearbyChat::postBuild()
if (getDockControl() == NULL)
{
setDockControl(new LLDockControl(
- LLBottomTray::getInstance()->getNearbyChatBar(), this,
- getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
+ LLBottomTray::getInstance()->getNearbyChatBar(), this,
+ getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
}
return true;
}
+void LLNearbyChat::applySavedVariables()
+{
+
+ if (mRectControl.size() > 1)
+ {
+ const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl);
+ reshape(rect.getWidth(), rect.getHeight());
+ setRect(rect);
+ }
+
+
+ if(!LLUI::sSettingGroups["floater"]->controlExists(mDocStateControl))
+ {
+ setDocked(true);
+ }
+ else
+ {
+ if (mDocStateControl.size() > 1)
+ {
+ bool dockState = LLUI::sSettingGroups["floater"]->getBOOL(mDocStateControl);
+ setDocked(dockState);
+ }
+ }
+}
+
LLColor4 nearbychat_get_text_color(const LLChat& chat)
{
LLColor4 text_color;
@@ -265,11 +290,5 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRect();
}
-void LLNearbyChat::setVisible (BOOL visible)
-{
- LLDockableFloater::setVisible(visible);
-}
-void LLNearbyChat::toggleWindow()
-{
-}
+
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 20cbf7537d..cb4654654a 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -52,16 +52,15 @@ public:
void onNearbyChatContextMenuItemClicked(const LLSD& userdata);
bool onNearbyChatCheckContextMenuItem(const LLSD& userdata);
- void setDocked (bool docked, bool pop_on_undock);
- void toggleWindow ();
+ void setDocked (bool docked, bool pop_on_undock = true);
/*virtual*/ void onOpen (const LLSD& key);
- virtual void setVisible (BOOL visible);
-
virtual void setRect (const LLRect &rect);
private:
+ virtual void applySavedVariables();
+
void getAllowedRect (LLRect& rect);
void onNearbySpeakers ();
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 32dc5e5927..d7a5ff289c 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -77,6 +77,10 @@ LLGestureComboBox::LLGestureComboBox(const LLGestureComboBox::Params& p)
// refresh list from current active gestures
refreshGestures();
+
+ // This forces using of halign from xml, since LLComboBox
+ // sets it to LLFontGL::LEFT, if text entry is disabled
+ mButton->setHAlign(p.drop_down_button.font_halign);
}
LLGestureComboBox::~LLGestureComboBox()
@@ -207,6 +211,7 @@ LLNearbyChatBar::LLNearbyChatBar()
: LLPanel()
, mChatBox(NULL)
{
+ mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
}
//virtual
@@ -516,8 +521,8 @@ void LLNearbyChatBar::displaySpeakingIndicator()
LLUUID id;
id.setNull();
- mSpeakerMgr.update(TRUE);
- mSpeakerMgr.getSpeakerList(&speaker_list, FALSE);
+ mSpeakerMgr->update(TRUE);
+ mSpeakerMgr->getSpeakerList(&speaker_list, FALSE);
for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)
{
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index 06204e6367..0307eee7bf 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -127,7 +127,7 @@ protected:
LLLineEditor* mChatBox;
LLTalkButton* mTalkBtn;
LLOutputMonitorCtrl* mOutputMonitor;
- LLActiveSpeakerMgr mSpeakerMgr;
+ LLLocalSpeakerMgr* mSpeakerMgr;
};
#endif
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index 8bac9937f0..39381e3faa 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -80,7 +80,8 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
mImageLevel2(p.image_level_2),
mImageLevel3(p.image_level_3),
mAutoUpdate(p.auto_update),
- mSpeakerId(p.speaker_id)
+ mSpeakerId(p.speaker_id),
+ mIsAgentControl(false)
{
//static LLUIColor output_monitor_muted_color = LLUIColorTable::instance().getColor("OutputMonitorMutedColor", LLColor4::orange);
//static LLUIColor output_monitor_overdriven_color = LLUIColorTable::instance().getColor("OutputMonitorOverdrivenColor", LLColor4::red);
@@ -132,7 +133,14 @@ void LLOutputMonitorCtrl::draw()
if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull())
{
setPower(gVoiceClient->getCurrentPower(mSpeakerId));
- setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId));
+ if(mIsAgentControl)
+ {
+ setIsTalking(gVoiceClient->getUserPTTState());
+ }
+ else
+ {
+ setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId));
+ }
}
LLPointer<LLUIImage> icon;
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 7a7b8bc3a1..85ea552a57 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -81,6 +81,8 @@ public:
// For the current user, need to know the PTT state to show
// correct button image.
+ void setIsAgentControl(bool val) { mIsAgentControl = val; }
+
void setIsTalking(bool val) { mIsTalking = val; }
void setSpeakerId(const LLUUID& speaker_id);
@@ -100,6 +102,7 @@ private:
F32 mPower;
+ bool mIsAgentControl;
bool mIsMuted;
bool mIsTalking;
LLPointer<LLUIImage> mImageMute;
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index b54975b76b..21e88b6d07 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -112,21 +112,32 @@ BOOL LLPanelIMControlPanel::postBuild()
childSetAction("add_friend_btn", boost::bind(&LLPanelIMControlPanel::onAddFriendButtonClicked, this));
childSetAction("share_btn", boost::bind(&LLPanelIMControlPanel::onShareButtonClicked, this));
+ childSetAction("teleport_btn", boost::bind(&LLPanelIMControlPanel::onTeleportButtonClicked, this));
+ childSetAction("pay_btn", boost::bind(&LLPanelIMControlPanel::onPayButtonClicked, this));
childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()));
return LLPanelChatControlPanel::postBuild();
}
+void LLPanelIMControlPanel::onTeleportButtonClicked()
+{
+ LLAvatarActions::offerTeleport(mAvatarID);
+}
+void LLPanelIMControlPanel::onPayButtonClicked()
+{
+ LLAvatarActions::pay(mAvatarID);
+}
+
void LLPanelIMControlPanel::onViewProfileButtonClicked()
{
- LLAvatarActions::showProfile(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId());
+ LLAvatarActions::showProfile(mAvatarID);
}
void LLPanelIMControlPanel::onAddFriendButtonClicked()
{
LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");
std::string full_name = avatar_icon->getFirstName() + " " + avatar_icon->getLastName();
- LLAvatarActions::requestFriendshipDialog(avatar_icon->getAvatarId(), full_name);
+ LLAvatarActions::requestFriendshipDialog(mAvatarID, full_name);
}
void LLPanelIMControlPanel::onShareButtonClicked()
@@ -140,12 +151,12 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
LLIMModel& im_model = LLIMModel::instance();
- LLUUID avatar_id = im_model.getOtherParticipantID(session_id);
+ mAvatarID = im_model.getOtherParticipantID(session_id);
// Disable "Add friend" button for friends.
- childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(avatar_id));
+ childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID));
- getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(avatar_id);
+ getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID);
// Disable profile button if participant is not realy SL avatar
LLIMModel::LLIMSession* im_session =
@@ -188,6 +199,20 @@ void LLPanelGroupControlPanel::onGroupInfoButtonClicked()
LLGroupActions::show(mGroupID);
}
+void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata)
+{
+ // TODO: Check this code when when sort order menu will be added. (EM)
+ if (false && !mParticipantList)
+ return;
+
+ std::string chosen_item = userdata.asString();
+
+ if (chosen_item == "sort_name")
+ {
+ mParticipantList->setSortOrder(LLParticipantList::E_SORT_BY_NAME);
+ }
+
+}
void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id)
{
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index d25f33935a..fa101f4280 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -73,6 +73,8 @@ private:
void onViewProfileButtonClicked();
void onAddFriendButtonClicked();
void onShareButtonClicked();
+ void onTeleportButtonClicked();
+ void onPayButtonClicked();
LLUUID mAvatarID;
};
@@ -97,6 +99,7 @@ protected:
private:
void onGroupInfoButtonClicked();
+ void onSortMenuItemClicked(const LLSD& userdata);
};
class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
new file mode 100644
index 0000000000..1152ca6873
--- /dev/null
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -0,0 +1,437 @@
+/**
+ * @file llpanellandmarkinfo.cpp
+ * @brief Displays landmark info in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-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 "llpanellandmarkinfo.h"
+
+#include "llinventory.h"
+
+#include "llcombobox.h"
+#include "lllineeditor.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+#include "lltrans.h"
+
+#include "llagent.h"
+#include "llagentui.h"
+#include "llinventorymodel.h"
+#include "lllandmarkactions.h"
+#include "llviewerinventory.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+
+//----------------------------------------------------------------------------
+// Aux types and methods
+//----------------------------------------------------------------------------
+
+typedef std::pair<LLUUID, std::string> folder_pair_t;
+
+static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right);
+static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats);
+
+static LLRegisterPanelClassWrapper<LLPanelLandmarkInfo> t_landmark_info("panel_landmark_info");
+
+LLPanelLandmarkInfo::LLPanelLandmarkInfo()
+: LLPanelPlaceInfo()
+{}
+
+// virtual
+LLPanelLandmarkInfo::~LLPanelLandmarkInfo()
+{}
+
+// virtual
+BOOL LLPanelLandmarkInfo::postBuild()
+{
+ LLPanelPlaceInfo::postBuild();
+
+ mOwner = getChild<LLTextBox>("owner");
+ mCreator = getChild<LLTextBox>("creator");
+ mCreated = getChild<LLTextBox>("created");
+
+ mTitleEditor = getChild<LLLineEditor>("title_editor");
+ mNotesEditor = getChild<LLTextEditor>("notes_editor");
+ mFolderCombo = getChild<LLComboBox>("folder_combo");
+
+ return TRUE;
+}
+
+// virtual
+void LLPanelLandmarkInfo::resetLocation()
+{
+ LLPanelPlaceInfo::resetLocation();
+
+ std::string not_available = getString("not_available");
+ mCreator->setText(not_available);
+ mOwner->setText(not_available);
+ mCreated->setText(not_available);
+ mTitleEditor->setText(LLStringUtil::null);
+ mNotesEditor->setText(LLStringUtil::null);
+}
+
+// virtual
+void LLPanelLandmarkInfo::setInfoType(INFO_TYPE type)
+{
+ LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel");
+
+ bool is_info_type_create_landmark = type == CREATE_LANDMARK;
+ bool is_info_type_landmark = type == LANDMARK;
+
+ landmark_info_panel->setVisible(is_info_type_landmark);
+
+ getChild<LLTextBox>("folder_label")->setVisible(is_info_type_create_landmark);
+ mFolderCombo->setVisible(is_info_type_create_landmark);
+
+ switch(type)
+ {
+ case CREATE_LANDMARK:
+ mCurrentTitle = getString("title_create_landmark");
+
+ mTitleEditor->setEnabled(TRUE);
+ mNotesEditor->setEnabled(TRUE);
+ break;
+
+ case LANDMARK:
+ default:
+ mCurrentTitle = getString("title_landmark");
+
+ mTitleEditor->setEnabled(FALSE);
+ mNotesEditor->setEnabled(FALSE);
+ break;
+ }
+
+ populateFoldersList();
+
+ LLPanelPlaceInfo::setInfoType(type);
+}
+
+// virtual
+void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data)
+{
+ LLPanelPlaceInfo::processParcelInfo(parcel_data);
+
+ // HACK: Flag 0x2 == adult region,
+ // Flag 0x1 == mature region, otherwise assume PG
+ std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);
+ if (parcel_data.flags & 0x2)
+ {
+ rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT);
+ }
+ else if (parcel_data.flags & 0x1)
+ {
+ rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);
+ }
+
+ mMaturityRatingText->setValue(rating);
+
+ S32 region_x;
+ S32 region_y;
+ S32 region_z;
+
+ // If the region position is zero, grab position from the global
+ if(mPosRegion.isExactlyZero())
+ {
+ region_x = llround(parcel_data.global_x) % REGION_WIDTH_UNITS;
+ region_y = llround(parcel_data.global_y) % REGION_WIDTH_UNITS;
+ region_z = llround(parcel_data.global_z);
+ }
+ else
+ {
+ region_x = llround(mPosRegion.mV[VX]);
+ region_y = llround(mPosRegion.mV[VY]);
+ region_z = llround(mPosRegion.mV[VZ]);
+ }
+
+ if (mInfoType == CREATE_LANDMARK)
+ {
+ if (parcel_data.name.empty())
+ {
+ mTitleEditor->setText(llformat("%s (%d, %d, %d)",
+ parcel_data.sim_name.c_str(), region_x, region_y, region_z));
+ }
+ else
+ {
+ mTitleEditor->setText(parcel_data.name);
+ }
+
+ std::string desc;
+ LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent());
+ mNotesEditor->setText(desc);
+
+ if (!LLLandmarkActions::landmarkAlreadyExists())
+ {
+ createLandmark(mFolderCombo->getValue().asUUID());
+ }
+ }
+}
+
+void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem)
+{
+ if (!pItem)
+ return;
+
+ if(!gCacheName)
+ return;
+
+ const LLPermissions& perm = pItem->getPermissions();
+
+ //////////////////
+ // CREATOR NAME //
+ //////////////////
+ if (pItem->getCreatorUUID().notNull())
+ {
+ std::string name;
+ LLUUID creator_id = pItem->getCreatorUUID();
+ if (!gCacheName->getFullName(creator_id, name))
+ {
+ gCacheName->get(creator_id, FALSE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mCreator, _2, _3));
+ }
+ mCreator->setText(name);
+ }
+ else
+ {
+ mCreator->setText(getString("unknown"));
+ }
+
+ ////////////////
+ // OWNER NAME //
+ ////////////////
+ if(perm.isOwned())
+ {
+ std::string name;
+ if (perm.isGroupOwned())
+ {
+ LLUUID group_id = perm.getGroup();
+ if (!gCacheName->getGroupName(group_id, name))
+ {
+ gCacheName->get(group_id, TRUE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3));
+ }
+ }
+ else
+ {
+ LLUUID owner_id = perm.getOwner();
+ if (!gCacheName->getFullName(owner_id, name))
+ {
+ gCacheName->get(owner_id, FALSE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3));
+ }
+ }
+ mOwner->setText(name);
+ }
+ else
+ {
+ mOwner->setText(getString("public"));
+ }
+
+ //////////////////
+ // ACQUIRE DATE //
+ //////////////////
+ time_t time_utc = pItem->getCreationDate();
+ if (0 == time_utc)
+ {
+ mCreated->setText(getString("unknown"));
+ }
+ else
+ {
+ std::string timeStr = getString("acquired_date");
+ LLSD substitution;
+ substitution["datetime"] = (S32) time_utc;
+ LLStringUtil::format (timeStr, substitution);
+ mCreated->setText(timeStr);
+ }
+
+ mTitleEditor->setText(pItem->getName());
+ mNotesEditor->setText(pItem->getDescription());
+}
+
+void LLPanelLandmarkInfo::toggleLandmarkEditMode(BOOL enabled)
+{
+ // If switching to edit mode while creating landmark
+ // the "Create Landmark" title remains.
+ if (enabled && mInfoType != CREATE_LANDMARK)
+ {
+ mTitle->setText(getString("title_edit_landmark"));
+ }
+ else
+ {
+ mTitle->setText(mCurrentTitle);
+ }
+
+ if (mNotesEditor->getReadOnly() == (enabled == TRUE))
+ {
+ mTitleEditor->setEnabled(enabled);
+ mNotesEditor->setReadOnly(!enabled);
+ mFolderCombo->setVisible(enabled);
+ getChild<LLTextBox>("folder_label")->setVisible(enabled);
+
+ // HACK: To change the text color in a text editor
+ // when it was enabled/disabled we set the text once again.
+ mNotesEditor->setText(mNotesEditor->getText());
+ }
+}
+
+const std::string& LLPanelLandmarkInfo::getLandmarkTitle() const
+{
+ return mTitleEditor->getText();
+}
+
+const std::string LLPanelLandmarkInfo::getLandmarkNotes() const
+{
+ return mNotesEditor->getText();
+}
+
+const LLUUID LLPanelLandmarkInfo::getLandmarkFolder() const
+{
+ return mFolderCombo->getValue().asUUID();
+}
+
+BOOL LLPanelLandmarkInfo::setLandmarkFolder(const LLUUID& id)
+{
+ return mFolderCombo->setCurrentByID(id);
+}
+
+void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)
+{
+ std::string name = mTitleEditor->getText();
+ std::string desc = mNotesEditor->getText();
+
+ LLStringUtil::trim(name);
+ LLStringUtil::trim(desc);
+
+ // If typed name is empty use the parcel name instead.
+ if (name.empty())
+ {
+ name = mParcelName->getText();
+
+ // If no parcel exists use the region name instead.
+ if (name.empty())
+ {
+ name = mRegionName->getText();
+ }
+ }
+
+ LLStringUtil::replaceChar(desc, '\n', ' ');
+ // If no folder chosen use the "Landmarks" folder.
+ LLLandmarkActions::createLandmarkHere(name, desc,
+ folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK));
+}
+
+// static
+std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCategory* cat)
+{
+ std::string name = cat->getName();
+ LLUUID parent_id;
+
+ // translate category name, if it's right below the root
+ // FIXME: it can throw notification about non existent string in strings.xml
+ if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
+ {
+ LLTrans::findString(name, "InvFolder " + name);
+ }
+
+ // we don't want "My Inventory" to appear in the name
+ while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
+ {
+ cat = gInventory.getCategory(parent_id);
+ name = cat->getName() + "/" + name;
+ }
+
+ return name;
+}
+
+void LLPanelLandmarkInfo::populateFoldersList()
+{
+ // Collect all folders that can contain landmarks.
+ LLInventoryModel::cat_array_t cats;
+ collectLandmarkFolders(cats);
+
+ mFolderCombo->removeall();
+
+ // Put the "Landmarks" folder first in list.
+ LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id);
+ if (!cat)
+ {
+ llwarns << "Cannot find the landmarks folder" << llendl;
+ }
+ std::string cat_full_name = getFullFolderName(cat);
+ mFolderCombo->add(cat_full_name, cat->getUUID());
+
+ typedef std::vector<folder_pair_t> folder_vec_t;
+ folder_vec_t folders;
+ // Sort the folders by their full name.
+ for (S32 i = 0; i < cats.count(); i++)
+ {
+ cat = cats.get(i);
+ cat_full_name = getFullFolderName(cat);
+ folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
+ }
+ sort(folders.begin(), folders.end(), cmp_folders);
+
+ // Finally, populate the combobox.
+ for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++)
+ mFolderCombo->add(it->second, LLSD(it->first));
+}
+
+static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right)
+{
+ return left.second < right.second;
+}
+
+static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats)
+{
+ LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+
+ // Add descendent folders of the "Landmarks" category.
+ LLInventoryModel::item_array_t items; // unused
+ LLIsType is_category(LLAssetType::AT_CATEGORY);
+ gInventory.collectDescendentsIf(
+ landmarks_id,
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_category);
+
+ // Add the "My Favorites" category.
+ LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+ LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
+ if (!favorites_cat)
+ {
+ llwarns << "Cannot find the favorites folder" << llendl;
+ }
+ else
+ {
+ cats.put(favorites_cat);
+ }
+}
diff --git a/indra/newview/llpanellandmarkinfo.h b/indra/newview/llpanellandmarkinfo.h
new file mode 100644
index 0000000000..03377986b3
--- /dev/null
+++ b/indra/newview/llpanellandmarkinfo.h
@@ -0,0 +1,85 @@
+/**
+ * @file llpanellandmarkinfo.h
+ * @brief Displays landmark info in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-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 LL_LLPANELLANDMARKINFO_H
+#define LL_LLPANELLANDMARKINFO_H
+
+#include "llpanelplaceinfo.h"
+
+class LLComboBox;
+class LLLineEditor;
+class LLTextEditor;
+
+class LLPanelLandmarkInfo : public LLPanelPlaceInfo
+{
+public:
+ LLPanelLandmarkInfo();
+ /*virtual*/ ~LLPanelLandmarkInfo();
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void resetLocation();
+
+ /*virtual*/ void setInfoType(INFO_TYPE type);
+
+ /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+
+ // Displays landmark owner, creator and creation date info.
+ void displayItemInfo(const LLInventoryItem* pItem);
+
+ void toggleLandmarkEditMode(BOOL enabled);
+
+ const std::string& getLandmarkTitle() const;
+ const std::string getLandmarkNotes() const;
+ const LLUUID getLandmarkFolder() const;
+
+ // Select current landmark folder in combobox.
+ BOOL setLandmarkFolder(const LLUUID& id);
+
+ // Create a landmark for the current location
+ // in a folder specified by folder_id.
+ void createLandmark(const LLUUID& folder_id);
+
+ static std::string getFullFolderName(const LLViewerInventoryCategory* cat);
+
+private:
+ void populateFoldersList();
+
+ LLTextBox* mOwner;
+ LLTextBox* mCreator;
+ LLTextBox* mCreated;
+ LLLineEditor* mTitleEditor;
+ LLTextEditor* mNotesEditor;
+ LLComboBox* mFolderCombo;
+};
+
+#endif // LL_LLPANELLANDMARKINFO_H
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index de7d16c4f1..6d6fd38cce 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -553,14 +553,16 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
std::string command_name = userdata.asString();
if("add_landmark" == command_name)
{
- if(LLLandmarkActions::landmarkAlreadyExists())
+ LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos();
+ if(landmark)
+ {
+ LLSideTray::getInstance()->showPanel("panel_places",
+ LLSD().insert("type", "landmark").insert("id",landmark->getUUID()));
+ }
+ else
{
- std::string location;
- LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_FULL);
- llwarns<<" Landmark already exists at location: "<< location<<llendl;
- return;
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
}
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
}
else if ("category" == command_name)
{
@@ -616,19 +618,21 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const
void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)
{
- if(!mCurrentSelectedList) return;
-
- LLFolderView* root_folder = mCurrentSelectedList->getRootFolder();
+ LLFolderView* landmarks_folder = mLandmarksInventoryPanel->getRootFolder();
+ LLFolderView* fav_folder = mFavoritesInventoryPanel->getRootFolder();
std::string command_name = userdata.asString();
if ("expand_all" == command_name)
{
- root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
- root_folder->arrangeAll();
+ landmarks_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
+ fav_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
+ landmarks_folder->arrangeAll();
+ fav_folder->arrangeAll();
}
else if ("collapse_all" == command_name)
{
- root_folder->closeAllFolders();
+ landmarks_folder->closeAllFolders();
+ fav_folder->closeAllFolders();
}
else if ( "sort_by_date" == command_name)
{
@@ -639,6 +643,9 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)
}
else
{
+ if(!mCurrentSelectedList) return;
+
+ LLFolderView* root_folder = mCurrentSelectedList->getRootFolder();
root_folder->doToSelected(&gInventory, userdata);
}
}
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 4580eeb336..2f8fae0f5d 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -42,6 +42,7 @@
#include "llpanelpeople.h"
// newview
+#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llagent.h"
#include "llavataractions.h"
@@ -516,6 +517,9 @@ BOOL LLPanelPeople::postBuild()
// call this method in case some list is empty and buttons can be in inconsistent state
updateButtons();
+ mOnlineFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2));
+ mAllFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2));
+
return TRUE;
}
@@ -560,6 +564,8 @@ void LLPanelPeople::updateFriendList()
mOnlineFriendList->setDirty();
mAllFriendList->setDirty();
+
+ showFriendsAccordionsIfNeeded();
}
void LLPanelPeople::updateNearbyList()
@@ -797,14 +803,15 @@ void LLPanelPeople::reSelectedCurrentTab()
void LLPanelPeople::onFilterEdit(const std::string& search_string)
{
- if (mFilterSubString == search_string)
- return;
+ std::string search_upper = search_string;
+ // Searches are case-insensitive
+ LLStringUtil::toUpper(search_upper);
+ LLStringUtil::trimHead(search_upper);
- mFilterSubString = search_string;
+ if (mFilterSubString == search_upper)
+ return;
- // Searches are case-insensitive
- LLStringUtil::toUpper(mFilterSubString);
- LLStringUtil::trimHead(mFilterSubString);
+ mFilterSubString = search_upper;
// Apply new filter.
mNearbyList->setNameFilter(mFilterSubString);
@@ -812,6 +819,8 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
mAllFriendList->setNameFilter(mFilterSubString);
mRecentList->setNameFilter(mFilterSubString);
mGroupList->setNameFilter(mFilterSubString);
+
+ showFriendsAccordionsIfNeeded();
}
void LLPanelPeople::onTabSelected(const LLSD& param)
@@ -1124,3 +1133,49 @@ void LLPanelPeople::onOpen(const LLSD& key)
else
reSelectedCurrentTab();
}
+
+void LLPanelPeople::showAccordion(const std::string name, bool show)
+{
+ if(name.empty())
+ {
+ llwarns << "No name provided" << llendl;
+ return;
+ }
+
+ LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name);
+ tab->setVisible(show);
+ if(show)
+ {
+ // expand accordion
+ tab->changeOpenClose(false);
+ }
+}
+
+void LLPanelPeople::showFriendsAccordionsIfNeeded()
+{
+ if(FRIENDS_TAB_NAME == getActiveTabName())
+ {
+ // Expand and show accordions if needed, else - hide them
+ showAccordion("tab_online", mOnlineFriendList->filterHasMatches());
+ showAccordion("tab_all", mAllFriendList->filterHasMatches());
+
+ // Rearrange accordions
+ LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
+ accordion->arrange();
+ }
+}
+
+void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param)
+{
+ if(ctrl == mOnlineFriendList)
+ {
+ showAccordion("tab_online", param.asInteger());
+ }
+ else if(ctrl == mAllFriendList)
+ {
+ showAccordion("tab_all", param.asInteger());
+ }
+
+ LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
+ accordion->arrange();
+}
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index dc0aaeb70f..9bf9befe90 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -124,6 +124,12 @@ private:
void onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list);
+ void showAccordion(const std::string name, bool show);
+
+ void showFriendsAccordionsIfNeeded();
+
+ void onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param);
+
LLFilterEditor* mFilterEditor;
LLTabContainer* mTabContainer;
LLAvatarList* mOnlineFriendList;
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 3fcc5d9325..2c5f4b5afa 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -1,6 +1,6 @@
/**
* @file llpanelplaceinfo.cpp
- * @brief Displays place information in Side Tray.
+ * @brief Base class for place information in Side Tray.
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
@@ -39,66 +39,34 @@
#include "llsecondlifeurls.h"
#include "llinventory.h"
-#include "llparcel.h"
-#include "llqueryflags.h"
+#include "llsdutil_math.h"
-#include "llbutton.h"
-#include "llcombobox.h"
-#include "lliconctrl.h"
#include "llscrollcontainer.h"
#include "lltextbox.h"
-#include "lltrans.h"
-#include "llaccordionctrl.h"
-#include "llaccordionctrltab.h"
#include "llagent.h"
-#include "llagentui.h"
-#include "llappviewer.h"
#include "llavatarpropertiesprocessor.h"
-#include "llcallbacklist.h"
#include "llexpandabletextbox.h"
#include "llfloaterworldmap.h"
-#include "llfloaterbuycurrency.h"
#include "llinventorymodel.h"
-#include "lllandmarkactions.h"
#include "llpanelpick.h"
#include "lltexturectrl.h"
-#include "llstatusbar.h"
#include "llviewerinventory.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
-#include "llviewercontrol.h"
#include "llviewertexteditor.h"
#include "llworldmap.h"
-#include "llsdutil_math.h"
-
-//----------------------------------------------------------------------------
-// Aux types and methods
-//----------------------------------------------------------------------------
-
-typedef std::pair<LLUUID, std::string> folder_pair_t;
-
-static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right);
-static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats);
-
-static LLRegisterPanelClassWrapper<LLPanelPlaceInfo> t_place_info("panel_place_info");
LLPanelPlaceInfo::LLPanelPlaceInfo()
: LLPanel(),
mParcelID(),
mRequestedID(),
mPosRegion(),
- mLandmarkID(),
- mMinHeight(0),
- mScrollingPanel(NULL),
- mInfoPanel(NULL),
- mMediaPanel(NULL),
- mForSalePanel(NULL),
- mYouAreHerePanel(NULL),
- mSelectedParcelID(-1)
+ mMinHeight(0)
{}
+//virtual
LLPanelPlaceInfo::~LLPanelPlaceInfo()
{
if (mParcelID.notNull())
@@ -107,220 +75,41 @@ LLPanelPlaceInfo::~LLPanelPlaceInfo()
}
}
+//virtual
BOOL LLPanelPlaceInfo::postBuild()
{
- mTitle = getChild<LLTextBox>("panel_title");
+ mTitle = getChild<LLTextBox>("title");
mCurrentTitle = mTitle->getText();
- mForSalePanel = getChild<LLPanel>("for_sale_panel");
- mYouAreHerePanel = getChild<LLPanel>("here_panel");
- gIdleCallbacks.addFunction(&LLPanelPlaceInfo::updateYouAreHereBanner, this);
-
- //Icon value should contain sale price of last selected parcel.
- mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")->
- setMouseDownCallback(boost::bind(&LLPanelPlaceInfo::onForSaleBannerClick, this));
-
mSnapshotCtrl = getChild<LLTextureCtrl>("logo");
mRegionName = getChild<LLTextBox>("region_title");
mParcelName = getChild<LLTextBox>("parcel_title");
mDescEditor = getChild<LLExpandableTextBox>("description");
mMaturityRatingText = getChild<LLTextBox>("maturity_value");
- mParcelOwner = getChild<LLTextBox>("owner_value");
- mLastVisited = getChild<LLTextBox>("last_visited_value");
-
- mRatingText = getChild<LLTextBox>("rating_value");
- mVoiceText = getChild<LLTextBox>("voice_value");
- mFlyText = getChild<LLTextBox>("fly_value");
- mPushText = getChild<LLTextBox>("push_value");
- mBuildText = getChild<LLTextBox>("build_value");
- mScriptsText = getChild<LLTextBox>("scripts_value");
- mDamageText = getChild<LLTextBox>("damage_value");
-
- mRegionNameText = getChild<LLTextBox>("region_name");
- mRegionTypeText = getChild<LLTextBox>("region_type");
- mRegionRatingText = getChild<LLTextBox>("region_rating");
- mRegionOwnerText = getChild<LLTextBox>("region_owner");
- mRegionGroupText = getChild<LLTextBox>("region_group");
-
- mEstateNameText = getChild<LLTextBox>("estate_name");
- mEstateRatingText = getChild<LLTextBox>("estate_rating");
- mEstateOwnerText = getChild<LLTextBox>("estate_owner");
- mCovenantText = getChild<LLTextEditor>("covenant");
-
- mSalesPriceText = getChild<LLTextBox>("sales_price");
- mAreaText = getChild<LLTextBox>("area");
- mTrafficText = getChild<LLTextBox>("traffic");
- mPrimitivesText = getChild<LLTextBox>("primitives");
- mParcelScriptsText = getChild<LLTextBox>("parcel_scripts");
- mTerraformLimitsText = getChild<LLTextBox>("terraform_limits");
- mSubdivideText = getChild<LLTextEditor>("subdivide");
- mResaleText = getChild<LLTextEditor>("resale");
- mSaleToText = getChild<LLTextBox>("sale_to");
- mOwner = getChild<LLTextBox>("owner");
- mCreator = getChild<LLTextBox>("creator");
- mCreated = getChild<LLTextBox>("created");
-
- mTitleEditor = getChild<LLLineEditor>("title_editor");
- mNotesEditor = getChild<LLTextEditor>("notes_editor");
- mFolderCombo = getChild<LLComboBox>("folder_combo");
-
- LLScrollContainer* scroll_container = getChild<LLScrollContainer>("scroll_container");
+ LLScrollContainer* scroll_container = getChild<LLScrollContainer>("place_scroll");
scroll_container->setBorderVisible(FALSE);
mMinHeight = scroll_container->getScrolledViewRect().getHeight();
- mScrollingPanel = getChild<LLPanel>("scrolling_panel");
- mInfoPanel = getChild<LLPanel>("info_panel");
- mMediaPanel = getChild<LLMediaPanel>("media_panel");
- if (!mMediaPanel)
- return FALSE;
-
return TRUE;
}
-void LLPanelPlaceInfo::displayItemInfo(const LLInventoryItem* pItem)
-{
- if (!pItem)
- return;
-
- mLandmarkID = pItem->getUUID();
-
- if(!gCacheName)
- return;
-
- const LLPermissions& perm = pItem->getPermissions();
-
- //////////////////
- // CREATOR NAME //
- //////////////////
- if (pItem->getCreatorUUID().notNull())
- {
- std::string name;
- LLUUID creator_id = pItem->getCreatorUUID();
- if (!gCacheName->getFullName(creator_id, name))
- {
- gCacheName->get(creator_id, FALSE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mCreator, _2, _3));
- }
- mCreator->setText(name);
- }
- else
- {
- mCreator->setText(getString("unknown"));
- }
-
- ////////////////
- // OWNER NAME //
- ////////////////
- if(perm.isOwned())
- {
- std::string name;
- if (perm.isGroupOwned())
- {
- LLUUID group_id = perm.getGroup();
- if (!gCacheName->getGroupName(group_id, name))
- {
- gCacheName->get(group_id, TRUE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3));
- }
- }
- else
- {
- LLUUID owner_id = perm.getOwner();
- if (!gCacheName->getFullName(owner_id, name))
- {
- gCacheName->get(owner_id, FALSE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3));
- }
- }
- mOwner->setText(name);
- }
- else
- {
- mOwner->setText(getString("public"));
- }
-
- //////////////////
- // ACQUIRE DATE //
- //////////////////
- time_t time_utc = pItem->getCreationDate();
- if (0 == time_utc)
- {
- mCreated->setText(getString("unknown"));
- }
- else
- {
- std::string timeStr = getString("acquired_date");
- LLSD substitution;
- substitution["datetime"] = (S32) time_utc;
- LLStringUtil::format (timeStr, substitution);
- mCreated->setText(timeStr);
- }
-
- mTitleEditor->setText(pItem->getName());
- mNotesEditor->setText(pItem->getDescription());
-}
-
-void LLPanelPlaceInfo::nameUpdatedCallback(
- LLTextBox* text,
- const std::string& first,
- const std::string& last)
-{
- text->setText(first + " " + last);
-}
-
+//virtual
void LLPanelPlaceInfo::resetLocation()
{
mParcelID.setNull();
mRequestedID.setNull();
- mLandmarkID.setNull();
mPosRegion.clearVec();
- mForSalePanel->setVisible(FALSE);
- mYouAreHerePanel->setVisible(FALSE);
+
std::string not_available = getString("not_available");
mMaturityRatingText->setValue(not_available);
- mParcelOwner->setValue(not_available);
- mLastVisited->setValue(not_available);
mRegionName->setText(not_available);
mParcelName->setText(not_available);
mDescEditor->setText(not_available);
- mCreator->setText(not_available);
- mOwner->setText(not_available);
- mCreated->setText(not_available);
- mTitleEditor->setText(LLStringUtil::null);
- mNotesEditor->setText(LLStringUtil::null);
+
mSnapshotCtrl->setImageAssetID(LLUUID::null);
mSnapshotCtrl->setFallbackImageName("default_land_picture.j2c");
-
- mRatingText->setText(not_available);
- mVoiceText->setText(not_available);
- mFlyText->setText(not_available);
- mPushText->setText(not_available);
- mBuildText->setText(not_available);
- mParcelScriptsText->setText(not_available);
- mDamageText->setText(not_available);
-
- mRegionNameText->setValue(not_available);
- mRegionTypeText->setValue(not_available);
- mRegionRatingText->setValue(not_available);
- mRegionOwnerText->setValue(not_available);
- mRegionGroupText->setValue(not_available);
-
- mEstateNameText->setValue(not_available);
- mEstateRatingText->setValue(not_available);
- mEstateOwnerText->setValue(not_available);
- mCovenantText->setValue(not_available);
-
- mSalesPriceText->setValue(not_available);
- mAreaText->setValue(not_available);
- mTrafficText->setValue(not_available);
- mPrimitivesText->setValue(not_available);
- mParcelScriptsText->setValue(not_available);
- mTerraformLimitsText->setValue(not_available);
- mSubdivideText->setValue(not_available);
- mResaleText->setValue(not_available);
- mSaleToText->setValue(not_available);
}
//virtual
@@ -330,108 +119,55 @@ void LLPanelPlaceInfo::setParcelID(const LLUUID& parcel_id)
sendParcelInfoRequest();
}
+//virtual
void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)
{
- LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel");
- LLPanel* landmark_edit_panel = getChild<LLPanel>("landmark_edit_panel");
-
- bool is_info_type_agent = type == AGENT;
- bool is_info_type_create_landmark = type == CREATE_LANDMARK;
- bool is_info_type_landmark = type == LANDMARK;
- bool is_info_type_teleport_history = type == TELEPORT_HISTORY;
-
- getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent);
- mMaturityRatingText->setVisible(!is_info_type_agent);
-
- getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent);
- mParcelOwner->setVisible(is_info_type_agent);
-
- getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history);
- mLastVisited->setVisible(is_info_type_teleport_history);
-
- landmark_info_panel->setVisible(is_info_type_landmark);
- landmark_edit_panel->setVisible(is_info_type_landmark || is_info_type_create_landmark);
-
- getChild<LLTextBox>("folder_lable")->setVisible(is_info_type_create_landmark);
- mFolderCombo->setVisible(is_info_type_create_landmark);
-
- getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent);
-
- switch(type)
- {
- case CREATE_LANDMARK:
- mCurrentTitle = getString("title_create_landmark");
-
- mTitleEditor->setEnabled(TRUE);
- mNotesEditor->setEnabled(TRUE);
-
- populateFoldersList();
- break;
-
- case AGENT:
- case PLACE:
- mCurrentTitle = getString("title_place");
-
- if (!isMediaPanelVisible())
- {
- mTitle->setText(mCurrentTitle);
- }
- break;
-
- case LANDMARK:
- mCurrentTitle = getString("title_landmark");
-
- mTitleEditor->setEnabled(FALSE);
- mNotesEditor->setEnabled(FALSE);
-
- populateFoldersList();
- break;
-
- case TELEPORT_HISTORY:
- mCurrentTitle = getString("title_teleport_history");
- break;
- }
-
- if (type != AGENT)
- toggleMediaPanel(FALSE);
+ mTitle->setText(mCurrentTitle);
mInfoType = type;
}
-BOOL LLPanelPlaceInfo::isMediaPanelVisible()
+void LLPanelPlaceInfo::sendParcelInfoRequest()
{
- if (!mMediaPanel)
- return FALSE;
+ if (mParcelID != mRequestedID)
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this);
+ LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID);
- return mMediaPanel->getVisible();
+ mRequestedID = mParcelID;
+ }
}
-void LLPanelPlaceInfo::toggleMediaPanel(BOOL visible)
+void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
+ const LLVector3d& pos_global)
{
- if (!mMediaPanel)
- return;
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ return;
+
+ mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
+ (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
+ (F32)pos_global.mdV[VZ]);
- if (visible)
+ LLSD body;
+ std::string url = region->getCapability("RemoteParcelRequest");
+ if (!url.empty())
{
- mTitle->setText(getString("title_media"));
+ body["location"] = ll_sd_from_vector3(mPosRegion);
+ if (!region_id.isNull())
+ {
+ body["region_id"] = region_id;
+ }
+ if (!pos_global.isExactlyZero())
+ {
+ U64 region_handle = to_region_handle(pos_global);
+ body["region_handle"] = ll_sd_from_U64(region_handle);
+ }
+ LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
}
else
{
- mTitle->setText(mCurrentTitle);
- }
-
- mInfoPanel->setVisible(!visible);
- mMediaPanel->setVisible(visible);
-}
-
-void LLPanelPlaceInfo::sendParcelInfoRequest()
-{
- if (mParcelID != mRequestedID)
- {
- LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this);
- LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID);
-
- mRequestedID = mParcelID;
+ mDescEditor->setText(getString("server_update_text"));
}
}
@@ -473,27 +209,6 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
mDescEditor->setText(parcel_data.desc);
}
- // HACK: Flag 0x2 == adult region,
- // Flag 0x1 == mature region, otherwise assume PG
- std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);
- if (parcel_data.flags & 0x2)
- {
- rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT);
- }
- else if (parcel_data.flags & 0x1)
- {
- rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);
- }
-
- mMaturityRatingText->setValue(rating);
- mRatingText->setValue(rating);
-
- //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 is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) &&
- mInfoType == AGENT ? TRUE : FALSE;
- mForSalePanel->setVisible(is_for_sale);
-
S32 region_x;
S32 region_y;
S32 region_z;
@@ -521,408 +236,25 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
{
mParcelName->setText(getString("not_available"));
}
-
- if (mInfoType == CREATE_LANDMARK)
- {
- if (parcel_data.name.empty())
- {
- mTitleEditor->setText(llformat("%s (%d, %d, %d)",
- parcel_data.sim_name.c_str(), region_x, region_y, region_z));
- }
- else
- {
- mTitleEditor->setText(parcel_data.name);
- }
-
- // FIXME: Creating landmark works only for current agent location.
- std::string desc;
- LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent());
- mNotesEditor->setText(desc);
-
- if (!LLLandmarkActions::landmarkAlreadyExists())
- {
- createLandmark(mFolderCombo->getValue().asUUID());
- }
- }
}
-void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
- const LLVector3d& pos_global)
+// virtual
+void LLPanelPlaceInfo::handleVisibilityChange(BOOL new_visibility)
{
- LLViewerRegion* region = gAgent.getRegion();
- if (!region)
- return;
-
- mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
- (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
- (F32)pos_global.mdV[VZ]);
-
- LLSD body;
- std::string url = region->getCapability("RemoteParcelRequest");
- if (!url.empty())
- {
- body["location"] = ll_sd_from_vector3(mPosRegion);
- if (!region_id.isNull())
- {
- body["region_id"] = region_id;
- }
- if (!pos_global.isExactlyZero())
- {
- U64 region_handle = to_region_handle(pos_global);
- body["region_handle"] = ll_sd_from_U64(region_handle);
- }
- LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
- }
- else
- {
- mDescEditor->setText(getString("server_update_text"));
- }
-}
+ LLPanel::handleVisibilityChange(new_visibility);
-void LLPanelPlaceInfo::displaySelectedParcelInfo(LLParcel* parcel,
- LLViewerRegion* region,
- const LLVector3d& pos_global,
- bool is_current_parcel)
-{
- if (!region || !parcel)
+ LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
+ if (!parcel_mgr)
return;
- // send EstateCovenantInfo message
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessage("EstateCovenantRequest");
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
- msg->sendReliable(region->getHost());
-
- 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;
- break;
-
- case SIM_ACCESS_ADULT:
- parcel_data.flags = 0x2;
- break;
-
- default:
- parcel_data.flags = 0;
- }
- parcel_data.desc = parcel->getDesc();
- parcel_data.name = parcel->getName();
- parcel_data.sim_name = region->getName();
- parcel_data.snapshot_id = parcel->getSnapshotID();
- mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
- (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
- (F32)pos_global.mdV[VZ]);
- parcel_data.global_x = pos_global.mdV[VX];
- parcel_data.global_y = pos_global.mdV[VY];
- parcel_data.global_z = pos_global.mdV[VZ];
-
- std::string on = getString("on");
- std::string off = getString("off");
-
- // Processing parcel characteristics
- if (parcel->getParcelFlagAllowVoice())
- {
- mVoiceText->setText(on);
- }
- else
- {
- mVoiceText->setText(off);
- }
-
- if (!region->getBlockFly() && parcel->getAllowFly())
- {
- mFlyText->setText(on);
- }
- else
- {
- mFlyText->setText(off);
- }
-
- if (region->getRestrictPushObject() || parcel->getRestrictPushObject())
- {
- mPushText->setText(off);
- }
- else
- {
- mPushText->setText(on);
- }
-
- if (parcel->getAllowModify())
- {
- mBuildText->setText(on);
- }
- else
- {
- mBuildText->setText(off);
- }
-
- if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) ||
- (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) ||
- !parcel->getAllowOtherScripts())
- {
- mScriptsText->setText(off);
- }
- else
- {
- mScriptsText->setText(on);
- }
-
- if (region->getAllowDamage() || parcel->getAllowDamage())
- {
- mDamageText->setText(on);
- }
- else
- {
- mDamageText->setText(off);
- }
-
- mRegionNameText->setText(region->getName());
- mRegionTypeText->setText(region->getSimProductName());
- mRegionRatingText->setText(region->getSimAccessString());
-
- // Determine parcel owner
- if (parcel->isPublic())
- {
- mParcelOwner->setText(getString("public"));
- mRegionOwnerText->setText(getString("public"));
- }
- else
- {
- if (parcel->getIsGroupOwned())
- {
- mRegionOwnerText->setText(getString("group_owned_text"));
-
- if(!parcel->getGroupID().isNull())
- {
- // FIXME: Using parcel group as region group.
- gCacheName->get(parcel->getGroupID(), TRUE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionGroupText, _2, _3));
-
- gCacheName->get(parcel->getGroupID(), TRUE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3));
- }
- else
- {
- std::string owner = getString("none_text");
- mRegionGroupText->setText(owner);
- mParcelOwner->setText(owner);
- }
- }
- else
- {
- // Figure out the owner's name
- gCacheName->get(parcel->getOwnerID(), FALSE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3));
- gCacheName->get(region->getOwner(), FALSE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionOwnerText, _2, _3));
- }
-
- if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
- {
- mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text"));
- }
- }
-
- mEstateRatingText->setText(region->getSimAccessString());
-
- S32 area;
- S32 claim_price;
- S32 rent_price;
- F32 dwell;
- BOOL for_sale = parcel->getForSale();
- LLViewerParcelMgr::getInstance()->getDisplayInfo(&area,
- &claim_price,
- &rent_price,
- &for_sale,
- &dwell);
- if (for_sale)
- {
- // Adding "For Sale" flag in remote parcel response format.
- parcel_data.flags |= DFQ_FOR_SALE;
-
- const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
- if(auth_buyer_id.notNull())
- {
- gCacheName->get(auth_buyer_id, TRUE,
- boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mSaleToText, _2, _3));
-
- // Show sales info to a specific person or a group he belongs to.
- if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id))
- {
- for_sale = FALSE;
- }
- }
- else
- {
- mSaleToText->setText(getString("anyone"));
- }
-
- const U8* sign = (U8*)getString("price_text").c_str();
- const U8* sqm = (U8*)getString("area_text").c_str();
-
- mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice()));
- mAreaText->setText(llformat("%d %s", area, sqm));
- mTrafficText->setText(llformat("%.0f", dwell));
-
- // Can't have more than region max tasks, regardless of parcel
- // object bonus factor.
- S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()),
- (S32)region->getMaxTasks());
-
- const U8* available = (U8*)getString("available").c_str();
- const U8* allocated = (U8*)getString("allocated").c_str();
-
- mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated));
-
- if (parcel->getAllowOtherScripts())
- {
- mParcelScriptsText->setText(getString("all_residents_text"));
- }
- else if (parcel->getAllowGroupScripts())
- {
- mParcelScriptsText->setText(getString("group_text"));
- }
- else
- {
- mParcelScriptsText->setText(off);
- }
-
- mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off);
-
- if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES)
- {
- mSubdivideText->setText(getString("can_change"));
- }
- else
- {
- mSubdivideText->setText(getString("can_not_change"));
- }
- if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)
- {
- mResaleText->setText(getString("can_not_resell"));
- }
- else
- {
- mResaleText->setText(getString("can_resell"));
- }
- }
-
- mSelectedParcelID = parcel->getLocalID();
- mLastSelectedRegionID = region->getRegionID();
- processParcelInfo(parcel_data);
-
- mYouAreHerePanel->setVisible(is_current_parcel);
- getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale);
-}
-
-void LLPanelPlaceInfo::updateEstateName(const std::string& name)
-{
- mEstateNameText->setText(name);
-}
-
-void LLPanelPlaceInfo::updateEstateOwnerName(const std::string& name)
-{
- mEstateOwnerText->setText(name);
-}
-
-void LLPanelPlaceInfo::updateCovenantText(const std::string &text)
-{
- mCovenantText->setText(text);
-}
-
-void LLPanelPlaceInfo::updateLastVisitedText(const LLDate &date)
-{
- if (date.isNull())
- {
- mLastVisited->setText(getString("unknown"));
- }
- else
- {
- std::string timeStr = getString("acquired_date");
- LLSD substitution;
- substitution["datetime"] = (S32) date.secondsSinceEpoch();
- LLStringUtil::format (timeStr, substitution);
- mLastVisited->setText(timeStr);
- }
-}
-
-void LLPanelPlaceInfo::toggleLandmarkEditMode(BOOL enabled)
-{
- // If switching to edit mode while creating landmark
- // the "Create Landmark" title remains.
- if (enabled && mInfoType != CREATE_LANDMARK)
- {
- mTitle->setText(getString("title_edit_landmark"));
- }
- else
- {
- mTitle->setText(mCurrentTitle);
- }
-
- if (mNotesEditor->getReadOnly() == (enabled == TRUE))
- {
- mTitleEditor->setEnabled(enabled);
- mNotesEditor->setReadOnly(!enabled);
- mFolderCombo->setVisible(enabled);
- getChild<LLTextBox>("folder_lable")->setVisible(enabled);
-
- // HACK: To change the text color in a text editor
- // when it was enabled/disabled we set the text once again.
- mNotesEditor->setText(mNotesEditor->getText());
- }
-}
-
-const std::string& LLPanelPlaceInfo::getLandmarkTitle() const
-{
- return mTitleEditor->getText();
-}
-
-const std::string LLPanelPlaceInfo::getLandmarkNotes() const
-{
- return mNotesEditor->getText();
-}
-
-const LLUUID LLPanelPlaceInfo::getLandmarkFolder() const
-{
- return mFolderCombo->getValue().asUUID();
-}
-
-BOOL LLPanelPlaceInfo::setLandmarkFolder(const LLUUID& id)
-{
- return mFolderCombo->setCurrentByID(id);
-}
-
-void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id)
-{
- std::string name = mTitleEditor->getText();
- std::string desc = mNotesEditor->getText();
-
- LLStringUtil::trim(name);
- LLStringUtil::trim(desc);
-
- // If typed name is empty use the parcel name instead.
- if (name.empty())
+ // Remove land selection when panel hides.
+ if (!new_visibility)
{
- name = mParcelName->getText();
-
- // If no parcel exists use the region name instead.
- if (name.empty())
+ if (!parcel_mgr->selectionEmpty())
{
- name = mRegionName->getText();
+ parcel_mgr->deselectLand();
}
}
-
- LLStringUtil::replaceChar(desc, '\n', ' ');
- // If no folder chosen use the "Landmarks" folder.
- LLLandmarkActions::createLandmarkHere(name, desc,
- folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK));
}
void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel)
@@ -942,159 +274,10 @@ void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit*
pick_panel->setPickData(&data);
}
-// virtual
-void LLPanelPlaceInfo::handleVisibilityChange (BOOL new_visibility)
-{
- LLPanel::handleVisibilityChange(new_visibility);
-
- LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
- if (!parcel_mgr)
- return;
-
- // Remove land selection when panel hides.
- if (!new_visibility)
- {
- if (!parcel_mgr->selectionEmpty())
- {
- parcel_mgr->deselectLand();
- }
- }
-}
-
-void LLPanelPlaceInfo::populateFoldersList()
+// static
+void LLPanelPlaceInfo::nameUpdatedCallback(LLTextBox* text,
+ const std::string& first,
+ const std::string& last)
{
- // Collect all folders that can contain landmarks.
- LLInventoryModel::cat_array_t cats;
- collectLandmarkFolders(cats);
-
- mFolderCombo->removeall();
-
- // Put the "Landmarks" folder first in list.
- const LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
- const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id);
- if (!cat)
- {
- llwarns << "Cannot find the landmarks folder" << llendl;
- }
- std::string cat_full_name = getFullFolderName(cat);
- mFolderCombo->add(cat_full_name, cat->getUUID());
-
- typedef std::vector<folder_pair_t> folder_vec_t;
- folder_vec_t folders;
- // Sort the folders by their full name.
- for (S32 i = 0; i < cats.count(); i++)
- {
- cat = cats.get(i);
- cat_full_name = getFullFolderName(cat);
- folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
- }
- sort(folders.begin(), folders.end(), cmp_folders);
-
- // Finally, populate the combobox.
- for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++)
- mFolderCombo->add(it->second, LLSD(it->first));
-}
-
-//static
-void LLPanelPlaceInfo::updateYouAreHereBanner(void* userdata)
-{
- //YouAreHere Banner should be displayed only for selected places,
- // If you want to display it for landmark or teleport history item, you should check by mParcelId
-
- LLPanelPlaceInfo* self = static_cast<LLPanelPlaceInfo*>(userdata);
- if(!self->getVisible())
- return;
- if(!gDisconnected)
- {
- static F32 radius = gSavedSettings.getF32("YouAreHereDistance");
-
- BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID &&
- LLAgentUI::checkAgentDistance(self->mPosRegion, radius);
-
- self->mYouAreHerePanel->setVisible(display_banner);
- }
-}
-
-void LLPanelPlaceInfo::onForSaleBannerClick()
-{
- LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
- LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection();
- LLViewerRegion* selected_region = mgr->getSelectionRegion();
- if(!hParcel.isNull() && selected_region)
- {
- if(hParcel->getParcel()->getLocalID() == mSelectedParcelID &&
- mLastSelectedRegionID ==selected_region->getRegionID())
- {
- if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0)
- {
- LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice());
- }
- else
- {
- LLViewerParcelMgr::getInstance()->startBuyLand();
- }
- }
- else
- {
- LL_WARNS("Places") << "User is trying to buy remote parcel.Operation is not supported"<< LL_ENDL;
- }
-
- }
-
-
-}
-
-/*static*/
-std::string LLPanelPlaceInfo::getFullFolderName(const LLViewerInventoryCategory* cat)
-{
- std::string name = cat->getName();
- LLUUID parent_id;
-
- // translate category name, if it's right below the root
- // FIXME: it can throw notification about non existent string in strings.xml
- if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
- {
- LLTrans::findString(name, "InvFolder " + name);
- }
-
- // we don't want "My Inventory" to appear in the name
- while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
- {
- cat = gInventory.getCategory(parent_id);
- name = cat->getName() + "/" + name;
- }
-
- return name;
-}
-
-static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right)
-{
- return left.second < right.second;
-}
-
-static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats)
-{
- const LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
-
- // Add descendent folders of the "Landmarks" category.
- LLInventoryModel::item_array_t items; // unused
- LLIsType is_category(LLAssetType::AT_CATEGORY);
- gInventory.collectDescendentsIf(
- landmarks_id,
- cats,
- items,
- LLInventoryModel::EXCLUDE_TRASH,
- is_category);
-
- // Add the "My Favorites" category.
- const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
- LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
- if (!favorites_cat)
- {
- llwarns << "Cannot find the favorites folder" << llendl;
- }
- else
- {
- cats.put(favorites_cat);
- }
+ text->setText(first + " " + last);
}
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index 07a2434d59..c9e1347542 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -1,6 +1,6 @@
/**
* @file llpanelplaceinfo.h
- * @brief Displays place information in Side Tray.
+ * @brief Base class for place information in Side Tray.
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
@@ -38,19 +38,13 @@
#include "v3dmath.h"
#include "lluuid.h"
-#include "llpanelmedia.h"
#include "llremoteparcelrequest.h"
-class LLButton;
-class LLComboBox;
class LLExpandableTextBox;
class LLInventoryItem;
-class LLLineEditor;
class LLPanelPickEdit;
class LLParcel;
-class LLIconCtrl;
class LLTextBox;
-class LLTextEditor;
class LLTextureCtrl;
class LLViewerRegion;
class LLViewerInventoryCategory;
@@ -74,30 +68,18 @@ public:
// Ignore all old location information, useful if you are
// recycling an existing dialog and need to clear it.
- void resetLocation();
+ virtual void resetLocation();
// Sends a request for data about the given parcel, which will
// only update the location if there is none already available.
/*virtual*/ void setParcelID(const LLUUID& parcel_id);
- // Depending on how the panel was triggered
- // (from landmark or current location, or other)
+ // Depending on how the panel was triggered
+ // (from landmark or current location, or other)
// sets a corresponding title and contents.
- void setInfoType(INFO_TYPE type);
-
- // Create a landmark for the current location
- // in a folder specified by folder_id.
- void createLandmark(const LLUUID& folder_id);
-
- // Create a pick for the location specified
- // by global_pos.
- void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel);
-
- BOOL isMediaPanelVisible();
- void toggleMediaPanel(BOOL visible);
- void displayItemInfo(const LLInventoryItem* pItem);
- /*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
+ virtual void setInfoType(INFO_TYPE type);
+ // Requests remote parcel info by parcel ID.
void sendParcelInfoRequest();
// Displays information about a remote parcel.
@@ -105,109 +87,37 @@ public:
void displayParcelInfo(const LLUUID& region_id,
const LLVector3d& pos_global);
- // Displays information about the currently selected parcel
- // without sending a request to the server.
- // If is_current_parcel true shows "You Are Here" banner.
- void displaySelectedParcelInfo(LLParcel* parcel,
- LLViewerRegion* region,
- const LLVector3d& pos_global,
- bool is_current_parcel);
-
- void updateEstateName(const std::string& name);
- void updateEstateOwnerName(const std::string& name);
- void updateCovenantText(const std::string &text);
- void updateLastVisitedText(const LLDate &date);
-
- void nameUpdatedCallback(LLTextBox* text,
- const std::string& first,
- const std::string& last);
-
- void toggleLandmarkEditMode(BOOL enabled);
-
- const std::string& getLandmarkTitle() const;
- const std::string getLandmarkNotes() const;
- const LLUUID getLandmarkFolder() const;
-
- // Select current landmark folder in combobox.
- BOOL setLandmarkFolder(const LLUUID& id);
+ /*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+
/*virtual*/ void handleVisibilityChange (BOOL new_visibility);
-
- static std::string getFullFolderName(const LLViewerInventoryCategory* cat);
-private:
+ // Create a pick for the location specified
+ // by global_pos.
+ void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel);
- void populateFoldersList();
- static void updateYouAreHereBanner(void*);// added to gIdleCallbacks
- void onForSaleBannerClick();
+protected:
+ static void nameUpdatedCallback(LLTextBox* text,
+ const std::string& first,
+ const std::string& last);
/**
* mParcelID is valid only for remote places, in other cases it's null. See resetLocation()
*/
- LLUUID mParcelID;
- LLUUID mRequestedID;
- LLUUID mLandmarkID;
- LLVector3 mPosRegion;
- std::string mCurrentTitle;
- S32 mMinHeight;
- INFO_TYPE mInfoType;
-
- /**
- * Hold last displayed parcel. Needs for YouAreHere banner.
- */
- S32 mSelectedParcelID;
- LLUUID mLastSelectedRegionID;
-
- LLTextBox* mTitle;
- LLPanel* mForSalePanel;
- LLPanel* mYouAreHerePanel;
- LLTextureCtrl* mSnapshotCtrl;
- LLTextBox* mRegionName;
- LLTextBox* mParcelName;
- LLExpandableTextBox*mDescEditor;
- LLTextBox* mMaturityRatingText;
- LLTextBox* mParcelOwner;
- LLTextBox* mLastVisited;
-
- LLTextBox* mRatingText;
- LLTextBox* mVoiceText;
- LLTextBox* mFlyText;
- LLTextBox* mPushText;
- LLTextBox* mBuildText;
- LLTextBox* mScriptsText;
- LLTextBox* mDamageText;
-
- LLTextBox* mRegionNameText;
- LLTextBox* mRegionTypeText;
- LLTextBox* mRegionRatingText;
- LLTextBox* mRegionOwnerText;
- LLTextBox* mRegionGroupText;
-
- LLTextBox* mEstateNameText;
- LLTextBox* mEstateRatingText;
- LLTextBox* mEstateOwnerText;
- LLTextEditor* mCovenantText;
-
- LLTextBox* mSalesPriceText;
- LLTextBox* mAreaText;
- LLTextBox* mTrafficText;
- LLTextBox* mPrimitivesText;
- LLTextBox* mParcelScriptsText;
- LLTextBox* mTerraformLimitsText;
- LLTextEditor* mSubdivideText;
- LLTextEditor* mResaleText;
- LLTextBox* mSaleToText;
-
- LLTextBox* mOwner;
- LLTextBox* mCreator;
- LLTextBox* mCreated;
- LLLineEditor* mTitleEditor;
- LLTextEditor* mNotesEditor;
- LLComboBox* mFolderCombo;
- LLPanel* mScrollingPanel;
- LLPanel* mInfoPanel;
- LLMediaPanel* mMediaPanel;
+ LLUUID mParcelID;
+ LLUUID mRequestedID;
+ LLVector3 mPosRegion;
+ std::string mCurrentTitle;
+ S32 mMinHeight;
+ INFO_TYPE mInfoType;
+
+ LLTextBox* mTitle;
+ LLTextureCtrl* mSnapshotCtrl;
+ LLTextBox* mRegionName;
+ LLTextBox* mParcelName;
+ LLExpandableTextBox* mDescEditor;
+ LLTextBox* mMaturityRatingText;
};
#endif // LL_LLPANELPLACEINFO_H
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
new file mode 100644
index 0000000000..9ba72fe6cf
--- /dev/null
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -0,0 +1,541 @@
+/**
+ * @file llpanelplaceprofile.cpp
+ * @brief Displays place profile in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-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 "llpanelplaceprofile.h"
+
+#include "llparcel.h"
+
+#include "llqueryflags.h"
+
+#include "lliconctrl.h"
+#include "lllineeditor.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
+#include "llagent.h"
+#include "llagentui.h"
+#include "llappviewer.h"
+#include "llcallbacklist.h"
+#include "llfloaterbuycurrency.h"
+#include "llstatusbar.h"
+#include "llviewercontrol.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+
+static LLRegisterPanelClassWrapper<LLPanelPlaceProfile> t_place_profile("panel_place_profile");
+
+LLPanelPlaceProfile::LLPanelPlaceProfile()
+: LLPanelPlaceInfo(),
+ mForSalePanel(NULL),
+ mYouAreHerePanel(NULL),
+ mSelectedParcelID(-1)
+{}
+
+// virtual
+LLPanelPlaceProfile::~LLPanelPlaceProfile()
+{}
+
+// virtual
+BOOL LLPanelPlaceProfile::postBuild()
+{
+ LLPanelPlaceInfo::postBuild();
+
+ mForSalePanel = getChild<LLPanel>("for_sale_panel");
+ mYouAreHerePanel = getChild<LLPanel>("here_panel");
+ gIdleCallbacks.addFunction(&LLPanelPlaceProfile::updateYouAreHereBanner, this);
+
+ //Icon value should contain sale price of last selected parcel.
+ mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")->
+ setMouseDownCallback(boost::bind(&LLPanelPlaceProfile::onForSaleBannerClick, this));
+
+ mParcelOwner = getChild<LLTextBox>("owner_value");
+ mLastVisited = getChild<LLTextBox>("last_visited_value");
+
+ mRatingText = getChild<LLTextBox>("rating_value");
+ mVoiceText = getChild<LLTextBox>("voice_value");
+ mFlyText = getChild<LLTextBox>("fly_value");
+ mPushText = getChild<LLTextBox>("push_value");
+ mBuildText = getChild<LLTextBox>("build_value");
+ mScriptsText = getChild<LLTextBox>("scripts_value");
+ mDamageText = getChild<LLTextBox>("damage_value");
+
+ mRegionNameText = getChild<LLTextBox>("region_name");
+ mRegionTypeText = getChild<LLTextBox>("region_type");
+ mRegionRatingText = getChild<LLTextBox>("region_rating");
+ mRegionOwnerText = getChild<LLTextBox>("region_owner");
+ mRegionGroupText = getChild<LLTextBox>("region_group");
+
+ mEstateNameText = getChild<LLTextBox>("estate_name");
+ mEstateRatingText = getChild<LLTextBox>("estate_rating");
+ mEstateOwnerText = getChild<LLTextBox>("estate_owner");
+ mCovenantText = getChild<LLTextEditor>("covenant");
+
+ mSalesPriceText = getChild<LLTextBox>("sales_price");
+ mAreaText = getChild<LLTextBox>("area");
+ mTrafficText = getChild<LLTextBox>("traffic");
+ mPrimitivesText = getChild<LLTextBox>("primitives");
+ mParcelScriptsText = getChild<LLTextBox>("parcel_scripts");
+ mTerraformLimitsText = getChild<LLTextBox>("terraform_limits");
+ mSubdivideText = getChild<LLTextEditor>("subdivide");
+ mResaleText = getChild<LLTextEditor>("resale");
+ mSaleToText = getChild<LLTextBox>("sale_to");
+
+ return TRUE;
+}
+
+// virtual
+void LLPanelPlaceProfile::resetLocation()
+{
+ LLPanelPlaceInfo::resetLocation();
+
+ mForSalePanel->setVisible(FALSE);
+ mYouAreHerePanel->setVisible(FALSE);
+
+ std::string not_available = getString("not_available");
+ mParcelOwner->setValue(not_available);
+ mLastVisited->setValue(not_available);
+
+ mRatingText->setText(not_available);
+ mVoiceText->setText(not_available);
+ mFlyText->setText(not_available);
+ mPushText->setText(not_available);
+ mBuildText->setText(not_available);
+ mParcelScriptsText->setText(not_available);
+ mDamageText->setText(not_available);
+
+ mRegionNameText->setValue(not_available);
+ mRegionTypeText->setValue(not_available);
+ mRegionRatingText->setValue(not_available);
+ mRegionOwnerText->setValue(not_available);
+ mRegionGroupText->setValue(not_available);
+
+ mEstateNameText->setValue(not_available);
+ mEstateRatingText->setValue(not_available);
+ mEstateOwnerText->setValue(not_available);
+ mCovenantText->setValue(not_available);
+
+ mSalesPriceText->setValue(not_available);
+ mAreaText->setValue(not_available);
+ mTrafficText->setValue(not_available);
+ mPrimitivesText->setValue(not_available);
+ mParcelScriptsText->setValue(not_available);
+ mTerraformLimitsText->setValue(not_available);
+ mSubdivideText->setValue(not_available);
+ mResaleText->setValue(not_available);
+ mSaleToText->setValue(not_available);
+}
+
+// virtual
+void LLPanelPlaceProfile::setInfoType(INFO_TYPE type)
+{
+ bool is_info_type_agent = type == AGENT;
+ bool is_info_type_teleport_history = type == TELEPORT_HISTORY;
+
+ getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent);
+ mMaturityRatingText->setVisible(!is_info_type_agent);
+
+ getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent);
+ mParcelOwner->setVisible(is_info_type_agent);
+
+ getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history);
+ mLastVisited->setVisible(is_info_type_teleport_history);
+
+ getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent);
+
+ switch(type)
+ {
+ case AGENT:
+ case PLACE:
+ default:
+ mCurrentTitle = getString("title_place");
+ break;
+
+ case TELEPORT_HISTORY:
+ mCurrentTitle = getString("title_teleport_history");
+ break;
+ }
+
+ LLPanelPlaceInfo::setInfoType(type);
+}
+
+// virtual
+void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data)
+{
+ LLPanelPlaceInfo::processParcelInfo(parcel_data);
+
+ // HACK: Flag 0x2 == adult region,
+ // Flag 0x1 == mature region, otherwise assume PG
+ std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);
+ if (parcel_data.flags & 0x2)
+ {
+ rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT);
+ }
+ else if (parcel_data.flags & 0x1)
+ {
+ rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);
+ }
+
+ mMaturityRatingText->setValue(rating);
+ mRatingText->setValue(rating);
+
+ //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 is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) &&
+ mInfoType == AGENT ? TRUE : FALSE;
+ mForSalePanel->setVisible(is_for_sale);
+}
+
+void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
+ LLViewerRegion* region,
+ const LLVector3d& pos_global,
+ bool is_current_parcel)
+{
+ if (!region || !parcel)
+ return;
+
+ // send EstateCovenantInfo message
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessage("EstateCovenantRequest");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->sendReliable(region->getHost());
+
+ 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;
+ break;
+
+ case SIM_ACCESS_ADULT:
+ parcel_data.flags = 0x2;
+ break;
+
+ default:
+ parcel_data.flags = 0;
+ }
+ parcel_data.desc = parcel->getDesc();
+ parcel_data.name = parcel->getName();
+ parcel_data.sim_name = region->getName();
+ parcel_data.snapshot_id = parcel->getSnapshotID();
+ mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
+ (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
+ (F32)pos_global.mdV[VZ]);
+ parcel_data.global_x = pos_global.mdV[VX];
+ parcel_data.global_y = pos_global.mdV[VY];
+ parcel_data.global_z = pos_global.mdV[VZ];
+
+ std::string on = getString("on");
+ std::string off = getString("off");
+
+ // Processing parcel characteristics
+ if (parcel->getParcelFlagAllowVoice())
+ {
+ mVoiceText->setText(on);
+ }
+ else
+ {
+ mVoiceText->setText(off);
+ }
+
+ if (!region->getBlockFly() && parcel->getAllowFly())
+ {
+ mFlyText->setText(on);
+ }
+ else
+ {
+ mFlyText->setText(off);
+ }
+
+ if (region->getRestrictPushObject() || parcel->getRestrictPushObject())
+ {
+ mPushText->setText(off);
+ }
+ else
+ {
+ mPushText->setText(on);
+ }
+
+ if (parcel->getAllowModify())
+ {
+ mBuildText->setText(on);
+ }
+ else
+ {
+ mBuildText->setText(off);
+ }
+
+ if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) ||
+ (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) ||
+ !parcel->getAllowOtherScripts())
+ {
+ mScriptsText->setText(off);
+ }
+ else
+ {
+ mScriptsText->setText(on);
+ }
+
+ if (region->getAllowDamage() || parcel->getAllowDamage())
+ {
+ mDamageText->setText(on);
+ }
+ else
+ {
+ mDamageText->setText(off);
+ }
+
+ mRegionNameText->setText(region->getName());
+ mRegionTypeText->setText(region->getSimProductName());
+ mRegionRatingText->setText(region->getSimAccessString());
+
+ // Determine parcel owner
+ if (parcel->isPublic())
+ {
+ mParcelOwner->setText(getString("public"));
+ mRegionOwnerText->setText(getString("public"));
+ }
+ else
+ {
+ if (parcel->getIsGroupOwned())
+ {
+ mRegionOwnerText->setText(getString("group_owned_text"));
+
+ if(!parcel->getGroupID().isNull())
+ {
+ // FIXME: Using parcel group as region group.
+ gCacheName->get(parcel->getGroupID(), TRUE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionGroupText, _2, _3));
+
+ gCacheName->get(parcel->getGroupID(), TRUE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3));
+ }
+ else
+ {
+ std::string owner = getString("none_text");
+ mRegionGroupText->setText(owner);
+ mParcelOwner->setText(owner);
+ }
+ }
+ else
+ {
+ // Figure out the owner's name
+ gCacheName->get(parcel->getOwnerID(), FALSE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3));
+ gCacheName->get(region->getOwner(), FALSE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionOwnerText, _2, _3));
+ }
+
+ if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
+ {
+ mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text"));
+ }
+ }
+
+ mEstateRatingText->setText(region->getSimAccessString());
+
+ S32 area;
+ S32 claim_price;
+ S32 rent_price;
+ F32 dwell;
+ BOOL for_sale = parcel->getForSale();
+ LLViewerParcelMgr::getInstance()->getDisplayInfo(&area,
+ &claim_price,
+ &rent_price,
+ &for_sale,
+ &dwell);
+ if (for_sale)
+ {
+ // Adding "For Sale" flag in remote parcel response format.
+ parcel_data.flags |= DFQ_FOR_SALE;
+
+ const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
+ if(auth_buyer_id.notNull())
+ {
+ gCacheName->get(auth_buyer_id, TRUE,
+ boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mSaleToText, _2, _3));
+
+ // Show sales info to a specific person or a group he belongs to.
+ if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id))
+ {
+ for_sale = FALSE;
+ }
+ }
+ else
+ {
+ mSaleToText->setText(getString("anyone"));
+ }
+
+ const U8* sign = (U8*)getString("price_text").c_str();
+ const U8* sqm = (U8*)getString("area_text").c_str();
+
+ mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice()));
+ mAreaText->setText(llformat("%d %s", area, sqm));
+ mTrafficText->setText(llformat("%.0f", dwell));
+
+ // Can't have more than region max tasks, regardless of parcel
+ // object bonus factor.
+ S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()),
+ (S32)region->getMaxTasks());
+
+ const U8* available = (U8*)getString("available").c_str();
+ const U8* allocated = (U8*)getString("allocated").c_str();
+
+ mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated));
+
+ if (parcel->getAllowOtherScripts())
+ {
+ mParcelScriptsText->setText(getString("all_residents_text"));
+ }
+ else if (parcel->getAllowGroupScripts())
+ {
+ mParcelScriptsText->setText(getString("group_text"));
+ }
+ else
+ {
+ mParcelScriptsText->setText(off);
+ }
+
+ mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off);
+
+ if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES)
+ {
+ mSubdivideText->setText(getString("can_change"));
+ }
+ else
+ {
+ mSubdivideText->setText(getString("can_not_change"));
+ }
+ if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)
+ {
+ mResaleText->setText(getString("can_not_resell"));
+ }
+ else
+ {
+ mResaleText->setText(getString("can_resell"));
+ }
+ }
+
+ mSelectedParcelID = parcel->getLocalID();
+ mLastSelectedRegionID = region->getRegionID();
+ processParcelInfo(parcel_data);
+
+ mYouAreHerePanel->setVisible(is_current_parcel);
+ getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale);
+}
+
+void LLPanelPlaceProfile::updateEstateName(const std::string& name)
+{
+ mEstateNameText->setText(name);
+}
+
+void LLPanelPlaceProfile::updateEstateOwnerName(const std::string& name)
+{
+ mEstateOwnerText->setText(name);
+}
+
+void LLPanelPlaceProfile::updateCovenantText(const std::string &text)
+{
+ mCovenantText->setText(text);
+}
+
+void LLPanelPlaceProfile::updateLastVisitedText(const LLDate &date)
+{
+ if (date.isNull())
+ {
+ mLastVisited->setText(getString("unknown"));
+ }
+ else
+ {
+ std::string timeStr = getString("acquired_date");
+ LLSD substitution;
+ substitution["datetime"] = (S32) date.secondsSinceEpoch();
+ LLStringUtil::format (timeStr, substitution);
+ mLastVisited->setText(timeStr);
+ }
+}
+
+void LLPanelPlaceProfile::onForSaleBannerClick()
+{
+ LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
+ LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection();
+ LLViewerRegion* selected_region = mgr->getSelectionRegion();
+ if(!hParcel.isNull() && selected_region)
+ {
+ if(hParcel->getParcel()->getLocalID() == mSelectedParcelID &&
+ mLastSelectedRegionID ==selected_region->getRegionID())
+ {
+ if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0)
+ {
+ LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice());
+ }
+ else
+ {
+ LLViewerParcelMgr::getInstance()->startBuyLand();
+ }
+ }
+ else
+ {
+ LL_WARNS("Places") << "User is trying to buy remote parcel.Operation is not supported"<< LL_ENDL;
+ }
+
+ }
+}
+
+// static
+void LLPanelPlaceProfile::updateYouAreHereBanner(void* userdata)
+{
+ //YouAreHere Banner should be displayed only for selected places,
+ // If you want to display it for landmark or teleport history item, you should check by mParcelId
+
+ LLPanelPlaceProfile* self = static_cast<LLPanelPlaceProfile*>(userdata);
+ if(!self->getVisible())
+ return;
+
+ if(!gDisconnected)
+ {
+ static F32 radius = gSavedSettings.getF32("YouAreHereDistance");
+
+ BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID &&
+ LLAgentUI::checkAgentDistance(self->mPosRegion, radius);
+
+ self->mYouAreHerePanel->setVisible(display_banner);
+ }
+}
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
new file mode 100644
index 0000000000..d8e4bcb6bd
--- /dev/null
+++ b/indra/newview/llpanelplaceprofile.h
@@ -0,0 +1,114 @@
+/**
+ * @file llpanelplaceprofile.h
+ * @brief Displays place profile in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-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 LL_LLPANELPLACEPROFILE_H
+#define LL_LLPANELPLACEPROFILE_H
+
+#include "llpanelplaceinfo.h"
+
+class LLTextEditor;
+
+class LLPanelPlaceProfile : public LLPanelPlaceInfo
+{
+public:
+ LLPanelPlaceProfile();
+ /*virtual*/ ~LLPanelPlaceProfile();
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void resetLocation();
+
+ /*virtual*/ void setInfoType(INFO_TYPE type);
+
+ /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+
+ // Displays information about the currently selected parcel
+ // without sending a request to the server.
+ // If is_current_parcel true shows "You Are Here" banner.
+ void displaySelectedParcelInfo(LLParcel* parcel,
+ LLViewerRegion* region,
+ const LLVector3d& pos_global,
+ bool is_current_parcel);
+
+ void updateEstateName(const std::string& name);
+ void updateEstateOwnerName(const std::string& name);
+ void updateCovenantText(const std::string &text);
+ void updateLastVisitedText(const LLDate &date);
+
+private:
+ void onForSaleBannerClick();
+
+ static void updateYouAreHereBanner(void*);// added to gIdleCallbacks
+
+ /**
+ * Holds last displayed parcel. Needed for YouAreHere banner.
+ */
+ S32 mSelectedParcelID;
+ LLUUID mLastSelectedRegionID;
+
+ LLPanel* mForSalePanel;
+ LLPanel* mYouAreHerePanel;
+
+ LLTextBox* mParcelOwner;
+ LLTextBox* mLastVisited;
+
+ LLTextBox* mRatingText;
+ LLTextBox* mVoiceText;
+ LLTextBox* mFlyText;
+ LLTextBox* mPushText;
+ LLTextBox* mBuildText;
+ LLTextBox* mScriptsText;
+ LLTextBox* mDamageText;
+
+ LLTextBox* mRegionNameText;
+ LLTextBox* mRegionTypeText;
+ LLTextBox* mRegionRatingText;
+ LLTextBox* mRegionOwnerText;
+ LLTextBox* mRegionGroupText;
+
+ LLTextBox* mEstateNameText;
+ LLTextBox* mEstateRatingText;
+ LLTextBox* mEstateOwnerText;
+ LLTextEditor* mCovenantText;
+
+ LLTextBox* mSalesPriceText;
+ LLTextBox* mAreaText;
+ LLTextBox* mTrafficText;
+ LLTextBox* mPrimitivesText;
+ LLTextBox* mParcelScriptsText;
+ LLTextBox* mTerraformLimitsText;
+ LLTextEditor* mSubdivideText;
+ LLTextEditor* mResaleText;
+ LLTextBox* mSaleToText;
+};
+
+#endif // LL_LLPANELPLACEPROFILE_H
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index f172462ca3..66efb96fc7 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -57,9 +57,10 @@
#include "llinventorymodel.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
-#include "llpanelplaceinfo.h"
+#include "llpanellandmarkinfo.h"
#include "llpanellandmarks.h"
#include "llpanelpick.h"
+#include "llpanelplaceprofile.h"
#include "llpanelteleporthistory.h"
#include "llteleporthistorystorage.h"
#include "lltoggleablemenu.h"
@@ -121,7 +122,8 @@ LLPanelPlaces::LLPanelPlaces()
mFilterSubString(LLStringUtil::null),
mActivePanel(NULL),
mFilterEditor(NULL),
- mPlaceInfo(NULL),
+ mPlaceProfile(NULL),
+ mLandmarkInfo(NULL),
mPickPanel(NULL),
mItem(NULL),
mPlaceMenu(NULL),
@@ -135,7 +137,7 @@ LLPanelPlaces::LLPanelPlaces()
gInventory.addObserver(mInventoryObserver);
LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
- boost::bind(&LLPanelPlaces::onAgentParcelChange, this));
+ boost::bind(&LLPanelPlaces::updateVerbs, this));
//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
}
@@ -206,25 +208,32 @@ BOOL LLPanelPlaces::postBuild()
mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false));
}
- mPlaceInfo = getChild<LLPanelPlaceInfo>("panel_place_info");
+ mPlaceProfile = getChild<LLPanelPlaceProfile>("panel_place_profile");
+ mLandmarkInfo = getChild<LLPanelLandmarkInfo>("panel_landmark_info");
+ if (!mPlaceProfile || !mLandmarkInfo)
+ return FALSE;
- LLButton* back_btn = mPlaceInfo->getChild<LLButton>("back_btn");
+ LLButton* back_btn = mPlaceProfile->getChild<LLButton>("back_btn");
back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
- LLLineEditor* title_editor = mPlaceInfo->getChild<LLLineEditor>("title_editor");
+ back_btn = mLandmarkInfo->getChild<LLButton>("back_btn");
+ back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
+
+ LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor");
title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL);
- LLTextEditor* notes_editor = mPlaceInfo->getChild<LLTextEditor>("notes_editor");
+ LLTextEditor* notes_editor = mLandmarkInfo->getChild<LLTextEditor>("notes_editor");
notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
- LLComboBox* folder_combo = mPlaceInfo->getChild<LLComboBox>("folder_combo");
+ LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo");
folder_combo->setSelectionCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
+
return TRUE;
}
void LLPanelPlaces::onOpen(const LLSD& key)
{
- if(mPlaceInfo == NULL || key.size() == 0)
+ if(!mPlaceProfile || !mLandmarkInfo || key.size() == 0)
return;
mFilterEditor->clear();
@@ -239,11 +248,11 @@ void LLPanelPlaces::onOpen(const LLSD& key)
if (mPlaceInfoType == AGENT_INFO_TYPE)
{
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::AGENT);
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);
}
else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
{
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
+ mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
if (key.has("x") && key.has("y") && key.has("z"))
{
@@ -256,11 +265,11 @@ void LLPanelPlaces::onOpen(const LLSD& key)
mPosGlobal = gAgent.getPositionGlobal();
}
- mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+ mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
}
else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
+ mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
if (!item)
@@ -270,17 +279,12 @@ void LLPanelPlaces::onOpen(const LLSD& key)
}
else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
- if (mPlaceInfo->isMediaPanelVisible())
- {
- toggleMediaPanel();
- }
-
mPosGlobal = LLVector3d(key["x"].asReal(),
key["y"].asReal(),
key["z"].asReal());
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::PLACE);
- mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
+ mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
}
else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
{
@@ -291,9 +295,9 @@ void LLPanelPlaces::onOpen(const LLSD& key)
mPosGlobal = hist_items[index].mGlobalPos;
- mPlaceInfo->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
- mPlaceInfo->updateLastVisitedText(hist_items[index].mDate);
- mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
+ mPlaceProfile->updateLastVisitedText(hist_items[index].mDate);
+ mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
}
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
@@ -321,7 +325,7 @@ void LLPanelPlaces::onOpen(const LLSD& key)
void LLPanelPlaces::setItem(LLInventoryItem* item)
{
- if (!mPlaceInfo || !item)
+ if (!mLandmarkInfo || !item)
return;
mItem = item;
@@ -351,19 +355,19 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)
if (is_landmark_editable)
{
- if(!mPlaceInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull())
+ if(!mLandmarkInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull())
{
const LLViewerInventoryCategory* cat = gInventory.getCategory(mItem->getParentUUID());
- if(cat)
+ if (cat)
{
- std::string cat_fullname = LLPanelPlaceInfo::getFullFolderName(cat);
- LLComboBox* folderList = mPlaceInfo->getChild<LLComboBox>("folder_combo");
- folderList->add(cat_fullname, cat->getUUID(),ADD_TOP);
+ std::string cat_fullname = LLPanelLandmarkInfo::getFullFolderName(cat);
+ LLComboBox* folderList = mLandmarkInfo->getChild<LLComboBox>("folder_combo");
+ folderList->add(cat_fullname, cat->getUUID(), ADD_TOP);
}
}
}
- mPlaceInfo->displayItemInfo(mItem);
+ mLandmarkInfo->displayItemInfo(mItem);
LLLandmark* lm = gLandmarkList.getAsset(mItem->getAssetUUID(),
boost::bind(&LLPanelPlaces::onLandmarkLoaded, this, _1));
@@ -375,13 +379,13 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)
void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark)
{
- if (!mPlaceInfo)
+ if (!mLandmarkInfo)
return;
LLUUID region_id;
landmark->getRegionID(region_id);
landmark->getGlobalPos(mPosGlobal);
- mPlaceInfo->displayParcelInfo(region_id, mPosGlobal);
+ mLandmarkInfo->displayParcelInfo(region_id, mPosGlobal);
}
void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_filter)
@@ -418,10 +422,8 @@ void LLPanelPlaces::onShareButtonClicked()
void LLPanelPlaces::onTeleportButtonClicked()
{
- if (!mPlaceInfo)
- return;
-
- if (mPlaceInfo->getVisible())
+ LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+ if (panel && panel->getVisible())
{
if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
@@ -450,10 +452,8 @@ void LLPanelPlaces::onTeleportButtonClicked()
void LLPanelPlaces::onShowOnMapButtonClicked()
{
- if (!mPlaceInfo)
- return;
-
- if (mPlaceInfo->getVisible())
+ LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+ if (panel && panel->getVisible())
{
LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
if(!worldmap_instance)
@@ -496,31 +496,31 @@ void LLPanelPlaces::onShowOnMapButtonClicked()
void LLPanelPlaces::onEditButtonClicked()
{
- if (!mPlaceInfo || isLandmarkEditModeOn)
+ if (!mLandmarkInfo || isLandmarkEditModeOn)
return;
isLandmarkEditModeOn = true;
- mPlaceInfo->toggleLandmarkEditMode(TRUE);
+ mLandmarkInfo->toggleLandmarkEditMode(TRUE);
updateVerbs();
}
void LLPanelPlaces::onSaveButtonClicked()
{
- if (!mPlaceInfo || mItem.isNull())
+ if (!mLandmarkInfo || mItem.isNull())
return;
- std::string current_title_value = mPlaceInfo->getLandmarkTitle();
+ std::string current_title_value = mLandmarkInfo->getLandmarkTitle();
std::string item_title_value = mItem->getName();
- std::string current_notes_value = mPlaceInfo->getLandmarkNotes();
+ std::string current_notes_value = mLandmarkInfo->getLandmarkNotes();
std::string item_notes_value = mItem->getDescription();
LLStringUtil::trim(current_title_value);
LLStringUtil::trim(current_notes_value);
LLUUID item_id = mItem->getUUID();
- LLUUID folder_id = mPlaceInfo->getLandmarkFolder();
+ LLUUID folder_id = mLandmarkInfo->getLandmarkFolder();
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem);
@@ -553,7 +553,7 @@ void LLPanelPlaces::onSaveButtonClicked()
void LLPanelPlaces::onCancelButtonClicked()
{
- if (!mPlaceInfo)
+ if (!mLandmarkInfo)
return;
if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
@@ -562,13 +562,13 @@ void LLPanelPlaces::onCancelButtonClicked()
}
else
{
- mPlaceInfo->toggleLandmarkEditMode(FALSE);
+ mLandmarkInfo->toggleLandmarkEditMode(FALSE);
isLandmarkEditModeOn = false;
updateVerbs();
// Reload the landmark properties.
- mPlaceInfo->displayItemInfo(mItem);
+ mLandmarkInfo->displayItemInfo(mItem);
}
}
@@ -652,9 +652,6 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
}
else if (item == "pick")
{
- if (!mPlaceInfo)
- return;
-
if (mPickPanel == NULL)
{
mPickPanel = LLPanelPickEdit::create();
@@ -667,7 +664,12 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
togglePickPanel(TRUE);
mPickPanel->onOpen(LLSD());
- mPlaceInfo->createPick(mPosGlobal, mPickPanel);
+
+ LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+ if (panel)
+ {
+ panel->createPick(mPosGlobal, mPickPanel);
+ }
LLRect rect = getRect();
mPickPanel->reshape(rect.getWidth(), rect.getHeight());
@@ -694,39 +696,16 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
void LLPanelPlaces::onBackButtonClicked()
{
- if (!mPlaceInfo)
- return;
-
- if (mPlaceInfo->isMediaPanelVisible())
- {
- toggleMediaPanel();
- }
- else
- {
- togglePlaceInfoPanel(FALSE);
+ togglePlaceInfoPanel(FALSE);
- // Resetting mPlaceInfoType when Place Info panel is closed.
- mPlaceInfoType = LLStringUtil::null;
+ // Resetting mPlaceInfoType when Place Info panel is closed.
+ mPlaceInfoType = LLStringUtil::null;
- isLandmarkEditModeOn = false;
- }
+ isLandmarkEditModeOn = false;
updateVerbs();
}
-void LLPanelPlaces::toggleMediaPanel()
-{
- if (!mPlaceInfo)
- return;
-
- mPlaceInfo->toggleMediaPanel(!mPlaceInfo->isMediaPanelVisible());
-
- // Refresh the current place info because
- // the media panel controls can't refer to
- // the remote parcel media.
- onOpen(LLSD().insert("type", AGENT_INFO_TYPE));
-}
-
void LLPanelPlaces::togglePickPanel(BOOL visible)
{
setAllChildrenVisible(this, !visible);
@@ -737,26 +716,50 @@ void LLPanelPlaces::togglePickPanel(BOOL visible)
void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
{
- if (!mPlaceInfo)
+ if (!mPlaceProfile || !mLandmarkInfo)
return;
- mPlaceInfo->setVisible(visible);
mFilterEditor->setVisible(!visible);
mTabContainer->setVisible(!visible);
- if (visible)
+ if (mPlaceInfoType == AGENT_INFO_TYPE ||
+ mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
+ mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
{
- mPlaceInfo->resetLocation();
+ mPlaceProfile->setVisible(visible);
- LLRect rect = getRect();
- LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
- mPlaceInfo->reshape(new_rect.getWidth(),new_rect.getHeight());
+ if (visible)
+ {
+ mPlaceProfile->resetLocation();
+
+ LLRect rect = getRect();
+ LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
+ mPlaceProfile->reshape(new_rect.getWidth(), new_rect.getHeight());
+
+ mLandmarkInfo->setVisible(FALSE);
+ }
+ }
+ else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
+ mPlaceInfoType == LANDMARK_INFO_TYPE)
+ {
+ mLandmarkInfo->setVisible(visible);
+
+ if (visible)
+ {
+ mLandmarkInfo->resetLocation();
+
+ LLRect rect = getRect();
+ LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
+ mLandmarkInfo->reshape(new_rect.getWidth(), new_rect.getHeight());
+
+ mPlaceProfile->setVisible(FALSE);
+ }
}
}
void LLPanelPlaces::changedParcelSelection()
{
- if (!mPlaceInfo)
+ if (!mPlaceProfile)
return;
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
@@ -782,8 +785,8 @@ void LLPanelPlaces::changedParcelSelection()
}
}
- mPlaceInfo->resetLocation();
- mPlaceInfo->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel);
+ mPlaceProfile->resetLocation();
+ mPlaceProfile->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel);
updateVerbs();
}
@@ -830,30 +833,22 @@ void LLPanelPlaces::changedInventory(U32 mask)
gInventory.removeObserver(mInventoryObserver);
}
-void LLPanelPlaces::onAgentParcelChange()
+void LLPanelPlaces::updateVerbs()
{
- if (!mPlaceInfo)
- return;
+ bool is_place_info_visible;
- if (mPlaceInfo->isMediaPanelVisible())
+ LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+ if (panel)
{
- onOpen(LLSD().insert("type", AGENT_INFO_TYPE));
+ is_place_info_visible = panel->getVisible();
}
else
{
- updateVerbs();
+ is_place_info_visible = false;
}
-}
-void LLPanelPlaces::updateVerbs()
-{
- if (!mPlaceInfo)
- return;
-
- bool is_place_info_visible = mPlaceInfo->getVisible();
bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE;
bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE;
- bool is_media_panel_visible = mPlaceInfo->isMediaPanelVisible();
mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
@@ -864,7 +859,7 @@ void LLPanelPlaces::updateVerbs()
mCancelBtn->setVisible(isLandmarkEditModeOn);
mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
- mOverflowBtn->setEnabled(is_place_info_visible && !is_media_panel_visible && !is_create_landmark_visible);
+ mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible);
if (is_place_info_visible)
{
@@ -872,16 +867,13 @@ void LLPanelPlaces::updateVerbs()
{
// We don't need to teleport to the current location
// so check if the location is not within the current parcel.
- mTeleportBtn->setEnabled(!is_media_panel_visible &&
- !mPosGlobal.isExactlyZero() &&
+ mTeleportBtn->setEnabled(!mPosGlobal.isExactlyZero() &&
!LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal));
}
else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
mTeleportBtn->setEnabled(TRUE);
}
-
- mShowOnMapBtn->setEnabled(!is_media_panel_visible);
}
else
{
@@ -890,6 +882,23 @@ void LLPanelPlaces::updateVerbs()
}
}
+LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel()
+{
+ if (mPlaceInfoType == AGENT_INFO_TYPE ||
+ mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
+ mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
+ {
+ return mPlaceProfile;
+ }
+ else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
+ mPlaceInfoType == LANDMARK_INFO_TYPE)
+ {
+ return mLandmarkInfo;
+ }
+
+ return NULL;
+}
+
static bool is_agent_in_selected_parcel(LLParcel* parcel)
{
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h
index e2d281dd84..39eb5261db 100644
--- a/indra/newview/llpanelplaces.h
+++ b/indra/newview/llpanelplaces.h
@@ -37,6 +37,10 @@
class LLInventoryItem;
class LLFilterEditor;
class LLLandmark;
+
+class LLPanelLandmarkInfo;
+class LLPanelPlaceProfile;
+
class LLPanelPickEdit;
class LLPanelPlaceInfo;
class LLPanelPlacesTab;
@@ -85,13 +89,16 @@ private:
void togglePickPanel(BOOL visible);
void togglePlaceInfoPanel(BOOL visible);
- void onAgentParcelChange();
void updateVerbs();
+ LLPanelPlaceInfo* getCurrentInfoPanel();
+
LLFilterEditor* mFilterEditor;
LLPanelPlacesTab* mActivePanel;
LLTabContainer* mTabContainer;
- LLPanelPlaceInfo* mPlaceInfo;
+ LLPanelPlaceProfile* mPlaceProfile;
+ LLPanelLandmarkInfo* mLandmarkInfo;
+
LLPanelPickEdit* mPickPanel;
LLToggleableMenu* mPlaceMenu;
LLToggleableMenu* mLandmarkMenu;
diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h
index b59d1d42f3..45c2fc116e 100644
--- a/indra/newview/llpanelprofileview.h
+++ b/indra/newview/llpanelprofileview.h
@@ -36,6 +36,8 @@
#include "llpanel.h"
#include "llpanelprofile.h"
#include "llavatarpropertiesprocessor.h"
+#include "llagent.h"
+#include "lltooldraganddrop.h"
class LLPanelProfile;
class LLPanelProfileTab;
@@ -64,6 +66,18 @@ public:
/*virtual*/ void togglePanel(LLPanel* panel);
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop, EDragAndDropType cargo_type,
+ void *cargo_data, EAcceptance *accept,
+ std::string& tooltip_msg)
+ {
+ LLToolDragAndDrop::handleGiveDragAndDrop(getAvatarId(), gAgent.getSessionID(), drop,
+ cargo_type, cargo_data, accept);
+
+ return TRUE;
+ }
+
+
protected:
void onBackBtnClick();
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index e97eb1df2b..9450bee315 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -32,6 +32,11 @@
#include "llviewerprecompiledheaders.h"
+// common includes
+#include "lltrans.h"
+#include "llavataractions.h"
+#include "llagent.h"
+
#include "llparticipantlist.h"
#include "llavatarlist.h"
#include "llspeakers.h"
@@ -39,15 +44,18 @@
//LLParticipantList retrieves add, clear and remove events and updates view accordingly
LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list):
mSpeakerMgr(data_source),
- mAvatarList(avatar_list)
+ mAvatarList(avatar_list),
+ mSpeakerAddListener(*this),
+ mSpeakerRemoveListener(*this),
+ mSpeakerClearListener(*this),
+ mSortOrder(E_SORT_BY_NAME)
{
- mSpeakerAddListener = new SpeakerAddListener(mAvatarList);
- mSpeakerRemoveListener = new SpeakerRemoveListener(mAvatarList);
- mSpeakerClearListener = new SpeakerClearListener(mAvatarList);
+ mSpeakerMgr->addListener(&mSpeakerAddListener, "add");
+ mSpeakerMgr->addListener(&mSpeakerRemoveListener, "remove");
+ mSpeakerMgr->addListener(&mSpeakerClearListener, "clear");
- mSpeakerMgr->addListener(mSpeakerAddListener, "add");
- mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove");
- mSpeakerMgr->addListener(mSpeakerClearListener, "clear");
+ mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
+ mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
//Lets fill avatarList with existing speakers
LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
@@ -58,24 +66,33 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
{
group_members.push_back((*it)->mID);
}
- mAvatarList->setDirty();
- mAvatarList->sortByName();
+ sort();
}
LLParticipantList::~LLParticipantList()
{
- delete mSpeakerAddListener;
- delete mSpeakerRemoveListener;
- delete mSpeakerClearListener;
- mSpeakerAddListener = NULL;
- mSpeakerRemoveListener = NULL;
- mSpeakerClearListener = NULL;
}
-//
-// LLParticipantList::SpeakerAddListener
-//
-bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list)
+{
+ LLUUID clicked_id = list->getSelectedUUID();
+
+ if (clicked_id.isNull() || clicked_id == gAgent.getID())
+ return;
+
+ LLAvatarActions::startIM(clicked_id);
+}
+
+void LLParticipantList::setSortOrder(EParticipantSortOrder order)
+{
+ if ( mSortOrder != order )
+ {
+ mSortOrder = order;
+ sort();
+ }
+}
+
+bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
LLUUID uu_id = event->getValue().asUUID();
@@ -88,15 +105,11 @@ bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::L
}
group_members.push_back(uu_id);
- mAvatarList->setDirty();
- mAvatarList->sortByName();
+ sort();
return true;
}
-//
-// LLParticipantList::SpeakerRemoveListener
-//
-bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
LLAvatarList::uuid_vector_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID());
@@ -108,10 +121,7 @@ bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents
return true;
}
-//
-// LLParticipantList::SpeakerClearListener
-//
-bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
group_members.clear();
@@ -119,3 +129,45 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents:
return true;
}
+void LLParticipantList::sort()
+{
+ if ( !mAvatarList )
+ return;
+
+ // Mark AvatarList as dirty one
+ mAvatarList->setDirty();
+
+ // TODO: Implement more sorting orders after specs updating (EM)
+ switch ( mSortOrder ) {
+ case E_SORT_BY_NAME :
+ mAvatarList->sortByName();
+ break;
+ default :
+ llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl;
+ return;
+ }
+}
+
+//
+// LLParticipantList::SpeakerAddListener
+//
+bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ return mParent.onAddItemEvent(event, userdata);
+}
+
+//
+// LLParticipantList::SpeakerRemoveListener
+//
+bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ return mParent.onRemoveItemEvent(event, userdata);
+}
+
+//
+// LLParticipantList::SpeakerClearListener
+//
+bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+ return mParent.onClearListEvent(event, userdata);
+}
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 68aae0aee5..04d9e29256 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -38,46 +38,74 @@ class LLAvatarList;
class LLParticipantList
{
+ LOG_CLASS(LLParticipantList);
public:
LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);
~LLParticipantList();
+ typedef enum e_participant_sort_oder {
+ E_SORT_BY_NAME = 0,
+ } EParticipantSortOrder;
+
+ /**
+ * Set and sort Avatarlist by given order
+ */
+ void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME);
+
protected:
+ /**
+ * LLSpeakerMgr event handlers
+ */
+ bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+ bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+
+ /**
+ * Sorts the Avatarlist by stored order
+ */
+ void sort();
//List of listeners implementing LLOldEvents::LLSimpleListener.
//There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way
//that one listener can handle only one type of event
- class SpeakerAddListener : public LLOldEvents::LLSimpleListener
+ class BaseSpeakerListner : public LLOldEvents::LLSimpleListener
{
public:
- SpeakerAddListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
+ BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {}
+ protected:
+ LLParticipantList& mParent;
+ };
+ class SpeakerAddListener : public BaseSpeakerListner
+ {
+ public:
+ SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
- LLAvatarList* mAvatarList;
};
- class SpeakerRemoveListener : public LLOldEvents::LLSimpleListener
+ class SpeakerRemoveListener : public BaseSpeakerListner
{
public:
- SpeakerRemoveListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
-
+ SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
- LLAvatarList* mAvatarList;
};
- class SpeakerClearListener : public LLOldEvents::LLSimpleListener
+ class SpeakerClearListener : public BaseSpeakerListner
{
public:
- SpeakerClearListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
-
+ SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
- LLAvatarList* mAvatarList;
};
+
private:
+ void onAvatarListDoubleClicked(LLAvatarList* list);
+
LLSpeakerMgr* mSpeakerMgr;
- LLAvatarList* mAvatarList;
+ LLAvatarList* mAvatarList;
+
+ SpeakerAddListener mSpeakerAddListener;
+ SpeakerRemoveListener mSpeakerRemoveListener;
+ SpeakerClearListener mSpeakerClearListener;
- SpeakerAddListener* mSpeakerAddListener;
- SpeakerRemoveListener* mSpeakerRemoveListener;
- SpeakerClearListener* mSpeakerClearListener;
+ EParticipantSortOrder mSortOrder;
};
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 16c768b14e..d8e6c52c8c 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -140,7 +140,7 @@
#include "llgroupactions.h"
#include "llagentui.h"
#include "llpanelblockedlist.h"
-#include "llpanelplaceinfo.h"
+#include "llpanelplaceprofile.h"
#include <boost/tokenizer.hpp>
#include <boost/algorithm/string/split.hpp>
@@ -5549,7 +5549,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**)
LLPanelLandCovenant::updateEstateOwnerName(owner_name);
LLFloaterBuyLand::updateEstateOwnerName(owner_name);
- LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info");
+ LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile");
if (panel)
{
panel->updateEstateName(estate_name);
@@ -5683,7 +5683,7 @@ void onCovenantLoadComplete(LLVFS *vfs,
LLPanelLandCovenant::updateCovenantText(covenant_text);
LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid);
- LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info");
+ LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile");
if (panel)
{
panel->updateCovenantText(covenant_text);
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 26d2f4e497..88aca005cf 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -3,7 +3,7 @@
legacy_header_height="18"
background_visible="true"
follows="left|top|right|bottom"
- height="270"
+ height="359"
layout="topleft"
left="0"
name="panel_im"
@@ -12,13 +12,13 @@
can_dock="true"
can_minimize="true"
visible="true"
- width="365"
+ width="400"
can_resize="true"
min_width="200"
min_height="150">
<layout_stack follows="left|top|right|bottom"
- height="255"
- width="365"
+ height="344"
+ width="400"
layout="topleft"
orientation="horizontal"
name="im_panels"
@@ -28,13 +28,13 @@
name="panel_im_control_panel"
layout="topleft"
top_delta="-3"
- width="146"
- height="255"
+ height="344"
follows="left"
label="IM Control Panel"
+ auto_resize="false"
user_resize="false" />
- <layout_panel height="255"
- width="200"
+ <layout_panel height="344"
+ width="235"
left_delta="146"
top="0"
user_resize="false">
@@ -56,14 +56,14 @@
length="1"
follows="left|top|right|bottom"
font="SansSerif"
- height="205"
+ height="290"
layout="topleft"
name="chat_history"
parse_highlights="true"
allow_html="true"
- width="195">
+ width="230">
</chat_history>
- <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="190">
+ <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="225">
</line_editor>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index f50acc224f..87c4e2787f 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
name="panel_im_control_panel"
- width="146"
+ width="180"
height="215"
border="false">
<avatar_list
@@ -16,10 +16,11 @@
show_info_btn="false"
show_profile_btn="false"
top="10"
- width="140" />
+ width="180" />
<button
name="call_btn"
label="Call"
+ left_delta="27"
width="125"
height="20" />
<button
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index c183749587..b5051523e5 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -93,7 +93,7 @@
min_width="76"
name="gesture_panel"
user_resize="false">
- <button
+ <gesture_combo_box
follows="right"
height="23"
label="Gesture"
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 9ed510dff3..3358015335 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
name="panel_im_control_panel"
- width="146"
+ width="180"
height="238"
border="false">
<avatar_list
@@ -16,11 +16,11 @@
show_info_btn="false"
show_profile_btn="false"
top="10"
- width="140" />
+ width="180" />
<button
name="group_info_btn"
label="Group Info"
- left_delta="3"
+ left_delta="27"
width="125"
height="20" />
<button
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 63e8ffcb1e..ab0f956da0 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
@@ -47,7 +47,7 @@ background_visible="true"
text_color="white"
top="0"
value="(Loading...)"
- use_elipsis="true"
+ use_ellipses="true"
width="300" />
<line_editor
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index c4cdaa41f9..0dd3878426 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -1,30 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_im_control_panel"
- width="125"
- height="248"
+ width="128"
+ height="327"
border="false">
<avatar_icon name="avatar_icon"
- width="96"
- height="96" />
+ follows="left|top"
+ left_delta="3"
+ width="125"
+ height="125" />
<button name="view_profile_btn"
+ follows="left|bottom"
label="View Profile"
- left_delta="3"
width="125"
height="20" />
<button name="add_friend_btn"
+ follows="left|bottom"
label="Add Friend"
width="125"
height="20" />
<button name="call_btn"
+ follows="left|bottom"
label="Call"
width="125"
height="20" />
<button
+ follows="left|bottom"
height="20"
label="End Call"
name="end_call_btn"
@@ -33,15 +38,27 @@
<button
enabled="false"
+ follows="left|bottom"
name="voice_ctrls_btn"
label="Open Voice Controls"
width="125"
height="20"
visible="false"/>
+ <button name="teleport_btn"
+ follows="left|bottom"
+ label="Teleport"
+ width="125"
+ height="20" />
<button name="share_btn"
+ follows="left|bottom"
label="Share"
width="125"
height="20" />
+ <button name="pay_btn"
+ follows="left|bottom"
+ label="Pay"
+ width="125"
+ height="20" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
new file mode 100644
index 0000000000..03ba7f7c81
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="landmark_info"
+ top="20"
+ width="330">
+ <string
+ name="title_create_landmark"
+ value="Create Landmark" />
+ <string
+ name="title_edit_landmark"
+ value="Edit Landmark" />
+ <string
+ name="title_landmark"
+ value="Landmark" />
+ <string
+ name="not_available"
+ value="(N\A)" />
+ <string
+ name="unknown"
+ value="(unknown)" />
+ <string
+ name="public"
+ value="(public)" />
+ <string
+ name="server_update_text">
+ Place information not available without server update.
+ </string>
+ <string
+ name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string
+ name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </string>
+ <string
+ name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button
+ follows="top|right"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ left="10"
+ name="back_btn"
+ picture_style="true"
+ tab_stop="false"
+ top="0"
+ width="23" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="white"
+ top="0"
+ use_ellipses="true"
+ value="Place Profile"
+ width="275" />
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ height="533"
+ layout="topleft"
+ left="10"
+ name="place_scroll"
+ opaque="true"
+ top_pad="5"
+ width="313">
+ <panel
+ bg_alpha_color="DkGray2"
+ follows="all"
+ height="533"
+ layout="topleft"
+ left="0"
+ min_height="300"
+ name="scrolling_panel"
+ top="0"
+ width="313">
+ <texture_picker
+ enabled="false"
+ follows="top|left"
+ height="190"
+ layout="topleft"
+ left="10"
+ name="logo"
+ top="10"
+ width="290" />
+ <text
+ follows="left|top|right"
+ font="SansSerifLarge"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="region_title"
+ text_color="white"
+ top_pad="5"
+ use_ellipses="true"
+ value="SampleRegion"
+ width="290" />
+ <text
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="parcel_title"
+ top_pad="4"
+ use_ellipses="true"
+ value="SampleParcel, Name Long (145, 228, 26)"
+ width="285" />
+ <expandable_text
+ follows="left|top|right"
+ height="50"
+ layout="topleft"
+ left="5"
+ name="description"
+ top_pad="10"
+ value="Du waltz die spritz"
+ width="300" />
+ <panel
+ follows="left|top|right"
+ height="55"
+ layout="topleft"
+ left="10"
+ name="landmark_info_panel"
+ top_pad="10"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="owner_label"
+ top_pad="10"
+ value="Owner:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="70"
+ name="owner"
+ top_delta="0"
+ width="200" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="creator_label"
+ value="Creator:"
+ width="90" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="70"
+ name="creator"
+ top_delta="0"
+ width="200" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="created_label"
+ value="Created:"
+ width="50" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="70"
+ name="created"
+ top_delta="0"
+ width="200" />
+ </panel>
+ <panel
+ follows="left|top|right"
+ height="210"
+ layout="topleft"
+ left="10"
+ name="landmark_edit_panel"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="title_label"
+ top_pad="10"
+ value="Title:"
+ width="290" />
+ <line_editor
+ background_image_disabled="task_panel_background.png"
+ follows="left|top|right"
+ height="22"
+ layout="topleft"
+ left="0"
+ max_length="63"
+ name="title_editor"
+ prevalidate_callback="ascii"
+ text_readonly_color="white"
+ top_pad="5"
+ width="290" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="notes_label"
+ top_pad="10"
+ value="My notes:"
+ width="290" />
+ <text_editor
+ bg_readonly_color="DkGray2"
+ follows="all"
+ height="70"
+ layout="topleft"
+ left="0"
+ max_length="127"
+ name="notes_editor"
+ read_only="true"
+ text_readonly_color="white"
+ top_pad="5"
+ width="290"
+ wrap="true" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="folder_label"
+ top_pad="15"
+ value="Landmark location:"
+ width="290" />
+ <combo_box
+ follows="bottom|left|right"
+ height="20"
+ layout="topleft"
+ left="0"
+ name="folder_combo"
+ top_pad="5"
+ width="200" />
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 2182163da5..555fedb1ff 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -42,13 +42,17 @@
width="20" />
<button
follows="right"
+ is_toggle="true"
width="45"
top="0"
layout="topleft"
left_pad="8"
label="Log"
height="23"
+ name="show_nearby_chat"
tool_tip="Show/hide nearby chat log">
- <button.commit_callback function="Floater.Toggle" parameter="nearby_chat"/>
+ <button.init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="nearby_chat" />
</button>
</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 a67ae59b4a..3cc9c3f38a 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -30,7 +30,7 @@
text_color="white"
top="0"
value="Pick Info"
- use_elipsis="true"
+ use_ellipses="true"
width="275" />
<scroll_container
color="DkGray2"
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
new file mode 100644
index 0000000000..7e073f064d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -0,0 +1,979 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="place_profile"
+ top="20"
+ width="330">
+ <string
+ name="on"
+ value="On" />
+ <string
+ name="off"
+ value="Off" />
+ <string
+ name="anyone"
+ value="Anyone" />
+ <string
+ name="available"
+ value="available" />
+ <string
+ name="allocated"
+ value="allocated" />
+ <string
+ name="title_place"
+ value="Place Profile" />
+ <string
+ name="title_teleport_history"
+ value="Teleport History Location" />
+ <string
+ name="not_available"
+ value="(N\A)" />
+ <string
+ name="unknown"
+ value="(unknown)" />
+ <string
+ name="public"
+ value="(public)" />
+ <string
+ name="none_text"
+ value="(none)" />
+ <string
+ name="sale_pending_text"
+ value="(Sale Pending)" />
+ <string
+ name="group_owned_text"
+ value="(Group Owned)" />
+ <string
+ name="price_text"
+ value="L$" />
+ <string
+ name="area_text"
+ value="m²" />
+ <string
+ name="all_residents_text"
+ value="All Residents" />
+ <string
+ name="group_text"
+ value="Group" />
+ <string
+ name="can_resell">
+ Purchased land in this region may be resold.
+ </string>
+ <string
+ name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </string>
+ <string
+ name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </string>
+ <string
+ name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </string>
+ <string
+ name="server_update_text">
+ Place information not available without server update.
+ </string>
+ <string
+ name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string
+ name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </string>
+ <string
+ name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button
+ follows="top|right"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ left="10"
+ name="back_btn"
+ picture_style="true"
+ tab_stop="false"
+ top="0"
+ width="23" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="white"
+ top="0"
+ use_ellipses="true"
+ value="Place Profile"
+ width="275" />
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ height="533"
+ layout="topleft"
+ left="10"
+ name="place_scroll"
+ opaque="true"
+ top_pad="5"
+ width="313">
+ <panel
+ bg_alpha_color="DkGray2"
+ follows="all"
+ height="533"
+ layout="topleft"
+ left="0"
+ min_height="300"
+ name="scrolling_panel"
+ top="0"
+ value="&gt;"
+ width="313">
+ <texture_picker
+ enabled="false"
+ follows="top|left"
+ height="190"
+ layout="topleft"
+ left="10"
+ name="logo"
+ top="10"
+ width="290" />
+ <layout_stack
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="50"
+ layout="topleft"
+ mouse_opaque="false"
+ name="panel_stack"
+ orientation="horizontal"
+ top_pad="-65"
+ width="100">
+ <layout_panel
+ follows="left|right"
+ height="50"
+ layout="topleft"
+ left="0"
+ min_height="50"
+ min_width="50"
+ mouse_opaque="false"
+ name="here_panel"
+ top="0"
+ user_resize="false"
+ width="60">
+ <icon
+ follows="top|left"
+ height="50"
+ image_name="YouAreHere_Badge"
+ layout="topleft"
+ left="0"
+ name="icon_you_are_here"
+ top="0"
+ width="50" />
+ </layout_panel>
+ <layout_panel
+ follows="left|right"
+ height="60"
+ layout="topleft"
+ min_height="50"
+ min_width="60"
+ mouse_opaque="false"
+ name="for_sale_panel"
+ top="0"
+ user_resize="false"
+ width="60">
+ <icon
+ follows="top|left"
+ height="50"
+ image_name="ForSale_Badge"
+ layout="topleft"
+ left="10"
+ name="icon_for_sale"
+ top="0"
+ width="50" />
+ </layout_panel>
+ </layout_stack>
+ <text
+ follows="left|top|right"
+ font="SansSerifLarge"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="region_title"
+ text_color="white"
+ top_pad="5"
+ use_ellipses="true"
+ value="SampleRegion"
+ width="290" />
+ <!-- <icon
+ follows="top|right"
+ height="16"
+ image_name="Icon_For_Sale"
+ layout="topleft"
+ left="3"
+ mouse_opaque="true"
+ name="icon_for_sale"
+ width="16" />-->
+ <text
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="parcel_title"
+ top_pad="4"
+ use_ellipses="true"
+ value="SampleParcel, Name Long (145, 228, 26)"
+ width="285" />
+ <expandable_text
+ follows="left|top|right"
+ height="50"
+ layout="topleft"
+ left="5"
+ name="description"
+ top_pad="10"
+ value="Du waltz die spritz"
+ width="300" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left="10"
+ name="owner_label"
+ text_color="White"
+ top_pad="0"
+ value="Owner:"
+ width="90" />
+ <!--TODO: HOOK THIS NAME UP WITH AN INSPECTOR -->
+ <text
+ follows="left|top|right"
+ height="14"
+ layout="topleft"
+ left_pad="1"
+ name="owner_value"
+ top_delta="0"
+ value="Alex Superduperlongenamenton"
+ width="205" />
+ <accordion
+ follows="all"
+ height="230"
+ layout="topleft"
+ left="0"
+ name="advanced_info_accordion"
+ top_pad="10"
+ width="313">
+ <accordion_tab
+ layout="topleft"
+ name="parcel_characteristics_tab"
+ title="Parcel">
+ <scroll_container
+ color="DkGray2"
+ follows="all"
+ height="132"
+ layout="topleft"
+ left="0"
+ name="parcel_scroll"
+ opaque="true"
+ top="0"
+ width="290">
+ <panel
+ follows="all"
+ height="165"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="275">
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="parcel_drk_M"
+ layout="topleft"
+ left="20"
+ name="icon_M"
+ top="0"
+ width="18" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="parcel_drk_R"
+ layout="topleft"
+ left="20"
+ name="icon_R"
+ top="0"
+ width="18" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="parcel_drk_PG"
+ layout="topleft"
+ left="20"
+ name="icon_PG"
+ top="0"
+ visible="false"
+ width="18" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="8"
+ name="rating_label"
+ value="Rating:"
+ width="80" />
+ <text
+ follows="right|top"
+ height="16"
+ layout="topleft"
+ left_pad="0"
+ name="rating_value"
+ top_delta="0"
+ value="Mature"
+ width="120" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_Voice"
+ layout="topleft"
+ left="20"
+ name="icon_Voice"
+ top_pad="5"
+ width="22" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_VoiceNo"
+ layout="topleft"
+ left="20"
+ name="icon_VoiceNo"
+ top_delta="0"
+ visible="false"
+ width="22" />
+ <text
+ follows="left|top"
+ height="18"
+ layout="topleft"
+ left_pad="8"
+ name="voice_label"
+ top_delta="0"
+ value="Voice:"
+ width="76" />
+ <text
+ follows="right|top"
+ height="18"
+ layout="topleft"
+ left_pad="0"
+ name="voice_value"
+ top_delta="0"
+ value="On"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_Fly"
+ layout="topleft"
+ left="20"
+ name="icon_Fly"
+ top_pad="3"
+ width="22" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_FlyNo"
+ layout="topleft"
+ left="20"
+ name="icon_FlyNo"
+ top_delta="0"
+ visible="false"
+ width="22" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="8"
+ name="fly_label"
+ value="Fly:"
+ width="76" />
+ <text
+ follows="right|top"
+ height="16"
+ layout="topleft"
+ left_pad="0"
+ name="fly_value"
+ top_delta="0"
+ value="On"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_Push"
+ layout="topleft"
+ left="20"
+ name="icon_Push"
+ top_pad="3"
+ visible="false"
+ width="22" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_PushNo"
+ layout="topleft"
+ left="20"
+ name="icon_PushNo"
+ top_delta="0"
+ width="22" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="push_label"
+ value="Push:"
+ width="76" />
+ <text
+ follows="right|top"
+ height="14"
+ layout="topleft"
+ left_pad="0"
+ name="push_value"
+ top_delta="0"
+ value="Off"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_Build"
+ layout="topleft"
+ left="20"
+ name="icon_Build"
+ top_pad="3"
+ width="22" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_BuildNo"
+ layout="topleft"
+ left="20"
+ name="icon_BuildNo"
+ top_delta="0"
+ visible="false" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="build_label"
+ value="Build:"
+ width="76" />
+ <text
+ follows="right|top"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="build_value"
+ top_delta="0"
+ value="On"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_Scripts"
+ layout="topleft"
+ left="20"
+ name="icon_Scripts"
+ top_pad="3"
+ width="22" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_ScriptsNo"
+ layout="topleft"
+ left="20"
+ name="icon_ScriptsNo"
+ top_delta="0"
+ visible="false" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="scripts_label"
+ value="Scripts:"
+ width="76" />
+ <text
+ follows="right|top"
+ height="14"
+ layout="topleft"
+ left_pad="0"
+ name="scripts_value"
+ top_delta="0"
+ value="On"
+ width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_Damage"
+ layout="topleft"
+ left="20"
+ name="icon_Damage"
+ top_pad="7"
+ visible="false"
+ width="22" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="parcel_drk_DamageNo"
+ layout="topleft"
+ left="20"
+ name="icon_DamageNo"
+ top_delta="0" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="damage_label"
+ value="Damage:"
+ width="76" />
+ <text
+ follows="right|top"
+ height="14"
+ layout="topleft"
+ left_pad="0"
+ name="damage_value"
+ top_delta="0"
+ value="Off"
+ width="60" />
+ <button
+ follows="bottom|right"
+ height="19"
+ label="About Land"
+ layout="topleft"
+ name="about_land_btn"
+ right="-5"
+ tab_stop="false"
+ top="138"
+ width="90">
+ <click_callback
+ function="ShowFloater"
+ parameter="about_land" />
+ </button>
+ </panel>
+ </scroll_container>
+ </accordion_tab>
+ <accordion_tab
+ expanded="false"
+ layout="topleft"
+ name="region_information_tab"
+ title="Region">
+ <panel
+ follows="all"
+ height="125"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_name_label"
+ top_pad="5"
+ value="Region:"
+ width="80" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="region_name"
+ top_delta="0"
+ value="Mooseland"
+ width="195" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_type_label"
+ top_pad="5"
+ value="Type:"
+ width="80" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="region_type"
+ top_delta="0"
+ value="Moose"
+ width="195" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_rating_label"
+ top_pad="7"
+ value="Rating:"
+ width="80" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="parcel_drk_M"
+ layout="topleft"
+ left_pad="0"
+ name="icon_M"
+ width="18" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="parcel_drk_R"
+ layout="topleft"
+ left_delta="0"
+ name="icon_R"
+ top_delta="0"
+ visible="false"
+ width="18" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="parcel_drk_PG"
+ layout="topleft"
+ left_delta="0"
+ name="icon_PG"
+ top_delta="0"
+ visible="false"
+ width="18" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="10"
+ name="region_rating"
+ value="Explicit"
+ width="100" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_owner_label"
+ top_pad="5"
+ value="Owner:"
+ width="80" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="region_owner"
+ top_delta="0"
+ value="moose Van Moose"
+ width="195" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="region_group_label"
+ top_pad="5"
+ value="Group:"
+ width="80" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="region_group"
+ top_delta="0"
+ use_ellipses="true"
+ width="195">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button
+ follows="bottom|right"
+ height="19"
+ label="Region/Estate"
+ layout="topleft"
+ name="region_info_btn"
+ right="-5"
+ tab_stop="false"
+ width="105">
+ <click_callback
+ function="ShowFloater"
+ parameter="region_info" />
+ </button>
+ </panel>
+ </accordion_tab>
+ <accordion_tab
+ expanded="false"
+ layout="topleft"
+ name="estate_information_tab"
+ title="Estate">
+ <panel
+ follows="all"
+ height="189"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="estate_name_label"
+ top_pad="5"
+ value="Estate:"
+ width="80" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="90"
+ name="estate_name"
+ top_delta="0"
+ width="160" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="estate_rating_label"
+ top_pad="5"
+ value="Rating:"
+ width="80" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="90"
+ name="estate_rating"
+ top_delta="0"
+ width="160" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="estate_owner_label"
+ top_pad="5"
+ value="Owner:"
+ width="80" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="90"
+ name="estate_owner"
+ top_delta="0"
+ width="160" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="covenant_label"
+ top_pad="5"
+ value="Covenant:"
+ width="220" />
+ <text_editor
+ bg_focus_color="DkGray2"
+ bg_readonly_color="DkGray2"
+ follows="left|top|right"
+ handle_edit_keys_directly="true"
+ height="90"
+ layout="topleft"
+ left="10"
+ max_length="65535"
+ name="covenant"
+ read_only="true"
+ top_pad="0"
+ width="280" />
+ </panel>
+ </accordion_tab>
+ <accordion_tab
+ expanded="false"
+ layout="topleft"
+ name="sales_tab"
+ title="For Sale">
+ <panel
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="290">
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="sales_price_label"
+ top_pad="5"
+ value="Price:"
+ width="100" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="110"
+ name="sales_price"
+ top_delta="0"
+ width="140" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="area_label"
+ top_pad="5"
+ value="Area:"
+ width="100" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="110"
+ name="area"
+ top_delta="0"
+ width="140" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="traffic_label"
+ top_pad="5"
+ value="Traffic:"
+ width="100" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="110"
+ name="traffic"
+ top_delta="0"
+ width="140" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="primitives_label"
+ top_pad="5"
+ value="Primitives:"
+ width="100" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="110"
+ name="primitives"
+ top_delta="0"
+ width="140" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="parcel_scripts_label"
+ top_pad="5"
+ value="Scripts:"
+ width="100" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="110"
+ name="parcel_scripts"
+ top_delta="0"
+ width="140" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="terraform_limits_label"
+ top_pad="5"
+ value="Terraform limits:"
+ width="100" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="110"
+ name="terraform_limits"
+ top_delta="0"
+ width="140" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="subdivide_label"
+ top_pad="5"
+ value="Subdivide/Join ability:"
+ width="220" />
+ <text_editor
+ bg_focus_color="DkGray2"
+ bg_readonly_color="DkGray2"
+ follows="left|top|right"
+ height="45"
+ layout="topleft"
+ left="10"
+ max_length="65535"
+ name="subdivide"
+ read_only="true"
+ top_pad="5"
+ width="245" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="resale_label"
+ top_pad="5"
+ value="ReSale ability:"
+ width="80" />
+ <text_editor
+ bg_focus_color="DkGray2"
+ bg_readonly_color="DkGray2"
+ follows="left|top|right"
+ height="45"
+ layout="topleft"
+ left="10"
+ max_length="65535"
+ name="resale"
+ read_only="true"
+ top_pad="5"
+ width="245" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="sale_to_label"
+ top_pad="5"
+ value="For sale to:"
+ width="80" />
+ <text
+ follows="left|top|right"
+ height="15"
+ layout="topleft"
+ left="90"
+ name="sale_to"
+ top_delta="0"
+ width="160" />
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 5aa53ab46b..87ac5be74a 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -40,14 +40,26 @@ background_visible="true"
top_pad="10"
width="313" />
<panel
- class="panel_place_info"
- filename="panel_place_info.xml"
+ class="panel_place_profile"
+ filename="panel_place_profile.xml"
follows="all"
height="533"
layout="topleft"
left="0"
help_topic="places_info_tab"
- name="panel_place_info"
+ name="panel_place_profile"
+ top="5"
+ visible="false"
+ width="313" />
+ <panel
+ class="panel_landmark_info"
+ filename="panel_landmark_info.xml"
+ follows="all"
+ height="533"
+ layout="topleft"
+ left="0"
+ help_topic="places_info_tab"
+ name="panel_landmark_info"
top="5"
visible="false"
width="313" />
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 5af7d7d674..c3a92f9d9a 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -157,7 +157,7 @@
value="http://librarianavengers.org"
width="280"
word_wrap="false"
- use_elipsis="true"
+ use_ellipses="true"
/>
<text
follows="left|top"
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 195b731531..4b2e901718 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -36,7 +36,7 @@
text_color="white"
top="0"
value="(Loading...)"
- use_elipsis="true"
+ use_ellipses="true"
width="275" />
<text
follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
index ab4ad94089..6171be034f 100644
--- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
@@ -15,14 +15,14 @@
image_disabled_selected="ComboButton_Disabled_Selected" />
<gesture_combo_box.drop_down_button name="Drop Down Button"
label=""
+ halign="center"
hover_glow_amount="0.15"
font="SansSerif"
scale_image="true"
- pad_right="24"
- image_unselected="DropDown_Off"
- image_selected="DropDown_Selected"
- image_disabled="DropDown_Disabled"
- image_disabled_selected="DropDown_Disabled_Selected" />
+ image_unselected="PushButton_Off"
+ image_selected="PushButton_Selected"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Selected_Disabled" />
<gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
scroll_bar_bg_visible="true" />
<gesture_combo_box.combo_editor name="Combo Text Entry"