From f96a6b0675c218b3671085e5c228eb52a1718906 Mon Sep 17 00:00:00 2001 From: McCabe Maxsted Date: Sat, 5 Jun 2010 11:23:13 -0700 Subject: Ported group titles window from the Cool Viewer and placed it in the groups list --- linden/indra/newview/CMakeLists.txt | 3 + linden/indra/newview/app_settings/settings.xml | 16 ++ linden/indra/newview/hbfloatergrouptitles.cpp | 246 +++++++++++++++++++++ linden/indra/newview/hbfloatergrouptitles.h | 82 +++++++ linden/indra/newview/llfloatergroups.cpp | 15 ++ linden/indra/newview/llfloatergroups.h | 2 + .../default/xui/en-us/floater_group_titles.xml | 17 ++ .../skins/default/xui/en-us/panel_groups.xml | 2 + 8 files changed, 383 insertions(+) create mode 100644 linden/indra/newview/hbfloatergrouptitles.cpp create mode 100644 linden/indra/newview/hbfloatergrouptitles.h create mode 100644 linden/indra/newview/skins/default/xui/en-us/floater_group_titles.xml diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt index 6be53a4..796e98e 100644 --- a/linden/indra/newview/CMakeLists.txt +++ b/linden/indra/newview/CMakeLists.txt @@ -69,6 +69,7 @@ set(viewer_SOURCE_FILES floaterao.cpp floaterbusy.cpp floaterlogin.cpp + hbfloatergrouptitles.cpp hippoGridManager.cpp hippoLimits.cpp hippoRestRequest.cpp @@ -496,6 +497,7 @@ set(viewer_HEADER_FILES floaterao.h floaterbusy.h floaterlogin.h + hbfloatergrouptitles.h hippoGridManager.h hippoLimits.h hippoRestRequest.h @@ -1122,6 +1124,7 @@ set(viewer_XUI_FILES skins/default/xui/en-us/floater_gesture.xml skins/default/xui/en-us/floater_god_tools.xml skins/default/xui/en-us/floater_group_info.xml + skins/default/xui/en-us/floater_group_titles.xml skins/default/xui/en-us/floater_hardware_settings.xml skins/default/xui/en-us/floater_html.xml skins/default/xui/en-us/floater_html_simple.xml diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml index 7ce768b..32b29d0 100644 --- a/linden/indra/newview/app_settings/settings.xml +++ b/linden/indra/newview/app_settings/settings.xml @@ -141,6 +141,22 @@ 0 + FloaterGroupTitlesRect + + Comment + Rectangle for group titles window + Persist + 1 + Type + Rect + Value + + 0 + 400 + 500 + 0 + + FloaterPrimImport Comment diff --git a/linden/indra/newview/hbfloatergrouptitles.cpp b/linden/indra/newview/hbfloatergrouptitles.cpp new file mode 100644 index 0000000..bd6de9e --- /dev/null +++ b/linden/indra/newview/hbfloatergrouptitles.cpp @@ -0,0 +1,246 @@ +/** + * @file hbfloatergrouptitles.h + * @brief HBFloaterGroupTitles class implementation + * + * This class implements a floater where all available group titles are + * listed, allowing the user to activate any via simple double-click. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Henri Beauchamp. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "message.h" +#include "roles_constants.h" + +#include "hbfloatergrouptitles.h" + +#include "llagent.h" +#include "lluictrlfactory.h" +#include "llviewercontrol.h" + +// static variable +HBFloaterGroupTitles* HBFloaterGroupTitles::sInstance = NULL; + +// helper function +void update_titles_list(HBFloaterGroupTitles* self); + + +// HBFloaterGroupTitlesObserver class + +HBFloaterGroupTitlesObserver::HBFloaterGroupTitlesObserver(HBFloaterGroupTitles* instance, const LLUUID& group_id) +: LLGroupMgrObserver(group_id), + mFloaterInstance(instance) +{ + LLGroupMgr::getInstance()->addObserver(this); +} + +// virtual +HBFloaterGroupTitlesObserver::~HBFloaterGroupTitlesObserver() +{ + LLGroupMgr::getInstance()->removeObserver(this); +} + +// virtual +void HBFloaterGroupTitlesObserver::changed(LLGroupChange gc) +{ + if (gc == GC_TITLES) + { + update_titles_list(mFloaterInstance); + } +} + + +// HBFloaterGroupTitles class + +HBFloaterGroupTitles::HBFloaterGroupTitles() +: LLFloater(std::string("group titles")), + mFirstUse(true) +{ + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_group_titles.xml", NULL); + sInstance = this; +} + +// virtual +HBFloaterGroupTitles::~HBFloaterGroupTitles() +{ + while (!mObservers.empty()) + { + HBFloaterGroupTitlesObserver* observer = mObservers.back(); + delete observer; + mObservers.pop_back(); + } + sInstance = NULL; +} + +// static +void HBFloaterGroupTitles::toggle() +{ + // I hate things that don't toggle -- MC + if (!sInstance) + { + sInstance = new HBFloaterGroupTitles(); + sInstance->setFocus(TRUE); + sInstance->open(); + } + else + { + if (sInstance->getVisible()) + { + sInstance->close(); + } + else + { + sInstance->open(); + } + } +} + +BOOL HBFloaterGroupTitles::postBuild() +{ + mTitlesList = getChild("titles_list"); + if (!mTitlesList) + { + return FALSE; + } + mTitlesList->setCallbackUserData(this); + mTitlesList->setDoubleClickCallback(onActivate); + childSetAction("activate", onActivate, this); + update_titles_list(this); + return TRUE; +} + +// static +void HBFloaterGroupTitles::onActivate(void* userdata) +{ + HBFloaterGroupTitles* self = (HBFloaterGroupTitles*) userdata; + LLScrollListItem *item = self->mTitlesList->getFirstSelected(); + if (!item) return; + + // Set the group if needed. + LLUUID old_group_id = gAgent.getGroupID(); + LLUUID group_id = item->getColumn(LIST_GROUP_ID)->getValue().asUUID(); + if (group_id != old_group_id) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ActivateGroup); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUIDFast(_PREHASH_GroupID, group_id); + gAgent.sendReliableMessage(); + } + + // Set the title + LLGroupMgr::getInstance()->sendGroupTitleUpdate(group_id, item->getUUID()); + // Force a refresh via the observer + if (group_id == LLUUID::null) + { + group_id = old_group_id; + } + LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_id); +} + +void update_titles_list(HBFloaterGroupTitles* self) +{ + S32 i; + S32 count = gAgent.mGroups.count(); + LLUUID id; + LLUUID highlight_id = LLUUID::null; + LLUUID current_group_id = gAgent.getGroupID(); + std::vector::const_iterator citer; + std::string style; + LLGroupData* group_datap; + LLGroupMgrGroupData* gmgr_datap; + + if (!self || !self->mTitlesList) return; + LLCtrlListInterface *title_list = self->mTitlesList->getListInterface(); + + self->mTitlesList->deleteAllItems(); + + for (i = 0; i < count; ++i) + { + group_datap = &gAgent.mGroups.get(i); + id = group_datap->mID; + if (self->mFirstUse) + { + HBFloaterGroupTitlesObserver* observer = new HBFloaterGroupTitlesObserver(self, id); + self->mObservers.push_back(observer); + } + gmgr_datap = LLGroupMgr::getInstance()->getGroupData(id); + if (!gmgr_datap) + { + LLGroupMgr::getInstance()->sendGroupTitlesRequest(id); + continue; + } + for (citer = gmgr_datap->mTitles.begin(); citer != gmgr_datap->mTitles.end(); citer++) + { + style = "NORMAL"; + if (current_group_id == id && citer->mSelected) + { + style = "BOLD"; + highlight_id = citer->mRoleID; + } + LLSD element; + element["id"] = citer->mRoleID; + element["columns"][LIST_TITLE]["column"] = "title"; + element["columns"][LIST_TITLE]["value"] = citer->mTitle; + element["columns"][LIST_TITLE]["font-style"] = style; + element["columns"][LIST_GROUP_NAME]["column"] = "group_name"; + element["columns"][LIST_GROUP_NAME]["value"] = group_datap->mName; + element["columns"][LIST_GROUP_NAME]["font-style"] = style; + element["columns"][LIST_GROUP_ID]["column"] = "group_id"; + element["columns"][LIST_GROUP_ID]["value"] = id; + + title_list->addElement(element, ADD_SORTED); + } + } + + // add "none" to list at top + { + style = "NORMAL"; + if (current_group_id.isNull()) + { + style = "BOLD"; + } + LLSD element; + element["id"] = LLUUID::null; + element["columns"][LIST_TITLE]["column"] = "title"; + element["columns"][LIST_TITLE]["value"] = "none"; + element["columns"][LIST_TITLE]["font-style"] = style; + element["columns"][LIST_GROUP_NAME]["column"] = "group_name"; + element["columns"][LIST_GROUP_NAME]["value"] = "none"; + element["columns"][LIST_GROUP_NAME]["font-style"] = style; + element["columns"][LIST_GROUP_ID]["column"] = "group_id"; + element["columns"][LIST_GROUP_ID]["value"] = LLUUID::null; + + title_list->addElement(element, ADD_TOP); + } + + title_list->selectByValue(highlight_id); + self->mFirstUse = false; +} diff --git a/linden/indra/newview/hbfloatergrouptitles.h b/linden/indra/newview/hbfloatergrouptitles.h new file mode 100644 index 0000000..fbfd33c --- /dev/null +++ b/linden/indra/newview/hbfloatergrouptitles.h @@ -0,0 +1,82 @@ +/** + * @file hbfloatergrouptitles.h + * @brief HBFloaterGroupTitles class definition + * + * This class implements a floater where all available group titles are + * listed, allowing the user to activate any via simple double-click. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Henri Beauchamp. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_HBFLOATERGROUPTITLES_H +#define LL_HBFLOATERGROUPTITLES_H + +#include "llfloater.h" +#include "llgroupmgr.h" +#include "llscrolllistctrl.h" + +enum TITLES_COLUMN_ORDER +{ + LIST_TITLE, + LIST_GROUP_NAME, + LIST_GROUP_ID +}; +class HBFloaterGroupTitles; + +class HBFloaterGroupTitlesObserver : public LLGroupMgrObserver +{ +public: + HBFloaterGroupTitlesObserver(HBFloaterGroupTitles* instance, const LLUUID& group_id); + /* virtual */ ~HBFloaterGroupTitlesObserver(); + + /* virtual */ void changed(LLGroupChange gc); + +private: + HBFloaterGroupTitles* mFloaterInstance; +}; + +class HBFloaterGroupTitles : public LLFloater +{ +public: + HBFloaterGroupTitles(); + virtual ~HBFloaterGroupTitles(); + + static void toggle(); + + BOOL postBuild(); + + bool mFirstUse; + LLScrollListCtrl* mTitlesList; + std::vector mObservers; + +private: + static void onActivate(void* data); + + static HBFloaterGroupTitles* sInstance; +}; + +#endif diff --git a/linden/indra/newview/llfloatergroups.cpp b/linden/indra/newview/llfloatergroups.cpp index e94734d..f00489c 100644 --- a/linden/indra/newview/llfloatergroups.cpp +++ b/linden/indra/newview/llfloatergroups.cpp @@ -45,6 +45,7 @@ #include "message.h" #include "roles_constants.h" +#include "hbfloatergrouptitles.h" #include "llagent.h" #include "llbutton.h" #include "llfloatergroupinfo.h" @@ -233,6 +234,8 @@ BOOL LLPanelGroups::postBuild() childSetAction("Invite...", onBtnInvite, this); + childSetAction("Titles...", onBtnTitles, this); + setDefaultBtn("IM"); childSetDoubleClickCallback("group list", onBtnIM); @@ -333,6 +336,12 @@ void LLPanelGroups::onBtnSearch(void* userdata) if(self) self->search(); } +void LLPanelGroups::onBtnTitles(void* userdata) +{ + LLPanelGroups* self = (LLPanelGroups*)userdata; + if(self) self->titles(); +} + void LLPanelGroups::create() { llinfos << "LLPanelGroups::create" << llendl; @@ -440,6 +449,12 @@ void LLPanelGroups::invite() LLFloaterGroupInvite::showForGroup(group_id); } +void LLPanelGroups::titles() +{ + HBFloaterGroupTitles::toggle(); +} + + // static bool LLPanelGroups::callbackLeaveGroup(const LLSD& notification, const LLSD& response) { diff --git a/linden/indra/newview/llfloatergroups.h b/linden/indra/newview/llfloatergroups.h index e3c3e26..c0d06e7 100644 --- a/linden/indra/newview/llfloatergroups.h +++ b/linden/indra/newview/llfloatergroups.h @@ -112,6 +112,7 @@ protected: static void onBtnSearch(void* userdata); static void onBtnVote(void* userdata); static void onBtnInvite(void* userdata); + static void onBtnTitles(void* userdata); static void onDoubleClickGroup(void* userdata); void create(); @@ -122,6 +123,7 @@ protected: void search(); void callVote(); void invite(); + void titles(); static bool callbackLeaveGroup(const LLSD& notification, const LLSD& response); diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_group_titles.xml b/linden/indra/newview/skins/default/xui/en-us/floater_group_titles.xml new file mode 100644 index 0000000..5ec037f --- /dev/null +++ b/linden/indra/newview/skins/default/xui/en-us/floater_group_titles.xml @@ -0,0 +1,17 @@ + + + + + + + + +