summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Bennetts <steve@lindenlab.com>2009-07-02 00:38:13 +0000
committerSteven Bennetts <steve@lindenlab.com>2009-07-02 00:38:13 +0000
commit39905b927d60e204438705728d2c214cb3f9ef81 (patch)
tree7bb617cc204514b233e081457d905693aa0ae409
parent687cff0eb8dfe663b99e18cfd953e0764d8ab372 (diff)
merge https://svn.aws.productengine.com/secondlife/export-from-ll/viewer-2-0@873 https://svn.aws.productengine.com/secondlife/pe/stable@888 -> viewer-2.0.0-pe-4
-rw-r--r--indra/llui/llpanel.cpp4
-rw-r--r--indra/llui/llpanel.h5
-rw-r--r--indra/llui/lluictrl.cpp18
-rw-r--r--indra/llui/lluictrl.h11
-rw-r--r--indra/newview/llagent.cpp12
-rw-r--r--indra/newview/llavatarlist.cpp10
-rw-r--r--indra/newview/llavatarlist.h3
-rw-r--r--indra/newview/llavatarpropertiesprocessor.cpp1
-rw-r--r--indra/newview/llbottomtray.cpp208
-rw-r--r--indra/newview/llbottomtray.h39
-rw-r--r--indra/newview/llchatbar.cpp9
-rw-r--r--indra/newview/llchiclet.cpp248
-rw-r--r--indra/newview/llchiclet.h18
-rw-r--r--indra/newview/llgesturemgr.cpp3
-rw-r--r--indra/newview/llgrouplist.cpp20
-rw-r--r--indra/newview/llgrouplist.h2
-rw-r--r--indra/newview/llmenucommands.cpp4
-rw-r--r--indra/newview/llpanelavatar.cpp139
-rw-r--r--indra/newview/llpanelavatar.h15
-rw-r--r--indra/newview/llpanellandmarks.cpp27
-rw-r--r--indra/newview/llpanellandmarks.h1
-rw-r--r--indra/newview/llpanelpeople.cpp207
-rw-r--r--indra/newview/llpanelpeople.h17
-rw-r--r--indra/newview/llpanelpick.cpp188
-rw-r--r--indra/newview/llpanelpick.h28
-rw-r--r--indra/newview/llpanelpicks.cpp352
-rw-r--r--indra/newview/llpanelpicks.h44
-rw-r--r--indra/newview/llpanelplaceinfo.cpp54
-rw-r--r--indra/newview/llpanelplaceinfo.h11
-rw-r--r--indra/newview/llpanelplaces.cpp11
-rw-r--r--indra/newview/llpanelplacestab.cpp21
-rw-r--r--indra/newview/llpanelplacestab.h6
-rw-r--r--indra/newview/llpanelprofileview.cpp6
-rw-r--r--indra/newview/llpanelteleporthistory.cpp40
-rw-r--r--indra/newview/llpanelteleporthistory.h3
-rw-r--r--indra/newview/llsidetray.cpp4
-rw-r--r--indra/newview/lltoolgrab.cpp1
-rw-r--r--indra/newview/lltoolpie.cpp1
-rw-r--r--indra/newview/llviewergesture.cpp4
-rw-r--r--indra/newview/llviewerwindow.cpp47
-rw-r--r--indra/newview/skins/default/textures/image_edit_icon.tgabin0 -> 3116 bytes
-rw-r--r--indra/newview/skins/default/xui/en/accordion_parent.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_picks.xml46
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml31
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmark_info.xml442
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml281
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml34
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml34
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_list_item.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml72
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml249
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml50
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/side_tray.xml16
59 files changed, 2037 insertions, 1177 deletions
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 0136a41d61..3a76e72868 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -869,12 +869,12 @@ void LLPanel::childSetAction(const std::string& id, boost::function<void(void*)>
}
}
-void LLPanel::childSetActionTextbox(const std::string& id, void(*function)(void*), void* value)
+void LLPanel::childSetActionTextbox(const std::string& id, boost::function<void(void*)> function, void* value)
{
LLTextBox* textbox = findChild<LLTextBox>(id);
if (textbox)
{
- textbox->setClickedCallback(function, value);
+ textbox->setClickedCallback(boost::bind(function, value));
}
}
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index fc40cd77eb..c38e9df53b 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -235,7 +235,10 @@ public:
// LLButton
void childSetAction(const std::string& id, boost::function<void(void*)> function, void* value = NULL);
- void childSetActionTextbox(const std::string& id, void(*function)(void*), void* value = NULL);
+
+ // LLTextBox
+ void childSetActionTextbox(const std::string& id, boost::function<void(void*)> function, void* value = NULL);
+
void childSetControlName(const std::string& id, const std::string& control_name);
// Error reporting
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 7b378fd9c7..0fbcf24c49 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -48,6 +48,8 @@ LLUICtrl::Params::Params()
commit_callback("commit_callback"),
validate_callback("validate_callback"),
rightclick_callback("rightclick_callback"),
+ mouseenter_callback("mouseenter_callback"),
+ mouseleave_callback("mouseleave_callback"),
control_name("control_name")
{
addSynonym(initial_value, "initial_val");
@@ -200,6 +202,11 @@ void LLUICtrl::initFromParams(const Params& p)
if(p.rightclick_callback.isProvided())
initCommitCallback(p.rightclick_callback, mRightClickSignal);
+ if(p.mouseenter_callback.isProvided())
+ initCommitCallback(p.mouseenter_callback, mMouseEnterSignal);
+
+ if(p.mouseleave_callback.isProvided())
+ initCommitCallback(p.mouseleave_callback, mMouseLeaveSignal);
}
@@ -264,6 +271,17 @@ void LLUICtrl::initEnableCallback(const EnableCallbackParam& cb, enable_signal_t
}
}
+// virtual
+void LLUICtrl::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ mMouseEnterSignal(this, getValue());
+}
+
+// virtual
+void LLUICtrl::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mMouseLeaveSignal(this, getValue());
+}
void LLUICtrl::onCommit()
{
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 6dfbd9cf8b..2b9caa2a82 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -145,6 +145,9 @@ public:
Optional<EnableCallbackParam> validate_callback;
Optional<CommitCallbackParam> rightclick_callback;
+
+ Optional<CommitCallbackParam> mouseenter_callback;
+ Optional<CommitCallbackParam> mouseleave_callback;
Optional<focus_callback_t> focus_lost_callback;
@@ -181,6 +184,8 @@ public:
/*virtual*/ BOOL isCtrl() const;
/*virtual*/ void setTentative(BOOL b);
/*virtual*/ BOOL getTentative() const;
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
// From LLFocusableElement
/*virtual*/ void setFocus( BOOL b );
@@ -246,6 +251,9 @@ public:
boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb ) { return mCommitSignal.connect(cb); }
boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb ) { return mValidateSignal.connect(cb); }
+
+ boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mMouseEnterSignal.connect(cb); }
+ boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mMouseLeaveSignal.connect(cb); }
// *TODO: Deprecate; for backwards compatability only:
boost::signals2::connection setCommitCallback( boost::function<void (LLUICtrl*,void*)> cb, void* data);
@@ -275,6 +283,9 @@ protected:
enable_signal_t mValidateSignal;
commit_signal_t mRightClickSignal;
+ commit_signal_t mMouseEnterSignal;
+ commit_signal_t mMouseLeaveSignal;
+
LLViewModelPtr mViewModel;
LLControlVariable* mControlVariable;
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index a8094a5850..8a050539d7 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2724,7 +2724,8 @@ void LLAgent::startTyping()
{
sendAnimationRequest(ANIM_AGENT_TYPE, ANIM_REQUEST_START);
}
- LLBottomTray::getInstance()->sendChatFromViewer("", CHAT_TYPE_START, FALSE);
+ if(gBottomTray)
+ gBottomTray->sendChatFromViewer("", CHAT_TYPE_START, FALSE);
}
//-----------------------------------------------------------------------------
@@ -2736,7 +2737,8 @@ void LLAgent::stopTyping()
{
clearRenderState(AGENT_STATE_TYPING);
sendAnimationRequest(ANIM_AGENT_TYPE, ANIM_REQUEST_STOP);
- LLBottomTray::getInstance()->sendChatFromViewer("", CHAT_TYPE_STOP, FALSE);
+ if(gBottomTray)
+ gBottomTray->sendChatFromViewer("", CHAT_TYPE_STOP, FALSE);
}
}
@@ -2811,7 +2813,8 @@ void LLAgent::endAnimationUpdateUI()
LLNavigationBar::getInstance()->setVisible(TRUE);
gStatusBar->setVisibleForMouselook(true);
- LLBottomTray::getInstance()->setVisible(TRUE);
+ if(gBottomTray)
+ gBottomTray->setVisible(TRUE);
LLSideTray::getInstance()->setVisible(TRUE);
@@ -2901,7 +2904,8 @@ void LLAgent::endAnimationUpdateUI()
LLNavigationBar::getInstance()->setVisible(FALSE);
gStatusBar->setVisibleForMouselook(false);
- LLBottomTray::getInstance()->setVisible(FALSE);
+ if(gBottomTray)
+ gBottomTray->setVisible(FALSE);
LLSideTray::getInstance()->setVisible(FALSE);
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 08f0cf8842..449bcc4f0b 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -117,7 +117,13 @@ void LLAvatarList::addItem(const LLUUID& id, const std::string& name, BOOL is_bo
}
}
-BOOL LLAvatarList::updateList(const std::vector<LLUUID>& all_buddies)
+static bool findInsensitive(std::string haystack, const std::string& needle_upper)
+{
+ LLStringUtil::toUpper(haystack);
+ return haystack.find(needle_upper) != std::string::npos;
+}
+
+BOOL LLAvatarList::update(const std::vector<LLUUID>& all_buddies, const std::string& name_filter)
{
BOOL have_names = TRUE;
@@ -133,6 +139,8 @@ BOOL LLAvatarList::updateList(const std::vector<LLUUID>& all_buddies)
std::string name;
const LLUUID& buddy_id = *buddy_it;
have_names &= gCacheName->getFullName(buddy_id, name);
+ if (name_filter != LLStringUtil::null && !findInsensitive(name, name_filter))
+ continue;
addItem(buddy_id, name, LLAvatarTracker::instance().isBuddyOnline(buddy_id));
}
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 9bd9ce8e0e..9dba719fee 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -53,7 +53,8 @@ public:
LLAvatarList(const Params&);
virtual ~LLAvatarList() {}
- BOOL updateList(const std::vector<LLUUID>& all_buddies);
+ BOOL update(const std::vector<LLUUID>& all_buddies,
+ const std::string& name_filter = LLStringUtil::null);
protected:
std::vector<LLUUID> getSelectedIDs();
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index e27da5663b..5a92888cef 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -102,6 +102,7 @@ void LLAvatarPropertiesProcessor::sendDataRequest(const LLUUID& avatar_id, EAvat
if (data) {
sendPickInfoRequest(avatar_id, *static_cast<const LLUUID*>(data));
}
+ break;
case APT_NOTES:
sendGenericRequest(avatar_id, "avatarnotesrequest");
break;
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 616cbb1fdb..d26da81179 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -38,53 +38,81 @@
#include "llkeyboard.h"
#include "llgesturemgr.h"
#include "llanimationstates.h"
+#include "llmultigesture.h"
//FIXME: temporary, for send_chat_from_viewer() proto
#include "llchatbar.h"
+//
+// Globals
+//
+//FIXME: made it adjustable
+const F32 AGENT_TYPING_TIMEOUT = 5.f; // seconds
+
+LLBottomTray* gBottomTray = NULL;
+
LLBottomTray::LLBottomTray()
- :mLastSpecialChatChannel(0)
+ : mLastSpecialChatChannel(0)
+ , mGestureLabelTimer()
{
LLUICtrlFactory::getInstance()->buildPanel(this,"panel_bottomtray.xml");
mChicletPanel = getChild<LLChicletPanel>("chiclet_list",TRUE,FALSE);
+ mIMWell = getChild<LLNotificationChiclet>("im_well",TRUE,FALSE);
+ mSysWell = getChild<LLNotificationChiclet>("sys_well",TRUE,FALSE);
+ mSeparator = getChild<LLViewBorder>("well_separator",TRUE,FALSE);
+ mChatBox = getChild<LLLineEditor>("chat_box",TRUE,FALSE);
+
+ if (mChatBox)
+ {
+ mChatBox->setCommitCallback(boost::bind(&LLBottomTray::onChatBoxCommit, this));
+ mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this);
+ mChatBox->setFocusLostCallback(&onChatBoxFocusLost, this);
+
+ mChatBox->setIgnoreArrowKeys(TRUE);
+ mChatBox->setCommitOnFocusLost( FALSE );
+ mChatBox->setRevertOnEsc( FALSE );
+ mChatBox->setIgnoreTab(TRUE);
+ mChatBox->setPassDelete(TRUE);
+ mChatBox->setReplaceNewlinesWithSpaces(FALSE);
+ mChatBox->setMaxTextLength(1023);
+ mChatBox->setEnableLineHistory(TRUE);
+
+ }
+
+ mGestureCombo = getChild<LLComboBox>( "Gesture", TRUE, FALSE);
+ if (mGestureCombo)
+ {
+ mGestureCombo->setCommitCallback(boost::bind(&LLBottomTray::onCommitGesture, this, _1));
- LLLineEditor* chat_box = getChatBox();
- chat_box->setCommitCallback(boost::bind(&LLBottomTray::onChatBoxCommit, this));
- chat_box->setKeystrokeCallback(&onChatBoxKeystroke, this);
- chat_box->setFocusLostCallback(&onChatBoxFocusLost, this);
+ // now register us as observer since we have a place to put the results
+ gGestureManager.addObserver(this);
+
+ // refresh list from current active gestures
+ refreshGestures();
+ }
LLIMMgr::getInstance()->addSessionObserver(this);
}
LLBottomTray::~LLBottomTray()
{
+ gGestureManager.removeObserver(this);
if (!LLSingleton<LLIMMgr>::destroyed())
{
LLIMMgr::getInstance()->removeSessionObserver(this);
}
}
-LLLineEditor* LLBottomTray::getChatBox()
-{
- return getChild<LLLineEditor>("chat_box",TRUE,FALSE);
-}
-
void LLBottomTray::onChatBoxCommit()
{
- if (getChatBox()->getText().length() > 0)
+ if (mChatBox && mChatBox->getText().length() > 0)
{
sendChat(CHAT_TYPE_NORMAL);
-
- LLLineEditor* chat_box = getChatBox();
-
- if (chat_box)
- {
- chat_box->setText(LLStringExplicit(""));
- }
-
- gAgent.stopTyping();
+ mChatBox->setText(LLStringExplicit(""));
}
+
+ gAgent.stopTyping();
}
void LLBottomTray::sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate)
@@ -219,6 +247,105 @@ void LLBottomTray::onChatBoxFocusLost(LLFocusableElement* caller, void* userdata
gAgent.stopTyping();
}
+void LLBottomTray::refresh()
+{
+ // HACK: Leave the name of the gesture in place for a few seconds.
+ const F32 SHOW_GESTURE_NAME_TIME = 2.f;
+ if (mGestureLabelTimer.getStarted() && mGestureLabelTimer.getElapsedTimeF32() > SHOW_GESTURE_NAME_TIME)
+ {
+ LLCtrlListInterface* gestures = mGestureCombo ? mGestureCombo->getListInterface() : NULL;
+ if (gestures) gestures->selectFirstItem();
+ mGestureLabelTimer.stop();
+ }
+
+ if ((gAgent.getTypingTime() > AGENT_TYPING_TIMEOUT) && (gAgent.getRenderState() & AGENT_STATE_TYPING))
+ {
+ gAgent.stopTyping();
+ }
+}
+
+void LLBottomTray::onCommitGesture(LLUICtrl* ctrl)
+{
+ LLCtrlListInterface* gestures = mGestureCombo ? mGestureCombo->getListInterface() : NULL;
+ if (gestures)
+ {
+ S32 index = gestures->getFirstSelectedIndex();
+ if (index == 0)
+ {
+ return;
+ }
+ const std::string& trigger = gestures->getSelectedValue().asString();
+
+ // pretend the user chatted the trigger string, to invoke
+ // substitution and logging.
+ std::string text(trigger);
+ std::string revised_text;
+ gGestureManager.triggerAndReviseString(text, &revised_text);
+
+ revised_text = utf8str_trim(revised_text);
+ if (!revised_text.empty())
+ {
+ // Don't play nodding animation
+ sendChatFromViewer(revised_text, CHAT_TYPE_NORMAL, FALSE);
+ }
+ }
+ mGestureLabelTimer.start();
+ if (mGestureCombo != NULL)
+ {
+ // free focus back to chat bar
+ mGestureCombo->setFocus(FALSE);
+ }
+}
+
+void LLBottomTray::refreshGestures()
+{
+ if (mGestureCombo)
+ {
+
+ //store current selection so we can maintain it
+ std::string cur_gesture = mGestureCombo->getValue().asString();
+ mGestureCombo->selectFirstItem();
+ std::string label = mGestureCombo->getValue().asString();;
+ // clear
+ mGestureCombo->clearRows();
+
+ // collect list of unique gestures
+ std::map <std::string, BOOL> unique;
+ LLGestureManager::item_map_t::iterator it;
+ for (it = gGestureManager.mActive.begin(); it != gGestureManager.mActive.end(); ++it)
+ {
+ LLMultiGesture* gesture = (*it).second;
+ if (gesture)
+ {
+ if (!gesture->mTrigger.empty())
+ {
+ unique[gesture->mTrigger] = TRUE;
+ }
+ }
+ }
+
+ // add unique gestures
+ std::map <std::string, BOOL>::iterator it2;
+ for (it2 = unique.begin(); it2 != unique.end(); ++it2)
+ {
+ mGestureCombo->addSimpleElement((*it2).first);
+ }
+
+ mGestureCombo->sortByName();
+ // Insert label after sorting, at top, with separator below it
+ mGestureCombo->addSeparator(ADD_TOP);
+ mGestureCombo->addSimpleElement(getString("gesture_label"), ADD_TOP);
+
+ if (!cur_gesture.empty())
+ {
+ mGestureCombo->selectByValue(LLSD(cur_gesture));
+ }
+ else
+ {
+ mGestureCombo->selectFirstItem();
+ }
+ }
+}
//virtual
void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
@@ -236,8 +363,6 @@ void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& nam
LLIMChiclet* chicklet = (LLIMChiclet *)getChicletPanel()->createChiclet(&sid);
chicklet->setIMSessionName(name);
chicklet->setOtherParticipantId(other_participant_id);
-
- getChicletPanel()->arrange();
}
}
}
@@ -249,21 +374,48 @@ void LLBottomTray::sessionRemoved(const LLUUID& session_id)
{
LLSD sid(session_id);
getChicletPanel()->removeIMChiclet(&sid);
- getChicletPanel()->arrange();
}
}
-void LLBottomTray::sendChat( EChatType type )
+//virtual
+void LLBottomTray::onFocusLost()
+{
+ if (gAgent.cameraMouselook())
+ {
+ setVisible(FALSE);
+ }
+}
+
+//virtual
+void LLBottomTray::onVisibilityChange(BOOL curVisibilityIn)
{
- LLLineEditor* chat_box = getChatBox();
+ BOOL visibility = gAgent.cameraMouselook() ? false : true;
+
+ if (mChicletPanel && mChicletPanel->getVisible() == visibility)
+ return;
+
+ if (mChicletPanel)
+ mChicletPanel->setVisible(visibility);
+
+ if (mIMWell)
+ mIMWell->setVisible(visibility);
- if (chat_box)
+ if (mSysWell)
+ mSysWell->setVisible(visibility);
+
+ if (mSeparator)
+ mSeparator->setVisible(visibility);
+}
+
+void LLBottomTray::sendChat( EChatType type )
+{
+ if (mChatBox)
{
- LLWString text = chat_box->getConvertedText();
+ LLWString text = mChatBox->getConvertedText();
if (!text.empty())
{
// store sent line in history, duplicates will get filtered
- chat_box->updateHistory();
+ mChatBox->updateHistory();
// Check if this is destined for another channel
S32 channel = 0;
stripChannelNumber(text, &channel);
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 780e1b270d..7d842a0aad 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -37,6 +37,7 @@
#include "llflyoutbutton.h"
#include "llimview.h"
#include "llchat.h"
+#include "llgesturemgr.h"
class LLChicletPanel;
class LLNotificationChiclet;
@@ -44,22 +45,19 @@ class LLNotificationChiclet;
class LLTalkButton;
class LLBottomTray
- : public LLSingleton<LLBottomTray>
- , public LLPanel
+ : public LLPanel
, public LLIMSessionObserver
+ , LLGestureManagerObserver
{
public:
LLBottomTray();
~LLBottomTray();
- LLLineEditor* getChatBox();
-
- LLChicletPanel* getChicletPanel() {return mChicletPanel;};
-
- LLNotificationChiclet* getIMWell() {return mIMWell;};
-
- LLNotificationChiclet* getNotificationWell(){return mNotificationWell;};
+ LLLineEditor* getChatBox() {return mChatBox;}
+ LLChicletPanel* getChicletPanel() {return mChicletPanel;}
+ LLNotificationChiclet* getIMWell() {return mIMWell;}
+ LLNotificationChiclet* getSysWell() {return mSysWell;}
void onChatBoxCommit();
void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);
@@ -67,10 +65,21 @@ public:
static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata);
static void onChatBoxFocusLost(LLFocusableElement* caller, void* userdata);
+ void refresh();
+
+ void onCommitGesture(LLUICtrl* ctrl);
+ void refreshGestures();
+
// LLIMSessionObserver observe triggers
virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
virtual void sessionRemoved(const LLUUID& session_id);
+ // LLGestureManagerObserver trigger
+ virtual void changed() { refreshGestures(); }
+
+ virtual void onFocusLost();
+ virtual void onVisibilityChange(BOOL curVisibilityIn);
+
protected:
void sendChat( EChatType type );
@@ -79,10 +88,14 @@ protected:
// Which non-zero channel did we last chat on?
S32 mLastSpecialChatChannel;
- LLChicletPanel* mChicletPanel;
- LLNotificationChiclet* mIMWell;
- LLNotificationChiclet* mNotificationWell;
- LLTalkButton* mTalkBtn;
+ LLLineEditor* mChatBox;
+ LLChicletPanel* mChicletPanel;
+ LLNotificationChiclet* mIMWell;
+ LLNotificationChiclet* mSysWell;
+ LLViewBorder* mSeparator;
+ LLTalkButton* mTalkBtn;
+ LLComboBox* mGestureCombo;
+ LLFrameTimer mGestureLabelTimer;
};
extern LLBottomTray* gBottomTray;
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 5e97157694..b94229704f 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -415,9 +415,10 @@ void LLChatBar::sendChat( EChatType type )
void LLChatBar::startChat(const char* line)
{
//TODO* remove DUMMY chat
- if(LLBottomTray::getInstance()->getChatBox())
+ if(gBottomTray && gBottomTray->getChatBox())
{
- LLBottomTray::getInstance()->getChatBox()->setFocus(TRUE);
+ gBottomTray->setVisible(TRUE);
+ gBottomTray->getChatBox()->setFocus(TRUE);
}
// *TODO Vadim: Why was this code commented out?
@@ -441,9 +442,9 @@ void LLChatBar::startChat(const char* line)
void LLChatBar::stopChat()
{
//TODO* remove DUMMY chat
- if(LLBottomTray::getInstance()->getChatBox())
+ if(gBottomTray && gBottomTray->getChatBox())
{
- LLBottomTray::getInstance()->getChatBox()->setFocus(FALSE);
+ gBottomTray->getChatBox()->setFocus(FALSE);
}
// *TODO Vadim: Why was this code commented out?
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index d8e844d291..811ce39228 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -264,7 +264,7 @@ void LLIMChiclet::setShowSpeaker(bool show)
void LLIMChiclet::draw()
{
LLUICtrl::draw();
- gl_rect_2d(1, getRect().getHeight(), getRect().getWidth(), 1, LLColor4(0.0f,0.0f,0.0f,1.f), FALSE);
+ gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 1, LLColor4(0.0f,0.0f,0.0f,1.f), FALSE);
}
S32 LLIMChiclet::calcCounterWidth()
@@ -281,27 +281,27 @@ S32 LLIMChiclet::calcCounterWidth()
LLChicletPanel::LLChicletPanel(const Params&p)
: LLPanel(p)
+, mScrollArea(NULL)
, mLeftScroll(NULL)
, mRightScroll(NULL)
-, mFirstToShow(0)
{
LLButton::Params params;
params.name("scroll_left");
params.label(LLStringUtil::null);
params.tab_stop(false);
- params.image_selected(LLUI::getUIImage("scroll_left.tga"));
- params.image_unselected(LLUI::getUIImage("scroll_left.tga"));
- params.image_hover_selected(LLUI::getUIImage("scroll_left.tga"));
+ params.image_selected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
+ params.image_unselected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
+ params.image_hover_selected(LLUI::getUIImage("bottom_tray_scroll_left.tga"));
mLeftScroll = LLUICtrlFactory::create<LLButton>(params);
addChild(mLeftScroll);
mLeftScroll->setClickedCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this));
mLeftScroll->setEnabled(false);
params.name("scroll_right");
- params.image_selected(LLUI::getUIImage("scroll_right.tga"));
- params.image_unselected(LLUI::getUIImage("scroll_right.tga"));
- params.image_hover_selected(LLUI::getUIImage("scroll_right.tga"));
+ params.image_selected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
+ params.image_unselected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
+ params.image_hover_selected(LLUI::getUIImage("bottom_tray_scroll_right.tga"));
mRightScroll = LLUICtrlFactory::create<LLButton>(params);
addChild(mRightScroll);
mRightScroll->setClickedCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this));
@@ -317,19 +317,6 @@ LLChicletPanel::~LLChicletPanel()
}
-LLChicletPanel* LLChicletPanel::create()
-{
- LLChicletPanel* panel = new LLChicletPanel(LLChicletPanel::Params());
- return panel;
-}
-
-BOOL LLChicletPanel::postBuild()
-{
- LLPanel::postBuild();
-
- return TRUE;
-}
-
LLChiclet* LLChicletPanel::createChiclet(LLSD* imSessionId, S32 pos)
{
LLChiclet* chiclet = LLIMChiclet::create(imSessionId);
@@ -352,10 +339,20 @@ bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 pos)
{
if(mScrollArea->addChild(chiclet))
{
+ // if first chiclet is scrolled left, the created one should be scrolled left too
+ if(0 == pos && canScrollLeft())
+ {
+ LLRect first_chiclet_rect = getChiclet(0)->getRect();
+ chiclet->setRect(first_chiclet_rect);
+ }
+
mChicletList.insert(mChicletList.begin() + pos, chiclet);
chiclet->setLeftButtonClickCallback(boost::bind(&LLChicletPanel::onChicletClick, this, _1, _2));
+ arrange();
+ showScrollButtonsIfNeeded();
+
return true;
}
@@ -378,6 +375,7 @@ LLChiclet* LLChicletPanel::findIMChiclet(LLSD* imSessionId)
chiclet_list_t::const_iterator it = mChicletList.begin();
for( ; mChicletList.end() != it; ++it)
{
+ // Only IM Chiclets have session id, skip non IM Chiclets
LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
if(!chiclet)
{
@@ -394,21 +392,35 @@ LLChiclet* LLChicletPanel::findIMChiclet(LLSD* imSessionId)
LLChiclet* LLChicletPanel::getChiclet(S32 pos)
{
- return mChicletList.at(pos);
+ return mChicletList[pos];
}
void LLChicletPanel::removeChiclet(chiclet_list_t::iterator it)
{
+ // if possible, after deletion shift chiclets right
+ if(canScrollLeft() && !canScrollRight())
+ {
+ LLChiclet* chiclet = *it;
+ LLRect first_chiclet_rect = getChiclet(0)->getRect();
+ S32 deleted_chiclet_width = chiclet->getRect().getWidth();
+ deleted_chiclet_width += CHICLET_PADDING;
+
+ first_chiclet_rect.mLeft += deleted_chiclet_width;
+ first_chiclet_rect.mRight += deleted_chiclet_width;
+
+ getChiclet(0)->setRect(first_chiclet_rect);
+ }
+
mScrollArea->removeChild(*it);
- delete *it;
mChicletList.erase(it);
- mLeftScroll->setEnabled(canScrollLeft());
- mRightScroll->setEnabled(canScrollRight());
+
+ arrange();
+ showScrollButtonsIfNeeded();
}
void LLChicletPanel::removeChiclet(S32 pos)
{
- if(0 > pos || getChicletCount() >= pos)
+ if(0 > pos || getChicletCount() <= pos)
{
return;
}
@@ -434,6 +446,7 @@ void LLChicletPanel::removeIMChiclet(LLSD* imSessionId)
chiclet_list_t::iterator it = mChicletList.begin();
for( ; mChicletList.end() != it; ++it)
{
+ // Only IM Chiclets have session id, skip non IM Chiclets
LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
if(!chiclet)
{
@@ -453,8 +466,8 @@ void LLChicletPanel::removeAll()
mScrollArea->deleteAllChildren();
mChicletList.erase(mChicletList.begin(), mChicletList.end());
- mLeftScroll->setEnabled(false);
- mRightScroll->setEnabled(false);
+
+ showScrollButtonsIfNeeded();
}
void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent )
@@ -463,41 +476,92 @@ void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent )
mLeftScroll->setRect(LLRect(0,CHICLET_HEIGHT,SCROLL_BUTTON_WIDTH,
CHICLET_HEIGHT - SCROLL_BUTTON_HEIGHT));
- mRightScroll->setRect(LLRect(getRect().getWidth()-SCROLL_BUTTON_WIDTH,CHICLET_HEIGHT,
- getRect().getWidth(),CHICLET_HEIGHT - SCROLL_BUTTON_HEIGHT));
+ mRightScroll->setRect(LLRect(width-SCROLL_BUTTON_WIDTH,CHICLET_HEIGHT,
+ width,CHICLET_HEIGHT - SCROLL_BUTTON_HEIGHT));
+
+ S32 old_scroll_width = mScrollArea->getRect().getWidth();
mScrollArea->setRect(LLRect(SCROLL_BUTTON_WIDTH + 5,CHICLET_HEIGHT + 1,
- getRect().getWidth() - SCROLL_BUTTON_WIDTH - 5, 0));
+ width - SCROLL_BUTTON_WIDTH - 5, 0));
+ S32 current_scroll_width = mScrollArea->getRect().getWidth();
+ reshapeScrollArea(current_scroll_width - old_scroll_width);
- arrange();
+ showScrollButtonsIfNeeded();
+}
+
+void LLChicletPanel::reshapeScrollArea(S32 delta_width)
+{
+ if(mChicletList.empty())
+ return;
+
+ S32 last_chiclet_right = (*mChicletList.rbegin())->getRect().mRight;
+ S32 scroll_width = mScrollArea->getRect().getWidth();
+
+ // Align all chiclets to last chiclet
+ // if there is a gap between last chiclet and scroll area right side
+ // or last chiclet is at visible area right side
+ if( last_chiclet_right < scroll_width
+ || last_chiclet_right == scroll_width - delta_width)
+ {
+ LLRect first_chiclet_rect = getChiclet(0)->getRect();
+ // if we can right shift all chiclets
+ if(first_chiclet_rect.mLeft < 0)
+ {
+ first_chiclet_rect.mLeft += delta_width;
+ first_chiclet_rect.mRight += delta_width;
+
+ getChiclet(0)->setRect(first_chiclet_rect);
+
+ arrange();
+ }
+ }
}
void LLChicletPanel::arrange()
{
- S32 left = 0;
- S32 size = getChicletCount();
+ if(mChicletList.empty())
+ return;
- for( int n = mFirstToShow; n < size; ++n)
+ LLRect first_chiclet_rect = getChiclet(0)->getRect();
+ // don't allow gap between first chiclet and scroll area left side
+ if(first_chiclet_rect.mLeft > 0)
+ {
+ first_chiclet_rect.mRight = first_chiclet_rect.getWidth();
+ first_chiclet_rect.mLeft = 0;
+ }
+
+ S32 left = first_chiclet_rect.mLeft;
+
+ S32 size = getChicletCount();
+ for( int n = 0; n < size; ++n)
{
LLChiclet* chiclet = getChiclet(n);
S32 chiclet_width = chiclet->getRequiredRect().getWidth();
LLRect rc(left, CHICLET_HEIGHT, left + chiclet_width, 0);
chiclet->setRect(rc);
- chiclet->reshape(rc.getWidth(),rc.getHeight());
left += chiclet_width + CHICLET_PADDING;
}
+}
+
+void LLChicletPanel::showScrollButtonsIfNeeded()
+{
+ bool can_scroll_left = canScrollLeft();
+ bool can_scroll_right = canScrollRight();
- mLeftScroll->setEnabled(canScrollLeft());
- mRightScroll->setEnabled(canScrollRight());
+ mLeftScroll->setEnabled(can_scroll_left);
+ mRightScroll->setEnabled(can_scroll_right);
+
+ bool show_scroll_buttons = can_scroll_left || can_scroll_right;
+
+ mLeftScroll->setVisible(show_scroll_buttons);
+ mRightScroll->setVisible(show_scroll_buttons);
}
void LLChicletPanel::draw()
{
- //gl_rect_2d(0,getRect().getHeight(),getRect().getWidth(),0,LLColor4(0.f,1.f,1.f,1.f),TRUE);
-
child_list_const_iter_t it = getChildList()->begin();
for( ; getChildList()->end() != it; ++it)
{
@@ -516,36 +580,60 @@ void LLChicletPanel::draw()
bool LLChicletPanel::canScrollRight()
{
- S32 width = 0;
- LLRect visible_rect = mScrollArea->getRect();
+ if(mChicletList.empty())
+ return false;
+
+ S32 scroll_width = mScrollArea->getRect().getWidth();
+ S32 last_chiclet_right = (*mChicletList.rbegin())->getRect().mRight;
+
+ if(last_chiclet_right > scroll_width)
+ return true;
- chiclet_list_t::const_iterator it = mChicletList.begin() + mFirstToShow;
- for(;mChicletList.end() != it; ++it)
- {
- LLChiclet* chiclet = *it;
- width += chiclet->getRect().getWidth() + CHICLET_PADDING;
- if(width > visible_rect.getWidth())
- return true;
- }
return false;
}
bool LLChicletPanel::canScrollLeft()
{
- return mFirstToShow > 0;
+ if(mChicletList.empty())
+ return false;
+
+ return getChiclet(0)->getRect().mLeft < 0;
}
void LLChicletPanel::scroll(ScrollDirection direction)
{
- S32 elem = 0;
- if(SCROLL_LEFT == direction)
- elem = mFirstToShow;
- else if(SCROLL_RIGHT)
- elem = mFirstToShow - 1;
+ S32 first_visible_chiclet = getFirstVisibleChiclet();
+ if(-1 == first_visible_chiclet)
+ return;
- S32 offset = mChicletList[elem]->getRect().getWidth() +
- CHICLET_PADDING;
- offset *= direction;
+ S32 offset = 0;
+
+ if(SCROLL_LEFT == direction)
+ {
+ if(0 == first_visible_chiclet)
+ {
+ // shift chiclets in case first chiclet is partially visible
+ offset = llabs(getChiclet(first_visible_chiclet)->getRect().mLeft);
+ }
+ else
+ {
+ offset = getChiclet(first_visible_chiclet - 1)->getRect().getWidth() + CHICLET_PADDING;
+ }
+ }
+ else if(SCROLL_RIGHT == direction)
+ {
+ S32 last_chiclet_right = (*mChicletList.rbegin())->getRect().mRight;
+ S32 scroll_rect_width = mScrollArea->getRect().getWidth();
+
+ offset = getChiclet(first_visible_chiclet)->getRect().getWidth() + CHICLET_PADDING;
+ offset *= direction;
+ // if after scrolling, the last chiclet will not be aligned to
+ // scroll area right side - align it.
+ if( last_chiclet_right + offset < scroll_rect_width )
+ {
+ offset = scroll_rect_width - last_chiclet_right;
+ }
+ }
chiclet_list_t::const_iterator it = mChicletList.begin();
for(;mChicletList.end() != it; ++it)
@@ -555,14 +643,33 @@ void LLChicletPanel::scroll(ScrollDirection direction)
}
}
+S32 LLChicletPanel::getFirstVisibleChiclet()
+{
+ if(mChicletList.empty())
+ return -1;
+
+ for(int n = 0; n < getChicletCount(); ++n)
+ {
+ LLRect rc = getChiclet(n)->getRect();
+ if(n > 0)
+ rc.mLeft -= CHICLET_PADDING;
+ // bottom left of scroll area is first visible point
+ if(rc.pointInRect(0,0))
+ {
+ return n;
+ }
+ }
+
+ return -1;
+}
+
void LLChicletPanel::scrollLeft()
{
if(canScrollLeft())
{
- --mFirstToShow;
scroll(SCROLL_LEFT);
- mLeftScroll->setEnabled(canScrollLeft());
- mRightScroll->setEnabled(canScrollRight());
+
+ showScrollButtonsIfNeeded();
}
}
@@ -570,10 +677,9 @@ void LLChicletPanel::scrollRight()
{
if(canScrollRight())
{
- ++mFirstToShow;
scroll(SCROLL_RIGHT);
- mLeftScroll->setEnabled(canScrollLeft());
- mRightScroll->setEnabled(canScrollRight());
+
+ showScrollButtonsIfNeeded();
}
}
@@ -606,6 +712,10 @@ BOOL LLChicletPanel::handleScrollWheel(S32 x, S32 y, S32 clicks)
return TRUE;
}
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
LLTalkButton::LLTalkButton(const LLUICtrl::Params& p)
: LLUICtrl(p)
{
@@ -639,8 +749,8 @@ LLTalkButton::LLTalkButton(const LLUICtrl::Params& p)
show_params.tab_stop(false);
show_params.is_toggle(true);
show_params.picture_style(true);
- show_params.image_selected(LLUI::getUIImage("show_btn_selected.tga"));
- show_params.image_unselected(LLUI::getUIImage("show_btn.tga"));
+ show_params.image_selected(LLUI::getUIImage("talk_btn_right_selected.tga"));
+ show_params.image_unselected(LLUI::getUIImage("talk_btn_right.tga"));
mShowBtn = LLUICtrlFactory::create<LLButton>(show_params);
addChild(mShowBtn);
@@ -704,8 +814,8 @@ void LLTalkButton::onClick_ShowBtn()
mPrivateCallPanel = new LLVoiceControlPanel;
getRootView()->addChild(mPrivateCallPanel);
- y = LLBottomTray::getInstance()->getRect().getHeight()
- + mPrivateCallPanel->getRect().getHeight();
+ if(gBottomTray)
+ y = gBottomTray->getRect().getHeight() + mPrivateCallPanel->getRect().getHeight();
LLRect rect;
rect.setLeftTopAndSize(x, y, mPrivateCallPanel->getRect().getWidth(), mPrivateCallPanel->getRect().getHeight());
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 11c3356c46..65be9e183a 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -180,7 +180,7 @@ public:
Params(){};
};
- static LLChicletPanel* create();
+ ~LLChicletPanel();
LLChiclet* createChiclet(LLSD* imSessionId = NULL, S32 pos = 0);
@@ -200,10 +200,6 @@ public:
void removeAll();
- void arrange();
-
- ~LLChicletPanel();
-
void scrollLeft();
void scrollRight();
@@ -224,18 +220,22 @@ public:
void draw();
- BOOL postBuild();
-
protected:
LLChicletPanel(const Params&p);
friend class LLUICtrlFactory;
- bool needsScrolling();
+ void arrange();
bool canScrollRight();
bool canScrollLeft();
+ void showScrollButtonsIfNeeded();
+
+ S32 getFirstVisibleChiclet();
+
+ void reshapeScrollArea(S32 delta_width);
+
enum ScrollDirection
{
SCROLL_LEFT = 1,
@@ -255,8 +255,6 @@ protected:
chiclet_list_t mChicletList;
LLButton* mLeftScroll;
LLButton* mRightScroll;
- S32 mFirstToShow;
- S32 mLastToShow;
LLPanel* mScrollArea;
};
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 0f2951d9df..66ed680984 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -872,7 +872,8 @@ void LLGestureManager::runStep(LLMultiGesture* gesture, LLGestureStep* step)
const BOOL animate = FALSE;
- LLBottomTray::getInstance()->sendChatFromViewer(chat_text, CHAT_TYPE_NORMAL, animate);
+ if(gBottomTray)
+ gBottomTray->sendChatFromViewer(chat_text, CHAT_TYPE_NORMAL, animate);
gesture->mCurrentStep++;
break;
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index 5d0bcab07a..6473c85775 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -34,6 +34,9 @@
#include "llgrouplist.h"
+// libs
+#include "lltrans.h"
+
// newview
#include "llagent.h"
@@ -44,7 +47,13 @@ LLGroupList::LLGroupList(const Params& p)
{
}
-BOOL LLGroupList::updateList()
+static bool findInsensitive(std::string haystack, const std::string& needle_upper)
+{
+ LLStringUtil::toUpper(haystack);
+ return haystack.find(needle_upper) != std::string::npos;
+}
+
+BOOL LLGroupList::update(const std::string& name_filter)
{
LLCtrlListInterface *group_list = getListInterface();
const LLUUID& highlight_id = gAgent.getGroupID();
@@ -58,12 +67,17 @@ BOOL LLGroupList::updateList()
// *TODO: check powers mask?
id = gAgent.mGroups.get(i).mID;
const LLGroupData& group_data = gAgent.mGroups.get(i);
+ if (name_filter != LLStringUtil::null && !findInsensitive(group_data.mName, name_filter))
+ continue;
addItem(id, group_data.mName, highlight_id == id, ADD_BOTTOM);
}
// add "none" to list at top
- //name = LLTrans::getString("GroupsNone")
- addItem(LLUUID::null, std::string("none"), highlight_id.isNull(), ADD_TOP); // *TODO: localize
+ {
+ std::string loc_none = LLTrans::getString("GroupsNone");
+ if (name_filter == LLStringUtil::null || findInsensitive(loc_none, name_filter))
+ addItem(LLUUID::null, loc_none, highlight_id.isNull(), ADD_TOP);
+ }
group_list->selectByValue(highlight_id);
return TRUE;
diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h
index ce26977fdb..a246650822 100644
--- a/indra/newview/llgrouplist.h
+++ b/indra/newview/llgrouplist.h
@@ -47,7 +47,7 @@ public:
};
LLGroupList(const Params&);
- BOOL updateList();
+ BOOL update(const std::string& name_filter = LLStringUtil::null);
};
#endif // LL_LLGROUPLIST_H
diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp
index 80bc2ad861..f0bfbef565 100644
--- a/indra/newview/llmenucommands.cpp
+++ b/indra/newview/llmenucommands.cpp
@@ -84,8 +84,8 @@ void handle_mouselook(void*)
void handle_chat(void*)
{
// give focus to chatbar if it's open but not focused
- if (gSavedSettings.getBOOL("ChatVisible") && gFocusMgr.childHasKeyboardFocus(
- LLBottomTray::getInstance()->getChatBox()))
+ if (gBottomTray && gSavedSettings.getBOOL("ChatVisible") &&
+ gFocusMgr.childHasKeyboardFocus(gBottomTray->getChatBox()))
{
LLChatBar::stopChat();
}
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index d7929cc5c2..ee592ac22c 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -45,6 +45,7 @@
#include "lltooldraganddrop.h"
#include "llviewermenu.h" // *FIX: for is_agent_friend()
#include "llscrollcontainer.h"
+#include "llweb.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLDropTarget
@@ -168,6 +169,7 @@ void LLPanelProfileTab::setProfileType()
void LLPanelProfileTab::onActivate(const LLUUID& id)
{
setAvatarId(id);
+ scrollToTop();
updateData();
}
@@ -199,6 +201,15 @@ void LLPanelProfileTab::onTeleport()
}
}
+void LLPanelProfileTab::scrollToTop()
+{
+ LLScrollContainer* scrollContainer = getChild<LLScrollContainer>("profile_scroll", FALSE, FALSE);
+ if (NULL != scrollContainer)
+ {
+ scrollContainer->goToTop();
+ }
+}
+
//////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
// LLPanelAvatarProfile()
@@ -260,20 +271,26 @@ void LLPanelAvatarProfile::processProperties(void* data, EAvatarProcessorType ty
if (!isEditMode())
{
setCaptionText(avatar_data);
- }
- childSetValue("show_in_search_checkbox", (BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH));
-
- if (avatar_data->partner_id.notNull())
- {
- std::string first, last;
- BOOL found = gCacheName->getName(avatar_data->partner_id, first, last);
- if (found)
+ if (avatar_data->partner_id.notNull())
+ {
+ std::string first, last;
+ BOOL found = gCacheName->getName(avatar_data->partner_id, first, last);
+ if (found)
+ {
+ childSetTextArg("partner_text", "[FIRST]", first);
+ childSetTextArg("partner_text", "[LAST]", last);
+ }
+ }
+ else
{
- childSetTextArg("partner_text", "[FIRST]", first);
- childSetTextArg("partner_text", "[LAST]", last);
+ childSetTextArg("partner_text", "[FIRST]", getString("no_partner_text"));
}
}
- //http://secondlife.com/partner
+ else
+ {
+ childSetValue("show_in_search_checkbox", (BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH));
+ }
+
bool online = avatar_data->flags & AVATAR_ONLINE;
if(is_agent_friend(avatar_data->avatar_id))
@@ -306,6 +323,12 @@ void LLPanelAvatarProfile::processProperties(void* data, EAvatarProcessorType ty
}
mStatusCombobox->setValue(status);
}
+ if (isOwnProfile())
+ {
+ std::string full_name;
+ gCacheName->getFullName(mAvatarId, full_name);
+ childSetValue("user_name", full_name);
+ }
}
else if(APT_GROUPS == type)
{
@@ -438,6 +461,14 @@ void LLPanelAvatarProfile::onShareButtonClick()
mStatusMessage->setCommitCallback(boost::bind(&LLPanelAvatarProfile::onStatusMessageChanged, this));
}
+ if (!isEditMode())
+ {
+ childSetActionTextbox("homepage_edit", boost::bind(&LLPanelAvatarProfile::onHomepageTextboxClicked, this));
+ childSetActionTextbox("payment_update_link", boost::bind(&LLPanelAvatarProfile::onUpdateAccountTextboxClicked, this));
+ childSetActionTextbox("my_account_link", boost::bind(&LLPanelAvatarProfile::onMyAccountTextboxClicked, this));
+ childSetActionTextbox("partner_edit_link", boost::bind(&LLPanelAvatarProfile::onPartnerEditTextboxClicked, this));
+ }
+
childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriendButtonClick,this)),NULL);
childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL);
childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL);
@@ -460,22 +491,13 @@ void LLPanelAvatarProfile::onShareButtonClick()
return TRUE;
}
+
void LLPanelAvatarProfile::onOpen(const LLSD& key)
{
- setAvatarId(key);
- scrollToTop();
+ onActivate(key);
updateChildrenList();
- updateData();
}
-void LLPanelAvatarProfile::scrollToTop()
-{
- LLScrollContainer* scrollContainer = getChild<LLScrollContainer>("profile_scroll", FALSE, FALSE);
- if (NULL != scrollContainer)
- {
- scrollContainer->goToTop();
- }
-}
void LLPanelAvatarProfile::updateChildrenList()
{
@@ -486,29 +508,35 @@ void LLPanelAvatarProfile::updateChildrenList()
switch (mProfileType)
{
case PT_OWN:
- childSetVisible("status_panel",FALSE);
- childSetVisible("profile_buttons_panel",FALSE);
- childSetVisible("title_groups_text",FALSE);
- childSetVisible("sl_groups",FALSE);
+ childSetVisible("user_name", true);
+ childSetVisible("status_panel", false);
+ childSetVisible("profile_buttons_panel", false);
+ childSetVisible("title_groups_text", false);
+ childSetVisible("sl_groups", false);
mUpdated = true;
- childSetVisible("status_me_panel",TRUE);
- childSetVisible("profile_me_buttons_panel",TRUE);
+ childSetVisible("status_me_panel", true);
+ childSetVisible("profile_me_buttons_panel", true);
break;
case PT_OTHER:
- childSetVisible("status_me_panel",FALSE);
- childSetVisible("profile_me_buttons_panel",FALSE);
+ childSetVisible("user_name", false);
+ childSetVisible("status_me_panel", false);
+ childSetVisible("profile_me_buttons_panel", false);
- childSetVisible("status_panel",TRUE);
- childSetVisible("profile_buttons_panel",TRUE);
- childSetVisible("title_groups_text",TRUE);
- childSetVisible("sl_groups",TRUE);
+ childSetVisible("status_panel", true);
+ childSetVisible("profile_buttons_panel", true);
+ childSetVisible("title_groups_text", true);
+ childSetVisible("sl_groups", true);
// account actions
- childSetVisible("account_actions_panel", FALSE);
- childSetVisible("partner_edit_link", FALSE);
+ childSetVisible("account_actions_panel", false);
+ childSetVisible("partner_edit_link", false);
- mUpdated = true;
+ //hide for friends
+ childSetEnabled("add_friend", !is_agent_friend(getAvatarId()));
+
+ //need to update profile view on every activate
+ mUpdated = false;
break;
case PT_UNKNOWN: break;//do nothing
default:
@@ -546,6 +574,31 @@ void LLPanelAvatarProfile::onStatusMessageChanged()
updateData();
}
+//static
+void LLPanelAvatarProfile::onUrlTextboxClicked(std::string url)
+{
+ LLWeb::loadURL(url);
+}
+
+void LLPanelAvatarProfile::onHomepageTextboxClicked()
+{
+ onUrlTextboxClicked(childGetValue("homepage_edit").asString());
+}
+
+void LLPanelAvatarProfile::onUpdateAccountTextboxClicked()
+{
+ onUrlTextboxClicked(getString("payment_update_link_url"));
+}
+
+void LLPanelAvatarProfile::onMyAccountTextboxClicked()
+{
+ onUrlTextboxClicked(getString("my_account_link_url"));
+}
+
+void LLPanelAvatarProfile::onPartnerEditTextboxClicked()
+{
+ onUrlTextboxClicked(getString("partner_edit_link_url"));
+}
//-----------------------------------------------------------------------------
// LLPanelAvatarNotes()
@@ -664,3 +717,15 @@ void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type
}
}
}
+
+void LLPanelAvatarNotes::onActivate(const LLUUID& id)
+{
+ LLPanelProfileTab::onActivate(id);
+ updateChildrenList();
+}
+
+void LLPanelAvatarNotes::updateChildrenList()
+{
+ //hide for friends
+ childSetEnabled("add_friend", !is_agent_friend(getAvatarId()));
+}
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index f72eb1990d..8bfa386d55 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -109,6 +109,9 @@ protected:
virtual ~LLPanelProfileTab();
void setProfileType();
+private:
+ void scrollToTop();
+
protected:
e_profile_type mProfileType;
LLUUID mAvatarId;
@@ -133,7 +136,7 @@ public:
virtual void clearControls();
/*virtual*/ BOOL postBuild(void);
- void onOpen(const LLSD& key);
+ /*virtual*/ void onOpen(const LLSD& key);
void onAddFriendButtonClick();
@@ -152,8 +155,12 @@ private:
void onStatusChanged();
void onStatusMessageChanged();
void setCaptionText(const LLAvatarData* avatar_data);
- void scrollToTop();
+ static void onUrlTextboxClicked(std::string url);
+ void onHomepageTextboxClicked();
+ void onUpdateAccountTextboxClicked();
+ void onMyAccountTextboxClicked();
+ void onPartnerEditTextboxClicked();
protected:
bool mEditMode;
@@ -175,6 +182,8 @@ public:
static void* create(void* data);
+ void onActivate(const LLUUID& id);
+
BOOL postBuild(void);
void onCommitRights();
@@ -188,6 +197,8 @@ public:
void updateData();
protected:
+
+ void updateChildrenList();
};
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 24b4082630..8c7e3e960a 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -157,8 +157,6 @@ void LLLandmarksPanel::onTeleport()
{
listenerp->openItem();
}
-
- togglePanelPlacesButtons(TRUE);
}
/*
@@ -195,6 +193,25 @@ void LLLandmarksPanel::onCopySLURL()
}
*/
+// virtual
+void LLLandmarksPanel::updateVerbs()
+{
+ BOOL enabled = FALSE;
+
+ LLFolderViewItem* current_item = mInventoryPanel->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ LLFolderViewEventListener* listenerp = current_item->getListener();
+ if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
+ {
+ enabled = TRUE;
+ }
+ }
+
+ mTeleportBtn->setEnabled(enabled);
+ mShowOnMapBtn->setEnabled(enabled);
+}
+
void LLLandmarksPanel::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
LLFolderViewItem* current_item = mInventoryPanel->getRootFolder()->getCurSelectedItem();
@@ -224,16 +241,14 @@ void LLLandmarksPanel::onSelectionChange(const std::deque<LLFolderViewItem*> &it
if (!mActionBtn->getVisible())
mActionBtn->setVisible(TRUE);
-
- togglePanelPlacesButtons(TRUE);
}
else
{
if (mActionBtn->getVisible())
mActionBtn->setVisible(FALSE);
-
- togglePanelPlacesButtons(FALSE);
}
+
+ updateVerbs();
}
void LLLandmarksPanel::onSelectorButtonClicked()
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 0f400a722e..76333e4d85 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -48,6 +48,7 @@ public:
/*virtual*/ void onShowOnMap();
/*virtual*/ void onTeleport();
///*virtual*/ void onCopySLURL();
+ /*virtual*/ void updateVerbs();
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
void onSelectorButtonClicked();
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 1d7a2748cc..3f9f44bbf5 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -62,10 +62,18 @@ using namespace LLOldEvents;
#define NEARBY_LIST_UPDATE_INTERVAL 1
#define RECENT_LIST_UPDATE_DELAY 1
+static const std::string NEARBY_TAB_NAME = "nearby_panel";
+static const std::string FRIENDS_TAB_NAME = "friends_panel";
+static const std::string GROUP_TAB_NAME = "groups_panel";
+static const std::string RECENT_TAB_NAME = "recent_panel";
+
static LLRegisterPanelClassWrapper<LLPanelPeople> t_people("panel_people");
//=============================================================================
+/**
+ * Updates given list either on regular basis or on external events (up to implementation).
+ */
class LLPanelPeople::Updater
{
public:
@@ -74,15 +82,31 @@ public:
: mCallback(cb)
{
}
+
virtual ~Updater()
{
}
+
+ /**
+ * Force the list updates.
+ *
+ * This may start repeated updates until all names are complete.
+ */
+ virtual void forceUpdate() {}
+
+ /**
+ * Activate/deactivate updater.
+ *
+ * This may start/stop regular updates.
+ */
virtual void setActive(bool) {}
+
protected:
bool updateList(U32 mask = 0)
{
return mCallback(mask);
}
+
callback_t mCallback;
};
@@ -99,10 +123,13 @@ public:
/**
* Updates the friends list.
+ *
+ * Updates the list on external events which trigger the changed() method.
*/
class LLFriendListUpdater : public LLAvatarListUpdater, public LLFriendObserver
{
LOG_CLASS(LLFriendListUpdater);
+
public:
LLFriendListUpdater(callback_t cb)
: LLAvatarListUpdater(cb, FRIEND_LIST_UPDATE_TIMEOUT)
@@ -111,20 +138,20 @@ public:
// For notification when SIP online status changes.
LLVoiceClient::getInstance()->addObserver(this);
}
+
~LLFriendListUpdater()
{
LLVoiceClient::getInstance()->removeObserver(this);
LLAvatarTracker::instance().removeObserver(this);
}
- /*virtual*/ void setActive(bool val)
- {
- if (!val)
- return;
+ /*virtual*/ void forceUpdate()
+ {
// Perform updates until all names are loaded.
if (!updateList(LLFriendObserver::ADD))
changed(LLFriendObserver::ADD);
}
+
/*virtual*/ void changed(U32 mask)
{
// events can arrive quickly in bulk - we need not process EVERY one of them -
@@ -134,6 +161,7 @@ public:
// save-up all the mask-bits which have come-in
mMask |= mask;
}
+
/*virtual*/ BOOL tick()
{
if (updateList(mMask))
@@ -145,33 +173,33 @@ public:
return FALSE;
}
+
private:
U32 mMask;
};
/**
* Periodically updates the nearby people list while the Nearby tab is active.
+ *
+ * The period is defined by NEARBY_LIST_UPDATE_INTERVAL constant.
*/
class LLNearbyListUpdater : public LLAvatarListUpdater
{
LOG_CLASS(LLNearbyListUpdater);
+
public:
LLNearbyListUpdater(callback_t cb)
: LLAvatarListUpdater(cb, NEARBY_LIST_UPDATE_INTERVAL)
{
setActive(false);
}
- /*virtual*/ BOOL tick()
- {
- updateList();
- return FALSE;
- }
+
/*virtual*/ void setActive(bool val)
{
if (val)
{
// update immediately and start regular updates
- tick();
+ updateList();
mEventTimer.start();
}
else
@@ -180,6 +208,17 @@ public:
mEventTimer.stop();
}
}
+
+ /*virtual*/ void forceUpdate()
+ {
+ updateList();
+ }
+
+ /*virtual*/ BOOL tick()
+ {
+ updateList();
+ return FALSE;
+ }
private:
};
@@ -189,13 +228,20 @@ private:
class LLRecentListUpdater : public LLAvatarListUpdater
{
LOG_CLASS(LLRecentListUpdater);
+
public:
LLRecentListUpdater(callback_t cb)
: LLAvatarListUpdater(cb, RECENT_LIST_UPDATE_DELAY)
{
LLRecentPeople::instance().setChangedCallback(boost::bind(&LLRecentListUpdater::onRecentPeopleChanged, this));
}
+
private:
+ /*virtual*/ void forceUpdate()
+ {
+ onRecentPeopleChanged();
+ }
+
/*virtual*/ BOOL tick()
{
// Update the list until we get all the names.
@@ -207,6 +253,7 @@ private:
return FALSE;
}
+
void onRecentPeopleChanged()
{
if (!updateList())
@@ -223,16 +270,24 @@ private:
class LLGroupListUpdater : public LLPanelPeople::Updater, public LLSimpleListener
{
LOG_CLASS(LLGroupListUpdater);
+
public:
LLGroupListUpdater(callback_t cb)
: LLPanelPeople::Updater(cb)
{
gAgent.addListener(this, "new group");
}
+
~LLGroupListUpdater()
{
gAgent.removeListener(this);
}
+
+ /*virtual*/ void forceUpdate()
+ {
+ updateList();
+ }
+
/*virtual*/ bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
// Why is "new group" sufficient?
@@ -277,22 +332,23 @@ LLPanelPeople::~LLPanelPeople()
BOOL LLPanelPeople::postBuild()
{
mSearchEditor = getChild<LLSearchEditor>("filter_input");
+ mSearchEditor->setSearchCallback(boost::bind(&LLPanelPeople::onSearchEdit, this, _1));
mTabContainer = getChild<LLTabContainer>("tabs");
mTabContainer->setCommitCallback(boost::bind(&LLPanelPeople::onTabSelected, this, _2));
- mTabContainer->selectTabByName("friends_panel"); // must go after setting commit callback
+ mTabContainer->selectTabByName(FRIENDS_TAB_NAME); // must go after setting commit callback
- mFriendList = getChild<LLPanel>("friends_panel")->getChild<LLAvatarList>("avatar_list");
- mNearbyList = getChild<LLPanel>("nearby_panel")->getChild<LLAvatarList>("avatar_list");
- mRecentList = getChild<LLPanel>("recent_panel")->getChild<LLAvatarList>("avatar_list");
+ mFriendList = getChild<LLPanel>(FRIENDS_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
+ mNearbyList = getChild<LLPanel>(NEARBY_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
+ mRecentList = getChild<LLPanel>(RECENT_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
mGroupList = getChild<LLGroupList>("group_list");
- LLPanel* groups_panel = getChild<LLPanel>("groups_panel");
+ LLPanel* groups_panel = getChild<LLPanel>(GROUP_TAB_NAME);
groups_panel->childSetAction("activate_btn", boost::bind(&LLPanelPeople::onActivateButtonClicked, this));
groups_panel->childSetAction("plus_btn", boost::bind(&LLPanelPeople::onGroupPlusButtonClicked, this));
groups_panel->childSetAction("minus_btn", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked, this));
- LLPanel* friends_panel = getChild<LLPanel>("friends_panel");
+ LLPanel* friends_panel = getChild<LLPanel>(FRIENDS_TAB_NAME);
friends_panel->childSetAction("add_btn", boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked, this));
friends_panel->childSetAction("del_btn", boost::bind(&LLPanelPeople::onDeleteFriendButtonClicked, this));
@@ -326,82 +382,84 @@ BOOL LLPanelPeople::postBuild()
mGroupMinusMenuHandle = minus_menu->getHandle();
// Perform initial update.
- mFriendListUpdater->setActive(true);
+ mFriendListUpdater->forceUpdate();
updateGroupList();
updateRecentList();
return TRUE;
}
-bool LLPanelPeople::refreshFriendNames(U32 changed_mask)
+bool LLPanelPeople::updateFriendList(U32 changed_mask)
{
- // get all buddies we know about
- LLAvatarTracker::buddy_map_t all_buddies;
- LLAvatarTracker::instance().copyBuddyList(all_buddies);
-
- bool have_names = true;
-
+ // Refresh names.
if (changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE))
{
+ // get all buddies we know about
+ LLAvatarTracker::buddy_map_t all_buddies;
+ LLAvatarTracker::instance().copyBuddyList(all_buddies);
+
// *TODO: it's suboptimal to rebuild the whole list on online status change.
// convert the buddy map to vector
- std::vector<LLUUID> avatar_ids;
+ mFriendVec.clear();
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
for (; buddy_it != all_buddies.end(); ++buddy_it)
- avatar_ids.push_back(buddy_it->first);
+ mFriendVec.push_back(buddy_it->first);
- // do refresh the friend list
- if (avatar_ids.size() > 0)
- have_names = mFriendList->updateList(avatar_ids);
- else
- mFriendList->setCommentText(getString("no_friends"));
+ return filterFriendList();
}
- return have_names;
+ return true;
}
-bool LLPanelPeople::updateFriendList(U32 changed_mask)
+bool LLPanelPeople::updateNearbyList()
{
- // Refresh names.
- if (changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE))
- {
- return refreshFriendNames(changed_mask);
- }
-
+ LLWorld::getInstance()->getAvatars(&mNearbyVec, NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange"));
+ filterNearbyList();
+
return true;
}
-bool LLPanelPeople::updateNearbyList()
+bool LLPanelPeople::updateRecentList()
{
- std::vector<LLUUID> avatar_ids;
+ LLRecentPeople::instance().get(mRecentVec);
+ filterRecentList();
- LLWorld::getInstance()->getAvatars(&avatar_ids, NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange"));
+ return true;
+}
- mNearbyList->updateList(avatar_ids);
+bool LLPanelPeople::updateGroupList()
+{
+ return mGroupList->update(mFilterSubString);
+}
- if (avatar_ids.size() == 0)
- mNearbyList->setCommentText(getString("no_one_near"));
+bool LLPanelPeople::filterFriendList()
+{
+ if (mFriendVec.size() > 0)
+ return mFriendList->update(mFriendVec, mFilterSubString);
+ mFriendList->setCommentText(getString("no_friends"));
return true;
}
-bool LLPanelPeople::updateRecentList()
+bool LLPanelPeople::filterNearbyList()
{
- std::vector<LLUUID> avatar_ids;
+ bool have_names = mNearbyList->update(mNearbyVec, mFilterSubString);
- LLRecentPeople::instance().get(avatar_ids);
-
- if (avatar_ids.size() > 0)
- return mRecentList->updateList(avatar_ids);
+ if (mNearbyVec.size() == 0)
+ mNearbyList->setCommentText(getString("no_one_near"));
- mRecentList->setCommentText(getString("no_people"));
- return true;
+ return have_names;
}
-bool LLPanelPeople::updateGroupList()
+bool LLPanelPeople::filterRecentList()
{
- return mGroupList->updateList();
+ if (mRecentVec.size() > 0)
+ return mRecentList->update(mRecentVec, mFilterSubString);
+
+ mRecentList->setCommentText(getString("no_people"));
+
+ return true;
}
void LLPanelPeople::buttonSetVisible(std::string btn_name, BOOL visible)
@@ -433,10 +491,10 @@ void LLPanelPeople::buttonSetAction(const std::string& btn_name, const commit_si
void LLPanelPeople::updateButtons()
{
std::string cur_tab = mTabContainer->getCurrentPanel()->getName();
- bool nearby_tab_active = (cur_tab == "nearby_panel");
- bool friends_tab_active = (cur_tab == "friends_panel");
- bool group_tab_active = (cur_tab == "groups_panel");
- bool recent_tab_active = (cur_tab == "recent_panel");
+ bool nearby_tab_active = (cur_tab == NEARBY_TAB_NAME);
+ bool friends_tab_active = (cur_tab == FRIENDS_TAB_NAME);
+ bool group_tab_active = (cur_tab == GROUP_TAB_NAME);
+ bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
LLUUID selected_id;
buttonSetVisible("group_info_btn", group_tab_active);
@@ -489,11 +547,11 @@ LLAvatarList* LLPanelPeople::getActiveAvatarList() const
{
std::string cur_tab = mTabContainer->getCurrentPanel()->getName();
- if (cur_tab == "friends_panel")
+ if (cur_tab == FRIENDS_TAB_NAME)
return mFriendList;
- if (cur_tab == "nearby_panel")
+ if (cur_tab == NEARBY_TAB_NAME)
return mNearbyList;
- if (cur_tab == "recent_panel")
+ if (cur_tab == RECENT_TAB_NAME)
return mRecentList;
return NULL;
@@ -535,14 +593,19 @@ void LLPanelPeople::onVisibilityChange(BOOL new_visibility)
}
else
{
- // Make the tab-container re-select current tab
- // for onTabSelected() callback to get called.
- // (currently this is needed to reactivate nearby list updates
- // when we get visible)
- mTabContainer->selectTab(mTabContainer->getCurrentPanelIndex());
+ reSelectedCurrentTab();
}
}
+// Make the tab-container re-select current tab
+// for onTabSelected() callback to get called.
+// (currently this is needed to reactivate nearby list updates
+// when we get visible)
+void LLPanelPeople::reSelectedCurrentTab()
+{
+ mTabContainer->selectTab(mTabContainer->getCurrentPanelIndex());
+}
+
void LLPanelPeople::onSearchEdit(const std::string& search_string)
{
if (mFilterSubString == search_string)
@@ -553,12 +616,18 @@ void LLPanelPeople::onSearchEdit(const std::string& search_string)
LLStringUtil::toUpper(mFilterSubString);
LLStringUtil::trimHead(mFilterSubString);
mSearchEditor->setText(mFilterSubString);
+
+ // Apply new filter to all tabs.
+ filterNearbyList();
+ filterFriendList();
+ filterRecentList();
+ updateGroupList();
}
void LLPanelPeople::onTabSelected(const LLSD& param)
{
std::string tab_name = getChild<LLPanel>(param.asString())->getName();
- mNearbyListUpdater->setActive(tab_name == "nearby_panel");
+ mNearbyListUpdater->setActive(tab_name == NEARBY_TAB_NAME);
updateButtons();
}
@@ -725,5 +794,5 @@ void LLPanelPeople::onMoreButtonClicked()
void LLPanelPeople::onOpen(const LLSD& key)
{
- mTabContainer->selectTab(key.asInteger());
+ reSelectedCurrentTab();
}
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 4d535f287c..4855096750 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -61,8 +61,10 @@ private:
bool updateNearbyList();
bool updateRecentList();
bool updateGroupList();
+ bool filterFriendList();
+ bool filterNearbyList();
+ bool filterRecentList();
void updateButtons();
- bool refreshFriendNames(U32 changed_mask);
LLAvatarList* getActiveAvatarList() const;
LLUUID getCurrentItemID() const;
void buttonSetVisible(std::string btn_name, BOOL visible);
@@ -72,6 +74,8 @@ private:
/*virtual*/ void onVisibilityChange(BOOL new_visibility);
+ void reSelectedCurrentTab();
+
// UI callbacks
void onSearchEdit(const std::string& search_string);
void onTabSelected(const LLSD& param);
@@ -117,6 +121,17 @@ private:
Updater* mGroupListUpdater;
std::string mFilterSubString;
+
+ // The vectors below contain up-to date avatar lists
+ // for the corresponding tabs.
+ // When the user enters a filter, it gets applied
+ // to all the vectors and the result is shown in the tabs.
+ // We don't need to have such a vector for the groups tab
+ // since re-fetching the groups list is always fast.
+ typedef std::vector<LLUUID> uuid_vector_t;
+ uuid_vector_t mNearbyVec;
+ uuid_vector_t mFriendVec;
+ uuid_vector_t mRecentVec;
};
#endif //LL_LLPANELPEOPLE_H
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index 65be4718ef..cb47759a49 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -42,9 +42,11 @@
#include "llviewerparcelmgr.h"
#include "lltexturectrl.h"
#include "lluiconstants.h"
+#include "llworldmap.h"
+#include "llfloaterworldmap.h"
+#include "llfloaterreg.h"
#include "llavatarpropertiesprocessor.h"
#include "llpanelpick.h"
-#include "llpanelmeprofile.h"
#define XML_PANEL_EDIT_PICK "panel_edit_pick.xml"
@@ -55,6 +57,12 @@
#define XML_SNAPSHOT "pick_snapshot"
#define XML_LOCATION "pick_location"
+#define XML_BTN_SAVE "save_changes_btn"
+
+#define SAVE_BTN_LABEL "[WHAT]"
+#define LABEL_PICK = "Pick"
+#define LABEL_CHANGES = "Changes"
+
LLPanelPick::LLPanelPick(BOOL edit_mode/* = FALSE */)
: LLPanel(), LLAvatarPropertiesObserver(),
@@ -78,15 +86,22 @@ LLPanelPick::LLPanelPick(BOOL edit_mode/* = FALSE */)
LLPanelPick::~LLPanelPick()
{
- if (!mCreatorId.isNull()) LLAvatarPropertiesProcessor::instance().removeObserver(mCreatorId, this);
+ if (mCreatorId.notNull()) LLAvatarPropertiesProcessor::instance().removeObserver(mCreatorId, this);
}
void LLPanelPick::reset()
{
+ setEditMode(FALSE);
+
mPickId.setNull();
mCreatorId.setNull();
mParcelId.setNull();
+ setName("");
+ setDesc("");
+ setLocation("");
+ mSnapshotCtrl->setImageAssetID(LLUUID::null);
+
mDataReceived = FALSE;
mPosGlobal.clearVec();
@@ -100,14 +115,22 @@ BOOL LLPanelPick::postBuild()
{
childSetAction("cancel_btn", onClickCancel, this);
childSetAction("set_to_curr_location_btn", onClickSet, this);
- childSetAction("save_changes_btn", onClickSave, this);
+ childSetAction(XML_BTN_SAVE, onClickSave, this);
+
+ mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelPick::childSetVisible, this, "edit_icon", true));
+ mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelPick::childSetVisible, this, "edit_icon", false));
}
else
{
childSetAction("edit_btn", onClickEdit, this);
childSetAction("teleport_btn", onClickTeleport, this);
childSetAction("show_on_map_btn", onClickMap, this);
- childSetAction("back_btn", onClickBack, this);
+
+ if (mExitFunction && mExitData)
+ {
+ childSetAction("back_btn", mExitFunction, mExitData);
+ }
+
//*TODO set on menu
}
@@ -119,21 +142,15 @@ void LLPanelPick::init(LLUUID creator_id, LLUUID pick_id)
mCreatorId = creator_id;
mPickId = pick_id;
- // on Pick Info panel (for non-Agent picks) edit_btn should be invisible
- if (!mEditMode)
- {
- if (mCreatorId != gAgentID)
- {
- childSetEnabled("edit_btn", FALSE);
- childSetVisible("edit_btn", FALSE);
- }
- else
- {
- childSetEnabled("edit_btn", TRUE);
- childSetVisible("edit_btn", TRUE);
- }
- }
+ //*TODO consider removing this, already called by setEditMode()
+ updateButtons();
+
+ requestData();
+}
+void LLPanelPick::requestData()
+{
+ mDataReceived = FALSE;
LLAvatarPropertiesProcessor::instance().addObserver(mCreatorId, this);
LLAvatarPropertiesProcessor::instance().sendDataRequest(mCreatorId, APT_PICK_INFO, &mPickId);
}
@@ -170,6 +187,8 @@ void LLPanelPick::createNewPick()
}
sendUpdate();
+
+ childSetLabelArg(XML_BTN_SAVE, SAVE_BTN_LABEL, std::string("Pick"));
}
/*virtual*/ void LLPanelPick::processProperties(void* data, EAvatarProcessorType type)
@@ -183,7 +202,7 @@ void LLPanelPick::createNewPick()
init(pick_data);
mDataReceived = TRUE;
- LLAvatarPropertiesProcessor::instance().removeObserver(gAgentID, this);
+ LLAvatarPropertiesProcessor::instance().removeObserver(mCreatorId, this);
}
@@ -192,44 +211,36 @@ void LLPanelPick::setEditMode( BOOL edit_mode )
if (mEditMode == edit_mode) return;
mEditMode = edit_mode;
- if (edit_mode)
- {
- // preserve data before killing controls
- std::string name = getName();
- std::string desc = getDesc();
- std::string location = getLocation();
- LLUUID snapshot_id = mSnapshotCtrl->getImageAssetID();
- LLRect old_rect = getRect();
+ // preserve data before killing controls
+ std::string name = getName();
+ std::string desc = getDesc();
+ std::string location = getLocation();
+ LLUUID snapshot_id = mSnapshotCtrl->getImageAssetID();
+ LLRect old_rect = getRect();
- deleteAllChildren();
+ deleteAllChildren();
+ if (edit_mode)
+ {
LLUICtrlFactory::getInstance()->buildPanel(this, XML_PANEL_EDIT_PICK);
-
- //*NOTE this code is from LLPanelMeProfile.togglePanel()... doubt this is a right way to do things
- reshape(old_rect.getWidth(), old_rect.getHeight());
- old_rect.setLeftTopAndSize(0, old_rect.getHeight(), old_rect.getWidth(), old_rect.getHeight());
- setRect(old_rect);
-
- // time to restore data
- setName(name);
- setDesc(desc);
- setLocation(location);
- mSnapshotCtrl->setImageAssetID(snapshot_id);
}
else
{
- // returning to VIEW mode - need to perform cleanup
- // this is the case when that panel is reused between viewing/editing different picks
- deleteAllChildren();
- reset();
LLUICtrlFactory::getInstance()->buildPanel(this, XML_PANEL_PICK_INFO);
}
-}
-//*HACK need to be redone - control panel toggling from parent (Me Panel/Avatar Profile Panel)
-void LLPanelPick::setPanelMeProfile(LLPanelMeProfile* meProfilePanel)
-{
- mMeProfilePanel = meProfilePanel;
+ //*NOTE this code is from LLPanelMeProfile.togglePanel()... doubt this is a right way to do things
+ reshape(old_rect.getWidth(), old_rect.getHeight());
+ old_rect.setLeftTopAndSize(0, old_rect.getHeight(), old_rect.getWidth(), old_rect.getHeight());
+ setRect(old_rect);
+
+ // time to restore data
+ setName(name);
+ setDesc(desc);
+ setLocation(location);
+ mSnapshotCtrl->setImageAssetID(snapshot_id);
+
+ updateButtons();
}
void LLPanelPick::setName(std::string name)
@@ -299,6 +310,9 @@ void LLPanelPick::sendUpdate()
pick_data.sort_order = 0;
pick_data.enabled = TRUE;
+ mDataReceived = FALSE;
+ LLAvatarPropertiesProcessor::instance().addObserver(gAgentID, this);
+
LLAvatarPropertiesProcessor::instance().sendDataUpdate(&pick_data, APT_PICK_INFO);
}
@@ -321,28 +335,20 @@ void LLPanelPick::onClickEdit(void* data)
//static
void LLPanelPick::onClickTeleport(void* data)
{
- //LLPanelPick* self = (LLPanelPick*)data;
- //*TODO implement
+ LLPanelPick* self = (LLPanelPick*)data;
+ if (!self) return;
+ teleport(self->mPosGlobal);
}
//static
void LLPanelPick::onClickMap(void* data)
{
- //LLPanelPick* self = (LLPanelPick*)data;
- //*TODO implement
-}
-
-//*HACK need to move panel toggling to parent panels
-//static
-void LLPanelPick::onClickBack(void* data)
-{
LLPanelPick* self = (LLPanelPick*)data;
if (!self) return;
- self->mMeProfilePanel->togglePanel(self);
+ showOnMap(self->mPosGlobal);
}
-
//-----------------------------------------
// "EDIT PICK" (EDIT MODE) BUTTON HANDLERS
//-----------------------------------------
@@ -353,17 +359,20 @@ void LLPanelPick::onClickCancel(void* data)
LLPanelPick* self = (LLPanelPick*) data;
if (!self) return;
if (!self->mEditMode) return;
- self->mMeProfilePanel->togglePanel(self);
+
+ LLUUID pick_id = self->mPickId;
+ LLUUID creator_id = self->mCreatorId;
+ self->reset();
+ self->init(creator_id, pick_id);
}
// static
void LLPanelPick::onClickSet(void* data)
{
- //TODO check whether pick data was received before
-
LLPanelPick* self = (LLPanelPick*) data;
if (!self) return;
if (!self->mEditMode) return;
+ if (!self->mDataReceived) return;
// Save location for later.
self->mPosGlobal = gAgent.getPositionGlobal();
@@ -386,7 +395,56 @@ void LLPanelPick::onClickSave(void* data)
if (!self->mEditMode) return;
if (!self->mDataReceived) return;
- //*TODO check if data was received before
self->sendUpdate();
- self->mMeProfilePanel->togglePanel(self);
+ self->setEditMode(FALSE);
+}
+
+void LLPanelPick::updateButtons()
+{
+
+ // on Pick Info panel (for non-Agent picks) edit_btn should be invisible
+ if (mEditMode)
+ {
+ childSetLabelArg(XML_BTN_SAVE, SAVE_BTN_LABEL, std::string("Changes"));
+ }
+ else
+ {
+ if (mCreatorId != gAgentID)
+ {
+ childSetEnabled("edit_btn", FALSE);
+ childSetVisible("edit_btn", FALSE);
+ }
+ else
+ {
+ childSetEnabled("edit_btn", TRUE);
+ childSetVisible("edit_btn", TRUE);
+ }
+ }
+}
+
+void LLPanelPick::setExitCallback( boost::function<void(void*)> function, void* data )
+{
+ mExitFunction = function;
+ mExitData = data;
+ if (!mEditMode)
+ {
+ childSetAction("back_btn", function, data);
+ }
+}
+
+//static
+void LLPanelPick::teleport(const LLVector3d& position)
+{
+ if (!position.isExactlyZero())
+ {
+ gAgent.teleportViaLocation(position);
+ LLFloaterWorldMap::getInstance()->trackLocation(position);
+ }
+}
+
+//static
+void LLPanelPick::showOnMap(const LLVector3d& position)
+{
+ LLFloaterWorldMap::getInstance()->trackLocation(position);
+ LLFloaterReg::showInstance("world_map", "center");
}
diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h
index 8ada1a39fb..36bced3849 100644
--- a/indra/newview/llpanelpick.h
+++ b/indra/newview/llpanelpick.h
@@ -41,7 +41,6 @@
class LLTextureCtrl;
class LLMessageSystem;
-class LLPanelMeProfile;
class LLAvatarPropertiesObserver;
class LLPanelPick : public LLPanel, public LLAvatarPropertiesObserver
@@ -51,6 +50,7 @@ public:
LLPanelPick(BOOL edit_mode = FALSE);
/*virtual*/ ~LLPanelPick();
+ // switches the panel to the VIEW mode and resets controls
void reset();
/*virtual*/ BOOL postBuild();
@@ -59,14 +59,26 @@ public:
// initial position, etc.
void createNewPick();
+ //initializes the panel with data of the pick with id = pick_id
+ //owned by the avatar with id = creator_id
void init(LLUUID creator_id, LLUUID pick_id);
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
+ // switches the panel to either View or Edit mode
void setEditMode(BOOL edit_mode);
- //TODO redo panel toggling
- void setPanelMeProfile(LLPanelMeProfile* meProfilePanel);
+ // because this panel works in two modes (edit/view) we are
+ // free from managing two panel for editing and viewing picks and so
+ // are free from controlling switching between them in the parent panel (e.g. Me Profile)
+ // but that causes such a complication that we cannot set a callback for a "Back" button
+ // from the parent panel only once, so we have to preserve that callback
+ // in the pick panel and set it for the back button everytime postBuild() is called.
+ void setExitCallback(boost::function<void(void*)> function, void* value);
+
+ static void teleport(const LLVector3d& position);
+ static void showOnMap(const LLVector3d& position);
+
protected:
@@ -79,15 +91,18 @@ protected:
std::string getLocation();
void sendUpdate();
+ void requestData();
+
void init(LLPickData *pick_data);
+ void updateButtons();
+
//-----------------------------------------
// "PICK INFO" (VIEW MODE) BUTTON HANDLERS
//-----------------------------------------
static void onClickEdit(void* data);
static void onClickTeleport(void* data);
static void onClickMap(void* data);
- static void onClickBack(void* data);
//-----------------------------------------
// "EDIT PICK" (EDIT MODE) BUTTON HANDLERS
@@ -99,7 +114,6 @@ protected:
protected:
BOOL mEditMode;
LLTextureCtrl* mSnapshotCtrl;
- BOOL mDataRequested;
BOOL mDataReceived;
LLUUID mPickId;
@@ -108,8 +122,8 @@ protected:
LLUUID mParcelId;
std::string mSimName;
- //TODO redo panel toggling
- LLPanelMeProfile* mMeProfilePanel;
+ boost::function<void(void*)> mExitFunction;
+ void* mExitData;
};
#endif // LL_LLPANELPICK_H
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 1a3aa8a33a..c32af24423 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -36,37 +36,39 @@
#include "llavatarconstants.h"
#include "lltexturectrl.h"
#include "llviewergenericmessage.h" // send_generic_message
-#include "llworldmap.h"
-#include "llfloaterworldmap.h"
-#include "llpanelmeprofile.h"
-#include "llfloaterreg.h"
+#include "llmenugl.h"
+#include "llviewermenu.h"
+
#include "llpanelpicks.h"
#include "llavatarpropertiesprocessor.h"
+#include "llpanelavatar.h"
#include "llpanelpick.h"
-#define XML_BTN_NEW "new_btn"
-#define XML_BTN_DELETE "trash_btn"
-#define XML_BTN_INFO "info_btn"
+static const std::string XML_BTN_NEW = "new_btn";
+static const std::string XML_BTN_DELETE = "trash_btn";
+static const std::string XML_BTN_INFO = "info_btn";
+static const std::string XML_BTN_TELEPORT = "teleport_btn";
+static const std::string XML_BTN_SHOW_ON_MAP = "show_on_map_btn";
+
+static const std::string XML_PICKS_LIST = "back_panel";
+
+#define PICK_ITEMS_BETWEEN 5
//-----------------------------------------------------------------------------
// LLPanelPicks
//-----------------------------------------------------------------------------
LLPanelPicks::LLPanelPicks(const LLUUID& avatar_id /* = LLUUID::null */)
-:LLPanelProfileTab(avatar_id), mMeProfilePanel(NULL)
+: LLPanelProfileTab(avatar_id),
+ mPopupMenu(NULL),
+ mSelectedPickItem(NULL)
{
updateData();
}
-LLPanelPicks::LLPanelPicks(const Params& params)
-:LLPanelProfileTab(params), mMeProfilePanel(NULL)
-{
-
-}
-
LLPanelPicks::~LLPanelPicks()
{
- if(!getAvatarId().isNull())
+ if(getAvatarId().notNull())
{
LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
}
@@ -99,8 +101,13 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
gCacheName->getName(getAvatarId(),name,second_name);
childSetTextArg("pick_title", "[NAME]",name);
- LLView* picks_list = getChild<LLView>("back_panel",TRUE,FALSE);
+ LLView* picks_list = getPicksList();
if(!picks_list) return;
+
+ // to restore selection of the same item later
+ LLUUID pick_id_selected(LLUUID::null);
+ if (mSelectedPickItem) pick_id_selected = mSelectedPickItem->getPickId();
+
clear();
//*TODO move it somewhere else?
@@ -108,13 +115,9 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
childSetEnabled(XML_BTN_NEW, false);
childSetEnabled(XML_BTN_DELETE, false);
childSetEnabled(XML_BTN_INFO, false);
+ childSetEnabled(XML_BTN_TELEPORT,!avatar_picks->picks_list.empty());
+ childSetEnabled(XML_BTN_SHOW_ON_MAP,!avatar_picks->picks_list.empty());
- S32 height = avatar_picks->picks_list.size() * 85;
- LLRect rc = picks_list->getRect();
- rc.setLeftTopAndSize(rc.mLeft,rc.mTop,rc.getWidth(),height);
- picks_list->setRect(rc);
- picks_list->reshape(rc.getWidth(),rc.getHeight());
-
LLAvatarPicks::picks_list_t::const_iterator it = avatar_picks->picks_list.begin();
for(; avatar_picks->picks_list.end() != it; ++it)
{
@@ -124,30 +127,22 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
LLPickItem* picture = LLPickItem::create();
picks_list->addChild(picture);
- picture->setPictureName(pick_name);
- picture->setPictureId(pick_id);
+ picture->setPickName(pick_name);
+ picture->setPickId(pick_id);
picture->setCreatorId(getAvatarId());
- S32 last_bottom = picks_list->getRect().getHeight();
- if(mPickItemList.size() > 0)
- {
- last_bottom = mPickItemList[mPickItemList.size()-1]->getRect().mBottom;
- last_bottom -= 5;
- }
- LLRect rc = picture->getRect();
- rc.mBottom = last_bottom - rc.getHeight();
- rc.mTop = last_bottom;
- picture->reshape(rc.getWidth(),rc.getHeight());
- picture->setRect(rc);
-
-
LLAvatarPropertiesProcessor::instance().addObserver(mAvatarId, picture);
picture->update();
mPickItemList.push_back(picture);
+ if (pick_id_selected != LLUUID::null &&
+ pick_id == pick_id_selected) setSelectedPickItem(picture);
}
+
+ reshapePicksList();
LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
updateButtons();
+ if (!mSelectedPickItem && mPickItemList.size()) setSelectedPickItem(mPickItemList.back());
picks_list->setEnabled(TRUE);
}
@@ -156,7 +151,7 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
void LLPanelPicks::clear()
{
- LLView* scroll = getChild<LLView>("back_panel",TRUE,FALSE);
+ LLView* scroll = getPicksList();
if(scroll)
{
picture_list_t::const_iterator it = mPickItemList.begin();
@@ -167,16 +162,85 @@ void LLPanelPicks::clear()
}
}
mPickItemList.clear();
+ mSelectedPickItem = NULL;
+}
+
+
+LLPickItem* LLPanelPicks::getSelectedPickItem()
+{
+ return mSelectedPickItem;
+}
+
+
+void LLPanelPicks::removePickItem( LLPickItem* pick_item )
+{
+ LLView* scroll = getPicksList();
+ scroll->removeChild(pick_item);
+ mPickItemList.remove(pick_item);
+ if (mPickItemList.size() == 0)
+ {
+ mSelectedPickItem = NULL;
+ }
+ else
+ {
+ setSelectedPickItem(mPickItemList.back());
+ }
+
+ reshapePicksList();
+}
+
+void LLPanelPicks::reshapePicksList()
+{
+ if (!mPickItemList.size()) return;
+ LLView* pickList = getPicksList();
+
+ S32 last_bottom = pickList->getRect().getHeight();
+ child_list_const_iter_t child_it, child_first_it = pickList->getChildList()->begin();
+ for ( child_it = child_first_it; child_it != pickList->getChildList()->end(); ++child_it)
+ {
+ LLView* const childp = *child_it;
+ if(child_it != child_first_it)
+ {
+ last_bottom -= childp->getRect().getHeight();
+ last_bottom -= PICK_ITEMS_BETWEEN;
+ }
+ reshapePickItem(childp, last_bottom);
+ }
+
+ S32 height = pickList->getChildCount() * ((*child_first_it)->getRect().getHeight() + PICK_ITEMS_BETWEEN);
+ LLRect rc = pickList->getRect();
+ rc.setLeftTopAndSize(rc.mLeft, rc.mTop, rc.getWidth(), height);
+ pickList->reshape(rc.getWidth(), rc.getHeight());
+ pickList->setRect(rc);
+}
+
+void LLPanelPicks::reshapePickItem(LLView* const pick_item, const S32 last_bottom)
+{
+ LLRect rc = pick_item->getRect();
+ rc.mBottom = last_bottom - rc.getHeight();
+ rc.mTop = last_bottom;
+ pick_item->reshape(rc.getWidth(), rc.getHeight());
+ pick_item->setRect(rc);
+}
+
+LLView* LLPanelPicks::getPicksList() const
+{
+ return getChild<LLView>(XML_PICKS_LIST, TRUE, FALSE);
}
BOOL LLPanelPicks::postBuild(void)
{
- childSetAction(XML_BTN_INFO, onClickInfo, this);
- childSetAction(XML_BTN_NEW, onClickNew, this);
childSetAction(XML_BTN_DELETE, onClickDelete, this);
childSetAction("teleport_btn", onClickTeleport, this);
childSetAction("show_on_map_btn", onClickMap, this);
+
+ mCommitCallbackRegistrar.add("Pick.Teleport", boost::bind(onClickTeleport, this));
+ mCommitCallbackRegistrar.add("Pick.Map", boost::bind(onClickMap, this));
+ mCommitCallbackRegistrar.add("Pick.Delete", boost::bind(onClickDelete, this));
+
+ mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_picks.xml", gMenuHolder);
+
return TRUE;
}
@@ -188,6 +252,14 @@ void LLPanelPicks::onActivate(const LLUUID& id)
childSetEnabled("edit_panel", self);
childSetVisible("edit_panel", self);
+ // Disable buttons when viewing profile for first time
+ if(getAvatarId() != id)
+ {
+ childSetEnabled(XML_BTN_INFO,FALSE);
+ childSetEnabled(XML_BTN_TELEPORT,FALSE);
+ childSetEnabled(XML_BTN_SHOW_ON_MAP,FALSE);
+ }
+
// and see a special title - set as invisible by default in xml file
if (self)
{
@@ -198,141 +270,74 @@ void LLPanelPicks::onActivate(const LLUUID& id)
LLPanelProfileTab::onActivate(id);
}
-
-//static
-void LLPanelPicks::onClickInfo(void *data)
-{
- LLPanelPicks* self = (LLPanelPicks*) data;
- if (self)
- {
- LLPanelPick* panel_pick_info = new LLPanelPick();
-
- //*TODO redo, use the selected pick from List View, but not the first (last) one
- LLView* scroll = self->getChild<LLView>("back_panel", TRUE, FALSE);
- LLPickItem* pick = static_cast<LLPickItem*>(scroll->getFirstChild());
- if (!pick) return;
-
- panel_pick_info->init(pick->getCreatorId(), pick->getPickId());
-
- //*HACK redo toggling of panels (should work on both "profiles")
- if (self->mMeProfilePanel)
- {
- panel_pick_info->setPanelMeProfile(self->mMeProfilePanel);
- //self->mMeProfilePanel->addChildInBack(panel_pick_info);
- self->mMeProfilePanel->togglePanel(panel_pick_info);
- }
- }
-}
-
-//static
-void LLPanelPicks::onClickNew(void *data)
-{
- LLPanelPicks* self = (LLPanelPicks*) data;
- if(self && self->mMeProfilePanel)
- {
- if (self->mPickItemList.size() >= MAX_AVATAR_PICKS)
- {
- //*TODO show warning message
- return;
- }
-
- //in edit mode
- LLPanelPick* panel_edit_pick = new LLPanelPick(TRUE);
- panel_edit_pick->createNewPick();
-
- //*HACK redo toggling of panels
- panel_edit_pick->setPanelMeProfile(self->mMeProfilePanel);
- self->mMeProfilePanel->togglePanel(panel_edit_pick);
- }
-}
-
//static
void LLPanelPicks::onClickDelete(void *data)
{
LLPanelPicks* self = (LLPanelPicks*) data;
- if(self && self->mMeProfilePanel)
- {
- //*TODO redo, use the selected pick from List View, but not the first (last) one
- LLView* scroll = self->getChild<LLView>("back_panel", TRUE, FALSE);
- LLPickItem* first_pick = static_cast<LLPickItem*>(scroll->getFirstChild());
- if (!first_pick) return;
+ if (!self) return;
+
+ LLPickItem* pick_item = self->getSelectedPickItem();
+ if (!pick_item) return;
LLSD args;
- args["PICK"] = first_pick->getPickName();
+ args["PICK"] = pick_item->getPickName();
LLNotifications::instance().add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDelete, self, _1, _2));
- }
}
bool LLPanelPicks::callbackDelete(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotification::getSelectedOption(notification, response);
- //*TODO redo, use the selected pick from List View, but not the first (last) one
- LLView* scroll = getChild<LLView>("back_panel",TRUE,FALSE);
- LLPickItem* first_pick = static_cast<LLPickItem*>(scroll->getFirstChild());
- if (!first_pick) return false;
+ LLPickItem* pick_item = getSelectedPickItem();
if (0 == option)
{
- LLAvatarPropertiesProcessor::instance().sendPickDelete(first_pick->getPickId());
-
- scroll->removeChild(first_pick);
- mPickItemList.pop_back();
- first_pick = NULL;
+ LLAvatarPropertiesProcessor::instance().sendPickDelete(pick_item->getPickId());
+ removePickItem(pick_item);
}
updateButtons();
return false;
}
-void LLPanelPicks::setPanelMeProfile(LLPanelMeProfile* meProfilePanel)
-{
- mMeProfilePanel = meProfilePanel;
-}
-
-//static
-void LLPanelPicks::teleport(const LLVector3d& position)
-{
- if (!position.isExactlyZero())
- {
- gAgent.teleportViaLocation(position);
- LLFloaterWorldMap::getInstance()->trackLocation(position);
- }
-}
-
//static
void LLPanelPicks::onClickTeleport(void* data)
{
LLPanelPicks* self = (LLPanelPicks*)data;
-
- if (!self->mPickItemList.size()) return;
-
- //*TODO use the selected Pick instead of the last one in the list of Picks
- LLPickItem* last_pick = self->mPickItemList.back();
- if (!last_pick) return;
-
- teleport(last_pick->getPosGlobal());
+ LLPickItem* pick_item = self->getSelectedPickItem();
+ if (!pick_item) return;
+ LLPanelPick::teleport(pick_item->getPosGlobal());
}
//static
void LLPanelPicks::onClickMap(void* data)
{
LLPanelPicks* self = (LLPanelPicks*)data;
-
- if (!self->mPickItemList.size()) return;
-
- //*TODO use the selected Pick instead of the last one in the list of Picks
- LLPickItem* last_pick = self->mPickItemList.back();
- if (!last_pick) return;
+ LLPickItem* pick_item = self->getSelectedPickItem();
+ if (!pick_item) return;
+ LLPanelPick::showOnMap(pick_item->getPosGlobal());
+}
- showOnMap(last_pick->getPosGlobal());
+BOOL LLPanelPicks::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (isMouseInPick(x, y))
+ {
+ if (mPopupMenu)
+ {
+ mPopupMenu->buildDrawLabels();
+ mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
+ ((LLContextMenu*)mPopupMenu)->show(x, y, FALSE);
+ LLMenuGL::showPopup(this, mPopupMenu, x, y);
+ }
+ return TRUE;
+ }
+ return LLPanel::handleRightMouseDown(x, y, mask);
}
-//static
-void LLPanelPicks::showOnMap(const LLVector3d& position)
+BOOL LLPanelPicks::handleMouseDown( S32 x, S32 y, MASK mask )
{
- LLFloaterWorldMap::getInstance()->trackLocation(position);
- LLFloaterReg::showInstance("world_map", "center");
+ if (isMouseInPick(x, y)) return TRUE;
+ return LLPanel::handleMouseDown(x, y, mask);
}
void LLPanelPicks::updateButtons()
@@ -344,7 +349,49 @@ void LLPanelPicks::updateButtons()
{
childSetEnabled(XML_BTN_NEW, picks_num < MAX_AVATAR_PICKS);
childSetEnabled(XML_BTN_DELETE, picks_num > 0);
+
+ //*TODO move somewhere this calls
+ // we'd better set them up earlier when a panel was being constructed
+ mPopupMenu->setItemVisible("pick_delete", TRUE);
+ mPopupMenu->setItemVisible("pick_edit", TRUE);
+ mPopupMenu->setItemVisible("pick_separator", TRUE);
}
+
+ //*TODO update buttons like Show on Map, Teleport etc.
+
+}
+
+void LLPanelPicks::setSelectedPickItem( LLPickItem* item )
+{
+ if (!item) return;
+ if (mSelectedPickItem == item) return;
+ if (mSelectedPickItem && mSelectedPickItem->isBackgroundVisible())
+ {
+ mSelectedPickItem->setBackgroundVisible(FALSE);
+ }
+ item->setBackgroundVisible(TRUE);
+ mSelectedPickItem = item;
+}
+
+BOOL LLPanelPicks::isMouseInPick( S32 x, S32 y )
+{
+ LLView* scroll = getChild<LLView>("profile_scroll");
+ if (!scroll->parentPointInView(x, y)) return FALSE;
+
+ S32 x_l = x;
+ S32 y_l = y;
+
+ picture_list_t::const_iterator it = mPickItemList.begin();
+ for(; mPickItemList.end() != it; ++it)
+ {
+ localPointToOtherView(x, y, &x_l, &y_l, (*it));
+ if ((*it)->pointInView(x_l, y_l))
+ {
+ setSelectedPickItem(*it);
+ return TRUE;
+ }
+ }
+ return FALSE;
}
@@ -353,18 +400,18 @@ void LLPanelPicks::updateButtons()
//-----------------------------------------------------------------------------
LLPickItem::LLPickItem()
: LLPanel()
-, mPicID(LLUUID::null)
+, mPickID(LLUUID::null)
, mCreatorID(LLUUID::null)
, mParcelID(LLUUID::null)
, mSnapshotID(LLUUID::null)
, mNeedData(true)
{
- LLUICtrlFactory::getInstance()->buildPanel(this,"panel_pic_list_item.xml");
+ LLUICtrlFactory::getInstance()->buildPanel(this,"panel_pick_list_item.xml");
}
LLPickItem::~LLPickItem()
{
- if (!mCreatorID.isNull())
+ if (mCreatorID.notNull())
{
LLAvatarPropertiesProcessor::instance().removeObserver(mCreatorID, this);
}
@@ -378,7 +425,7 @@ LLPickItem* LLPickItem::create()
void LLPickItem::init(LLPickData* pick_data)
{
- setPictureDescription(pick_data->desc);
+ setPickDesc(pick_data->desc);
setSnapshotId(pick_data->snapshot_id);
mPosGlobal = pick_data->pos_global;
mLocation = pick_data->location_text;
@@ -390,12 +437,7 @@ void LLPickItem::init(LLPickData* pick_data)
}
}
-void LLPickItem::setPicture()
-{
-
-}
-
-void LLPickItem::setPictureName(const std::string& name)
+void LLPickItem::setPickName(const std::string& name)
{
mPickName = name;
childSetValue("picture_name",name);
@@ -417,19 +459,19 @@ const LLUUID& LLPickItem::getSnapshotId()
return mSnapshotID;
}
-void LLPickItem::setPictureDescription(const std::string& descr)
+void LLPickItem::setPickDesc(const std::string& descr)
{
childSetValue("picture_descr",descr);
}
-void LLPickItem::setPictureId(const LLUUID& id)
+void LLPickItem::setPickId(const LLUUID& id)
{
- mPicID = id;
+ mPickID = id;
}
const LLUUID& LLPickItem::getPickId()
{
- return mPicID;
+ return mPickID;
}
const LLVector3d& LLPickItem::getPosGlobal()
@@ -450,7 +492,7 @@ const std::string LLPickItem::getDescription()
void LLPickItem::update()
{
mNeedData = true;
- LLAvatarPropertiesProcessor::instance().sendDataRequest(mCreatorID, APT_PICK_INFO, &mPicID);
+ LLAvatarPropertiesProcessor::instance().sendDataRequest(mCreatorID, APT_PICK_INFO, &mPickID);
mNeedData = false;
}
@@ -461,7 +503,7 @@ void LLPickItem::processProperties(void *data, EAvatarProcessorType type)
LLPickData* pick_data = static_cast<LLPickData *>(data);
if (!pick_data) return;
- if (mPicID != pick_data->pick_id) return;
+ if (mPickID != pick_data->pick_id) return;
init(pick_data);
LLAvatarPropertiesProcessor::instance().removeObserver(pick_data->agent_id, this);
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index bb1ee06780..5ec9809f0b 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -37,13 +37,14 @@
#include "v3dmath.h"
#include "lluuid.h"
#include "llavatarpropertiesprocessor.h"
+#include "llpanelavatar.h"
class LLMessageSystem;
class LLVector3d;
class LLPanelProfileTab;
-class LLPanelMeProfile;
class LLPanelPick;
class LLAgent;
+class LLMenuGL;
class LLPickItem;
@@ -52,15 +53,10 @@ class LLPanelPicks
{
public:
LLPanelPicks(const LLUUID& avatar_id = LLUUID::null);
- LLPanelPicks(const Params& params );
~LLPanelPicks();
static void* create(void* data);
- static void teleport(const LLVector3d& position);
-
- static void showOnMap(const LLVector3d& position);
-
/*virtual*/ BOOL postBuild(void);
/*virtual*/ void onActivate(const LLUUID& id);
@@ -69,28 +65,38 @@ public:
void updateData();
- void setPanelMeProfile(LLPanelMeProfile*);
-
void clear();
- //*TODO implement
- //LLPickItem& getSelectedPick();
+ // returns the selected pick item
+ LLPickItem* getSelectedPickItem();
+
+ // removes the specified pick item
+ void removePickItem(LLPickItem* pick_item);
+
+ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
private:
- static void onClickInfo(void* data);
- static void onClickNew(void* data);
static void onClickDelete(void* data);
static void onClickTeleport(void* data);
static void onClickMap(void* data);
bool callbackDelete(const LLSD& notification, const LLSD& response);
+ void reshapePicksList();
+ void reshapePickItem(LLView* const pick_item, const S32 last_bottom);
+ LLView* getPicksList() const;
void updateButtons();
- typedef std::vector<LLPickItem*> picture_list_t;
+ void setSelectedPickItem(LLPickItem* item);
+
+ BOOL isMouseInPick(S32 x, S32 y);
+
+ typedef std::list<LLPickItem*> picture_list_t;
picture_list_t mPickItemList;
- LLPanelMeProfile* mMeProfilePanel;
+ LLMenuGL* mPopupMenu;
+ LLPickItem* mSelectedPickItem;
};
class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver
@@ -103,13 +109,11 @@ public:
void init(LLPickData* pick_data);
- void setPictureName(const std::string& name);
-
- void setPictureDescription(const std::string& descr);
+ void setPickName(const std::string& name);
- void setPicture();
+ void setPickDesc(const std::string& descr);
- void setPictureId(const LLUUID& id);
+ void setPickId(const LLUUID& id);
void setCreatorId(const LLUUID& id) {mCreatorID = id;};
@@ -139,7 +143,7 @@ public:
protected:
- LLUUID mPicID;
+ LLUUID mPickID;
LLUUID mCreatorID;
LLUUID mParcelID;
LLUUID mSnapshotID;
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 3ed93e5598..d40e10478a 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -34,33 +34,36 @@
#include "llpanelplaceinfo.h"
-// *TODO: reorder includes to match the coding standard
+#include "roles_constants.h"
+#include "llsdutil.h"
+#include "llsecondlifeurls.h"
+
#include "llinventory.h"
-#include "llviewercontrol.h"
+
#include "llqueryflags.h"
-#include "llui.h"
-#include "llsecondlifeurls.h"
+
+#include "llbutton.h"
#include "llfloater.h"
#include "llfloaterreg.h"
+#include "lllineeditor.h"
+#include "llscrollcontainer.h"
+#include "lltextbox.h"
+#include "lltrans.h"
+#include "llui.h"
+#include "lluictrlfactory.h"
#include "llagent.h"
-#include "llviewerwindow.h"
-#include "llviewerinventory.h"
-#include "llbutton.h"
#include "llfloaterworldmap.h"
-#include "lllineeditor.h"
#include "llinventorymodel.h"
-#include "lluiconstants.h"
-#include "roles_constants.h"
-#include "lltextbox.h"
-#include "llviewertexteditor.h"
#include "lltexturectrl.h"
-#include "lltrans.h"
-#include "llworldmap.h"
+#include "lluiconstants.h"
+#include "llviewercontrol.h"
+#include "llviewerinventory.h"
#include "llviewerregion.h"
-#include "lluictrlfactory.h"
+#include "llviewertexteditor.h"
+#include "llviewerwindow.h"
#include "llweb.h"
-#include "llsdutil.h"
+#include "llworldmap.h"
static LLRegisterPanelClassWrapper<LLPanelPlaceInfo> t_places("panel_landmark_info");
@@ -69,7 +72,8 @@ LLPanelPlaceInfo::LLPanelPlaceInfo()
mParcelID(),
mRequestedID(),
mPosRegion(),
- mLandmarkID()
+ mLandmarkID(),
+ mMinHeight(0)
{}
LLPanelPlaceInfo::~LLPanelPlaceInfo()
@@ -104,6 +108,12 @@ BOOL LLPanelPlaceInfo::postBuild()
mNotesEditor->setCommitCallback(boost::bind(&LLPanelPlaceInfo::onCommitTitleOrNote, this, NOTE));
mNotesEditor->setCommitOnFocusLost(true);
+ LLScrollContainer* scroll_container = getChild<LLScrollContainer>("scroll_container");
+ scroll_container->setBorderVisible(FALSE);
+ mMinHeight = scroll_container->getScrolledViewRect().getHeight();
+
+ mScrollingPanel = getChild<LLPanel>("scrolling_panel");
+
mInfoPanel = getChild<LLPanel>("info_panel");
return TRUE;
@@ -380,3 +390,13 @@ void LLPanelPlaceInfo::onCommitTitleOrNote(LANDMARK_INFO_TYPE type)
gInventory.notifyObservers();
}
}
+
+void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ if (mMinHeight > 0)
+ {
+ mScrollingPanel->reshape(mScrollingPanel->getRect().getWidth(), mMinHeight);
+ }
+
+ LLView::reshape(width, height, called_from_parent);
+}
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index f88e29bc91..cec9e7b80c 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -1,5 +1,5 @@
/**
- * @file llpanelplace.h
+ * @file llpanelplaceinfo.h
* @brief Displays place information in Side Tray.
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
@@ -43,11 +43,11 @@
#include "llremoteparcelrequest.h"
class LLButton;
-class LLTextBox;
+class LLInventoryItem;
class LLLineEditor;
+class LLTextBox;
class LLTextEditor;
class LLTextureCtrl;
-class LLInventoryItem;
class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
{
@@ -77,6 +77,7 @@ public:
const std::string& last);
/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
private:
enum LANDMARK_INFO_TYPE
@@ -102,8 +103,10 @@ private:
LLTextBox* mCreated;
LLLineEditor* mTitleEditor;
LLTextEditor* mNotesEditor;
- LLTextBox* mLocationEditor;
+ LLTextBox* mLocationEditor;
+ LLPanel* mScrollingPanel;
LLPanel* mInfoPanel;
+ S32 mMinHeight;
};
#endif // LL_LLPANELPLACEINFO_H
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index d18cac9f42..42b09a45c3 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -108,13 +108,14 @@ void LLPanelPlaces::onOpen(const LLSD& key)
return;
togglePlaceInfoPanel(TRUE);
-
+
mPlaceInfoType = key["type"].asInteger();
if (mPlaceInfoType == AGENT)
{
// We don't need to teleport to the current location so disable the button
getChild<LLButton>("teleport_btn")->setEnabled(FALSE);
+ getChild<LLButton>("map_btn")->setEnabled(TRUE);
mPlaceInfo->displayParcelInfo(gAgent.getPositionAgent(),
gAgent.getRegion()->getRegionID(),
@@ -178,15 +179,11 @@ void LLPanelPlaces::onSearchEdit(const std::string& search_string)
void LLPanelPlaces::onTabSelected()
{
- if (!mActivePanel)
- return;
-
mActivePanel = dynamic_cast<LLPanelPlacesTab*>(mTabContainer->getCurrentPanel());
-
if (mActivePanel)
{
mActivePanel->onSearchEdit(mFilterSubString);
- mActivePanel->onTabSelected();
+ mActivePanel->updateVerbs();
}
}
@@ -249,7 +246,7 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL 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());
+ mPlaceInfo->reshape(new_rect.getWidth(),new_rect.getHeight());
}
}
diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp
index 2b38aa0890..dc9119d2e3 100644
--- a/indra/newview/llpanelplacestab.cpp
+++ b/indra/newview/llpanelplacestab.cpp
@@ -75,24 +75,3 @@ void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos,
LLNotifications::instance().add("CopySLURL", args);
}
-
-void LLPanelPlacesTab::onTabSelected()
-{
- togglePanelPlacesButtons(TRUE);
-}
-
-void LLPanelPlacesTab::togglePanelPlacesButtons(BOOL enabled)
-{
- if (enabled)
- {
- //mShareBtn->setEnabled(TRUE);
- mTeleportBtn->setEnabled(TRUE);
- mShowOnMapBtn->setEnabled(TRUE);
- }
- else
- {
- //mShareBtn->setEnabled(FALSE);
- mTeleportBtn->setEnabled(FALSE);
- mShowOnMapBtn->setEnabled(FALSE);
- }
-}
diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h
index 5d6b7d1090..c098302d1a 100644
--- a/indra/newview/llpanelplacestab.h
+++ b/indra/newview/llpanelplacestab.h
@@ -43,6 +43,7 @@ public:
virtual ~LLPanelPlacesTab() {}
virtual void onSearchEdit(const std::string& string) = 0;
+ virtual void updateVerbs() = 0; // Updates buttons at the bottom of Places panel
//virtual void onShare() = 0;
virtual void onShowOnMap() = 0;
virtual void onTeleport() = 0;
@@ -54,12 +55,7 @@ public:
const std::string& url,
const LLUUID& snapshot_id,
bool teleport);
- void onTabSelected();
-
protected:
- void togglePanelPlacesButtons(BOOL enabled);
-
-private:
//LLButton* mShareBtn;
LLButton* mTeleportBtn;
LLButton* mShowOnMapBtn;
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
index 0d25272f88..495911c2e3 100644
--- a/indra/newview/llpanelprofileview.cpp
+++ b/indra/newview/llpanelprofileview.cpp
@@ -70,10 +70,8 @@ void LLPanelProfileView::onOpen(const LLSD& key)
mProfileId = id;
mTabs[PANEL_PROFILE]->onOpen(mProfileId);
- mTabs[PANEL_PICKS]->setAvatarId(mProfileId);
- mTabs[PANEL_PICKS]->updateData();
- mTabs[PANEL_NOTES]->setAvatarId(mProfileId);
- mTabs[PANEL_NOTES]->updateData();
+ mTabs[PANEL_PICKS]->onActivate(mProfileId);
+ mTabs[PANEL_NOTES]->onActivate(mProfileId);
std::string full_name;
gCacheName->getFullName(key,full_name);
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index eb35834dc0..c271ca34b9 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -92,8 +92,15 @@ void LLTeleportHistoryPanel::onShowOnMap()
S32 index = itemp->getColumn(LIST_INDEX)->getValue().asInteger();
- // teleport to existing item in history, so we don't add it again
- mTeleportHistory->goToItem(index);
+ const LLTeleportHistory::slurl_list_t& hist_items = mTeleportHistory->getItems();
+
+ LLVector3d global_pos = hist_items[index].mGlobalPos;
+
+ if (!global_pos.isExactlyZero())
+ {
+ LLFloaterWorldMap::getInstance()->trackLocation(global_pos);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
}
// virtual
@@ -104,7 +111,8 @@ void LLTeleportHistoryPanel::onTeleport()
return;
S32 index = itemp->getColumn(LIST_INDEX)->getValue().asInteger();
-
+
+ // teleport to existing item in history, so we don't add it again
mTeleportHistory->goToItem(index);
}
@@ -132,6 +140,23 @@ void LLTeleportHistoryPanel::onCopySLURL()
}
*/
+// virtual
+void LLTeleportHistoryPanel::updateVerbs()
+{
+ S32 index = 0;
+ S32 cur_item = 0;
+
+ LLScrollListItem* itemp = mHistoryItems->getFirstSelected();
+ if (itemp)
+ {
+ index = itemp->getColumn(LIST_INDEX)->getValue().asInteger();
+ cur_item = mTeleportHistory->getCurrentItemIndex();
+ }
+
+ mTeleportBtn->setEnabled(index != cur_item);
+ mShowOnMapBtn->setEnabled(itemp != NULL);
+}
+
void LLTeleportHistoryPanel::showTeleportHistory()
{
const LLTeleportHistory::slurl_list_t& hist_items = mTeleportHistory->getItems();
@@ -181,17 +206,12 @@ void LLTeleportHistoryPanel::showTeleportHistory()
}
}
- togglePanelPlacesButtons(mHistoryItems->getFirstSelected() != NULL);
+ updateVerbs();
}
void LLTeleportHistoryPanel::handleItemSelect(const LLSD& data)
{
- LLScrollListItem* itemp = mHistoryItems->getFirstSelected();
-
- if (!itemp)
- return;
-
- togglePanelPlacesButtons(TRUE);
+ updateVerbs();
}
//static
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index 6f41c97eec..553385b37e 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -50,7 +50,8 @@ public:
/*virtual*/ void onShowOnMap();
/*virtual*/ void onTeleport();
///*virtual*/ void onCopySLURL();
-
+ /*virtual*/ void updateVerbs();
+
void showTeleportHistory();
void handleItemSelect(const LLSD& data);
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index e7008abe60..daee3ecfa6 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -704,6 +704,7 @@ void LLSideTray::createHomeTab()
panel_params.padding_right(10);
panel_params.padding_top(5);
panel_params.padding_bottom(5);
+ panel_params.name(sidebar_tab->getTabTitle());
LLCollapsibleCtrl* ctrl = LLUICtrlFactory::create<LLCollapsibleCtrl>(panel_params);
@@ -732,7 +733,8 @@ void LLSideTray::setPanelRect ()
panel_width+=mMaxBarWidth;
S32 panel_height = parent_rect.getHeight()-fake_top_offset;
- panel_height -= LLBottomTray::getInstance()->getRect().getHeight();
+ if(gBottomTray)
+ panel_height -= gBottomTray->getRect().getHeight();
LLRect panel_rect;
panel_rect.setLeftTopAndSize( parent_rect.mRight-panel_width, parent_rect.mTop-fake_top_offset, panel_width, panel_height);
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index 409549a66b..88e79fd4f4 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -46,7 +46,6 @@
// newview headers
#include "llagent.h"
-//#include "llfloateravatarinfo.h"
#include "lldrawable.h"
#include "llfloatertools.h"
#include "llhudeffect.h"
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index a6dcebc3b5..a89e79c8b8 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -48,6 +48,7 @@
#include "llhoverview.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
+#include "llmediamanager.h"
#include "llmenugl.h"
#include "llmutelist.h"
#include "llselectmgr.h"
diff --git a/indra/newview/llviewergesture.cpp b/indra/newview/llviewergesture.cpp
index 2fb56fbcb8..bbd34835ca 100644
--- a/indra/newview/llviewergesture.cpp
+++ b/indra/newview/llviewergesture.cpp
@@ -133,11 +133,11 @@ void LLViewerGesture::doTrigger( BOOL send_chat )
}
}
- if ( send_chat && !mOutputString.empty())
+ if (gBottomTray && send_chat && !mOutputString.empty())
{
// Don't play nodding animation, since that might not blend
// with the gesture animation.
- LLBottomTray::getInstance()->sendChatFromViewer(mOutputString, CHAT_TYPE_NORMAL, FALSE);
+ gBottomTray->sendChatFromViewer(mOutputString, CHAT_TYPE_NORMAL, FALSE);
}
}
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 5c9f8af216..2689fff533 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1552,20 +1552,13 @@ void LLViewerWindow::initWorldUI()
gIMMgr = LLIMMgr::getInstance();
// new bottom panel
- LLRect rc = LLBottomTray::getInstance()->getRect();
+ gBottomTray = new LLBottomTray();
+ LLRect rc = gBottomTray->getRect();
rc.mLeft = 0;
rc.mRight = mRootView->getRect().getWidth();
- mRootView->addChild(LLBottomTray::getInstance());
- LLBottomTray::getInstance()->reshape(rc.getWidth(),rc.getHeight(),FALSE);
- LLBottomTray::getInstance()->setRect(rc);
-
- // Updating of bottom boundary of gConsole to avoid overlapping
- if (gConsole)
- {
- LLRect cr = gConsole->getRect();
- cr.mBottom += LLBottomTray::getInstance()->getRect().getHeight();
- gConsole->setRect(cr);
- }
+ mRootView->addChild(gBottomTray);
+ gBottomTray->reshape(rc.getWidth(),rc.getHeight(),FALSE);
+ gBottomTray->setRect(rc);
// View for hover information
LLHoverView::Params hvp;
@@ -1597,9 +1590,9 @@ void LLViewerWindow::initWorldUI()
LLRect floater_view_rect = gFloaterView->getRect();
LLRect notify_view_rect = gNotifyBoxView->getRect();
floater_view_rect.mTop -= NAVIGATION_BAR_HEIGHT;
- floater_view_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight();
+ floater_view_rect.mBottom += gBottomTray->getRect().getHeight();
notify_view_rect.mTop -= NAVIGATION_BAR_HEIGHT;
- notify_view_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight();
+ notify_view_rect.mBottom += gBottomTray->getRect().getHeight();
gFloaterView->setRect(floater_view_rect);
gNotifyBoxView->setRect(notify_view_rect);
@@ -1858,8 +1851,11 @@ void LLViewerWindow::reshape(S32 width, S32 height)
// Hide normal UI when a logon fails
void LLViewerWindow::setNormalControlsVisible( BOOL visible )
{
- LLBottomTray::getInstance()->setVisible(visible);
- LLBottomTray::getInstance()->setEnabled(visible);
+ if(gBottomTray)
+ {
+ gBottomTray->setVisible(visible);
+ gBottomTray->setEnabled(visible);
+ }
if ( gMenuBarView )
{
@@ -2775,6 +2771,14 @@ void LLViewerWindow::updateLayout()
}
gMenuBarView->setItemVisible("BuildTools", gFloaterTools->getVisible());
}
+
+ // Always update console
+ if(gConsole)
+ {
+ LLRect console_rect = getChatConsoleRect();
+ gConsole->reshape(console_rect.getWidth(), console_rect.getHeight());
+ gConsole->setRect(console_rect);
+ }
}
void LLViewerWindow::updateMouseDelta()
@@ -4850,13 +4854,12 @@ void LLViewerWindow::calcDisplayScale()
}
}
-S32 TOOL_BAR_HEIGHT = 20; // *TODO:Skinning Fix
-
S32 LLViewerWindow::getChatConsoleBottomPad()
{
S32 offset = 0;
- if( gToolBar && gToolBar->getVisible() )
- offset += TOOL_BAR_HEIGHT;
+
+ if(gBottomTray)
+ offset += gBottomTray->getRect().getHeight();
return offset;
}
@@ -4875,7 +4878,9 @@ LLRect LLViewerWindow::getChatConsoleRect()
console_rect.mLeft += CONSOLE_PADDING_LEFT;
- if (gSavedSettings.getBOOL("ChatFullWidth"))
+ static const BOOL CHAT_FULL_WIDTH = gSavedSettings.getBOOL("ChatFullWidth");
+
+ if (CHAT_FULL_WIDTH)
{
console_rect.mRight -= CONSOLE_PADDING_RIGHT;
}
diff --git a/indra/newview/skins/default/textures/image_edit_icon.tga b/indra/newview/skins/default/textures/image_edit_icon.tga
new file mode 100644
index 0000000000..8666f0bbe6
--- /dev/null
+++ b/indra/newview/skins/default/textures/image_edit_icon.tga
Binary files differ
diff --git a/indra/newview/skins/default/xui/en/accordion_parent.xml b/indra/newview/skins/default/xui/en/accordion_parent.xml
index 632752b1c4..914a6eddb9 100644
--- a/indra/newview/skins/default/xui/en/accordion_parent.xml
+++ b/indra/newview/skins/default/xui/en/accordion_parent.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel border_thickness="2" name="splitter_parent"
- can_resize="true" background_visible="true"
+ background_visible="true"
label="splitter_parent"
title=""
>
diff --git a/indra/newview/skins/default/xui/en/menu_picks.xml b/indra/newview/skins/default/xui/en/menu_picks.xml
new file mode 100644
index 0000000000..146d7d06fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_picks.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Picks">
+ <menu_item_call
+ label="Info"
+ layout="topleft"
+ name="pick_info">
+ <menu_item_call.on_click
+ function="Pick.Info" />
+ </menu_item_call>
+ <menu_item_call
+ label="Edit"
+ layout="topleft"
+ name="pick_edit"
+ visible="false">
+ <menu_item_call.on_click
+ function="Pick.Edit" />
+ </menu_item_call>
+ <menu_item_call
+ label="Teleport"
+ layout="topleft"
+ name="pick_teleport">
+ <menu_item_call.on_click
+ function="Pick.Teleport" />
+ </menu_item_call>
+ <menu_item_call
+ label="Show on Map"
+ layout="topleft"
+ name="pick_map">
+ <menu_item_call.on_click
+ function="Pick.Map" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="pick_separator"
+ visible="false" />
+ <menu_item_call
+ label="Delete"
+ layout="topleft"
+ name="pick_delete"
+ visible="false">
+ <menu_item_call.on_click
+ function="Pick.Delete" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index bf3f70f54b..3de3365539 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -47,9 +47,9 @@
<button
bottom="5" left="260" width="20" height="20" follows="right"
name="info_btn" label=""
- image_unselected="info_btn.tga" image_disabled="info_btn.tga"
- image_selected="info_btn_active.tga" image_hover_selected="info_btn_active.tga"
- image_disabled_selected="info_btn.tga" font="SansSerifBigBold"
+ image_unselected="avatar_info_btn.tga" image_disabled="avatar_info_btn.tga"
+ image_selected="avatar_info_btn_active.tga" image_hover_selected="avatar_info_btn_active.tga"
+ image_disabled_selected="avatar_info_btn.tga" font="SansSerifBigBold"
/>
<button
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 303487f21b..1e222db7b5 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel follows="left|bottom|right" name="bottom_tray" bg_opaque_color="0.25 0.25 0.25 1.0"
bg_alpha_color="0.25 0.25 0.25 1.0" background_visible="true" auto_resize="true"
- left="0" bottom="0" width="1000" height="28" border_visible="false" has_border="false">
+ left="0" bottom="0" width="1000" height="28" border_visible="false">
+ <panel.string name="gesture_label">
+ Gestures
+ </panel.string>
<layout_stack name="toolbar_stack" follows="left|right|bottom|top"
bottom="0" left="0" width="1000" height="25" orientation="horizontal" border_size="0" auto_resize="false">
@@ -12,12 +15,16 @@
bevel_style="in" border_style="line" border_thickness="1"/>
</panel>
<icon image_name="spacer24.tga" left="0" width="5" height="10" bottom="0" follows="left|right" auto_resize="false" color="0 0 0 0"/>
- <view_border bevel_style="in" bottom="0" height="28" min_height="28" width="1" follows="left|right" left="270" mouse_opaque="false" auto_resize="false"/>
+ <view_border bevel_style="in" bottom="0" height="28" width="1" follows="left|right" left="270" mouse_opaque="false" auto_resize="false"/>
<icon image_name="spacer24.tga" left="0" width="5" height="10" bottom="0" follows="left|right" auto_resize="false" color="0 0 0 0"/>
<panel follows="left|right" auto_resize="false" width="100" height="28" min_height="28">
<chiclet_talk name="talk" left="0" bottom="6" width="100" height="20" follows="left|right" auto_resize="false"/>
</panel>
- <icon name="DUMMY" image_name="spacer24.tga" left="0" width="150" height="10" bottom="0" follows="left|right" auto_resize="false" color="0 0 0 0"/>
+ <icon name="DUMMY" image_name="spacer24.tga" left="0" width="5" height="10" bottom="0" follows="left|right" auto_resize="false" color="0 0 0 0"/>
+ <panel follows="left|right" auto_resize="true" width="90" height="28" min_height="28">
+ <combo_box follows="left|right" height="20" label="Gestures" left="0" bottom="6" name="Gesture" top_delta="0" width="90" />
+ </panel>
+ <icon name="DUMMY" image_name="spacer24.tga" left="0" width="5" height="10" bottom="0" follows="left|right" auto_resize="false" color="0 0 0 0"/>
<panel follows="left|right" auto_resize="true" width="250" height="28" min_height="28">
<chiclet_panel name="chiclet_list" follows="left|right"
width="250" height="25" left="0" bottom="2"/>
@@ -29,12 +36,12 @@
image_unselected="im_notifications.tga" image_selected="im_notifications.tga"/>
</panel>
<icon image_name="spacer24.tga" left="0" width="10" height="10" bottom="0" follows="left|right" auto_resize="false" color="0 0 0 0"/>
- <view_border bevel_style="in" bottom="0" height="30" width="1" follows="left|right" left="270" mouse_opaque="false" auto_resize="false"/>
+ <view_border name="well_separator" bevel_style="in" bottom="0" height="30" width="1" follows="left|right" left="270" mouse_opaque="false" auto_resize="false"/>
<icon image_name="spacer24.tga" left="0" width="10" height="10" bottom="0" follows="left|right" auto_resize="false" color="0 0 0 0"/>
<panel follows="left|right" auto_resize="false" width="48" height="28" min_height="28">
<chiclet_notification name="sys_well" follows="left|right" auto_resize="false"
left="0" bottom="5" width="48" height="25"
- image_unselected="sys_notifications.tga" image_selected="sys_notifications.tga"/>
+ image_unselected="bottom_tray_sys_notifications.tga" image_selected="bottom_tray_sys_notifications.tga"/>
</panel>
<icon image_name="spacer24.tga" left="0" width="5" height="10" bottom="0" follows="left|right" auto_resize="false" color="0 0 0 0"/>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index 967cf2f539..acbbde37c9 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -9,7 +9,7 @@
left="0"
name="panel_edit_pick"
top="0"
- width="355">
+ width="345">
<text
type="string"
length="1"
@@ -33,14 +33,33 @@
left="10"
right="-10"
top="30">
- <texture_picker
+ <panel
follows="left|top|right"
height="150"
layout="topleft"
left="10"
- name="pick_snapshot"
right="-10"
- top="10" />
+ top="10">
+ <panel
+ follows="left|top|right"
+ height="150"
+ layout="topleft" >
+ <texture_picker
+ follows="left|top|right"
+ height="150"
+ layout="topleft"
+ name="pick_snapshot" />
+ </panel>
+ <icon
+ height="16"
+ image_name="image_edit_icon.tga"
+ layout="topleft"
+ name="edit_icon"
+ right="-25"
+ top="30"
+ visible="false"
+ width="16" />
+ </panel>
<text
type="string"
length="1"
@@ -124,11 +143,11 @@
left="5"
name="bottom_panel"
top="605"
- width="345">
+ right="-10">
<button
follows="bottom|left"
height="20"
- label="Save Changes"
+ label="Save [WHAT]"
layout="topleft"
name="save_changes_btn"
right="-120"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index e787d03eca..5f51e8d22c 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -119,6 +119,24 @@
top_pad="5"
width="105" />
</panel>
+ <icon
+ height="16"
+ image_name="image_edit_icon.tga"
+ layout="topleft"
+ left="75"
+ name="2nd_life_edit_icon"
+ tool_tip="Click to select an image"
+ top="35"
+ width="16" />
+ <icon
+ height="16"
+ image_name="image_edit_icon.tga"
+ layout="topleft"
+ left="200"
+ name="1st_life_edit_icon"
+ tool_tip="Click to select an image"
+ top="35"
+ width="16" />
</panel>
<text
type="string"
@@ -189,8 +207,6 @@
Homepage:
</text>
<line_editor
- type="string"
- length="1"
follows="left|top|right"
font="SansSerif"
font.style="UNDERLINE"
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index e252788c69..7cdda126b9 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -37,222 +37,238 @@
name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</panel.string>
- <button
- follows="top|left"
- height="20"
- image_overlay="navbar_back.tga"
- image_selected="navbar_bg_button.tga"
- image_unselected="navbar_bg_button.tga"
- layout="topleft"
- left="10"
- name="back_btn"
- picture_style="true"
- top="20"
- width="20" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerifHugeBold"
- height="20"
- layout="topleft"
- left="50"
- name="panel_title"
- text_color="white"
- top="20"
- width="150">
- Landmark
- </text>
- <texture_picker
- follows="top|left"
- height="128"
- layout="topleft"
- left="10"
- name="logo"
- top="60"
- width="128" />
- <text
- follows="left|top|right"
- font="SansSerifHugeBold"
- height="20"
- layout="topleft"
- left="10"
- name="region_name"
- text_color="white"
- top="180"
- width="340" />
- <text
- follows="left|top|right"
- font="SansSerifBold"
- height="20"
- layout="topleft"
- left="10"
- name="parcel_name"
- text_color="white"
- top="205"
- width="340" />
- <panel
- follows="left|top|right|bottom"
- height="335"
+ <scroll_container
+ follows="all"
+ height="560"
layout="topleft"
left="0"
- name="info_panel"
- top="225"
+ top="0"
width="355">
- <text_editor
- bg_focus_color="0.3 0.3 0.3 1"
- bg_readonly_color="0.3 0.3 0.3 1"
- follows="left|top|right"
- font="SansSerif"
- height="90"
- hide_border="true"
- hide_scrollbar="true"
+ <panel
+ height="560"
layout="topleft"
- left="10"
- max_length="1000"
- name="description"
- read_only="true"
- text_color="white"
+ left="0"
+ name="scrolling_panel"
top="0"
- width="340" />
- <icon
- follows="top|left"
- height="30"
- image_name=""
- layout="topleft"
- left="10"
- mouse_opaque="true"
- name="maturity"
- top="95"
- width="30" />
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="15"
- layout="topleft"
- left="10"
- name="owner_lable"
- text_color="white"
- top="130"
- width="50"
- word_wrap="true">
- Owner:
- </text>
- <text
- follows="left|top|right"
- font="SansSerif"
- height="15"
- layout="topleft"
- left="80"
- name="owner"
- text_color="white"
- top="130"
- width="260"
- word_wrap="true" />
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="15"
- layout="topleft"
- left="10"
- name="creator_lable"
- text_color="white"
- top="150"
- width="50"
- word_wrap="true">
- Creator:
- </text>
- <text
- follows="left|top|right"
- font="SansSerif"
- height="15"
- layout="topleft"
- left="80"
- name="creator"
- text_color="white"
- top="150"
- width="260"
- word_wrap="true" />
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="15"
- layout="topleft"
- left="10"
- name="created_lable"
- text_color="white"
- top="170"
- width="50"
- word_wrap="true">
- Created:
- </text>
- <text
- follows="left|top|right"
- font="SansSerif"
- height="15"
- layout="topleft"
- left="80"
- name="created"
- text_color="white"
- top="170"
- width="260"
- word_wrap="true" />
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="15"
- layout="topleft"
- left="10"
- name="title_lable"
- text_color="white"
- top="190"
- width="50"
- word_wrap="true">
- Title:
- </text>
- <line_editor
- follows="left|top|right"
- font="SansSerif"
- height="22"
- layout="topleft"
- left="10"
- max_length="255"
- name="title_editor"
- top="210"
- width="330" />
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="15"
- layout="topleft"
- left="10"
- name="notes_lable"
- text_color="white"
- top="240"
- width="90"
- word_wrap="true">
- My Notes:
- </text>
- <text_editor
- follows="left|top|bottom|right"
- font="SansSerif"
- height="70"
- hide_scrollbar="true"
- layout="topleft"
- left="10"
- max_length="1000"
- name="notes_editor"
- top="260"
- width="330" />
- </panel>
+ width="310">
+ <button
+ follows="top|left"
+ height="20"
+ image_overlay="navbar_back.tga"
+ image_selected="navbar_bg_button.tga"
+ image_unselected="navbar_bg_button.tga"
+ layout="topleft"
+ left="10"
+ name="back_btn"
+ picture_style="true"
+ top="20"
+ width="20" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ font="SansSerifHugeBold"
+ height="20"
+ layout="topleft"
+ left="50"
+ name="panel_title"
+ text_color="white"
+ top="20"
+ width="150">
+ Landmark
+ </text>
+ <texture_picker
+ follows="top|left"
+ height="128"
+ layout="topleft"
+ left="10"
+ name="logo"
+ top="60"
+ width="128" />
+ <text
+ follows="left|top|right"
+ font="SansSerifHugeBold"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="region_name"
+ text_color="white"
+ top="180"
+ width="310" />
+ <text
+ follows="left|top|right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="parcel_name"
+ text_color="white"
+ top="205"
+ width="310" />
+ <panel
+ follows="left|top|right|bottom"
+ height="335"
+ layout="topleft"
+ left="10"
+ name="info_panel"
+ top="225"
+ width="310">
+ <text_editor
+ bg_focus_color="0.3 0.3 0.3 1"
+ bg_readonly_color="0.3 0.3 0.3 1"
+ follows="left|top|right"
+ font="SansSerif"
+ height="90"
+ hide_border="true"
+ hide_scrollbar="true"
+ layout="topleft"
+ left="0"
+ max_length="1000"
+ name="description"
+ read_only="true"
+ text_color="white"
+ top="0"
+ width="310" />
+ <icon
+ follows="top|left"
+ height="30"
+ image_name=""
+ layout="topleft"
+ left="0"
+ mouse_opaque="true"
+ name="maturity"
+ top="95"
+ width="30" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="owner_lable"
+ text_color="white"
+ top="130"
+ width="50"
+ word_wrap="true">
+ Owner:
+ </text>
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="15"
+ layout="topleft"
+ left="70"
+ name="owner"
+ text_color="white"
+ top="130"
+ width="240"
+ word_wrap="true" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="creator_lable"
+ text_color="white"
+ top="150"
+ width="50"
+ word_wrap="true">
+ Creator:
+ </text>
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="15"
+ layout="topleft"
+ left="70"
+ name="creator"
+ text_color="white"
+ top="150"
+ width="240"
+ word_wrap="true" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="created_lable"
+ text_color="white"
+ top="170"
+ width="50"
+ word_wrap="true">
+ Created:
+ </text>
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="15"
+ layout="topleft"
+ left="70"
+ name="created"
+ text_color="white"
+ top="170"
+ width="240"
+ word_wrap="true" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="title_lable"
+ text_color="white"
+ top="190"
+ width="50"
+ word_wrap="true">
+ Title:
+ </text>
+ <line_editor
+ follows="left|top|right"
+ font="SansSerif"
+ height="22"
+ layout="topleft"
+ left="0"
+ max_length="255"
+ name="title_editor"
+ top="210"
+ width="310" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="15"
+ layout="topleft"
+ left="0"
+ name="notes_lable"
+ text_color="white"
+ top="240"
+ width="90"
+ word_wrap="true">
+ My Notes:
+ </text>
+ <text_editor
+ follows="left|top|bottom|right"
+ font="SansSerif"
+ height="70"
+ hide_scrollbar="true"
+ layout="topleft"
+ left="0"
+ max_length="1000"
+ name="notes_editor"
+ top="260"
+ width="310" />
+ </panel>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
index 767432a522..27e2f87fb4 100644
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ b/indra/newview/skins/default/xui/en/panel_notes.xml
@@ -1,155 +1,162 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="top|left|right|bottom"
- background_visible="true"
bevel_style="in"
- bg_alpha_color="0.5 0.5 0.5 1"
- height="705"
+ height="625"
label="Notes and Privacy"
layout="topleft"
left="10"
name="panel_notes"
top="10"
width="355">
- <scroll_container
- left="1" width="354" height="690" follows="left|top|right|bottom"
- layout="topleft"
- reserve_scroll_corner="false">
- <panel
- layout="topleft"
- width="320"
- height="690"
- left="0"
- top="0">
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerifHugeBold"
- height="35"
+ <scroll_container
+ left="8"
+ width="340"
+ height="570"
+ follows="left|top|right|bottom"
layout="topleft"
- left="10"
- name="pick_title"
- text_color="white"
- top="10"
- width="250"
- word_wrap="true">
- Private Notes
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- font.style="ITALIC"
- height="15"
- layout="topleft"
- left="10"
- name="status_message"
- text_color="0.1 0.1 0.1 1"
- top="50"
- width="300">
- Your notes about this user:
- </text>
- <text_editor
- bg_focus_color="white"
- bg_writeable_color="0.6 0.6 0.6 1"
- follows="left|right"
- font="SansSerif"
- height="300"
- hide_scrollbar="true"
- layout="topleft"
- left="10"
- max_length="1000"
- name="notes_edit"
- text_color="black"
- top="70"
- width="280"
- word_wrap="true" />
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerifHugeBold"
- height="35"
- layout="topleft"
- left="10"
- name="pick_title"
- text_color="white"
- top="410"
- width="250"
- word_wrap="true">
- Private Settings
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- font.style="ITALIC"
- height="15"
- layout="topleft"
- left="10"
- name="status_message"
- text_color="0.1 0.1 0.1 1"
- top="435"
- width="300">
- This user can:
- </text>
- <check_box
- enabled="false"
- follows="left|top"
- font="SansSerifBig"
- height="20"
- label="See my online status"
- layout="topleft"
- left="10"
- name="status_check"
- text_disabled_color="0.1 0.1 0.1 1"
- text_enabled_color="white"
- top="455"
- width="300" />
- <check_box
- enabled="false"
- follows="left|top"
- font="SansSerifBig"
- height="20"
- label="See me on the map"
- layout="topleft"
- left="10"
- name="map_check"
- text_disabled_color="0.1 0.1 0.1 1"
- text_enabled_color="white"
- top="480"
- width="300" />
- <check_box
- enabled="false"
- follows="left|top"
- font="SansSerifBig"
- height="20"
- label="Edit, delite or take my objects"
- layout="topleft"
- left="10"
- name="objects_check"
- text_disabled_color="0.1 0.1 0.1 1"
- text_enabled_color="white"
- top="505"
- width="300" />
+ name="profile_scroll"
+ opaque="true"
+ color="0.5 0.5 0.5 1.0"
+ reserve_scroll_corner="false">
+ <panel
+ layout="topleft"
+ width="310"
+ height="530"
+ left="0"
+ follows="left|right"
+ top="0">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerifHugeBold"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="pick_title"
+ text_color="white"
+ top="10"
+ width="250"
+ word_wrap="true">
+ Private Notes
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ font.style="ITALIC"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="status_message"
+ text_color="0.1 0.1 0.1 1"
+ top_pad="10"
+ width="300">
+ Your notes about this user:
+ </text>
+ <text_editor
+ bg_focus_color="white"
+ bg_writeable_color="0.6 0.6 0.6 1"
+ follows="left|right"
+ font="SansSerif"
+ height="300"
+ hide_scrollbar="true"
+ layout="topleft"
+ left="10"
+ max_length="1000"
+ name="notes_edit"
+ text_color="black"
+ top_pad="10"
+ width="290"
+ word_wrap="true" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerifHugeBold"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="pick_title"
+ text_color="white"
+ top_pad="10"
+ width="250"
+ word_wrap="true">
+ Private Settings
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ font.style="ITALIC"
+ height="15"
+ layout="topleft"
+ left="10"
+ name="status_message"
+ text_color="0.1 0.1 0.1 1"
+ top_pad="10"
+ width="300">
+ This user can:
+ </text>
+ <check_box
+ enabled="false"
+ follows="left|top"
+ font="SansSerifBig"
+ height="20"
+ label="See my online status"
+ layout="topleft"
+ left="10"
+ name="status_check"
+ text_disabled_color="0.1 0.1 0.1 1"
+ text_enabled_color="white"
+ top_pad="10"
+ width="300" />
+ <check_box
+ enabled="false"
+ follows="left|top"
+ font="SansSerifBig"
+ height="20"
+ label="See me on the map"
+ layout="topleft"
+ left="10"
+ name="map_check"
+ text_disabled_color="0.1 0.1 0.1 1"
+ text_enabled_color="white"
+ top_pad="10"
+ width="300" />
+ <check_box
+ enabled="false"
+ follows="left|top"
+ font="SansSerifBig"
+ height="20"
+ label="Edit, delite or take my objects"
+ layout="topleft"
+ left="10"
+ name="objects_check"
+ text_disabled_color="0.1 0.1 0.1 1"
+ text_enabled_color="white"
+ top_pad="10"
+ width="300" />
+ </panel>
+ </scroll_container>
<panel
layout="topleft"
follows="bottom"
height="30"
- left="0"
+ left="8"
name="notes_buttons_panel"
- bottom="690"
- width="350">
- <button
+ bottom="625"
+ width="345">
+ <button
follows="bottom|left"
font="SansSerifSmallBold"
height="25"
label="Add Friend"
layout="topleft"
- left="5"
+ left="0"
mouse_opaque="false"
name="add_friend"
top="0"
@@ -162,7 +169,7 @@
layout="topleft"
left_pad="5"
name="im"
- top_delta="0"
+ top="0"
width="40" />
<button
follows="bottom|left"
@@ -172,7 +179,7 @@
layout="topleft"
left_pad="5"
name="call"
- top_delta="0"
+ top="0"
width="50"
enabled="false"/>
<button
@@ -183,7 +190,7 @@
layout="topleft"
left_pad="5"
name="teleport"
- top_delta="0"
+ top="0"
width="65" />
<button
follows="bottom|left"
@@ -191,12 +198,10 @@
height="25"
label="Share"
layout="topleft"
- left_pad="15"
+ left_pad="5"
name="share"
- top_delta="0"
+ top="0"
width="50"
enabled="false"/>
</panel>
</panel>
- </scroll_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index f53e06494f..ae385731f9 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -82,9 +82,9 @@
top="9" left="10" width="16" height="16"
follows="bottom|left"
font="SansSerifBigBold"
- image_hover_selected="add_btn.tga"
- image_selected="add_btn.tga"
- image_unselected="add_btn.tga" picture_style="true"
+ image_hover_selected="plus.tga"
+ image_selected="plus.tga"
+ image_unselected="plus.tga" picture_style="true"
/>
<button
name="del_btn"
@@ -92,9 +92,9 @@
top_delta="0" left_pad="24" width="16" height="16"
follows="bottom|left"
font="SansSerifBigBold"
- image_hover_selected="del_btn.tga"
- image_selected="del_btn.tga"
- image_unselected="del_btn.tga"
+ image_hover_selected="minus.tga"
+ image_selected="minus.tga"
+ image_unselected="minus.tga"
picture_style="true"
/>
<button
@@ -137,9 +137,9 @@
top="9" left="10" width="16" height="16"
follows="bottom|left"
font="SansSerifBigBold"
- image_hover_selected="add_btn.tga"
- image_selected="add_btn.tga"
- image_unselected="add_btn.tga"
+ image_hover_selected="plus.tga"
+ image_selected="plus.tga"
+ image_unselected="plus.tga"
picture_style="true"
/>
<button
@@ -148,9 +148,9 @@
top_delta="0" left_pad="24" width="16" height="16"
follows="bottom|left"
font="SansSerifBigBold"
- image_hover_selected="del_btn.tga"
- image_selected="del_btn.tga"
- image_unselected="del_btn.tga"
+ image_hover_selected="minus.tga"
+ image_selected="minus.tga"
+ image_unselected="minus.tga"
picture_style="true"
/>
<button
@@ -159,9 +159,9 @@
top_delta="0" left_pad="24" width="16" height="16"
follows="bottom|left"
font="SansSerifBigBold"
- image_hover_selected="activate_btn.tga"
- image_selected="activate_btn.tga"
- image_unselected="activate_btn.tga"
+ image_hover_selected="group_activate_btn.tga"
+ image_selected="group_activate_btn.tga"
+ image_unselected="group_activate_btn.tga"
picture_style="true"
/>
<button
@@ -434,8 +434,8 @@
class="panel_profile_view"
filename="panel_profile_view.xml"
top="0"
- left="5"
- width="345"
+ left="0"
+ width="355"
height="465"
follows="left|right|top|bottom"
visible="false"
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 fa04ba7f15..9fc1627cb9 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -3,7 +3,7 @@
background_visible="true"
bevel_style="in"
bg_alpha_color="0.2 0.2 0.2 1"
- height="640"
+ height="660"
layout="topleft"
left="0"
name="panel_pick_info"
@@ -39,7 +39,7 @@
background_visible="true"
bg_alpha_color="0.5 0.5 0.5 1"
follows="left|right|top|bottom"
- height="570"
+ height="580"
layout="topleft"
left="10"
right="-10"
@@ -133,52 +133,50 @@
follows="left|right|bottom"
height="30"
layout="topleft"
- left="10"
+ left="8"
name="buttons"
right="-10"
- top_pad="2">
+ bottom="660">
<button
follows="bottom|left"
font="SansSerifSmallBold"
height="25"
label="Edit"
layout="topleft"
- left="10"
+ left="0"
name="edit_btn"
- top="3"
+ top="0"
width="50" />
<button
- enabled="false"
- follows="bottom|left"
+ follows="bottom|left"
font="SansSerifSmallBold"
height="25"
label="Teleport"
layout="topleft"
- left="65"
+ left_pad="5"
name="teleport_btn"
- top="3"
+ top="0"
width="70" />
<button
- enabled="false"
- follows="bottom|left"
+ follows="bottom|left"
font="SansSerifSmallBold"
height="25"
label="Show on Map"
layout="topleft"
- left="140"
+ left_pad="5"
name="show_on_map_btn"
- top="3"
+ top="0"
width="90" />
<button
- enabled="false"
- follows="bottom|right"
+ enabled="false"
+ follows="bottom|left"
font="SansSerifSmallBold"
height="25"
label="Verb"
layout="topleft"
- left="270"
+ right="-5"
name="verb_btn"
- top="3"
+ top="0"
width="50" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
new file mode 100644
index 0000000000..a4599bdf1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ bg_alpha_color="0.4 0.4 0.4 1"
+ bg_opaque_color="0.4 0.4 0.4 1"
+ border="true"
+ follows="top|left|right"
+ height="80"
+ layout="topleft"
+ left="0"
+ name="picture_item"
+ top="80"
+ width="310">
+ <texture_picker
+ allow_no_texture="true"
+ default_image_name="None"
+ enabled="false"
+ follows="left|top"
+ height="80"
+ layout="topleft"
+ left="5"
+ mouse_opaque="false"
+ name="picture"
+ tab_stop="false"
+ top="7"
+ width="90" />
+ <text
+ follows="right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left="100"
+ name="picture_name"
+ text_color="black"
+ top="5"
+ width="170" />
+ <text
+ follows="right"
+ font="SansSerif"
+ height="40"
+ layout="topleft"
+ left="100"
+ name="picture_descr"
+ text_color="white"
+ top="25"
+ width="170"
+ word_wrap="true" />
+ <button
+ follows="right"
+ height="20"
+ image_disabled="navbar_bg_button.tga"
+ image_disabled_selected="navbar_bg_button.tga"
+ image_overlay="navbar_forward.tga"
+ image_selected="navbar_bg_button.tga"
+ image_unselected="navbar_bg_button.tga"
+ layout="topleft"
+ name="inspector"
+ picture_style="true"
+ right="-5"
+ tab_stop="false"
+ top="28"
+ width="20" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 95055f43dc..ed851452fe 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- background_visible="true"
bevel_style="in"
- bg_alpha_color="0.5 0.5 0.5 1"
- height="690"
+ follows="left|top|right|bottom"
+ height="625"
label="Picks"
layout="topleft"
left="0"
@@ -15,7 +14,7 @@
length="1"
follows="top|left|right"
font="SansSerifHugeBold"
- height="55"
+ height="50"
layout="topleft"
left="10"
name="pick_title"
@@ -44,22 +43,23 @@
</text>
<scroll_container
follows="left|top|right|bottom"
- height="550"
+ height="495"
layout="topleft"
- left="5"
- reserve_scroll_corner="true"
- width="345">
+ left="8"
+ name="profile_scroll"
+ opaque="true"
+ color="0.5 0.5 0.5 1.0"
+ reserve_scroll_corner="false"
+ top_pad="0"
+ width="340">
<panel
- background_visible="true"
bevel_style="in"
- bg_alpha_color="0.6 0.6 0.6 1"
- follows="left|top|right|bottom"
- height="600"
+ height="40"
layout="topleft"
left="0"
name="back_panel"
top="0"
- width="325" />
+ width="310" />
</scroll_container>
<panel
background_visible="true"
@@ -70,10 +70,11 @@
height="25"
label="bottom_panel"
layout="topleft"
- left="5"
+ left="8"
name="edit_panel"
visible="false"
- width="345">
+ top_pad="0"
+ width="340">
<button
enabled="false"
follows="bottom|left"
@@ -92,27 +93,27 @@
follows="bottom|left"
font="SansSerifBigBold"
height="16"
- image_disabled="add_btn.tga"
- image_disabled_selected="add_btn.tga"
- image_hover_selected="add_btn.tga"
- image_selected="add_btn.tga"
- image_unselected="add_btn.tga"
+ image_disabled="plus.tga"
+ image_disabled_selected="plus.tga"
+ image_hover_selected="plus.tga"
+ image_selected="plus.tga"
+ image_unselected="plus.tga"
layout="topleft"
left="35"
name="new_btn"
picture_style="true"
- tool_tip="Create New Pick at Current Location"
+ tool_tip="Create New Pick at Current Location"
top="5"
width="16" />
<button
follows="bottom|right"
font="SansSerifBigBold"
height="16"
- image_disabled="del_btn.tga"
- image_disabled_selected="del_btn.tga"
- image_hover_selected="del_btn.tga"
- image_selected="del_btn.tga"
- image_unselected="del_btn.tga"
+ image_disabled="minus.tga"
+ image_disabled_selected="minus.tga"
+ image_hover_selected="minus.tga"
+ image_selected="minus.tga"
+ image_unselected="minus.tga"
layout="topleft"
name="trash_btn"
picture_style="true"
@@ -121,12 +122,12 @@
width="16" />
</panel>
<panel
- follows="left|right"
- height="25"
+ follows="bottom|left"
+ height="30"
layout="topleft"
- left="0"
+ left="8"
name="buttons_cucks"
- top_pad="10"
+ bottom="625"
width="345">
<button
follows="bottom|left"
@@ -134,8 +135,9 @@
height="25"
label="Info"
layout="topleft"
- left="10"
+ left="0"
name="info_btn"
+ enabled="false"
top="0"
width="50" />
<button
@@ -144,8 +146,9 @@
height="25"
label="Teleport"
layout="topleft"
- left="65"
+ left_pad="5"
name="teleport_btn"
+ enabled="false"
top="0"
width="70" />
<button
@@ -154,8 +157,9 @@
height="25"
label="Show on Map"
layout="topleft"
- left="140"
+ left_pad="5"
name="show_on_map_btn"
+ enabled="false"
top="0"
width="90" />
<button
@@ -165,7 +169,7 @@
height="25"
label="Verb"
layout="topleft"
- left="270"
+ left="280"
name="verb_btn"
top="0"
width="50" />
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 66bb38b45e..272a7f4328 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -45,7 +45,7 @@
follows="bottom|left"
font="SansSerifSmallBold"
height="25"
- label="TELEPORT"
+ label="Teleport"
layout="topleft"
left_delta="10"
name="teleport_btn"
@@ -55,7 +55,7 @@
follows="bottom|left"
font="SansSerifSmallBold"
height="25"
- label="SHOW ON MAP"
+ label="Show on Map"
layout="topleft"
left_pad="5"
name="map_btn"
@@ -66,7 +66,7 @@
follows="bottom|left"
font="SansSerifSmallBold"
height="25"
- label="SHARE"
+ label="Share"
layout="topleft"
left_pad="5"
name="share_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index a4363d5858..f99d629aed 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- background_visible="true"
bevel_style="in"
- bg_alpha_color="0.5 0.5 0.5 1"
follows="left|top|right|bottom"
- height="705"
+ height="625"
label="Profile"
layout="topleft"
left="10"
@@ -52,19 +50,52 @@
name="NotAgeVerified">
Not Age-verified
</panel.string>
+ <panel.string
+ name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=en
+ </panel.string>
+ <panel.string
+ name="my_account_link_url">
+ http://secondlife.com/account
+ </panel.string>
+ <panel.string
+ name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </panel.string>
+ <panel.string
+ name="no_partner_text">
+ None
+ </panel.string>
<scroll_container
+ color="0.5 0.5 0.5 1.0"
follows="left|top|right|bottom"
- height="690"
+ height="570"
layout="topleft"
- left="1"
- name="profile_scroll"
- width="354">
+ left="8"
+ name="profile_scroll"
+ opaque="true"
+ reserve_scroll_corner="false"
+ width="340">
<panel
- height="710"
+ height="680"
layout="topleft"
left="0"
top="0"
- width="320">
+ width="310">
+ <text
+ type="string"
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="20"
+ layout="topleft"
+ left="9"
+ name="user_name"
+ text_color="white"
+ top="0"
+ mouse_opaque="true"
+ width="320">
+ (Loading...)
+ </text>
<panel
follows="left|top"
height="120"
@@ -146,8 +177,8 @@
layout="topleft"
left="0"
name="status_panel"
- top="135"
- width="300">
+ top="155"
+ width="320">
<text
follows="left|top"
font="SansSerifBold"
@@ -160,7 +191,6 @@
width="100" />
<text
type="string"
- length="1"
follows="left|top"
font="SansSerifBold"
font.style="ITALIC"
@@ -179,7 +209,7 @@
layout="topleft"
left="0"
name="status_me_panel"
- top="135"
+ top="155"
width="300">
<text
type="string"
@@ -223,7 +253,6 @@
What&apos;re you up to?
</text>
<line_editor
- type="string"
border_style="line"
border_thickness="1"
follows="left|top|right"
@@ -336,6 +365,7 @@
follows="left|top|right"
font="SansSerif"
font.style="UNDERLINE"
+ font_shadow="hard"
height="15"
layout="topleft"
left="9"
@@ -402,16 +432,17 @@
layout="topleft"
left="9"
name="account_actions_panel"
- width="335">
+ width="300">
<text
type="string"
follows="left|top"
font="SansSerif"
font.style="UNDERLINE"
+ font_shadow="hard"
height="15"
layout="topleft"
left="0"
- name="my_account_link"
+ name="payment_update_link"
text_color="0.2 0.2 1 1"
top="0"
width="65">
@@ -422,6 +453,7 @@
follows="left|top"
font="SansSerif"
font.style="UNDERLINE"
+ font_shadow="hard"
height="15"
layout="topleft"
left="70"
@@ -450,7 +482,7 @@
layout="topleft"
left="9"
name="partner_data_panel"
- width="335">
+ width="300">
<text
type="string"
follows="left|top|right"
@@ -470,10 +502,11 @@
follows="top|right"
font="SansSerif"
font.style="UNDERLINE"
+ font_shadow="hard"
halign="right"
height="15"
layout="topleft"
- left="270"
+ left="250"
name="partner_edit_link"
text_color="0.2 0.2 1 1"
top="0"
@@ -481,94 +514,98 @@
Edit
</text>
</panel>
- <panel
- follows="left|top"
- height="30"
- layout="topleft"
- name="profile_buttons_panel"
- width="350">
- <button
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="Add Friend"
- layout="topleft"
- left="5"
- mouse_opaque="false"
- name="add_friend"
- top="0"
- width="75" />
- <button
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="IM"
- layout="topleft"
- left_pad="5"
- name="im"
- top_delta="0"
- width="40" />
- <button
- enabled="false"
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="Call"
- layout="topleft"
- left_pad="5"
- name="call"
- top_delta="0"
- width="50" />
- <button
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="Teleport"
- layout="topleft"
- left_pad="5"
- name="teleport"
- top_delta="0"
- width="65" />
- <button
- enabled="false"
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="Share"
- layout="topleft"
- left_pad="15"
- name="share"
- top_delta="0"
- width="50" />
- </panel>
- <panel
- follows="left|top"
- height="30"
- layout="topleft"
- name="profile_me_buttons_panel"
- visible="false"
- width="350">
- <button
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="Edit Profile"
- layout="topleft"
- left="0"
- name="edit_profile_btn"
- top="0"
- width="105" />
- <button
- follows="bottom|left"
- font="SansSerifSmallBold"
- height="25"
- label="Edit Appearance"
- layout="topleft"
- left_pad="15"
- name="edit_appearance_btn"
- top_delta="0"
- width="130" />
- </panel>
</panel>
</scroll_container>
+ <panel
+ bottom="625"
+ follows="bottom|left"
+ height="30"
+ layout="topleft"
+ left="8"
+ name="profile_buttons_panel"
+ width="345">
+ <button
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Add Friend"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="add_friend"
+ top="0"
+ width="75" />
+ <button
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="IM"
+ layout="topleft"
+ left_pad="5"
+ name="im"
+ top="0"
+ width="40" />
+ <button
+ enabled="false"
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Call"
+ layout="topleft"
+ left_pad="5"
+ name="call"
+ top="0"
+ width="50" />
+ <button
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Teleport"
+ layout="topleft"
+ left_pad="5"
+ name="teleport"
+ top="0"
+ width="65" />
+ <button
+ enabled="false"
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Share"
+ layout="topleft"
+ left_pad="5"
+ name="share"
+ top="0"
+ width="50" />
+ </panel>
+ <panel
+ bottom="625"
+ follows="bottom|left"
+ height="30"
+ layout="topleft"
+ left="8"
+ name="profile_me_buttons_panel"
+ visible="false"
+ width="345">
+ <button
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Edit Profile"
+ layout="topleft"
+ left="0"
+ name="edit_profile_btn"
+ top="0"
+ width="105" />
+ <button
+ follows="bottom|left"
+ font="SansSerifSmallBold"
+ height="25"
+ label="Edit Appearance"
+ layout="topleft"
+ left_pad="5"
+ name="edit_appearance_btn"
+ top="0"
+ width="130" />
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
index fa919776a7..428d071db2 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -10,32 +10,32 @@
name="panel_target_profile"
top="0"
width="355">
- <button
- layout="topleft"
- name="back"
- left="0"
- top="5"
- width="20"
- height="20"
- label=""
- follows="top|left"
- image_selected="navbar_bg_button.tga"
- image_unselected="navbar_bg_button.tga"
- image_overlay="navbar_back.tga"/>
- <text
- layout="topleft"
- top="0"
- left="30"
- width="150"
- height="20"
- font="SansSerifHugeBold"
- text_color="white"
- follows="top|left"
- mouse_opaque="true"
- name="user_name">(Loading...)</text>
+ <button
+ layout="topleft"
+ name="back"
+ left="5"
+ top="5"
+ width="20"
+ height="20"
+ label=""
+ follows="top|left"
+ image_selected="navbar_bg_button.tga"
+ image_unselected="navbar_bg_button.tga"
+ image_overlay="navbar_back.tga"/>
+ <text
+ layout="topleft"
+ top="0"
+ left_pad="15"
+ width="320"
+ height="20"
+ font="SansSerifHugeBold"
+ text_color="white"
+ follows="top|left|right"
+ mouse_opaque="true"
+ name="user_name">(Loading...)</text>
<tab_container
follows="left|top|right|bottom"
- height="600"
+ height="625"
layout="topleft"
left="0"
name="profile_tabs"
@@ -54,7 +54,7 @@
label="Picks"
layout="topleft"
name="panel_picks"/>
- <panel
+ <panel
class="panel_notes"
filename="panel_notes.xml"
label="Notes"
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index 220191ddaa..ce8cb97f56 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -52,7 +52,7 @@
title="Places"
collapsable="true"
min_width="355"
- min_height="570"
+ min_height="200"
header_visible="false"
>
<panel
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index b7ce812dc8..330bc362d2 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="Teleport History" bottom="0" height="326" left="0" width="380"
border="true" follows="left|top|right|bottom">
- <scroll_list bottom="0" can_resize="true" column_padding="0" draw_heading="true"
+ <scroll_list bottom="0" column_padding="0" draw_heading="true"
draw_stripes="false" follows="left|top|bottom|right" left="0"
multi_select="false" name="history_items" search_column="1"
sort_column="1" height="326" width="380" >
diff --git a/indra/newview/skins/default/xui/en/widgets/side_tray.xml b/indra/newview/skins/default/xui/en/widgets/side_tray.xml
index e3b70ba6e2..55ec18f292 100644
--- a/indra/newview/skins/default/xui/en/widgets/side_tray.xml
+++ b/indra/newview/skins/default/xui/en/widgets/side_tray.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<side_tray tab_btn_image="sidebar_tab_left.tga"
- tab_btn_image_selected="sidebar_tab_left_selected.tga"
- tab_btn_width = "32"
- tab_btn_height = "32"
- tab_btn_margin = "0"
- >
-</side_tray>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<side_tray tab_btn_image="sidebar_tab_left.tga"
+ tab_btn_image_selected="sidebar_tab_left_selected.tga"
+ tab_btn_width = "32"
+ tab_btn_height = "32"
+ tab_btn_margin = "0"
+ >
+</side_tray>