FIRE-10839: Make displayed columns in radar customizable
parent
510798a2fa
commit
541de1ad30
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue