FIRE-10839: Make displayed columns in radar customizable

Ansariel 2014-08-21 12:50:36 +02:00
parent 510798a2fa
commit 541de1ad30
12 changed files with 268 additions and 94 deletions

View File

@ -22655,6 +22655,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>FSRadarColumnConfig</key>
<map>
<key>Comment</key>
<string>Stores the column visibility of the radar</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>511</integer>
</map>
</map>
</llsd>

View File

@ -85,16 +85,38 @@ FSPanelRadar::FSPanelRadar()
mFilterSubString(LLStringUtil::null),
mFilterSubStringOrig(LLStringUtil::null),
mRadarList(NULL),
mVisibleCheckFunction(NULL)
mVisibleCheckFunction(NULL),
mUpdateSignalConnection(),
mFSRadarColumnConfigConnection(),
mLastResizeDelta(0)
{
mButtonsUpdater = new FSButtonsUpdater(boost::bind(&FSPanelRadar::updateButtons, this));
mCommitCallbackRegistrar.add("Radar.AddFriend", boost::bind(&FSPanelRadar::onAddFriendButtonClicked, this));
mCommitCallbackRegistrar.add("Radar.Gear", boost::bind(&FSPanelRadar::onGearButtonClicked, this, _1));
mColumnBits["name"] = 1;
mColumnBits["voice_level"] = 2;
mColumnBits["in_region"] = 4;
mColumnBits["typing_status"] = 8;
mColumnBits["sitting_status"] = 16;
mColumnBits["flags"] = 32;
mColumnBits["age"] = 64;
mColumnBits["seen"] = 128;
mColumnBits["range"] = 256;
}
FSPanelRadar::~FSPanelRadar()
{
mUpdateSignalConnection.disconnect();
if (mUpdateSignalConnection.connected())
{
mUpdateSignalConnection.disconnect();
}
if (mFSRadarColumnConfigConnection.connected())
{
mFSRadarColumnConfigConnection.disconnect();
}
delete mButtonsUpdater;
if (mOptionsMenuHandle.get()) mOptionsMenuHandle.get()->die();
@ -122,10 +144,12 @@ BOOL FSPanelRadar::postBuild()
registrar.add("Radar.Option.Action", boost::bind(&FSPanelRadar::onOptionsMenuItemClicked, this, _2));
registrar.add("Radar.NameFmt", boost::bind(&FSRadar::onRadarNameFmtClicked, _2));
registrar.add("Radar.ReportTo", boost::bind(&FSRadar::onRadarReportToClicked, _2));
registrar.add("Radar.ToggleColumn", boost::bind(&FSPanelRadar::onColumnVisibilityChecked, this, _2));
enable_registrar.add("Radar.NameFmtCheck", boost::bind(&FSRadar::radarNameFmtCheck, _2));
enable_registrar.add("Radar.ReportToCheck", boost::bind(&FSRadar::radarReportToCheck, _2));
enable_registrar.add("Radar.EnableColumn", boost::bind(&FSPanelRadar::onEnableColumnVisibilityChecked, this, _2));
mRadarGearButton = getChild<LLButton>("gear_btn");
mOptionsButton = getChild<LLMenuButton>("options_btn");
@ -136,6 +160,9 @@ BOOL FSPanelRadar::postBuild()
mOptionsButton->setMenu(options_menu, LLMenuButton::MP_BOTTOM_LEFT);
}
mFSRadarColumnConfigConnection = gSavedSettings.getControl("FSRadarColumnConfig")->getSignal()->connect(boost::bind(&FSPanelRadar::onColumnDisplayModeChanged, this));
onColumnDisplayModeChanged();
// Register for radar updates
mUpdateSignalConnection = FSRadar::getInstance()->setUpdateCallback(boost::bind(&FSPanelRadar::updateList, this, _1, _2));
@ -399,3 +426,111 @@ void FSPanelRadar::updateList(const std::vector<LLSD>& entries, const LLSD& stat
updateButtons();
mChangeSignal();
}
void FSPanelRadar::onColumnDisplayModeChanged()
{
U32 column_config = gSavedSettings.getU32("FSRadarColumnConfig");
std::vector<LLScrollListColumn::Params> column_params = mRadarList->getColumnInitParams();
S32 column_padding = mRadarList->getColumnPadding();
LLFloater* parent_floater = NULL;
LLView* parent = getParent();
while (parent)
{
parent_floater = dynamic_cast<LLFloater*>(parent);
if (parent_floater)
{
break;
}
parent = parent->getParent();
}
if (!parent_floater)
{
return;
}
S32 default_width = 0;
S32 new_width = 0;
S32 min_width, min_height;
parent_floater->getResizeLimits(&min_width, &min_height);
std::string current_sort_col = mRadarList->getSortColumnName();
BOOL current_sort_asc = mRadarList->getSortAscending();
mRadarList->clearRows();
mRadarList->clearColumns();
mRadarList->updateLayout();
std::vector<LLScrollListColumn::Params>::iterator param_it;
for (param_it = column_params.begin(); param_it != column_params.end(); ++param_it)
{
LLScrollListColumn::Params p = *param_it;
default_width += (p.width.pixel_width.getValue() + column_padding);
LLScrollListColumn::Params params;
params.header = p.header;
params.name = p.name;
params.halign = p.halign;
params.sort_direction = p.sort_direction;
params.sort_column = p.sort_column;
params.tool_tip = p.tool_tip;
if (column_config & mColumnBits[p.name.getValue()])
{
params.width = p.width;
new_width += (params.width.pixel_width.getValue() + column_padding);
}
else
{
params.width.pixel_width.set(-1, true);
}
mRadarList->addColumn(params);
}
min_width -= (default_width - new_width - mLastResizeDelta);
mLastResizeDelta = default_width - new_width;
parent_floater->setResizeLimits(min_width, min_height);
if (parent_floater->getRect().getWidth() < min_width)
{
parent_floater->reshape(min_width, parent_floater->getRect().getHeight());
}
if (mRadarList->getColumn(current_sort_col)->getWidth() == -1)
{
current_sort_col = "range";
current_sort_asc = TRUE;
}
mRadarList->sortByColumn(current_sort_col, current_sort_asc);
mRadarList->setFilterColumn(0);
mRadarList->dirtyColumns();
}
void FSPanelRadar::onColumnVisibilityChecked(const LLSD& userdata)
{
std::string column = userdata.asString();
U32 column_config = gSavedSettings.getU32("FSRadarColumnConfig");
U32 new_value;
U32 enabled = (mColumnBits[column] & column_config);
if (enabled)
{
new_value = (column_config & ~mColumnBits[column]);
}
else
{
new_value = (column_config | mColumnBits[column]);
}
gSavedSettings.setU32("FSRadarColumnConfig", new_value);
}
bool FSPanelRadar::onEnableColumnVisibilityChecked(const LLSD& userdata)
{
std::string column = userdata.asString();
U32 column_config = gSavedSettings.getU32("FSRadarColumnConfig");
return (mColumnBits[column] & column_config);
}

