From 541de1ad309602c010154744e67f17fe93148cc5 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Thu, 21 Aug 2014 12:50:36 +0200 Subject: [PATCH] FIRE-10839: Make displayed columns in radar customizable --- indra/newview/app_settings/settings.xml | 11 ++ indra/newview/fspanelradar.cpp | 141 +++++++++++++++++- indra/newview/fspanelradar.h | 8 + .../ansastorm/xui/en/floater_fs_radar.xml | 27 ---- .../skins/ansastorm/xui/en/floater_people.xml | 36 ----- .../default/xui/de/menu_fs_radar_options.xml | 9 ++ .../skins/default/xui/en/floater_fs_radar.xml | 6 +- .../skins/default/xui/en/floater_people.xml | 6 +- .../default/xui/en/menu_fs_radar_options.xml | 76 +++++++++- .../skins/default/xui/en/panel_fs_radar.xml | 18 +-- .../skins/vintage/xui/en/floater_people.xml | 6 +- .../skins/vintage/xui/en/panel_fs_radar.xml | 18 +-- 12 files changed, 268 insertions(+), 94 deletions(-) delete mode 100644 indra/newview/skins/ansastorm/xui/en/floater_fs_radar.xml delete mode 100644 indra/newview/skins/ansastorm/xui/en/floater_people.xml diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a94f04809b..85be40c587 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -22655,6 +22655,17 @@ Change of this parameter will affect the layout of buttons in notification toast Value 1 + FSRadarColumnConfig + + Comment + Stores the column visibility of the radar + Persist + 1 + Type + U32 + Value + 511 + diff --git a/indra/newview/fspanelradar.cpp b/indra/newview/fspanelradar.cpp index 0f662d2bd1..b98f7f02df 100644 --- a/indra/newview/fspanelradar.cpp +++ b/indra/newview/fspanelradar.cpp @@ -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("gear_btn"); mOptionsButton = getChild("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& entries, const LLSD& stat updateButtons(); mChangeSignal(); } + +void FSPanelRadar::onColumnDisplayModeChanged() +{ + U32 column_config = gSavedSettings.getU32("FSRadarColumnConfig"); + std::vector column_params = mRadarList->getColumnInitParams(); + S32 column_padding = mRadarList->getColumnPadding(); + + LLFloater* parent_floater = NULL; + LLView* parent = getParent(); + while (parent) + { + parent_floater = dynamic_cast(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::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); +} diff --git a/indra/newview/fspanelradar.h b/indra/newview/fspanelradar.h index 831c98c03f..f8682ad901 100644 --- a/indra/newview/fspanelradar.h +++ b/indra/newview/fspanelradar.h @@ -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 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; diff --git a/indra/newview/skins/ansastorm/xui/en/floater_fs_radar.xml b/indra/newview/skins/ansastorm/xui/en/floater_fs_radar.xml deleted file mode 100644 index 809eed94f1..0000000000 --- a/indra/newview/skins/ansastorm/xui/en/floater_fs_radar.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - diff --git a/indra/newview/skins/ansastorm/xui/en/floater_people.xml b/indra/newview/skins/ansastorm/xui/en/floater_people.xml deleted file mode 100644 index 31a8a8084e..0000000000 --- a/indra/newview/skins/ansastorm/xui/en/floater_people.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - diff --git a/indra/newview/skins/default/xui/de/menu_fs_radar_options.xml b/indra/newview/skins/default/xui/de/menu_fs_radar_options.xml index 7fb61517df..5d6459b95b 100644 --- a/indra/newview/skins/default/xui/de/menu_fs_radar_options.xml +++ b/indra/newview/skins/default/xui/de/menu_fs_radar_options.xml @@ -9,6 +9,15 @@ + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/floater_fs_radar.xml b/indra/newview/skins/default/xui/en/floater_fs_radar.xml index 18c4b477ab..809eed94f1 100644 --- a/indra/newview/skins/default/xui/en/floater_fs_radar.xml +++ b/indra/newview/skins/default/xui/en/floater_fs_radar.xml @@ -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"/> diff --git a/indra/newview/skins/default/xui/en/floater_people.xml b/indra/newview/skins/default/xui/en/floater_people.xml index 96e1e610f2..31a8a8084e 100755 --- a/indra/newview/skins/default/xui/en/floater_people.xml +++ b/indra/newview/skins/default/xui/en/floater_people.xml @@ -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"> + width="400"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -93,7 +167,7 @@ function="ToggleControl" parameter="FSRadarColorNamesByDistance" /> - + + dynamic_width="true"/> + width="20"/> + width="15"/> + width="10"/> + width="10"/> + width="15"/> + width="50"/> + width="50"/> + width="60"/> diff --git a/indra/newview/skins/vintage/xui/en/floater_people.xml b/indra/newview/skins/vintage/xui/en/floater_people.xml index 19db62c297..b7db15d72d 100644 --- a/indra/newview/skins/vintage/xui/en/floater_people.xml +++ b/indra/newview/skins/vintage/xui/en/floater_people.xml @@ -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"> + width="350"> + dynamic_width="true"/> + width="20"/> + width="60"/> + width="50"/> + width="50"/> + width="15"/> + width="10"/> + width="10"/> + width="15"/>