FIRE-30934: Add filter editor to group titles window

master
Ansariel 2021-05-10 09:58:05 +02:00
parent c370a21508
commit 5859e4aa6e
4 changed files with 53 additions and 10 deletions

View File

@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include "fsfloatergrouptitles.h"
#include "llfiltereditor.h"
#include "llgroupactions.h"
#include "llscrolllistctrl.h"
#include "lltrans.h"
@ -34,7 +35,7 @@
/////////////////////////////////////////////////////
// FSGroupTitlesObserver class
//
FSGroupTitlesObserver::FSGroupTitlesObserver(const LLGroupData& group_data, FSFloaterGroupTitles* parent) :
FSGroupTitlesObserver::FSGroupTitlesObserver(const LLGroupData& group_data, LLHandle<FSFloaterGroupTitles> parent) :
LLGroupMgrObserver(group_data.mID),
mGroupData(group_data),
mParent(parent)
@ -49,9 +50,9 @@ FSGroupTitlesObserver::~FSGroupTitlesObserver()
void FSGroupTitlesObserver::changed(LLGroupChange gc)
{
if (mParent)
if (!mParent.isDead())
{
mParent->processGroupTitleResults(mGroupData);
mParent.get()->processGroupTitleResults(mGroupData);
}
}
@ -60,7 +61,9 @@ void FSGroupTitlesObserver::changed(LLGroupChange gc)
// FSGroupTitles class
//
FSFloaterGroupTitles::FSFloaterGroupTitles(const LLSD& key) :
LLFloater(key)
LLFloater(key),
mFilterSubString(LLStringUtil::null),
mFilterSubStringOrig(LLStringUtil::null)
{
// Register observer and event listener
LLGroupMgr::getInstance()->addObserver(this);
@ -85,14 +88,17 @@ BOOL FSFloaterGroupTitles::postBuild()
mRefreshButton = getChild<LLButton>("btnRefresh");
mInfoButton = getChild<LLButton>("btnInfo");
mTitleList = getChild<LLScrollListCtrl>("title_list");
mFilterEditor = getChild<LLFilterEditor>("filter_input");
mActivateButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::activateGroupTitle, this));
mRefreshButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::refreshGroupTitles, this));
mInfoButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::openGroupInfo, this));
mTitleList->setDoubleClickCallback(boost::bind(&FSFloaterGroupTitles::activateGroupTitle, this));
mTitleList->setCommitCallback(boost::bind(&FSFloaterGroupTitles::selectedTitleChanged, this));
mFilterEditor->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onFilterEdit, this, _2));
mTitleList->sortByColumn("title_sort_column", TRUE);
mTitleList->setFilterColumn(0);
refreshGroupTitles();
@ -231,7 +237,7 @@ void FSFloaterGroupTitles::refreshGroupTitles()
for (std::vector<LLGroupData>::iterator it = gAgent.mGroups.begin(); it != gAgent.mGroups.end(); ++it)
{
LLGroupData& group_data = *it;
FSGroupTitlesObserver* roleObserver = new FSGroupTitlesObserver(group_data, this);
FSGroupTitlesObserver* roleObserver = new FSGroupTitlesObserver(group_data, getDerivedHandle<FSFloaterGroupTitles>());
mGroupTitleObserverMap[group_data.mID] = roleObserver;
LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_data.mID);
}
@ -256,3 +262,22 @@ void FSFloaterGroupTitles::openGroupInfo()
LLGroupActions::show(group_id);
}
}
void FSFloaterGroupTitles::onFilterEdit(const std::string& search_string)
{
mFilterSubStringOrig = search_string;
LLStringUtil::trimHead(mFilterSubStringOrig);
// Searches are case-insensitive
std::string search_upper = mFilterSubStringOrig;
LLStringUtil::toUpper(search_upper);
if (mFilterSubString == search_upper)
{
return;
}
mFilterSubString = search_upper;
// Apply new filter.
mTitleList->setFilterString(mFilterSubStringOrig);
}

View File

@ -33,20 +33,21 @@
#include "llgroupmgr.h"
class FSFloaterGroupTitles;
class LLFilterEditor;
class LLScrollListCtrl;
class FSGroupTitlesObserver : LLGroupMgrObserver
{
public:
FSGroupTitlesObserver(const LLGroupData& group_data, FSFloaterGroupTitles* parent);
FSGroupTitlesObserver(const LLGroupData& group_data, LLHandle<FSFloaterGroupTitles> parent);
virtual ~FSGroupTitlesObserver();
virtual void changed(LLGroupChange gc);
protected:
FSFloaterGroupTitles* mParent;
LLGroupData mGroupData;
LLHandle<FSFloaterGroupTitles> mParent;
LLGroupData mGroupData;
};
class FSFloaterGroupTitles : public LLFloater, public LLGroupMgrObserver, public LLOldEvents::LLSimpleListener
@ -73,11 +74,16 @@ private:
void activateGroupTitle();
void selectedTitleChanged();
void openGroupInfo();
void onFilterEdit(const std::string& search_string);
LLButton* mActivateButton;
LLButton* mRefreshButton;
LLButton* mInfoButton;
LLScrollListCtrl* mTitleList;
LLFilterEditor* mFilterEditor;
std::string mFilterSubString;
std::string mFilterSubStringOrig;
typedef std::map<LLUUID, FSGroupTitlesObserver*> observer_map_t;
observer_map_t mGroupTitleObserverMap;

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="group_titles" title="Gruppentitel">
<floater.string name="NoGroupTitle" value="&lt;Kein Titel&gt;"/>
<filter_editor label="Nach Gruppentiteln filtern" name="filter_input"/>
<scroll_list name="title_list">
<column name="grouptitle" label="Titel"/>
<column name="groupname" label="Gruppe"/>

View File

@ -16,14 +16,25 @@
<floater.string name="NoGroupTitle" value="&lt;No group title&gt;"/>
<filter_editor
follows="left|top|right"
height="23"
layout="topleft"
left="5"
label="Filter Group Titles"
max_length_bytes="20"
name="filter_input"
top="5"
right="-5" />
<scroll_list
name="title_list"
follows="all"
draw_heading="true"
layout="topleft"
width="240"
right="-5"
left="5"
height="265">
height="238">
<column
name="grouptitle"
sort_column="title_sort_column"