View File

@ -75,6 +75,9 @@ private:
void onOptionsMenuItemClicked(const LLSD& userdata);
void onFilterEdit(const std::string& search_string);
void onGearButtonClicked(LLUICtrl* btn);
void onColumnDisplayModeChanged();
void onColumnVisibilityChecked(const LLSD& userdata);
bool onEnableColumnVisibilityChecked(const LLSD& userdata);
FSRadarListCtrl* mRadarList;
LLNetMap* mMiniMap;
@ -89,9 +92,14 @@ private:
std::string mFilterSubString;
std::string mFilterSubStringOrig;
std::map<std::string, U32> mColumnBits;
S32 mLastResizeDelta;
// Slot connection for FSRadar updates
boost::signals2::connection mUpdateSignalConnection;
boost::signals2::connection mFSRadarColumnConfigConnection;
// Signal for subscribers interested in updates (selection/list update)
change_callback_t mChangeSignal;

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
name="radar"
help_topic="fs_radar"
title="Radar"
width="400"
height="440"
min_width="350"
min_height="150"
reuse_instance="true"
single_instance="true"
save_rect="true"
save_visibility="true"
can_resize="true"
can_minimize="true"
can_close="true">
<panel
class="fs_panel_radar"
name="panel_radar"
filename="panel_fs_radar.xml"
follows="all"
height="437"
layout="topleft"
left="3"
top_pad="3"
width="391"/>
</floater>

