From 2c93c14c9d6cf6940169d33b806dede90e60033f Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 16 Jul 2020 17:51:06 +0300 Subject: SL-13609 Better indicate which conversation is active in Conversations floater --- indra/newview/llfloaterimsessiontab.cpp | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'indra/newview/llfloaterimsessiontab.cpp') diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 3aee08482b..c75109db36 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -32,6 +32,8 @@ #include "llagent.h" #include "llagentcamera.h" #include "llavataractions.h" +#include "llavatariconctrl.h" +#include "llgroupiconctrl.h" #include "llchatentry.h" #include "llchathistory.h" #include "llchiclet.h" @@ -45,6 +47,9 @@ #include "llfloaterimnearbychat.h" const F32 REFRESH_INTERVAL = 1.0f; +const std::string ICN_GROUP("group_chat_icon"); +const std::string ICN_NEARBY("nearby_chat_icon"); +const std::string ICN_AVATAR("avatar_icon"); void cb_group_do_nothing() { @@ -693,6 +698,39 @@ void LLFloaterIMSessionTab::updateSessionName(const std::string& name) mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + name); } +void LLFloaterIMSessionTab::updateChatIcon(const LLUUID& id) +{ + if (mSession) + { + if (mSession->isP2PSessionType()) + { + LLAvatarIconCtrl* icon = getChild(ICN_AVATAR); + icon->setVisible(true); + icon->setValue(id); + } + if (mSession->isAdHocSessionType()) + { + LLGroupIconCtrl* icon = getChild(ICN_GROUP); + icon->setVisible(true); + } + if (mSession->isGroupSessionType()) + { + LLGroupIconCtrl* icon = getChild(ICN_GROUP); + icon->setVisible(true); + icon->setValue(id); + } + } + else + { + if (mIsNearbyChat) + { + LLIconCtrl* icon = getChild(ICN_NEARBY); + icon->setVisible(true); + } + } + +} + void LLFloaterIMSessionTab::hideAllStandardButtons() { for (S32 i = 0; i < BUTTON_COUNT; i++) -- cgit v1.3 From f86014ef151c7af64de4a08dc4c320e1743fb34b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 6 Jan 2021 00:45:07 +0200 Subject: SL-14270 Crash on participant's updateName Session was deleted before viewer had a chance to create view for listener, so listener ended up not deleted and avaiting an uptade, then tryed to call for deleted session. --- indra/newview/llconversationmodel.cpp | 14 +++++++++ indra/newview/llconversationmodel.h | 1 + indra/newview/llconversationview.cpp | 51 +++++++++++++++++++++++++++++++++ indra/newview/llconversationview.h | 2 ++ indra/newview/llfloaterimcontainer.cpp | 2 ++ indra/newview/llfloaterimsessiontab.cpp | 3 +- 6 files changed, 71 insertions(+), 2 deletions(-) (limited to 'indra/newview/llfloaterimsessiontab.cpp') diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index 8293dc6922..fbdf08d8aa 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -349,6 +349,20 @@ void LLConversationItemSession::clearParticipants() mNeedsRefresh = true; } + +void LLConversationItemSession::deleteParticipantModels() +{ + // Make sure that no views exist before use and that view-owned items were removed! + // + // Normally we are not supposed to delete models directly, they should be + // owned by views and this action will result in crashes, but LLParticipantList + // creates models separately from views (it probably shouldn't) and then those + // models wait for idle cycles to be assigned to view. + // this code is meant to delete 'waiting' models + std::for_each(mChildren.begin(), mChildren.end(), DeletePointer()); + mChildren.clear(); +} + LLConversationItemParticipant* LLConversationItemSession::findParticipant(const LLUUID& participant_id) { // This is *not* a general tree parsing algorithm. It assumes that a session contains only diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index 30c7481864..e30bfbb759 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -165,6 +165,7 @@ public: void removeParticipant(LLConversationItemParticipant* participant); void removeParticipant(const LLUUID& participant_id); void clearParticipants(); + void deleteParticipantModels(); // do not use while there are existing participant views LLConversationItemParticipant* findParticipant(const LLUUID& participant_id); void setParticipantIsMuted(const LLUUID& participant_id, bool is_muted); diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 25971a7d52..71346b4b43 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -103,6 +103,57 @@ LLConversationViewSession::~LLConversationViewSession() mFlashTimer->unset(); } +void LLConversationViewSession::destroyView() +{ + // Chat can create and parent models(listeners) to session's model before creating + // coresponding views, such participant's models normally will wait for idle cycles + // but since we are deleting session and won't be processing any more events, make + // sure unowned models are removed as well. + // Might be good idea to just have an LLPointer list somewhere in LLConversationItemSession + + LLConversationItemSession* vmi = dynamic_cast(getViewModelItem()); + + // CONV_SESSION_1_ON_1 stores participants as two models that belong to views independent + // from session (nasty! These views are widgets in LLFloaterIMSessionTab, see buildConversationViewParticipant) + if (vmi && vmi->getType() != LLConversationItem::CONV_SESSION_1_ON_1) + { + // Destroy existing views + while (!mItems.empty()) + { + LLFolderViewItem *itemp = mItems.back(); + mItems.pop_back(); + + LLFolderViewModelItem* item_vmi = itemp->getViewModelItem(); + if (item_vmi) // supposed to exist + { + // unparent to remove from child list + vmi->removeChild(item_vmi); + } + itemp->destroyView(); + } + + // Not needed in scope of sessions, but just in case + while (!mFolders.empty()) + { + LLFolderViewFolder *folderp = mFolders.back(); + mFolders.pop_back(); + + LLFolderViewModelItem* folder_vmi = folderp->getViewModelItem(); + if (folder_vmi) + { + vmi->removeChild(folder_vmi); + } + folderp->destroyView(); + } + + // Now everything that is left in model(listener) is unowned, + // it is safe to remove + vmi->deleteParticipantModels(); + } + + LLFolderViewFolder::destroyView(); +} + void LLConversationViewSession::setFlashState(bool flash_state) { if (flash_state && !mFlashStateOn) diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h index 9762d56d57..0932d24dfe 100644 --- a/indra/newview/llconversationview.h +++ b/indra/newview/llconversationview.h @@ -67,6 +67,8 @@ protected: public: virtual ~LLConversationViewSession(); + /*virtual*/ void destroyView(); + /*virtual*/ BOOL postBuild(); /*virtual*/ void draw(); /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask ); diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 61b0fda18f..86c79791b8 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -1822,6 +1822,8 @@ bool LLFloaterIMContainer::removeConversationListItem(const LLUUID& uuid, bool c { new_selection = mConversationsRoot->getPreviousFromChild(widget, FALSE); } + + // Will destroy views and delete models that are not assigned to any views widget->destroyView(); } diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index fd3f8b21ce..e7f428c06a 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -534,8 +534,7 @@ void LLFloaterIMSessionTab::removeConversationViewParticipant(const LLUUID& part LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,participant_id); if (widget) { - mConversationsRoot->extractItem(widget); - delete widget; + widget->destroyView(); } mConversationsWidgets.erase(participant_id); } -- cgit v1.3 From ba608514e1f2e7c05706fc3740d64b8390fbdb69 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Mon, 1 Mar 2021 17:16:07 +0200 Subject: SL-13609 Don't use any icon for Nearby chat --- indra/newview/llconversationview.cpp | 4 +- indra/newview/llfloaterimsessiontab.cpp | 12 +---- .../skins/default/xui/en/floater_im_session.xml | 57 ++++++++++------------ .../xui/en/panel_conversation_list_item.xml | 56 ++++++++++----------- 4 files changed, 56 insertions(+), 73 deletions(-) (limited to 'indra/newview/llfloaterimsessiontab.cpp') diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 71346b4b43..7c9027d1b5 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -249,8 +249,8 @@ BOOL LLConversationViewSession::postBuild() } case LLConversationItem::CONV_SESSION_NEARBY: { - LLIconCtrl* icon = mItemPanel->getChild("nearby_chat_icon"); - icon->setVisible(true); + mItemPanel->getChild("session_icon_panel")->setVisible(false); + mSpeakingIndicator->setSpeakerId(gAgentID, LLUUID::null, true); mIsInActiveVoiceChannel = true; if(LLVoiceClient::instanceExists()) diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index e7f428c06a..492f63a700 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -48,7 +48,6 @@ const F32 REFRESH_INTERVAL = 1.0f; const std::string ICN_GROUP("group_chat_icon"); -const std::string ICN_NEARBY("nearby_chat_icon"); const std::string ICN_AVATAR("avatar_icon"); void cb_group_do_nothing() @@ -347,6 +346,8 @@ BOOL LLFloaterIMSessionTab::postBuild() assignResizeLimits(); + getChild("session_icon_layout_panel")->setVisible(mSessionID.notNull()); + return result; } @@ -726,15 +727,6 @@ void LLFloaterIMSessionTab::updateChatIcon(const LLUUID& id) icon->setValue(id); } } - else - { - if (mIsNearbyChat) - { - LLIconCtrl* icon = getChild(ICN_NEARBY); - icon->setVisible(true); - } - } - } void LLFloaterIMSessionTab::hideAllStandardButtons() diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 15f02ab9c3..f61e5f1acc 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -265,38 +265,33 @@ bottom="-1" left="0" right="-1"> + + + + - - - diff --git a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml index 4372cf69bf..3be2beb0aa 100644 --- a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml @@ -6,45 +6,41 @@ name="conversation_list_item" mouse_opaque="false" width="120"> - - - + + width="109"> + + + + Date: Thu, 1 Apr 2021 13:47:18 +0300 Subject: SL-15053 Use previous icon for Nearby chat --- indra/newview/llconversationview.cpp | 4 +- indra/newview/llfloaterimsessiontab.cpp | 12 ++++- .../default/textures/icons/nearby_chat_icon.png | Bin 1035 -> 399 bytes .../skins/default/xui/en/floater_im_session.xml | 57 +++++++++++---------- .../xui/en/panel_conversation_list_item.xml | 56 ++++++++++---------- 5 files changed, 73 insertions(+), 56 deletions(-) (limited to 'indra/newview/llfloaterimsessiontab.cpp') diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 7c9027d1b5..71346b4b43 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -249,8 +249,8 @@ BOOL LLConversationViewSession::postBuild() } case LLConversationItem::CONV_SESSION_NEARBY: { - mItemPanel->getChild("session_icon_panel")->setVisible(false); - + LLIconCtrl* icon = mItemPanel->getChild("nearby_chat_icon"); + icon->setVisible(true); mSpeakingIndicator->setSpeakerId(gAgentID, LLUUID::null, true); mIsInActiveVoiceChannel = true; if(LLVoiceClient::instanceExists()) diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 492f63a700..e7f428c06a 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -48,6 +48,7 @@ const F32 REFRESH_INTERVAL = 1.0f; const std::string ICN_GROUP("group_chat_icon"); +const std::string ICN_NEARBY("nearby_chat_icon"); const std::string ICN_AVATAR("avatar_icon"); void cb_group_do_nothing() @@ -346,8 +347,6 @@ BOOL LLFloaterIMSessionTab::postBuild() assignResizeLimits(); - getChild("session_icon_layout_panel")->setVisible(mSessionID.notNull()); - return result; } @@ -727,6 +726,15 @@ void LLFloaterIMSessionTab::updateChatIcon(const LLUUID& id) icon->setValue(id); } } + else + { + if (mIsNearbyChat) + { + LLIconCtrl* icon = getChild(ICN_NEARBY); + icon->setVisible(true); + } + } + } void LLFloaterIMSessionTab::hideAllStandardButtons() diff --git a/indra/newview/skins/default/textures/icons/nearby_chat_icon.png b/indra/newview/skins/default/textures/icons/nearby_chat_icon.png index 2cb577776d..5ac4258b9d 100644 Binary files a/indra/newview/skins/default/textures/icons/nearby_chat_icon.png and b/indra/newview/skins/default/textures/icons/nearby_chat_icon.png differ diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index f61e5f1acc..15f02ab9c3 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -265,33 +265,38 @@ bottom="-1" left="0" right="-1"> - - - - + + + diff --git a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml index 3be2beb0aa..4372cf69bf 100644 --- a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml @@ -6,41 +6,45 @@ name="conversation_list_item" mouse_opaque="false" width="120"> - + + + - - - - + width="90">