diff options
-rwxr-xr-x | indra/newview/llconversationview.cpp | 3 | ||||
-rw-r--r-- | indra/newview/llimconversation.cpp | 10 | ||||
-rw-r--r-- | indra/newview/llimconversation.h | 3 | ||||
-rwxr-xr-x | indra/newview/llimfloatercontainer.cpp | 26 | ||||
-rw-r--r-- | indra/newview/llimfloatercontainer.h | 4 |
5 files changed, 39 insertions, 7 deletions
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 208a89cc8d..d5d4fc13da 100755 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -239,7 +239,6 @@ S32 LLConversationViewSession::arrange(S32* width, S32* height) void LLConversationViewSession::selectItem() { - LLFolderViewItem::selectItem(); LLConversationItem* item = dynamic_cast<LLConversationItem*>(mViewModelItem); LLFloater* session_floater = LLIMConversation::getConversation(item->getUUID()); @@ -255,6 +254,8 @@ void LLConversationViewSession::selectItem() // Set the focus on the selected floater session_floater->setFocus(TRUE); + + LLFolderViewItem::selectItem(); } void LLConversationViewSession::setVisibleIfDetached(BOOL visible) diff --git a/indra/newview/llimconversation.cpp b/indra/newview/llimconversation.cpp index 216c5bbd70..bab588126f 100644 --- a/indra/newview/llimconversation.cpp +++ b/indra/newview/llimconversation.cpp @@ -215,11 +215,21 @@ void LLIMConversation::onFocusReceived() } LLTransientDockableFloater::onFocusReceived(); + + mHasFocus = mHaveFocus; + mHaveFocus = true; + + if (! mHasFocus) + { + LLIMFloaterContainer* container = LLIMFloaterContainer::getInstance(); + container->setConvItemSelect(mSessionID); + } } void LLIMConversation::onFocusLost() { setBackgroundOpaque(false); + mHaveFocus = false; LLTransientDockableFloater::onFocusLost(); } diff --git a/indra/newview/llimconversation.h b/indra/newview/llimconversation.h index 41a76c206e..e09ba79a6a 100644 --- a/indra/newview/llimconversation.h +++ b/indra/newview/llimconversation.h @@ -139,6 +139,9 @@ private: void reshapeChatHistory(); LLTimer* mRefreshTimer; ///< Defines the rate at which refresh() is called. + + bool mHasFocus; + bool mHaveFocus; }; diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 54a40627fb..81dddfaa70 100755 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -183,9 +183,9 @@ void LLIMFloaterContainer::onOpen(const LLSD& key) } // virtual -void LLIMFloaterContainer::addFloater(LLFloater* floaterp, - BOOL select_added_floater, - LLTabContainer::eInsertionPoint insertion_point) +void LLIMFloaterContainer::addFloater(LLFloater* floaterp, + BOOL select_added_floater, + LLTabContainer::eInsertionPoint insertion_point) { if(!floaterp) return; @@ -427,7 +427,10 @@ void LLIMFloaterContainer::setVisible(BOOL visible) for (;widget_it != mConversationsWidgets.end(); ++widget_it) { LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(widget_it->second); - widget->setVisibleIfDetached(visible); + if (widget) + { + widget->setVisibleIfDetached(visible); + } } // Now, do the normal multifloater show/hide @@ -608,6 +611,16 @@ void LLIMFloaterContainer::repositioningWidgets() } } +void LLIMFloaterContainer::setConvItemSelect(LLUUID& session_id) +{ + LLFolderViewItem* widget = mConversationsWidgets[session_id]; + if (widget && mSelectedSession != session_id) + { + mSelectedSession = session_id; + (widget->getRoot())->setSelection(widget, FALSE, FALSE); + } +} + void LLIMFloaterContainer::addConversationListItem(const LLUUID& uuid) { bool is_nearby_chat = uuid.isNull(); @@ -675,7 +688,10 @@ void LLIMFloaterContainer::removeConversationListItem(const LLUUID& uuid, bool c if (widget_it != mConversationsWidgets.end()) { LLFolderViewItem* widget = widget_it->second; - widget->destroyView(); + if (widget) + { + widget->destroyView(); + } } // Suppress the conversation items and widgets from their respective maps diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index 324adfcc11..f6048bed37 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -62,7 +62,7 @@ public: /*virtual*/ void addFloater(LLFloater* floaterp, BOOL select_added_floater, LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END); - + void setConvItemSelect(LLUUID& session_id); /*virtual*/ void tabClose(); static LLFloater* getCurrentVoiceFloater(); @@ -114,6 +114,8 @@ private: bool mInitialized; + LLUUID mSelectedSession; + // Conversation list implementation public: void removeConversationListItem(const LLUUID& uuid, bool change_focus = true); |