View File

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<floater
positioning="cascading"
can_close="true"
can_resize="true"
height="570"
help_topic="sidebar_people"
min_height="200"
min_width="350"
layout="topleft"
name="floater_people"
save_rect="true"
save_visibility="true"
single_instance="true"
reuse_instance="true"
title="People"
width="400">
<panel_container
default_panel_name="panel_people"
follows="all"
height="570"
name="main_panel"
width="400">
<panel
class="panel_people"
name="panel_people"
filename="panel_people.xml"/>
<panel
class="panel_group_info_sidetray"
name="panel_group_info_sidetray"
filename="panel_group_info_sidetray.xml"
label="Group Profile"
font="SansSerifBold"/>
</panel_container>
</floater>

View File

@ -9,6 +9,15 @@
<menu_item_check label="Anzeigename (Benutzername)" name="radarFmtDNUN"/>
<menu_item_check label="Benutzername (Anzeigename)" name="radarFmtUNDN"/>
</context_menu>
<context_menu label="Angezeigte Spalten" name="visible_columns">
<menu_item_check label="Voice" name="voice_level"/>
<menu_item_check label="Selbe Region" name="in_region"/>
<menu_item_check label="Status Schreiben" name="typing_status"/>
<menu_item_check label="Status Sitzen" name="sitting_status"/>
<menu_item_check label="Status Zahlungsinformationen" name="flags"/>
<menu_item_check label="Alter" name="age"/>
<menu_item_check label="Zeit" name="seen"/>
</context_menu>
<menu_item_check label="Namen nach Entfernung einfärben" name="radarColorNamesBasedOnDistance"/>
<context_menu label="Melden via" name="report_to_menu">
<menu_item_check label="Chat in der Nähe" name="radar_nearby_chat"/>

View File

@ -3,9 +3,9 @@
name="radar"
help_topic="fs_radar"
title="Radar"
width="333"
width="400"
height="440"
min_width="250"
min_width="350"
min_height="150"
reuse_instance="true"
single_instance="true"
@ -23,5 +23,5 @@
layout="topleft"
left="3"
top_pad="3"
width="324"/>
width="391"/>
</floater>

View File

@ -7,7 +7,7 @@
height="570"
help_topic="sidebar_people"
min_height="200"
min_width="200"
min_width="350"
layout="topleft"
name="floater_people"
save_rect="true"
@ -15,13 +15,13 @@
single_instance="true"
reuse_instance="true"
title="People"
width="370">
width="400">
<panel_container
default_panel_name="panel_people"
follows="all"
height="570"
name="main_panel"
width="370">
width="400">
<panel
class="panel_people"
name="panel_people"

View File

@ -84,6 +84,80 @@
parameter="UNDN"/>
</menu_item_check>
</context_menu>
<context_menu
label="Displayed Columns"
name="visible_columns">
<menu_item_check
label="Voice"
name="voice_level">
<menu_item_check.on_check
function="Radar.EnableColumn"
parameter="voice_level"/>
<menu_item_check.on_click
function="Radar.ToggleColumn"
parameter="voice_level"/>
</menu_item_check>
<menu_item_check
label="Same Region"
name="in_region">
<menu_item_check.on_check
function="Radar.EnableColumn"
parameter="in_region"/>
<menu_item_check.on_click
function="Radar.ToggleColumn"
parameter="in_region"/>
</menu_item_check>
<menu_item_check
label="Typing Status"
name="typing_status">
<menu_item_check.on_check
function="Radar.EnableColumn"
parameter="typing_status"/>
<menu_item_check.on_click
function="Radar.ToggleColumn"
parameter="typing_status"/>
</menu_item_check>
<menu_item_check
label="Sitting Status"
name="sitting_status">
<menu_item_check.on_check
function="Radar.EnableColumn"
parameter="sitting_status"/>
<menu_item_check.on_click
function="Radar.ToggleColumn"
parameter="sitting_status"/>
</menu_item_check>
<menu_item_check
label="Flags"
name="flags">
<menu_item_check.on_check
function="Radar.EnableColumn"
parameter="flags"/>
<menu_item_check.on_click
function="Radar.ToggleColumn"
parameter="flags"/>
</menu_item_check>
<menu_item_check
label="Age"
name="age">
<menu_item_check.on_check
function="Radar.EnableColumn"
parameter="age"/>
<menu_item_check.on_click
function="Radar.ToggleColumn"
parameter="age"/>
</menu_item_check>
<menu_item_check
label="Seen"
name="seen">
<menu_item_check.on_check
function="Radar.EnableColumn"
parameter="seen"/>
<menu_item_check.on_click
function="Radar.ToggleColumn"
parameter="seen"/>
</menu_item_check>
</context_menu>
<menu_item_check
label="Color names based on distance"
name="radarColorNamesBasedOnDistance">
@ -93,7 +167,7 @@
function="ToggleControl"
parameter="FSRadarColorNamesByDistance" />
</menu_item_check>
<menu_item_separator layout="topleft" />
<context_menu

