From d3448fa204a648d61d07f12ecc982841160380d2 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 30 Jan 2024 01:50:15 +0200 Subject: BugSplat Crash #1409959 onTopLost onTopLost crashed 1. It contradicts callstack, but clearPopups() definetely has an issue due to not checking the pointer prior to calling onTopLost 2. According to callstack, crash happened around ~LLFolderViewFolder and while it does call removePopup for itself, it isn't a popup, the only one in the list would be the renamer, which calls back to parent, so made sure to secure it. 3. mFlashTimer was never deleted 4. Some explicit cleanup for TopLost --- indra/newview/llconversationview.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra/newview/llconversationview.cpp') diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 48c7df40df..84e5e2fe44 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -106,6 +106,8 @@ LLConversationViewSession::~LLConversationViewSession() } mFlashTimer->unset(); + delete mFlashTimer; + mFlashStateOn = false; } void LLConversationViewSession::destroyView() -- cgit v1.2.3 From 1b68f71348ecf3983b76b40d7940da8377f049b7 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Mon, 29 Apr 2024 07:43:28 +0300 Subject: #824 Process source files in bulk: replace tabs with spaces, convert CRLF to LF, and trim trailing whitespaces as needed --- indra/newview/llconversationview.cpp | 724 +++++++++++++++++------------------ 1 file changed, 362 insertions(+), 362 deletions(-) (limited to 'indra/newview/llconversationview.cpp') diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 48c7df40df..217f29bffb 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llconversationview.cpp * @brief Implementation of conversations list widgets and views * * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -53,48 +53,48 @@ class LLNearbyVoiceClientStatusObserver : public LLVoiceClientStatusObserver { public: - LLNearbyVoiceClientStatusObserver(LLConversationViewSession* conv) - : conversation(conv) - {} + LLNearbyVoiceClientStatusObserver(LLConversationViewSession* conv) + : conversation(conv) + {} - virtual void onChange(EStatusType status, const std::string &channelURI, bool proximal) - { - conversation->showVoiceIndicator(conversation - && status != STATUS_JOINING - && status != STATUS_LEFT_CHANNEL - && LLVoiceClient::getInstance()->voiceEnabled() - && LLVoiceClient::getInstance()->isVoiceWorking()); - } + virtual void onChange(EStatusType status, const std::string &channelURI, bool proximal) + { + conversation->showVoiceIndicator(conversation + && status != STATUS_JOINING + && status != STATUS_LEFT_CHANNEL + && LLVoiceClient::getInstance()->voiceEnabled() + && LLVoiceClient::getInstance()->isVoiceWorking()); + } private: - LLConversationViewSession* conversation; + LLConversationViewSession* conversation; }; -LLConversationViewSession::Params::Params() : - container() +LLConversationViewSession::Params::Params() : + container() {} LLConversationViewSession::LLConversationViewSession(const LLConversationViewSession::Params& p): - LLFolderViewFolder(p), - mContainer(p.container), - mItemPanel(NULL), - mCallIconLayoutPanel(NULL), - mSessionTitle(NULL), - mSpeakingIndicator(NULL), - mVoiceClientObserver(NULL), - mCollapsedMode(false), + LLFolderViewFolder(p), + mContainer(p.container), + mItemPanel(NULL), + mCallIconLayoutPanel(NULL), + mSessionTitle(NULL), + mSpeakingIndicator(NULL), + mVoiceClientObserver(NULL), + mCollapsedMode(false), mHasArrow(true), - mIsInActiveVoiceChannel(false), - mFlashStateOn(false), - mFlashStarted(false) + mIsInActiveVoiceChannel(false), + mFlashStateOn(false), + mFlashStarted(false) { - mFlashTimer = new LLFlashTimer(); - mAreChildrenInited = true; // inventory only + mFlashTimer = new LLFlashTimer(); + mAreChildrenInited = true; // inventory only } LLConversationViewSession::~LLConversationViewSession() { - mActiveVoiceChannelConnection.disconnect(); + mActiveVoiceChannelConnection.disconnect(); if (mVoiceClientObserver) { @@ -105,7 +105,7 @@ LLConversationViewSession::~LLConversationViewSession() delete mVoiceClientObserver; } - mFlashTimer->unset(); + mFlashTimer->unset(); } void LLConversationViewSession::destroyView() @@ -160,216 +160,216 @@ void LLConversationViewSession::destroyView() void LLConversationViewSession::setFlashState(bool flash_state) { - if (flash_state && !mFlashStateOn) - { - // flash chat toolbar button if scrolled out of sight (because flashing will not be visible) - if (mContainer->isScrolledOutOfSight(this)) - { - gToolBarView->flashCommand(LLCommandId("chat"), true); - } - } + if (flash_state && !mFlashStateOn) + { + // flash chat toolbar button if scrolled out of sight (because flashing will not be visible) + if (mContainer->isScrolledOutOfSight(this)) + { + gToolBarView->flashCommand(LLCommandId("chat"), true); + } + } - mFlashStateOn = flash_state; - mFlashStarted = false; - mFlashTimer->stopFlashing(); + mFlashStateOn = flash_state; + mFlashStarted = false; + mFlashTimer->stopFlashing(); } void LLConversationViewSession::setHighlightState(bool hihglight_state) { - mFlashStateOn = hihglight_state; - mFlashStarted = true; - mFlashTimer->stopFlashing(); + mFlashStateOn = hihglight_state; + mFlashStarted = true; + mFlashTimer->stopFlashing(); } void LLConversationViewSession::startFlashing() { - // Need to start flashing only when "Conversations" is opened or brought on top - if (isInVisibleChain() - && mFlashStateOn - && !mFlashStarted - && ! LLFloaterReg::getTypedInstance("im_container")->isMinimized() ) - { - mFlashStarted = true; - mFlashTimer->startFlashing(); - } + // Need to start flashing only when "Conversations" is opened or brought on top + if (isInVisibleChain() + && mFlashStateOn + && !mFlashStarted + && ! LLFloaterReg::getTypedInstance("im_container")->isMinimized() ) + { + mFlashStarted = true; + mFlashTimer->startFlashing(); + } } bool LLConversationViewSession::isHighlightAllowed() { - return mFlashStateOn || mIsSelected; + return mFlashStateOn || mIsSelected; } bool LLConversationViewSession::isHighlightActive() { - return (mFlashStateOn ? (mFlashTimer->isFlashingInProgress() ? mFlashTimer->isCurrentlyHighlighted() : true) : mIsCurSelection); + return (mFlashStateOn ? (mFlashTimer->isFlashingInProgress() ? mFlashTimer->isCurrentlyHighlighted() : true) : mIsCurSelection); } BOOL LLConversationViewSession::postBuild() { - LLFolderViewItem::postBuild(); - - mItemPanel = LLUICtrlFactory::getInstance()->createFromFile("panel_conversation_list_item.xml", NULL, LLPanel::child_registry_t::instance()); - addChild(mItemPanel); - - mCallIconLayoutPanel = mItemPanel->getChild("call_icon_panel"); - mSessionTitle = mItemPanel->getChild("conversation_title"); - - mActiveVoiceChannelConnection = LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLConversationViewSession::onCurrentVoiceSessionChanged, this, _1)); - mSpeakingIndicator = getChild("speaking_indicator"); - - LLConversationItem* vmi = dynamic_cast(getViewModelItem()); - if (vmi) - { - switch(vmi->getType()) - { - case LLConversationItem::CONV_PARTICIPANT: - case LLConversationItem::CONV_SESSION_1_ON_1: - { - LLIMModel::LLIMSession* session= LLIMModel::instance().findIMSession(vmi->getUUID()); - if (session) - { - LLAvatarIconCtrl* icon = mItemPanel->getChild("avatar_icon"); - icon->setVisible(true); - icon->setValue(session->mOtherParticipantID); - mSpeakingIndicator->setSpeakerId(session->mOtherParticipantID, session->mSessionID, true); + LLFolderViewItem::postBuild(); + + mItemPanel = LLUICtrlFactory::getInstance()->createFromFile("panel_conversation_list_item.xml", NULL, LLPanel::child_registry_t::instance()); + addChild(mItemPanel); + + mCallIconLayoutPanel = mItemPanel->getChild("call_icon_panel"); + mSessionTitle = mItemPanel->getChild("conversation_title"); + + mActiveVoiceChannelConnection = LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLConversationViewSession::onCurrentVoiceSessionChanged, this, _1)); + mSpeakingIndicator = getChild("speaking_indicator"); + + LLConversationItem* vmi = dynamic_cast(getViewModelItem()); + if (vmi) + { + switch(vmi->getType()) + { + case LLConversationItem::CONV_PARTICIPANT: + case LLConversationItem::CONV_SESSION_1_ON_1: + { + LLIMModel::LLIMSession* session= LLIMModel::instance().findIMSession(vmi->getUUID()); + if (session) + { + LLAvatarIconCtrl* icon = mItemPanel->getChild("avatar_icon"); + icon->setVisible(true); + icon->setValue(session->mOtherParticipantID); + mSpeakingIndicator->setSpeakerId(session->mOtherParticipantID, session->mSessionID, true); mHasArrow = false; - } - break; - } - case LLConversationItem::CONV_SESSION_AD_HOC: - { - LLGroupIconCtrl* icon = mItemPanel->getChild("group_icon"); - icon->setVisible(true); - mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true); - break; - } - case LLConversationItem::CONV_SESSION_GROUP: - { - LLGroupIconCtrl* icon = mItemPanel->getChild("group_icon"); - icon->setVisible(true); - icon->setValue(vmi->getUUID()); - mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true); - break; - } - case LLConversationItem::CONV_SESSION_NEARBY: - { - LLIconCtrl* icon = mItemPanel->getChild("nearby_chat_icon"); - icon->setVisible(true); - mSpeakingIndicator->setSpeakerId(gAgentID, LLUUID::null, true); - mIsInActiveVoiceChannel = true; - if(LLVoiceClient::instanceExists()) - { + } + break; + } + case LLConversationItem::CONV_SESSION_AD_HOC: + { + LLGroupIconCtrl* icon = mItemPanel->getChild("group_icon"); + icon->setVisible(true); + mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true); + break; + } + case LLConversationItem::CONV_SESSION_GROUP: + { + LLGroupIconCtrl* icon = mItemPanel->getChild("group_icon"); + icon->setVisible(true); + icon->setValue(vmi->getUUID()); + mSpeakingIndicator->setSpeakerId(gAgentID, vmi->getUUID(), true); + break; + } + case LLConversationItem::CONV_SESSION_NEARBY: + { + LLIconCtrl* icon = mItemPanel->getChild("nearby_chat_icon"); + icon->setVisible(true); + mSpeakingIndicator->setSpeakerId(gAgentID, LLUUID::null, true); + mIsInActiveVoiceChannel = true; + if(LLVoiceClient::instanceExists()) + { if (mVoiceClientObserver) { LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver); delete mVoiceClientObserver; } - mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this); - LLVoiceClient::getInstance()->addObserver(mVoiceClientObserver); - } - break; - } - default: - break; - } + mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this); + LLVoiceClient::getInstance()->addObserver(mVoiceClientObserver); + } + break; + } + default: + break; + } refresh(); // requires vmi - } + } - return TRUE; + return TRUE; } void LLConversationViewSession::draw() { - getViewModelItem()->update(); - - const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams(); - const BOOL show_context = (getRoot() ? getRoot()->getShowSelectionContext() : FALSE); - - // Indicate that flash can start (moot operation if already started, done or not flashing) - startFlashing(); - - // draw highlight for selected items - drawHighlight(show_context, true, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor); - - // Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap. - bool draw_children = getRoot() == static_cast(this) || isOpen(); - - // Todo/fix this: arrange hides children 'out of bonds', session 'slowly' adjusts container size, unhides children - // this process repeats until children fit - for (folders_t::iterator iter = mFolders.begin(); - iter != mFolders.end();) - { - folders_t::iterator fit = iter++; - (*fit)->setVisible(draw_children); - } - for (items_t::iterator iter = mItems.begin(); - iter != mItems.end();) - { - items_t::iterator iit = iter++; - (*iit)->setVisible(draw_children); - } - - // we don't draw the open folder arrow in minimized mode - if (mHasArrow && !mCollapsedMode) - { - // update the rotation angle of open folder arrow - updateLabelRotation(); - drawOpenFolderArrow(default_params, sFgColor); - } - LLView::draw(); + getViewModelItem()->update(); + + const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams(); + const BOOL show_context = (getRoot() ? getRoot()->getShowSelectionContext() : FALSE); + + // Indicate that flash can start (moot operation if already started, done or not flashing) + startFlashing(); + + // draw highlight for selected items + drawHighlight(show_context, true, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor); + + // Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap. + bool draw_children = getRoot() == static_cast(this) || isOpen(); + + // Todo/fix this: arrange hides children 'out of bonds', session 'slowly' adjusts container size, unhides children + // this process repeats until children fit + for (folders_t::iterator iter = mFolders.begin(); + iter != mFolders.end();) + { + folders_t::iterator fit = iter++; + (*fit)->setVisible(draw_children); + } + for (items_t::iterator iter = mItems.begin(); + iter != mItems.end();) + { + items_t::iterator iit = iter++; + (*iit)->setVisible(draw_children); + } + + // we don't draw the open folder arrow in minimized mode + if (mHasArrow && !mCollapsedMode) + { + // update the rotation angle of open folder arrow + updateLabelRotation(); + drawOpenFolderArrow(default_params, sFgColor); + } + LLView::draw(); } BOOL LLConversationViewSession::handleMouseDown( S32 x, S32 y, MASK mask ) { - //Will try to select a child node and then itself (if a child was not selected) + //Will try to select a child node and then itself (if a child was not selected) BOOL result = LLFolderViewFolder::handleMouseDown(x, y, mask); //This node (conversation) was selected and a child (participant) was not if(result && getRoot()) { - if(getRoot()->getCurSelectedItem() == this) - { - LLConversationItem* item = dynamic_cast(getViewModelItem()); - LLUUID session_id = item? item->getUUID() : LLUUID(); + if(getRoot()->getCurSelectedItem() == this) + { + LLConversationItem* item = dynamic_cast(getViewModelItem()); + LLUUID session_id = item? item->getUUID() : LLUUID(); - LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance("im_container"); - if (im_container->isConversationsPaneCollapsed() && im_container->getSelectedSession() == session_id) - { - im_container->collapseMessagesPane(!im_container->isMessagesPaneCollapsed()); - } - else - { - im_container->collapseMessagesPane(false); - } - } - selectConversationItem(); + LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance("im_container"); + if (im_container->isConversationsPaneCollapsed() && im_container->getSelectedSession() == session_id) + { + im_container->collapseMessagesPane(!im_container->isMessagesPaneCollapsed()); + } + else + { + im_container->collapseMessagesPane(false); + } + } + selectConversationItem(); } - return result; + return result; } BOOL LLConversationViewSession::handleMouseUp( S32 x, S32 y, MASK mask ) { - BOOL result = LLFolderViewFolder::handleMouseUp(x, y, mask); + BOOL result = LLFolderViewFolder::handleMouseUp(x, y, mask); - LLFloater* volume_floater = LLFloaterReg::findInstance("floater_voice_volume"); - LLFloater* chat_volume_floater = LLFloaterReg::findInstance("chat_voice"); - if (result - && getRoot() && (getRoot()->getCurSelectedItem() == this) - && !(volume_floater && volume_floater->isShown() && volume_floater->hasFocus()) - && !(chat_volume_floater && chat_volume_floater->isShown() && chat_volume_floater->hasFocus())) - { - LLConversationItem* item = dynamic_cast(getViewModelItem()); - LLUUID session_id = item? item->getUUID() : LLUUID(); - LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); - if(session_floater && !session_floater->hasFocus()) - { - session_floater->setFocus(true); - } + LLFloater* volume_floater = LLFloaterReg::findInstance("floater_voice_volume"); + LLFloater* chat_volume_floater = LLFloaterReg::findInstance("chat_voice"); + if (result + && getRoot() && (getRoot()->getCurSelectedItem() == this) + && !(volume_floater && volume_floater->isShown() && volume_floater->hasFocus()) + && !(chat_volume_floater && chat_volume_floater->isShown() && chat_volume_floater->hasFocus())) + { + LLConversationItem* item = dynamic_cast(getViewModelItem()); + LLUUID session_id = item? item->getUUID() : LLUUID(); + LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); + if(session_floater && !session_floater->hasFocus()) + { + session_floater->setFocus(true); + } } - return result; + return result; } BOOL LLConversationViewSession::handleRightMouseDown( S32 x, S32 y, MASK mask ) @@ -378,23 +378,23 @@ BOOL LLConversationViewSession::handleRightMouseDown( S32 x, S32 y, MASK mask ) if(result) { - selectConversationItem(); + selectConversationItem(); } - return result; + return result; } void LLConversationViewSession::selectConversationItem() { - if(getRoot()->getCurSelectedItem() == this) - { - LLConversationItem* item = dynamic_cast(getViewModelItem()); - LLUUID session_id = item? item->getUUID() : LLUUID(); + if(getRoot()->getCurSelectedItem() == this) + { + LLConversationItem* item = dynamic_cast(getViewModelItem()); + LLUUID session_id = item? item->getUUID() : LLUUID(); - LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance("im_container"); - im_container->flashConversationItemWidget(session_id,false); - im_container->selectConversationPair(session_id, false); - } + LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance("im_container"); + im_container->flashConversationItemWidget(session_id,false); + im_container->selectConversationPair(session_id, false); + } } // virtual @@ -404,92 +404,92 @@ S32 LLConversationViewSession::arrange(S32* width, S32* height) S32 arranged = LLFolderViewFolder::arrange(width, height); S32 h_pad = mHasArrow ? getIndentation() + mArrowSize : getIndentation(); - - LLRect rect(mCollapsedMode ? getLocalRect().mLeft : h_pad, - getLocalRect().mTop, - getLocalRect().mRight, - getLocalRect().mTop - getItemHeight()); - mItemPanel->setShape(rect); - return arranged; + LLRect rect(mCollapsedMode ? getLocalRect().mLeft : h_pad, + getLocalRect().mTop, + getLocalRect().mRight, + getLocalRect().mTop - getItemHeight()); + mItemPanel->setShape(rect); + + return arranged; } // virtual void LLConversationViewSession::toggleOpen() { - // conversations should not be opened while in minimized mode - if (!mCollapsedMode) - { - LLFolderViewFolder::toggleOpen(); + // conversations should not be opened while in minimized mode + if (!mCollapsedMode) + { + LLFolderViewFolder::toggleOpen(); - // do item's selection when opened - if (LLFolderViewFolder::isOpen()) - { - getParentFolder()->setSelection(this, true); - } - mContainer->reSelectConversation(); - } + // do item's selection when opened + if (LLFolderViewFolder::isOpen()) + { + getParentFolder()->setSelection(this, true); + } + mContainer->reSelectConversation(); + } } void LLConversationViewSession::toggleCollapsedMode(bool is_collapsed) { - mCollapsedMode = is_collapsed; + mCollapsedMode = is_collapsed; - // hide the layout stack which contains all item's child widgets - // except for the icon which we display in minimized mode - getChild("conversation_item_stack")->setVisible(!mCollapsedMode); + // hide the layout stack which contains all item's child widgets + // except for the icon which we display in minimized mode + getChild("conversation_item_stack")->setVisible(!mCollapsedMode); S32 h_pad = mHasArrow ? getIndentation() + mArrowSize : getIndentation(); - mItemPanel->translate(mCollapsedMode ? -h_pad : h_pad, 0); + mItemPanel->translate(mCollapsedMode ? -h_pad : h_pad, 0); } void LLConversationViewSession::setVisibleIfDetached(BOOL visible) { - // Do this only if the conversation floater has been torn off (i.e. no multi floater host) and is not minimized - // Note: minimized dockable floaters are brought to front hence unminimized when made visible and we don't want that here - LLFloater* session_floater = getSessionFloater(); - if (session_floater && session_floater->isDetachedAndNotMinimized()) - { - session_floater->setVisible(visible); - } + // Do this only if the conversation floater has been torn off (i.e. no multi floater host) and is not minimized + // Note: minimized dockable floaters are brought to front hence unminimized when made visible and we don't want that here + LLFloater* session_floater = getSessionFloater(); + if (session_floater && session_floater->isDetachedAndNotMinimized()) + { + session_floater->setVisible(visible); + } } LLFloater* LLConversationViewSession::getSessionFloater() { - LLFolderViewModelItem* item = mViewModelItem; - LLUUID session_uuid = dynamic_cast(item)->getUUID(); - return LLFloaterIMSessionTab::getConversation(session_uuid); + LLFolderViewModelItem* item = mViewModelItem; + LLUUID session_uuid = dynamic_cast(item)->getUUID(); + return LLFloaterIMSessionTab::getConversation(session_uuid); } LLConversationViewParticipant* LLConversationViewSession::findParticipant(const LLUUID& participant_id) { - // This is *not* a general tree parsing algorithm. We search only in the mItems list - // assuming there is no mFolders which makes sense for sessions (sessions don't contain - // sessions). - LLConversationViewParticipant* participant = NULL; - items_t::const_iterator iter; - for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) - { - participant = dynamic_cast(*iter); - if (participant->hasSameValue(participant_id)) - { - break; - } - } - return (iter == getItemsEnd() ? NULL : participant); + // This is *not* a general tree parsing algorithm. We search only in the mItems list + // assuming there is no mFolders which makes sense for sessions (sessions don't contain + // sessions). + LLConversationViewParticipant* participant = NULL; + items_t::const_iterator iter; + for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) + { + participant = dynamic_cast(*iter); + if (participant->hasSameValue(participant_id)) + { + break; + } + } + return (iter == getItemsEnd() ? NULL : participant); } void LLConversationViewSession::showVoiceIndicator(bool visible) { - mCallIconLayoutPanel->setVisible(visible && LLVoiceChannel::getCurrentVoiceChannel()->getSessionID().isNull()); - requestArrange(); + mCallIconLayoutPanel->setVisible(visible && LLVoiceChannel::getCurrentVoiceChannel()->getSessionID().isNull()); + requestArrange(); } void LLConversationViewSession::refresh() { - // Refresh the session view from its model data - LLConversationItem* vmi = dynamic_cast(getViewModelItem()); + // Refresh the session view from its model data + LLConversationItem* vmi = dynamic_cast(getViewModelItem()); if (vmi) { vmi->resetRefresh(); @@ -505,28 +505,28 @@ void LLConversationViewSession::refresh() } } - // Update all speaking indicators - LLSpeakingIndicatorManager::updateSpeakingIndicators(); - - // we should show indicator for specified voice session only if this is current channel. EXT-5562. - if (mSpeakingIndicator) - { - mSpeakingIndicator->setIsActiveChannel(mIsInActiveVoiceChannel); - mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel); - } - - LLConversationViewParticipant* participant = NULL; - items_t::const_iterator iter; - for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) - { - participant = dynamic_cast(*iter); - if (participant) - { - participant->allowSpeakingIndicator(mIsInActiveVoiceChannel); - } - } - - requestArrange(); + // Update all speaking indicators + LLSpeakingIndicatorManager::updateSpeakingIndicators(); + + // we should show indicator for specified voice session only if this is current channel. EXT-5562. + if (mSpeakingIndicator) + { + mSpeakingIndicator->setIsActiveChannel(mIsInActiveVoiceChannel); + mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel); + } + + LLConversationViewParticipant* participant = NULL; + items_t::const_iterator iter; + for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) + { + participant = dynamic_cast(*iter); + if (participant) + { + participant->allowSpeakingIndicator(mIsInActiveVoiceChannel); + } + } + + requestArrange(); if (vmi) { // Do the regular upstream refresh @@ -536,34 +536,34 @@ void LLConversationViewSession::refresh() void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& session_id) { - LLConversationItem* vmi = dynamic_cast(getViewModelItem()); + LLConversationItem* vmi = dynamic_cast(getViewModelItem()); - if (vmi) - { - bool old_value = mIsInActiveVoiceChannel; - mIsInActiveVoiceChannel = vmi->getUUID() == session_id; - mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel); - if (old_value != mIsInActiveVoiceChannel) - { - refresh(); - } - } + if (vmi) + { + bool old_value = mIsInActiveVoiceChannel; + mIsInActiveVoiceChannel = vmi->getUUID() == session_id; + mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel); + if (old_value != mIsInActiveVoiceChannel) + { + refresh(); + } + } } bool LLConversationViewSession::highlightFriendTitle(LLConversationItem* vmi) { - if(vmi->getType() == LLConversationItem::CONV_PARTICIPANT || vmi->getType() == LLConversationItem::CONV_SESSION_1_ON_1) - { - LLIMModel::LLIMSession* session= LLIMModel::instance().findIMSession(vmi->getUUID()); - if (session && LLAvatarActions::isFriend(session->mOtherParticipantID)) - { - LLStyle::Params title_style; - title_style.color = LLUIColorTable::instance().getColor("ConversationFriendColor"); - mSessionTitle->setText(vmi->getDisplayName(), title_style); - return true; - } - } - return false; + if(vmi->getType() == LLConversationItem::CONV_PARTICIPANT || vmi->getType() == LLConversationItem::CONV_SESSION_1_ON_1) + { + LLIMModel::LLIMSession* session= LLIMModel::instance().findIMSession(vmi->getUUID()); + if (session && LLAvatarActions::isFriend(session->mOtherParticipantID)) + { + LLStyle::Params title_style; + title_style.color = LLUIColorTable::instance().getColor("ConversationFriendColor"); + mSessionTitle->setText(vmi->getDisplayName(), title_style); + return true; + } + } + return false; } // @@ -574,7 +574,7 @@ static LLDefaultChildRegistry::Register r("conver bool LLConversationViewParticipant::sStaticInitialized = false; S32 LLConversationViewParticipant::sChildrenWidths[LLConversationViewParticipant::ALIC_COUNT]; -LLConversationViewParticipant::Params::Params() : +LLConversationViewParticipant::Params::Params() : container(), participant_id(), avatar_icon("avatar_icon"), @@ -583,7 +583,7 @@ output_monitor("output_monitor") {} LLConversationViewParticipant::LLConversationViewParticipant( const LLConversationViewParticipant::Params& p ): - LLFolderViewItem(p), + LLFolderViewItem(p), mAvatarIcon(NULL), mInfoBtn(NULL), mSpeakingIndicator(NULL), @@ -593,20 +593,20 @@ LLConversationViewParticipant::LLConversationViewParticipant( const LLConversati LLConversationViewParticipant::~LLConversationViewParticipant() { - mActiveVoiceChannelConnection.disconnect(); + mActiveVoiceChannelConnection.disconnect(); } void LLConversationViewParticipant::initFromParams(const LLConversationViewParticipant::Params& params) -{ +{ LLAvatarIconCtrl::Params avatar_icon_params(params.avatar_icon()); applyXUILayout(avatar_icon_params, this); LLAvatarIconCtrl * avatarIcon = LLUICtrlFactory::create(avatar_icon_params); - addChild(avatarIcon); - - LLButton::Params info_button_params(params.info_button()); + addChild(avatarIcon); + + LLButton::Params info_button_params(params.info_button()); applyXUILayout(info_button_params, this); - LLButton * button = LLUICtrlFactory::create(info_button_params); - addChild(button); + LLButton * button = LLUICtrlFactory::create(info_button_params); + addChild(button); LLOutputMonitorCtrl::Params output_monitor_params(params.output_monitor()); applyXUILayout(output_monitor_params, this); @@ -618,11 +618,11 @@ BOOL LLConversationViewParticipant::postBuild() { mAvatarIcon = getChild("avatar_icon"); - mInfoBtn = getChild("info_btn"); - mInfoBtn->setClickedCallback(boost::bind(&LLConversationViewParticipant::onInfoBtnClick, this)); - mInfoBtn->setVisible(false); + mInfoBtn = getChild("info_btn"); + mInfoBtn->setClickedCallback(boost::bind(&LLConversationViewParticipant::onInfoBtnClick, this)); + mInfoBtn->setVisible(false); - mSpeakingIndicator = getChild("speaking_indicator"); + mSpeakingIndicator = getChild("speaking_indicator"); if (!sStaticInitialized) { @@ -644,7 +644,7 @@ BOOL LLConversationViewParticipant::postBuild() void LLConversationViewParticipant::draw() { static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE); - static LLUIColor sFgDisabledColor = LLUIColorTable::instance().getColor("MenuItemDisabledColor", DEFAULT_WHITE); + static LLUIColor sFgDisabledColor = LLUIColorTable::instance().getColor("MenuItemDisabledColor", DEFAULT_WHITE); static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE); static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE); static LLUIColor sFlashBgColor = LLUIColorTable::instance().getColor("MenuItemFlashBgColor", DEFAULT_WHITE); @@ -658,32 +658,32 @@ void LLConversationViewParticipant::draw() F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad; F32 text_left = (F32)getLabelXPos(); - - LLColor4 color; - - LLLocalSpeakerMgr *speakerMgr = LLLocalSpeakerMgr::getInstance(); - - if (speakerMgr && speakerMgr->isSpeakerToBeRemoved(mUUID)) - { - color = sFgDisabledColor; - } - else - { - if (LLAvatarActions::isFriend(mUUID)) - { - color = LLUIColorTable::instance().getColor("ConversationFriendColor"); - } - else - { - color = mIsSelected ? sHighlightFgColor : sFgColor; - } - } - - LLConversationItemParticipant* participant_model = dynamic_cast(getViewModelItem()); - if (participant_model) - { - mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); - } + + LLColor4 color; + + LLLocalSpeakerMgr *speakerMgr = LLLocalSpeakerMgr::getInstance(); + + if (speakerMgr && speakerMgr->isSpeakerToBeRemoved(mUUID)) + { + color = sFgDisabledColor; + } + else + { + if (LLAvatarActions::isFriend(mUUID)) + { + color = LLUIColorTable::instance().getColor("ConversationFriendColor"); + } + else + { + color = mIsSelected ? sHighlightFgColor : sFgColor; + } + } + + LLConversationItemParticipant* participant_model = dynamic_cast(getViewModelItem()); + if (participant_model) + { + mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); + } drawHighlight(show_context, mIsSelected, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor); drawLabel(font, text_left, y, color, right_x); @@ -698,7 +698,7 @@ S32 LLConversationViewParticipant::arrange(S32* width, S32* height) S32 arranged = LLFolderViewItem::arrange(width, height); //Adjusts the avatar icon based upon the indentation - LLRect avatarRect(getIndentation(), + LLRect avatarRect(getIndentation(), mAvatarIcon->getRect().mTop, getIndentation() + mAvatarIcon->getRect().getWidth(), mAvatarIcon->getRect().mBottom); @@ -713,15 +713,15 @@ S32 LLConversationViewParticipant::arrange(S32* width, S32* height) // virtual void LLConversationViewParticipant::refresh() { - // Refresh the participant view from its model data - LLConversationItemParticipant* participant_model = dynamic_cast(getViewModelItem()); + // Refresh the participant view from its model data + LLConversationItemParticipant* participant_model = dynamic_cast(getViewModelItem()); if (participant_model) { participant_model->resetRefresh(); // *TODO: We should also do something with vmi->isModerator() to echo that state in the UI somewhat mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); - + // Do the regular upstream refresh LLFolderViewItem::refresh(); } @@ -731,7 +731,7 @@ void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder) { // Add the item to the folder (conversation) LLFolderViewItem::addToFolder(folder); - + // Retrieve the folder (conversation) UUID, which is also the speaker session UUID LLFolderViewFolder *prnt = getParentFolder(); if (prnt) @@ -751,36 +751,36 @@ void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder) void LLConversationViewParticipant::addToSession(const LLUUID& session_id) { - //Allows speaking icon image to be loaded based on mUUID - mAvatarIcon->setValue(mUUID); - - //Allows the speaker indicator to be activated based on the user and conversation - mSpeakingIndicator->setSpeakerId(mUUID, session_id); + //Allows speaking icon image to be loaded based on mUUID + mAvatarIcon->setValue(mUUID); + + //Allows the speaker indicator to be activated based on the user and conversation + mSpeakingIndicator->setSpeakerId(mUUID, session_id); } void LLConversationViewParticipant::onInfoBtnClick() { - LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mUUID)); + LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mUUID)); } BOOL LLConversationViewParticipant::handleMouseDown( S32 x, S32 y, MASK mask ) { - BOOL result = LLFolderViewItem::handleMouseDown(x, y, mask); + BOOL result = LLFolderViewItem::handleMouseDown(x, y, mask); if(result && getRoot()) { - if(getRoot()->getCurSelectedItem() == this) - { - LLConversationItem* vmi = getParentFolder() ? dynamic_cast(getParentFolder()->getViewModelItem()) : NULL; - LLUUID session_id = vmi? vmi->getUUID() : LLUUID(); - - LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance("im_container"); - LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); - im_container->setSelectedSession(session_id); - im_container->flashConversationItemWidget(session_id,false); - im_container->selectFloater(session_floater); - im_container->collapseMessagesPane(false); - } + if(getRoot()->getCurSelectedItem() == this) + { + LLConversationItem* vmi = getParentFolder() ? dynamic_cast(getParentFolder()->getViewModelItem()) : NULL; + LLUUID session_id = vmi? vmi->getUUID() : LLUUID(); + + LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance("im_container"); + LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); + im_container->setSelectedSession(session_id); + im_container->flashConversationItemWidget(session_id,false); + im_container->selectFloater(session_floater); + im_container->collapseMessagesPane(false); + } } return result; } @@ -877,7 +877,7 @@ LLView* LLConversationViewParticipant::getItemChildView(EAvatarListItemChildInde void LLConversationViewParticipant::allowSpeakingIndicator(bool val) { - mSpeakingIndicator->setIsActiveChannel(val); + mSpeakingIndicator->setIsActiveChannel(val); } // EOF -- cgit v1.2.3