summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindra/newview/llconversationview.cpp3
-rw-r--r--indra/newview/llimconversation.cpp10
-rw-r--r--indra/newview/llimconversation.h3
-rwxr-xr-xindra/newview/llimfloatercontainer.cpp26
-rw-r--r--indra/newview/llimfloatercontainer.h4
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);