View File

@ -175,44 +175,44 @@
label="Name"
name="name"
tool_tip="[TOTAL] avatars, [IN_REGION] in the same region, [IN_CHAT_RANGE] in chat range"
relative_width="0.30"/>
dynamic_width="true"/>
<radar_list.columns
label=""
name="voice_level"
tool_tip="Is talking on voice"
relative_width="0.07"/>
width="20"/>
<radar_list.columns
label=""
name="in_region"
tool_tip="Is in the same region"
relative_width="0.03"/>
width="15"/>
<radar_list.columns
label=""
name="typing_status"
tool_tip="Is typing"
relative_width="0.02"/>
width="10"/>
<radar_list.columns
label=""
name="sitting_status"
tool_tip="Is sitting"
relative_width="0.02"/>
width="10"/>
<radar_list.columns
label=""
name="flags"
tool_tip="Payment info status"
relative_width="0.05"/>
width="15"/>
<radar_list.columns
label="Age"
name="age"
relative_width="0.1"/>
width="50"/>
<radar_list.columns
label="Seen"
name="seen"
relative_width="0.15"/>
width="50"/>
<radar_list.columns
label="Range"
name="range"
relative_width="0.16"/>
width="60"/>
</radar_list>
</layout_panel>
</layout_stack>

View File

@ -7,7 +7,7 @@
height="570"
help_topic="sidebar_people"
min_height="250"
min_width="268"
min_width="350"
layout="topleft"
name="floater_people"
save_rect="true"
@ -15,13 +15,13 @@
single_instance="true"
reuse_instance="true"
title="PEOPLE"
width="333">
width="350">
<panel_container
default_panel_name="panel_people"
follows="all"
height="570"
name="main_panel"
width="333">
width="350">
<panel
class="panel_people"
name="panel_people"

View File

@ -91,44 +91,44 @@
label="Name"
name="name"
tool_tip="[TOTAL] avatars, [IN_REGION] in the same region, [IN_CHAT_RANGE] in chat range"
relative_width="0.28"/>
dynamic_width="true"/>
<radar_list.columns
label=""
name="voice_level"
tool_tip="Is talking on voice"
relative_width="0.07"/>
width="20"/>
<radar_list.columns
label="Distance"
name="range"
relative_width="0.15"/>
width="60"/>
<radar_list.columns
label="Time"
name="seen"
relative_width="0.15"/>
width="50"/>
<radar_list.columns
label="Age"
name="age"
relative_width="0.1"/>
width="50"/>
<radar_list.columns
label=""
name="in_region"
tool_tip="Is in the same region"
relative_width="0.03"/>
width="15"/>
<radar_list.columns
label=""
name="typing_status"
tool_tip="Is typing"
relative_width="0.02"/>
width="10"/>
<radar_list.columns
label=""
name="sitting_status"
tool_tip="Is sitting"
relative_width="0.02"/>
width="10"/>
<radar_list.columns
label=""
name="flags"
tool_tip="Payment info status"
relative_width="0.08"/>
width="15"/>
</radar_list>
</layout_panel>
</layout_stack>