diff options
author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
---|---|---|
committer | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
commit | 1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch) | |
tree | ab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/llblocklist.cpp | |
parent | 6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff) | |
parent | e1623bb276f83a43ce7a197e388720c05bdefe61 (diff) |
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts:
# autobuild.xml
# indra/cmake/CMakeLists.txt
# indra/cmake/GoogleMock.cmake
# indra/llaudio/llaudioengine_fmodstudio.cpp
# indra/llaudio/llaudioengine_fmodstudio.h
# indra/llaudio/lllistener_fmodstudio.cpp
# indra/llaudio/lllistener_fmodstudio.h
# indra/llaudio/llstreamingaudio_fmodstudio.cpp
# indra/llaudio/llstreamingaudio_fmodstudio.h
# indra/llcharacter/llmultigesture.cpp
# indra/llcharacter/llmultigesture.h
# indra/llimage/llimage.cpp
# indra/llimage/llimagepng.cpp
# indra/llimage/llimageworker.cpp
# indra/llimage/tests/llimageworker_test.cpp
# indra/llmessage/tests/llmockhttpclient.h
# indra/llprimitive/llgltfmaterial.h
# indra/llrender/llfontfreetype.cpp
# indra/llui/llcombobox.cpp
# indra/llui/llfolderview.cpp
# indra/llui/llfolderviewmodel.h
# indra/llui/lllineeditor.cpp
# indra/llui/lllineeditor.h
# indra/llui/lltextbase.cpp
# indra/llui/lltextbase.h
# indra/llui/lltexteditor.cpp
# indra/llui/lltextvalidate.cpp
# indra/llui/lltextvalidate.h
# indra/llui/lluictrl.h
# indra/llui/llview.cpp
# indra/llwindow/llwindowmacosx.cpp
# indra/newview/app_settings/settings.xml
# indra/newview/llappearancemgr.cpp
# indra/newview/llappearancemgr.h
# indra/newview/llavatarpropertiesprocessor.cpp
# indra/newview/llavatarpropertiesprocessor.h
# indra/newview/llbreadcrumbview.cpp
# indra/newview/llbreadcrumbview.h
# indra/newview/llbreastmotion.cpp
# indra/newview/llbreastmotion.h
# indra/newview/llconversationmodel.h
# indra/newview/lldensityctrl.cpp
# indra/newview/lldensityctrl.h
# indra/newview/llface.inl
# indra/newview/llfloatereditsky.cpp
# indra/newview/llfloatereditwater.cpp
# indra/newview/llfloateremojipicker.h
# indra/newview/llfloaterimsessiontab.cpp
# indra/newview/llfloaterprofiletexture.cpp
# indra/newview/llfloaterprofiletexture.h
# indra/newview/llgesturemgr.cpp
# indra/newview/llgesturemgr.h
# indra/newview/llimpanel.cpp
# indra/newview/llimpanel.h
# indra/newview/llinventorybridge.cpp
# indra/newview/llinventorybridge.h
# indra/newview/llinventoryclipboard.cpp
# indra/newview/llinventoryclipboard.h
# indra/newview/llinventoryfunctions.cpp
# indra/newview/llinventoryfunctions.h
# indra/newview/llinventorygallery.cpp
# indra/newview/lllistbrowser.cpp
# indra/newview/lllistbrowser.h
# indra/newview/llpanelobjectinventory.cpp
# indra/newview/llpanelprofile.cpp
# indra/newview/llpanelprofile.h
# indra/newview/llpreviewgesture.cpp
# indra/newview/llsavedsettingsglue.cpp
# indra/newview/llsavedsettingsglue.h
# indra/newview/lltooldraganddrop.cpp
# indra/newview/llurllineeditorctrl.cpp
# indra/newview/llvectorperfoptions.cpp
# indra/newview/llvectorperfoptions.h
# indra/newview/llviewerparceloverlay.cpp
# indra/newview/llviewertexlayer.cpp
# indra/newview/llviewertexturelist.cpp
# indra/newview/macmain.h
# indra/test/test.cpp
Diffstat (limited to 'indra/newview/llblocklist.cpp')
-rw-r--r-- | indra/newview/llblocklist.cpp | 926 |
1 files changed, 463 insertions, 463 deletions
diff --git a/indra/newview/llblocklist.cpp b/indra/newview/llblocklist.cpp index 29be2aaa6d..f9e5ce9e04 100644 --- a/indra/newview/llblocklist.cpp +++ b/indra/newview/llblocklist.cpp @@ -1,463 +1,463 @@ -/** - * @file llblocklist.cpp - * @brief List of the blocked avatars and objects. - * - * $LicenseInfo:firstyear=2012&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2012, 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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llblocklist.h" - -#include "llavataractions.h" -#include "llblockedlistitem.h" -#include "llfloatersidepanelcontainer.h" -#include "llviewermenu.h" - -static LLDefaultChildRegistry::Register<LLBlockList> r("block_list"); - -static const LLBlockListNameComparator NAME_COMPARATOR; -static const LLBlockListNameTypeComparator NAME_TYPE_COMPARATOR; - -LLBlockList::LLBlockList(const Params& p) -: LLFlatListViewEx(p), - mDirty(true), - mShouldAddAll(true), - mActionType(NONE), - mMuteListSize(0) -{ - - LLMuteList::getInstance()->addObserver(this); - mMuteListSize = LLMuteList::getInstance()->getMutes().size(); - - // Set up context menu. - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; - - registrar.add ("Block.Action", boost::bind(&LLBlockList::onCustomAction, this, _2)); - enable_registrar.add("Block.Enable", boost::bind(&LLBlockList::isActionEnabled, this, _2)); - enable_registrar.add("Block.Check", boost::bind(&LLBlockList::isMenuItemChecked, this, _2)); - enable_registrar.add("Block.Visible", boost::bind(&LLBlockList::isMenuItemVisible, this, _2)); - - LLToggleableMenu* context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>( - "menu_people_blocked_gear.xml", - gMenuHolder, - LLViewerMenuHolderGL::child_registry_t::instance()); - if(context_menu) - { - mContextMenu = context_menu->getHandle(); - } -} - -LLBlockList::~LLBlockList() -{ - if (mContextMenu.get()) - { - mContextMenu.get()->die(); - } - - LLMuteList::getInstance()->removeObserver(this); -} - -void LLBlockList::createList() -{ - std::vector<LLMute> mutes = LLMuteList::instance().getMutes(); - std::vector<LLMute>::const_iterator mute_it = mutes.begin(); - - for (; mute_it != mutes.end(); ++mute_it) - { - addNewItem(&*mute_it); - } -} - -BlockListActionType LLBlockList::getCurrentMuteListActionType() -{ - BlockListActionType type = NONE; - U32 curSize = LLMuteList::getInstance()->getMutes().size(); - if( curSize > mMuteListSize) - type = ADD; - else if(curSize < mMuteListSize) - type = REMOVE; - - return type; -} - -void LLBlockList::onChangeDetailed(const LLMute &mute) -{ - mActionType = getCurrentMuteListActionType(); - - mCurItemId = mute.mID; - mCurItemName = mute.mName; - mCurItemType = mute.mType; - mCurItemFlags = mute.mFlags; - - refresh(); -} - -bool LLBlockList::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - bool handled = LLUICtrl::handleRightMouseDown(x, y, mask); - - LLToggleableMenu* context_menu = mContextMenu.get(); - if (context_menu && size()) - { - context_menu->buildDrawLabels(); - context_menu->updateParent(LLMenuGL::sMenuContainer); - LLMenuGL::showPopup(this, context_menu, x, y); - } - - return handled; -} - -void LLBlockList::removeListItem(const LLMute* mute) -{ - if (mute->mID.notNull()) - { - removeItemByUUID(mute->mID); - } - else - { - removeItemByValue(mute->mName); - } -} - -void LLBlockList::hideListItem(LLBlockedListItem* item, bool show) -{ - item->setVisible(show); -} - -void LLBlockList::setNameFilter(const std::string& filter) -{ - std::string filter_upper = filter; - LLStringUtil::toUpper(filter_upper); - if (mNameFilter != filter_upper) - { - mNameFilter = filter_upper; - setDirty(); - } -} - -void LLBlockList::sortByName() -{ - setComparator(&NAME_COMPARATOR); - sort(); -} - -void LLBlockList::sortByType() -{ - setComparator(&NAME_TYPE_COMPARATOR); - sort(); -} - -void LLBlockList::draw() -{ - if (mDirty) - { - refresh(); - } - - LLFlatListView::draw(); -} - -void LLBlockList::addNewItem(const LLMute* mute) -{ - LLBlockedListItem* item = new LLBlockedListItem(mute); - if (!mNameFilter.empty()) - { - item->highlightName(mNameFilter); - } - if (item->getUUID().notNull()) - { - addItem(item, item->getUUID(), ADD_BOTTOM); - } - else - { - addItem(item, item->getName(), ADD_BOTTOM); - } -} - -void LLBlockList::refresh() -{ - bool have_filter = !mNameFilter.empty(); - - // save selection to restore it after list rebuilt - LLSD selected = getSelectedValue(); - LLSD next_selected; - - if(mShouldAddAll) // creating list of blockers - { - clear(); - createList(); - mShouldAddAll = false; - } - else - { - // handle remove/add functionality - LLMute mute(mCurItemId, mCurItemName, mCurItemType, mCurItemFlags); - if(mActionType == ADD) - { - addNewItem(&mute); - } - else if(mActionType == REMOVE) - { - if ((mute.mID.notNull() && selected.isUUID() && selected.asUUID() == mute.mID) - || (mute.mID.isNull() && selected.isString() && selected.asString() == mute.mName)) - { - // we are going to remove currently selected item, so select next item and save the selection to restore it - if (!selectNextItemPair(false, true)) - { - selectNextItemPair(true, true); - } - next_selected = getSelectedValue(); - } - removeListItem(&mute); - } - mActionType = NONE; - } - - // handle filter functionality - if(have_filter || (!have_filter && !mPrevNameFilter.empty())) - { - // we should update visibility of our items if previous filter was not empty - std::vector < LLPanel* > allItems; - getItems(allItems); - std::vector < LLPanel* >::iterator it = allItems.begin(); - - for(; it != allItems.end() ; ++it) - { - LLBlockedListItem * curItem = dynamic_cast<LLBlockedListItem *> (*it); - if(curItem) - { - hideListItem(curItem, findInsensitive(curItem->getName(), mNameFilter)); - } - } - } - mPrevNameFilter = mNameFilter; - - if (selected.isDefined()) - { - if (getItemPair(selected)) - { - // restore previously selected item - selectItemPair(getItemPair(selected), true); - } - else if (next_selected.isDefined() && getItemPair(next_selected)) - { - // previously selected item was removed, so select next item - selectItemPair(getItemPair(next_selected), true); - } - } - mMuteListSize = LLMuteList::getInstance()->getMutes().size(); - - // Sort the list. - sort(); - - setDirty(false); -} - -bool LLBlockList::findInsensitive(std::string haystack, const std::string& needle_upper) -{ - LLStringUtil::toUpper(haystack); - return haystack.find(needle_upper) != std::string::npos; -} - -LLBlockedListItem* LLBlockList::getBlockedItem() const -{ - LLPanel* panel = LLFlatListView::getSelectedItem(); - LLBlockedListItem* item = dynamic_cast<LLBlockedListItem*>(panel); - return item; -} - -bool LLBlockList::isActionEnabled(const LLSD& userdata) -{ - bool action_enabled = true; - - const std::string command_name = userdata.asString(); - - if ("profile_item" == command_name - || "block_voice" == command_name - || "block_text" == command_name - || "block_particles" == command_name - || "block_obj_sounds" == command_name) - { - LLBlockedListItem* item = getBlockedItem(); - action_enabled = item && (LLMute::AGENT == item->getType()); - } - - if ("unblock_item" == command_name) - { - action_enabled = getSelectedItem() != NULL; - } - - return action_enabled; -} - -void LLBlockList::onCustomAction(const LLSD& userdata) -{ - if (!isActionEnabled(userdata)) - { - return; - } - - LLBlockedListItem* item = getBlockedItem(); - const std::string command_name = userdata.asString(); - - if ("unblock_item" == command_name) - { - LLMute mute(item->getUUID(), item->getName()); - LLMuteList::getInstance()->remove(mute); - } - else if ("profile_item" == command_name) - { - switch(item->getType()) - { - - case LLMute::AGENT: - LLAvatarActions::showProfile(item->getUUID()); - break; - - default: - break; - } - } - else if ("block_voice" == command_name) - { - toggleMute(LLMute::flagVoiceChat); - } - else if ("block_text" == command_name) - { - toggleMute(LLMute::flagTextChat); - } - else if ("block_particles" == command_name) - { - toggleMute(LLMute::flagParticles); - } - else if ("block_obj_sounds" == command_name) - { - toggleMute(LLMute::flagObjectSounds); - } -} - -bool LLBlockList::isMenuItemChecked(const LLSD& userdata) -{ - LLBlockedListItem* item = getBlockedItem(); - if (!item) - { - return false; - } - - const std::string command_name = userdata.asString(); - - if ("block_voice" == command_name) - { - return LLMuteList::getInstance()->isMuted(item->getUUID(), LLMute::flagVoiceChat); - } - else if ("block_text" == command_name) - { - return LLMuteList::getInstance()->isMuted(item->getUUID(), LLMute::flagTextChat); - } - else if ("block_particles" == command_name) - { - return LLMuteList::getInstance()->isMuted(item->getUUID(), LLMute::flagParticles); - } - else if ("block_obj_sounds" == command_name) - { - return LLMuteList::getInstance()->isMuted(item->getUUID(), LLMute::flagObjectSounds); - } - - return false; -} - -bool LLBlockList::isMenuItemVisible(const LLSD& userdata) -{ - LLBlockedListItem* item = getBlockedItem(); - const std::string command_name = userdata.asString(); - - if ("block_voice" == command_name - || "block_text" == command_name - || "block_particles" == command_name - || "block_obj_sounds" == command_name) - { - return item && (LLMute::AGENT == item->getType()); - } - - return false; -} - -void LLBlockList::toggleMute(U32 flags) -{ - LLBlockedListItem* item = getBlockedItem(); - LLMute mute(item->getUUID(), item->getName(), item->getType()); - - if (!LLMuteList::getInstance()->isMuted(item->getUUID(), flags)) - { - LLMuteList::getInstance()->add(mute, flags); - } - else - { - LLMuteList::getInstance()->remove(mute, flags); - } -} - -bool LLBlockListItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const -{ - const LLBlockedListItem* blocked_item1 = dynamic_cast<const LLBlockedListItem*>(item1); - const LLBlockedListItem* blocked_item2 = dynamic_cast<const LLBlockedListItem*>(item2); - - if (!blocked_item1 || !blocked_item2) - { - LL_ERRS() << "blocked_item1 and blocked_item2 cannot be null" << LL_ENDL; - return true; - } - - return doCompare(blocked_item1, blocked_item2); -} - -bool LLBlockListNameComparator::doCompare(const LLBlockedListItem* blocked_item1, const LLBlockedListItem* blocked_item2) const -{ - std::string name1 = blocked_item1->getName(); - std::string name2 = blocked_item2->getName(); - - LLStringUtil::toUpper(name1); - LLStringUtil::toUpper(name2); - - return name1 < name2; -} - -bool LLBlockListNameTypeComparator::doCompare(const LLBlockedListItem* blocked_item1, const LLBlockedListItem* blocked_item2) const -{ - LLMute::EType type1 = blocked_item1->getType(); - LLMute::EType type2 = blocked_item2->getType(); - - // if mute type is LLMute::BY_NAME or LLMute::OBJECT it means that this mute is an object - bool both_mutes_are_objects = (LLMute::OBJECT == type1 || LLMute::BY_NAME == type1) && (LLMute::OBJECT == type2 || LLMute::BY_NAME == type2); - - // mute types may be different, but since both LLMute::BY_NAME and LLMute::OBJECT types represent objects - // it's needed to perform additional checking of both_mutes_are_objects variable - if (type1 != type2 && !both_mutes_are_objects) - { - // objects in block list go first, so return true if mute type is not an avatar - return LLMute::AGENT != type1; - } - - return NAME_COMPARATOR.compare(blocked_item1, blocked_item2); -} +/**
+ * @file llblocklist.cpp
+ * @brief List of the blocked avatars and objects.
+ *
+ * $LicenseInfo:firstyear=2012&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, 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$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llblocklist.h"
+
+#include "llavataractions.h"
+#include "llblockedlistitem.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llviewermenu.h"
+
+static LLDefaultChildRegistry::Register<LLBlockList> r("block_list");
+
+static const LLBlockListNameComparator NAME_COMPARATOR;
+static const LLBlockListNameTypeComparator NAME_TYPE_COMPARATOR;
+
+LLBlockList::LLBlockList(const Params& p)
+: LLFlatListViewEx(p),
+ mDirty(true),
+ mShouldAddAll(true),
+ mActionType(NONE),
+ mMuteListSize(0)
+{
+
+ LLMuteList::getInstance()->addObserver(this);
+ mMuteListSize = LLMuteList::getInstance()->getMutes().size();
+
+ // Set up context menu.
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+ registrar.add ("Block.Action", boost::bind(&LLBlockList::onCustomAction, this, _2));
+ enable_registrar.add("Block.Enable", boost::bind(&LLBlockList::isActionEnabled, this, _2));
+ enable_registrar.add("Block.Check", boost::bind(&LLBlockList::isMenuItemChecked, this, _2));
+ enable_registrar.add("Block.Visible", boost::bind(&LLBlockList::isMenuItemVisible, this, _2));
+
+ LLToggleableMenu* context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(
+ "menu_people_blocked_gear.xml",
+ gMenuHolder,
+ LLViewerMenuHolderGL::child_registry_t::instance());
+ if(context_menu)
+ {
+ mContextMenu = context_menu->getHandle();
+ }
+}
+
+LLBlockList::~LLBlockList()
+{
+ if (mContextMenu.get())
+ {
+ mContextMenu.get()->die();
+ }
+
+ LLMuteList::getInstance()->removeObserver(this);
+}
+
+void LLBlockList::createList()
+{
+ std::vector<LLMute> mutes = LLMuteList::instance().getMutes();
+ std::vector<LLMute>::const_iterator mute_it = mutes.begin();
+
+ for (; mute_it != mutes.end(); ++mute_it)
+ {
+ addNewItem(&*mute_it);
+ }
+}
+
+BlockListActionType LLBlockList::getCurrentMuteListActionType()
+{
+ BlockListActionType type = NONE;
+ U32 curSize = LLMuteList::getInstance()->getMutes().size();
+ if( curSize > mMuteListSize)
+ type = ADD;
+ else if(curSize < mMuteListSize)
+ type = REMOVE;
+
+ return type;
+}
+
+void LLBlockList::onChangeDetailed(const LLMute &mute)
+{
+ mActionType = getCurrentMuteListActionType();
+
+ mCurItemId = mute.mID;
+ mCurItemName = mute.mName;
+ mCurItemType = mute.mType;
+ mCurItemFlags = mute.mFlags;
+
+ refresh();
+}
+
+bool LLBlockList::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ bool handled = LLUICtrl::handleRightMouseDown(x, y, mask);
+
+ LLToggleableMenu* context_menu = mContextMenu.get();
+ if (context_menu && size())
+ {
+ context_menu->buildDrawLabels();
+ context_menu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(this, context_menu, x, y);
+ }
+
+ return handled;
+}
+
+void LLBlockList::removeListItem(const LLMute* mute)
+{
+ if (mute->mID.notNull())
+ {
+ removeItemByUUID(mute->mID);
+ }
+ else
+ {
+ removeItemByValue(mute->mName);
+ }
+}
+
+void LLBlockList::hideListItem(LLBlockedListItem* item, bool show)
+{
+ item->setVisible(show);
+}
+
+void LLBlockList::setNameFilter(const std::string& filter)
+{
+ std::string filter_upper = filter;
+ LLStringUtil::toUpper(filter_upper);
+ if (mNameFilter != filter_upper)
+ {
+ mNameFilter = filter_upper;
+ setDirty();
+ }
+}
+
+void LLBlockList::sortByName()
+{
+ setComparator(&NAME_COMPARATOR);
+ sort();
+}
+
+void LLBlockList::sortByType()
+{
+ setComparator(&NAME_TYPE_COMPARATOR);
+ sort();
+}
+
+void LLBlockList::draw()
+{
+ if (mDirty)
+ {
+ refresh();
+ }
+
+ LLFlatListView::draw();
+}
+
+void LLBlockList::addNewItem(const LLMute* mute)
+{
+ LLBlockedListItem* item = new LLBlockedListItem(mute);
+ if (!mNameFilter.empty())
+ {
+ item->highlightName(mNameFilter);
+ }
+ if (item->getUUID().notNull())
+ {
+ addItem(item, item->getUUID(), ADD_BOTTOM);
+ }
+ else
+ {
+ addItem(item, item->getName(), ADD_BOTTOM);
+ }
+}
+
+void LLBlockList::refresh()
+{
+ bool have_filter = !mNameFilter.empty();
+
+ // save selection to restore it after list rebuilt
+ LLSD selected = getSelectedValue();
+ LLSD next_selected;
+
+ if(mShouldAddAll) // creating list of blockers
+ {
+ clear();
+ createList();
+ mShouldAddAll = false;
+ }
+ else
+ {
+ // handle remove/add functionality
+ LLMute mute(mCurItemId, mCurItemName, mCurItemType, mCurItemFlags);
+ if(mActionType == ADD)
+ {
+ addNewItem(&mute);
+ }
+ else if(mActionType == REMOVE)
+ {
+ if ((mute.mID.notNull() && selected.isUUID() && selected.asUUID() == mute.mID)
+ || (mute.mID.isNull() && selected.isString() && selected.asString() == mute.mName))
+ {
+ // we are going to remove currently selected item, so select next item and save the selection to restore it
+ if (!selectNextItemPair(false, true))
+ {
+ selectNextItemPair(true, true);
+ }
+ next_selected = getSelectedValue();
+ }
+ removeListItem(&mute);
+ }
+ mActionType = NONE;
+ }
+
+ // handle filter functionality
+ if(have_filter || (!have_filter && !mPrevNameFilter.empty()))
+ {
+ // we should update visibility of our items if previous filter was not empty
+ std::vector < LLPanel* > allItems;
+ getItems(allItems);
+ std::vector < LLPanel* >::iterator it = allItems.begin();
+
+ for(; it != allItems.end() ; ++it)
+ {
+ LLBlockedListItem * curItem = dynamic_cast<LLBlockedListItem *> (*it);
+ if(curItem)
+ {
+ hideListItem(curItem, findInsensitive(curItem->getName(), mNameFilter));
+ }
+ }
+ }
+ mPrevNameFilter = mNameFilter;
+
+ if (selected.isDefined())
+ {
+ if (getItemPair(selected))
+ {
+ // restore previously selected item
+ selectItemPair(getItemPair(selected), true);
+ }
+ else if (next_selected.isDefined() && getItemPair(next_selected))
+ {
+ // previously selected item was removed, so select next item
+ selectItemPair(getItemPair(next_selected), true);
+ }
+ }
+ mMuteListSize = LLMuteList::getInstance()->getMutes().size();
+
+ // Sort the list.
+ sort();
+
+ setDirty(false);
+}
+
+bool LLBlockList::findInsensitive(std::string haystack, const std::string& needle_upper)
+{
+ LLStringUtil::toUpper(haystack);
+ return haystack.find(needle_upper) != std::string::npos;
+}
+
+LLBlockedListItem* LLBlockList::getBlockedItem() const
+{
+ LLPanel* panel = LLFlatListView::getSelectedItem();
+ LLBlockedListItem* item = dynamic_cast<LLBlockedListItem*>(panel);
+ return item;
+}
+
+bool LLBlockList::isActionEnabled(const LLSD& userdata)
+{
+ bool action_enabled = true;
+
+ const std::string command_name = userdata.asString();
+
+ if ("profile_item" == command_name
+ || "block_voice" == command_name
+ || "block_text" == command_name
+ || "block_particles" == command_name
+ || "block_obj_sounds" == command_name)
+ {
+ LLBlockedListItem* item = getBlockedItem();
+ action_enabled = item && (LLMute::AGENT == item->getType());
+ }
+
+ if ("unblock_item" == command_name)
+ {
+ action_enabled = getSelectedItem() != NULL;
+ }
+
+ return action_enabled;
+}
+
+void LLBlockList::onCustomAction(const LLSD& userdata)
+{
+ if (!isActionEnabled(userdata))
+ {
+ return;
+ }
+
+ LLBlockedListItem* item = getBlockedItem();
+ const std::string command_name = userdata.asString();
+
+ if ("unblock_item" == command_name)
+ {
+ LLMute mute(item->getUUID(), item->getName());
+ LLMuteList::getInstance()->remove(mute);
+ }
+ else if ("profile_item" == command_name)
+ {
+ switch(item->getType())
+ {
+
+ case LLMute::AGENT:
+ LLAvatarActions::showProfile(item->getUUID());
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if ("block_voice" == command_name)
+ {
+ toggleMute(LLMute::flagVoiceChat);
+ }
+ else if ("block_text" == command_name)
+ {
+ toggleMute(LLMute::flagTextChat);
+ }
+ else if ("block_particles" == command_name)
+ {
+ toggleMute(LLMute::flagParticles);
+ }
+ else if ("block_obj_sounds" == command_name)
+ {
+ toggleMute(LLMute::flagObjectSounds);
+ }
+}
+
+bool LLBlockList::isMenuItemChecked(const LLSD& userdata)
+{
+ LLBlockedListItem* item = getBlockedItem();
+ if (!item)
+ {
+ return false;
+ }
+
+ const std::string command_name = userdata.asString();
+
+ if ("block_voice" == command_name)
+ {
+ return LLMuteList::getInstance()->isMuted(item->getUUID(), LLMute::flagVoiceChat);
+ }
+ else if ("block_text" == command_name)
+ {
+ return LLMuteList::getInstance()->isMuted(item->getUUID(), LLMute::flagTextChat);
+ }
+ else if ("block_particles" == command_name)
+ {
+ return LLMuteList::getInstance()->isMuted(item->getUUID(), LLMute::flagParticles);
+ }
+ else if ("block_obj_sounds" == command_name)
+ {
+ return LLMuteList::getInstance()->isMuted(item->getUUID(), LLMute::flagObjectSounds);
+ }
+
+ return false;
+}
+
+bool LLBlockList::isMenuItemVisible(const LLSD& userdata)
+{
+ LLBlockedListItem* item = getBlockedItem();
+ const std::string command_name = userdata.asString();
+
+ if ("block_voice" == command_name
+ || "block_text" == command_name
+ || "block_particles" == command_name
+ || "block_obj_sounds" == command_name)
+ {
+ return item && (LLMute::AGENT == item->getType());
+ }
+
+ return false;
+}
+
+void LLBlockList::toggleMute(U32 flags)
+{
+ LLBlockedListItem* item = getBlockedItem();
+ LLMute mute(item->getUUID(), item->getName(), item->getType());
+
+ if (!LLMuteList::getInstance()->isMuted(item->getUUID(), flags))
+ {
+ LLMuteList::getInstance()->add(mute, flags);
+ }
+ else
+ {
+ LLMuteList::getInstance()->remove(mute, flags);
+ }
+}
+
+bool LLBlockListItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const
+{
+ const LLBlockedListItem* blocked_item1 = dynamic_cast<const LLBlockedListItem*>(item1);
+ const LLBlockedListItem* blocked_item2 = dynamic_cast<const LLBlockedListItem*>(item2);
+
+ if (!blocked_item1 || !blocked_item2)
+ {
+ LL_ERRS() << "blocked_item1 and blocked_item2 cannot be null" << LL_ENDL;
+ return true;
+ }
+
+ return doCompare(blocked_item1, blocked_item2);
+}
+
+bool LLBlockListNameComparator::doCompare(const LLBlockedListItem* blocked_item1, const LLBlockedListItem* blocked_item2) const
+{
+ std::string name1 = blocked_item1->getName();
+ std::string name2 = blocked_item2->getName();
+
+ LLStringUtil::toUpper(name1);
+ LLStringUtil::toUpper(name2);
+
+ return name1 < name2;
+}
+
+bool LLBlockListNameTypeComparator::doCompare(const LLBlockedListItem* blocked_item1, const LLBlockedListItem* blocked_item2) const
+{
+ LLMute::EType type1 = blocked_item1->getType();
+ LLMute::EType type2 = blocked_item2->getType();
+
+ // if mute type is LLMute::BY_NAME or LLMute::OBJECT it means that this mute is an object
+ bool both_mutes_are_objects = (LLMute::OBJECT == type1 || LLMute::BY_NAME == type1) && (LLMute::OBJECT == type2 || LLMute::BY_NAME == type2);
+
+ // mute types may be different, but since both LLMute::BY_NAME and LLMute::OBJECT types represent objects
+ // it's needed to perform additional checking of both_mutes_are_objects variable
+ if (type1 != type2 && !both_mutes_are_objects)
+ {
+ // objects in block list go first, so return true if mute type is not an avatar
+ return LLMute::AGENT != type1;
+ }
+
+ return NAME_COMPARATOR.compare(blocked_item1, blocked_item2);
+}
|