From 56b158e486f97f26c87ac37923f5dfbc2cc7548a Mon Sep 17 00:00:00 2001 From: Cho Date: Fri, 1 Feb 2013 18:54:15 +0000 Subject: 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 --- indra/newview/llavatarlist.cpp | 52 ++++++++++++++++++++++++++++++++++ indra/newview/llavatarlist.h | 3 ++ indra/newview/llavatarlistitem.cpp | 55 ------------------------------------ indra/newview/llavatarlistitem.h | 3 -- indra/newview/llfloaterimsession.cpp | 17 ++++++++++- indra/newview/llfloaterimsession.h | 15 +++++----- 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 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 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 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 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 @@ -1043,6 +1043,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, @@ -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; -- cgit v1.2.3 From 1192abd7eb0dff000be69f21d4d7cc7e0ecef561 Mon Sep 17 00:00:00 2001 From: Cho Date: Fri, 1 Feb 2013 21:55:03 +0000 Subject: CHUI-720 FIX User can open "Add friend" by pressing on a line in context menu for user that already is friend Added check for getVisible() and getEnabled() before passing along handleMouseDown() and handleMouseUp() callbacks to other menu items in LLMenuItemSeparatorGL --- indra/llui/llmenugl.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index b7148bb91b..f7bf39c897 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -593,12 +593,12 @@ BOOL LLMenuItemSeparatorGL::handleMouseDown(S32 x, S32 y, MASK mask) { // the menu items are in the child list in bottom up order LLView* prev_menu_item = parent_menu->findNextSibling(this); - return prev_menu_item ? prev_menu_item->handleMouseDown(x, prev_menu_item->getRect().getHeight(), mask) : FALSE; + return (prev_menu_item && prev_menu_item->getVisible() && prev_menu_item->getEnabled()) ? prev_menu_item->handleMouseDown(x, prev_menu_item->getRect().getHeight(), mask) : FALSE; } else { LLView* next_menu_item = parent_menu->findPrevSibling(this); - return next_menu_item ? next_menu_item->handleMouseDown(x, 0, mask) : FALSE; + return (next_menu_item && next_menu_item->getVisible() && next_menu_item->getEnabled()) ? next_menu_item->handleMouseDown(x, 0, mask) : FALSE; } } @@ -608,12 +608,12 @@ BOOL LLMenuItemSeparatorGL::handleMouseUp(S32 x, S32 y, MASK mask) if (y > getRect().getHeight() / 2) { LLView* prev_menu_item = parent_menu->findNextSibling(this); - return prev_menu_item ? prev_menu_item->handleMouseUp(x, prev_menu_item->getRect().getHeight(), mask) : FALSE; + return (prev_menu_item && prev_menu_item->getVisible() && prev_menu_item->getEnabled()) ? prev_menu_item->handleMouseUp(x, prev_menu_item->getRect().getHeight(), mask) : FALSE; } else { LLView* next_menu_item = parent_menu->findPrevSibling(this); - return next_menu_item ? next_menu_item->handleMouseUp(x, 0, mask) : FALSE; + return (next_menu_item && next_menu_item->getVisible() && next_menu_item->getEnabled()) ? next_menu_item->handleMouseUp(x, 0, mask) : FALSE; } } -- cgit v1.2.3