summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorCho <cho@lindenlab.com>2013-02-01 18:54:15 +0000
committerCho <cho@lindenlab.com>2013-02-01 18:54:15 +0000
commit56b158e486f97f26c87ac37923f5dfbc2cc7548a (patch)
treef29399d0d297573d5560a496ae1367436815656b /indra
parent97930c72b6f869e9bb47cda7d9ecfccf1a25a3fa (diff)
CHUI-675 FIX You can select multiple users in people floater but can only drag and drop one name to conversation
Moved drag and drop start in LLAvatarListItem instead of LLAvatarList, and made LLFloaterIMSession handle multiple dropped participants correctly
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/llavatarlist.cpp52
-rw-r--r--indra/newview/llavatarlist.h3
-rw-r--r--indra/newview/llavatarlistitem.cpp55
-rw-r--r--indra/newview/llavatarlistitem.h3
-rw-r--r--indra/newview/llfloaterimsession.cpp17
-rw-r--r--indra/newview/llfloaterimsession.h15
6 files changed, 79 insertions, 66 deletions
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index e54e47180f..9f02f301a1 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -46,6 +46,7 @@
#include "lluuid.h"
#include "llvoiceclient.h"
#include "llviewercontrol.h" // for gSavedSettings
+#include "lltooldraganddrop.h"
static LLDefaultChildRegistry::Register<LLAvatarList> r("avatar_list");
@@ -462,6 +463,57 @@ BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
return handled;
}
+BOOL LLAvatarList::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ gFocusMgr.setMouseCapture(this);
+
+ S32 screen_x;
+ S32 screen_y;
+ localPointToScreen(x, y, &screen_x, &screen_y);
+ LLToolDragAndDrop::getInstance()->setDragStart(screen_x, screen_y);
+
+ return LLFlatListViewEx::handleMouseDown(x, y, mask);
+}
+
+BOOL LLAvatarList::handleMouseUp( S32 x, S32 y, MASK mask )
+{
+ if(hasMouseCapture())
+ {
+ gFocusMgr.setMouseCapture(NULL);
+ }
+
+ return LLFlatListViewEx::handleMouseUp(x, y, mask);
+}
+
+BOOL LLAvatarList::handleHover(S32 x, S32 y, MASK mask)
+{
+ bool handled = hasMouseCapture();
+ if(handled)
+ {
+ S32 screen_x;
+ S32 screen_y;
+ localPointToScreen(x, y, &screen_x, &screen_y);
+
+ if(LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y))
+ {
+ // First, create the global drag and drop object
+ std::vector<EDragAndDropType> types;
+ uuid_vec_t cargo_ids;
+ getSelectedUUIDs(cargo_ids);
+ types.resize(cargo_ids.size(), DAD_PERSON);
+ LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_PEOPLE;
+ LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, src);
+ }
+ }
+
+ if(!handled)
+ {
+ handled = LLFlatListViewEx::handleHover(x, y, mask);
+ }
+
+ return handled;
+}
+
bool LLAvatarList::isAvalineItemSelected()
{
std::vector<LLPanel*> selected_items;
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 4814a88a79..3542577ae3 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -84,6 +84,9 @@ public:
bool getIconsVisible() const { return mShowIcons; }
const std::string getIconParamName() const{return mIconParamName;}
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
+ /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
// Return true if filter has at least one match.
bool filterHasMatches();
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 3ed0c7c482..3e6c817dd6 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -368,61 +368,6 @@ BOOL LLAvatarListItem::handleDoubleClick(S32 x, S32 y, MASK mask)
return LLPanel::handleDoubleClick(x, y, mask);
}
-BOOL LLAvatarListItem::handleMouseDown(S32 x, S32 y, MASK mask)
-{
- if (LLUICtrl::handleMouseDown(x, y, mask))
- {
- return TRUE;
- }
-
- gFocusMgr.setMouseCapture(this);
-
- S32 screen_x;
- S32 screen_y;
- localPointToScreen(x, y, &screen_x, &screen_y);
- LLToolDragAndDrop::getInstance()->setDragStart(screen_x, screen_y);
-
- return TRUE;
-}
-
-BOOL LLAvatarListItem::handleMouseUp( S32 x, S32 y, MASK mask )
-{
- if (LLUICtrl::childrenHandleMouseUp(x, y, mask))
- {
- return TRUE;
- }
-
- if(hasMouseCapture())
- {
- gFocusMgr.setMouseCapture(NULL);
- }
- return TRUE;
-}
-
-BOOL LLAvatarListItem::handleHover(S32 x, S32 y, MASK mask)
-{
- bool handled = hasMouseCapture();
- if(handled)
- {
- S32 screen_x;
- S32 screen_y;
- localPointToScreen(x, y, &screen_x, &screen_y);
-
- if(LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y))
- {
- // First, create the global drag and drop object
- std::vector<EDragAndDropType> types;
- uuid_vec_t cargo_ids;
- types.push_back(DAD_PERSON);
- cargo_ids.push_back(mAvatarId);
- LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_PEOPLE;
- LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, src);
- }
- }
-
- return handled;
-}
-
void LLAvatarListItem::setValue( const LLSD& value )
{
if (!value.isMap()) return;;
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 96aed20016..7ef35a746e 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -115,9 +115,6 @@ public:
void onProfileBtnClick();
/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
- /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
- /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
- /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
protected:
/**
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index f754853b82..50b2ed8c51 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -1044,6 +1044,19 @@ void LLFloaterIMSession::processSessionUpdate(const LLSD& session_update)
}
// virtual
+void LLFloaterIMSession::draw()
+{
+ // add people who were added via dropPerson()
+ if (!mPendingParticipants.empty())
+ {
+ addSessionParticipants(mPendingParticipants);
+ mPendingParticipants.clear();
+ }
+
+ LLFloaterIMSessionTab::draw();
+}
+
+// virtual
BOOL LLFloaterIMSession::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
@@ -1081,7 +1094,9 @@ bool LLFloaterIMSession::dropPerson(LLUUID* person_id, bool drop)
res = canAddSelectedToChat(ids);
if(res && drop)
{
- addSessionParticipants(ids);
+ // these people will be added during the next draw() call
+ // (so they can be added all at once)
+ mPendingParticipants.push_back(*person_id);
}
}
diff --git a/indra/newview/llfloaterimsession.h b/indra/newview/llfloaterimsession.h
index e7fd6f9ff3..381b3cf721 100644
--- a/indra/newview/llfloaterimsession.h
+++ b/indra/newview/llfloaterimsession.h
@@ -69,6 +69,13 @@ public:
/*virtual*/ BOOL getVisible();
// Check typing timeout timer.
+ /*virtual*/ void draw();
+ /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
static LLFloaterIMSession* findInstance(const LLUUID& session_id);
static LLFloaterIMSession* getInstance(const LLUUID& session_id);
@@ -117,13 +124,6 @@ public:
void processAgentListUpdates(const LLSD& body);
void processSessionUpdate(const LLSD& session_update);
- /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-
-
//used as a callback on receiving new IM message
static void sRemoveTypingIndicator(const LLSD& data);
static void onIMChicletCreated(const LLUUID& session_id);
@@ -189,6 +189,7 @@ private:
LLSD mQueuedMsgsForInit;
uuid_vec_t mInvitedParticipants;
+ uuid_vec_t mPendingParticipants;
// connection to voice channel state change signal
boost::signals2::connection mVoiceChannelStateChangeConnection;