diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8a18b294d2..692dce9961 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -139,6 +139,7 @@ set(viewer_SOURCE_FILES fsdroptarget.cpp fsexportperms.cpp fsfloateraddtocontactset.cpp + fsfloateravatarrendersettings.cpp fsfloaterblocklist.cpp fsfloatercontacts.cpp fsfloatercontactsetconfiguration.cpp @@ -878,6 +879,7 @@ set(viewer_HEADER_FILES fsdroptarget.h fsexportperms.h fsfloateraddtocontactset.h + fsfloateravatarrendersettings.h fsfloaterblocklist.h fsfloatercontacts.h fsfloatercontactsetconfiguration.h diff --git a/indra/newview/fsavatarrenderpersistence.cpp b/indra/newview/fsavatarrenderpersistence.cpp index 1d0b99bf1c..ed80c02e36 100644 --- a/indra/newview/fsavatarrenderpersistence.cpp +++ b/indra/newview/fsavatarrenderpersistence.cpp @@ -29,6 +29,7 @@ #include "fsavatarrenderpersistence.h" #include "llsdserialize.h" + FSAvatarRenderPersistence::FSAvatarRenderPersistence() { } @@ -69,6 +70,8 @@ void FSAvatarRenderPersistence::setAvatarRenderSettings(const LLUUID& avatar_id, { mAvatarRenderMap[avatar_id] = render_settings; } + + mAvatarRenderSettingChangedCallback(avatar_id, render_settings); } void FSAvatarRenderPersistence::loadAvatarRenderSettings() diff --git a/indra/newview/fsavatarrenderpersistence.h b/indra/newview/fsavatarrenderpersistence.h index db893f66fa..469ae85278 100644 --- a/indra/newview/fsavatarrenderpersistence.h +++ b/indra/newview/fsavatarrenderpersistence.h @@ -43,6 +43,15 @@ public: LLVOAvatar::VisualMuteSettings getAvatarRenderSettings(const LLUUID& avatar_id); void setAvatarRenderSettings(const LLUUID& avatar_id, LLVOAvatar::VisualMuteSettings render_settings); + typedef std::map avatar_render_setting_t; + avatar_render_setting_t getAvatarRenderMap() const { return mAvatarRenderMap; } + + typedef boost::signals2::signal render_setting_changed_callback_t; + boost::signals2::connection setAvatarRenderSettingChangedCallback(const render_setting_changed_callback_t::slot_type& cb) + { + return mAvatarRenderSettingChangedCallback.connect(cb); + } + private: FSAvatarRenderPersistence(); virtual ~FSAvatarRenderPersistence(); @@ -50,8 +59,8 @@ private: void loadAvatarRenderSettings(); void saveAvatarRenderSettings(); - typedef std::map avatar_render_setting_t; avatar_render_setting_t mAvatarRenderMap; -}; + render_setting_changed_callback_t mAvatarRenderSettingChangedCallback; +}; #endif // FS_AVATARRENDERPERSISTENCE_H diff --git a/indra/newview/fsfloateravatarrendersettings.cpp b/indra/newview/fsfloateravatarrendersettings.cpp new file mode 100644 index 0000000000..f79b6c43a5 --- /dev/null +++ b/indra/newview/fsfloateravatarrendersettings.cpp @@ -0,0 +1,154 @@ +/** + * @file fsfloateravatarrendersettings.cpp + * @brief Floater for showing persisted avatar render settings + * + * $LicenseInfo:firstyear=2016&license=fsviewerlgpl$ + * Phoenix Firestorm Viewer Source Code + * Copyright (C) 2016, Ansariel Hiller + * + * 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 + * + * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA + * http://www.firestormviewer.org + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "fsfloateravatarrendersettings.h" + +#include "llnamelistctrl.h" +#include "lltrans.h" +#include "llviewercontrol.h" +#include "llviewerobjectlist.h" +#include "llvoavatar.h" + + +FSFloaterAvatarRenderSettings::FSFloaterAvatarRenderSettings(const LLSD& key) + : LLFloater(key), + mAvatarList(NULL), + mRenderSettingChangedCallbackConnection() +{ +} + +FSFloaterAvatarRenderSettings::~FSFloaterAvatarRenderSettings() +{ + if (mRenderSettingChangedCallbackConnection.connected()) + { + mRenderSettingChangedCallbackConnection.disconnect(); + } +} + + +void FSFloaterAvatarRenderSettings::addElementToList(const LLUUID& avatar_id, LLVOAvatar::VisualMuteSettings render_setting) +{ + static const std::string av_render_never = getString("av_render_never"); + static const std::string av_render_always = getString("av_render_always"); + static const std::string av_name_waiting = LLTrans::getString("AvatarNameWaiting"); + + LLNameListCtrl::NameItem item_params; + item_params.value = avatar_id; + item_params.target = LLNameListCtrl::INDIVIDUAL; + + item_params.columns.add().column("name"); + item_params.name = av_name_waiting; + + std::string render_value = (render_setting == LLVOAvatar::AV_DO_NOT_RENDER ? av_render_never : av_render_always); + item_params.columns.add().value(render_value).column("render_setting"); + + mAvatarList->addNameItemRow(item_params); +} + +void FSFloaterAvatarRenderSettings::onOpen(const LLSD& key) +{ +} + +BOOL FSFloaterAvatarRenderSettings::postBuild() +{ + mAvatarList = getChild("avatar_list"); + mAvatarList->setContextMenu(&FSFloaterAvatarRenderPersistenceMenu::gFSAvatarRenderPersistenceMenu); + + childSetAction("close_btn", boost::bind(&FSFloaterAvatarRenderSettings::onCloseBtn, this)); + + mRenderSettingChangedCallbackConnection = FSAvatarRenderPersistence::instance().setAvatarRenderSettingChangedCallback(boost::bind(&FSFloaterAvatarRenderSettings::onAvatarRenderSettingChanged, this, _1, _2)); + + loadInitialList(); + + return TRUE; +} + +void FSFloaterAvatarRenderSettings::onCloseBtn() +{ + closeFloater(); +} + +void FSFloaterAvatarRenderSettings::loadInitialList() +{ + FSAvatarRenderPersistence::avatar_render_setting_t avatar_render_map = FSAvatarRenderPersistence::instance().getAvatarRenderMap(); + for (FSAvatarRenderPersistence::avatar_render_setting_t::iterator it = avatar_render_map.begin(); it != avatar_render_map.end(); ++it) + { + addElementToList(it->first, it->second); + } +} + +void FSFloaterAvatarRenderSettings::onAvatarRenderSettingChanged(const LLUUID& avatar_id, LLVOAvatar::VisualMuteSettings render_setting) +{ + mAvatarList->removeNameItem(avatar_id); + if (render_setting != LLVOAvatar::AV_RENDER_NORMALLY) + { + addElementToList(avatar_id, render_setting); + } +} + + +namespace FSFloaterAvatarRenderPersistenceMenu +{ + + FSAvatarRenderPersistenceMenu gFSAvatarRenderPersistenceMenu; + + LLContextMenu* FSAvatarRenderPersistenceMenu::createMenu() + { + // set up the callbacks for all of the avatar menu items + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + + registrar.add("Avatar.ChangeRenderSetting", boost::bind(&FSAvatarRenderPersistenceMenu::changeRenderSetting, this, _2)); + + // create the context menu from the XUI + return createFromFile("menu_fs_avatar_render_setting.xml"); + } + + void FSAvatarRenderPersistenceMenu::changeRenderSetting(const LLSD& param) + { + LLVOAvatar::VisualMuteSettings render_setting = (LLVOAvatar::VisualMuteSettings)param.asInteger(); + + for (uuid_vec_t::iterator it = mUUIDs.begin(); it != mUUIDs.end(); ++it) + { + LLUUID avatar_id = *it; + + LLVOAvatar* avatar = dynamic_cast(gObjectList.findObject(avatar_id)); + if (avatar) + { + // Set setting via the LLVOAvatar instance if it's available; will also call FSAvatarRenderPersistence::setAvatarRenderSettings() + avatar->setVisualMuteSettings(render_setting); + } + else + { + FSAvatarRenderPersistence::instance().setAvatarRenderSettings(avatar_id, render_setting); + } + } + + LLVOAvatar::cullAvatarsByPixelArea(); + } +} diff --git a/indra/newview/fsfloateravatarrendersettings.h b/indra/newview/fsfloateravatarrendersettings.h new file mode 100644 index 0000000000..e23f886d22 --- /dev/null +++ b/indra/newview/fsfloateravatarrendersettings.h @@ -0,0 +1,77 @@ +/** + * @file fsfloateravatarrendersettings.h + * @brief Floater for showing persisted avatar render settings + * + * $LicenseInfo:firstyear=2016&license=fsviewerlgpl$ + * Phoenix Firestorm Viewer Source Code + * Copyright (C) 2016, Ansariel Hiller + * + * 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 + * + * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA + * http://www.firestormviewer.org + * $/LicenseInfo$ + */ + +#ifndef FS_FLOATERAVATARRENDERSETTINGS_H +#define FS_FLOATERAVATARRENDERSETTINGS_H + +#include "fsavatarrenderpersistence.h" +#include "llfloater.h" +#include "lllistcontextmenu.h" +#include "llvoavatar.h" + +class LLNameListCtrl; + +class FSFloaterAvatarRenderSettings : public LLFloater +{ + LOG_CLASS(FSFloaterAvatarRenderSettings); +public: + FSFloaterAvatarRenderSettings(const LLSD& key); + virtual ~FSFloaterAvatarRenderSettings(); + + /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ BOOL postBuild(); + +private: + void onCloseBtn(); + void onAvatarRenderSettingChanged(const LLUUID& avatar_id, LLVOAvatar::VisualMuteSettings render_setting); + + void loadInitialList(); + void addElementToList(const LLUUID& avatar_id, LLVOAvatar::VisualMuteSettings render_setting); + + LLNameListCtrl* mAvatarList; + + boost::signals2::connection mRenderSettingChangedCallbackConnection; +}; + + + +namespace FSFloaterAvatarRenderPersistenceMenu +{ + +class FSAvatarRenderPersistenceMenu : public LLListContextMenu +{ +public: + /*virtual*/ LLContextMenu* createMenu(); +private: + void changeRenderSetting(const LLSD& param); +}; + +extern FSAvatarRenderPersistenceMenu gFSAvatarRenderPersistenceMenu; + +} // namespace FSFloaterAvatarRenderPersistenceMenu + +#endif // FS_FLOATERAVATARRENDERSETTINGS_H diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index fa30a9f294..6c5afb8b3b 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -169,6 +169,7 @@ #include "floatermedialists.h" #include "fsareasearch.h" #include "fsfloateraddtocontactset.h" +#include "fsfloateravatarrendersettings.h" #include "fsfloatercontacts.h" #include "fsfloatercontactsetconfiguration.h" #include "fsfloaterexport.h" @@ -439,6 +440,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("export_collada", "floater_export_collada.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("delete_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("floater_profile", "floater_profile_view.xml",&LLFloaterReg::build); + LLFloaterReg::add("fs_avatar_render_settings", "floater_fs_avatar_render_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("fs_blocklist", "floater_fs_blocklist.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("fs_add_contact", "floater_fs_contact_add.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("fs_contact_set_config", "floater_fs_contact_set_configuration.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/skins/default/xui/de/floater_fs_avatar_render_settings.xml b/indra/newview/skins/default/xui/de/floater_fs_avatar_render_settings.xml new file mode 100644 index 0000000000..58f8fa6abc --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_fs_avatar_render_settings.xml @@ -0,0 +1,14 @@ + + + + Niemals + + + Immer + + + + + +