From 6185c16a0af02c90625dec71119d12dec07bb056 Mon Sep 17 00:00:00 2001 From: Cho Date: Fri, 22 Feb 2013 20:54:58 +0000 Subject: CHUI-772 FIX User sees no notification of conversation activity not visible in long scrolling conversation list Added LLFLoaterIMContainer::isConversationItemWidgetvisible() which is now used in LLConversationViewSession::startFlashing() to flash chat toolbar button if out of view --- indra/newview/llconversationview.cpp | 12 ++++++++++++ indra/newview/llfloaterimcontainer.cpp | 16 ++++++++++++++++ indra/newview/llfloaterimcontainer.h | 1 + 3 files changed, 29 insertions(+) (limited to 'indra') diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 441de2e1a5..850668388f 100755 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -39,6 +39,7 @@ #include "llfloaterreg.h" #include "llgroupiconctrl.h" #include "lluictrlfactory.h" +#include "lltoolbarview.h" // // Implementation of conversations list session widgets @@ -114,6 +115,17 @@ void LLConversationViewSession::startFlashing() { mFlashStarted = true; mFlashTimer->startFlashing(); + + // get session id + LLConversationItem* vmi = dynamic_cast(getViewModelItem()); + if (vmi) + { + // flash chat toolbar button if scrolled out of view (because flashing will not be visible) + if (!mContainer->isConversationItemWidgetVisible(vmi->getUUID())) + { + gToolBarView->flashCommand(LLCommandId("chat"), true); + } + } } } diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index c8088588da..0260f2b89e 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -1853,6 +1853,22 @@ void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, } } +bool LLFloaterIMContainer::isConversationItemWidgetVisible(const LLUUID& session_id) +{ + // find the conversation line item using the session_id + LLConversationViewSession* widget = dynamic_cast(get_ptr_in_map(mConversationsWidgets, session_id)); + + if (widget) + { + // check whether the widget is in the visible portion of the scroll container + LLRect widget_rect; + widget->localRectToOtherView(widget->getLocalRect(), &widget_rect, mConversationsRoot); + return (mConversationsRoot->getVisibleRect().overlaps(widget_rect)); + } + + return false; +} + void LLFloaterIMContainer::closeFloater(bool app_quitting/* = false*/) { // Always unminimize before trying to close. diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 569fa9faab..156f11f14e 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -185,6 +185,7 @@ public: void updateSpeakBtnState(); static bool isConversationLoggingAllowed(); void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes); + bool isConversationItemWidgetVisible(const LLUUID& session_id); boost::signals2::connection mMicroChangedSignal; private: -- cgit v1.2.3