diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f2b8b146eb..3b097f9cd3 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -24692,6 +24692,17 @@ Change of this parameter will affect the layout of buttons in notification toast Value 0 + FSInspectColumnConfig + + Comment + Stores the column visibility of the inspect window + Persist + 1 + Type + U32 + Value + 1023 + diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index 4ce7ea5edc..174fca669c 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -55,17 +55,42 @@ // PoundLife END #include "llvovolume.h" +// FIRE-22292: Configurable columns +#include "llmenugl.h" +#include "llmenubutton.h" +#include "lltoggleablemenu.h" +#include "llviewermenu.h" // for gMenuHolder +// + //LLFloaterInspect* LLFloaterInspect::sInstance = NULL; LLFloaterInspect::LLFloaterInspect(const LLSD& key) : LLFloater(key), mDirty(FALSE), mOwnerNameCacheConnection(), - mCreatorNameCacheConnection() + mCreatorNameCacheConnection(), + // FIRE-22292: Configurable columns + mOptionsButton(NULL), + mFSInspectColumnConfigConnection(), + mLastResizeDelta(0) + // { mCommitCallbackRegistrar.add("Inspect.OwnerProfile", boost::bind(&LLFloaterInspect::onClickOwnerProfile, this)); mCommitCallbackRegistrar.add("Inspect.CreatorProfile", boost::bind(&LLFloaterInspect::onClickCreatorProfile, this)); mCommitCallbackRegistrar.add("Inspect.SelectObject", boost::bind(&LLFloaterInspect::onSelectObject, this)); + + // FIRE-22292: Configurable columns + mColumnBits["object_name"] = 1; + mColumnBits["description"] = 2; + mColumnBits["owner_name"] = 4; + mColumnBits["creator_name"] = 8; + mColumnBits["facecount"] = 16; + mColumnBits["vertexcount"] = 32; + mColumnBits["trianglecount"] = 64; + mColumnBits["tramcount"] = 128; + mColumnBits["vramcount"] = 256; + mColumnBits["creation_date"] = 512; + // } BOOL LLFloaterInspect::postBuild() @@ -74,6 +99,26 @@ BOOL LLFloaterInspect::postBuild() // childSetAction("button owner",onClickOwnerProfile, this); // childSetAction("button creator",onClickCreatorProfile, this); // childSetCommitCallback("object_list", onSelectObject, NULL); + + // FIRE-22292: Configurable columns + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + + registrar.add("Inspect.ToggleColumn", boost::bind(&LLFloaterInspect::onColumnVisibilityChecked, this, _2)); + enable_registrar.add("Inspect.EnableColumn", boost::bind(&LLFloaterInspect::onEnableColumnVisibilityChecked, this, _2)); + + mOptionsButton = getChild("options_btn"); + + LLToggleableMenu* options_menu = LLUICtrlFactory::getInstance()->createFromFile("menu_fs_inspect_options.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + if (options_menu) + { + mOptionsMenuHandle = options_menu->getHandle(); + mOptionsButton->setMenu(options_menu, LLMenuButton::MP_BOTTOM_LEFT); + } + + mFSInspectColumnConfigConnection = gSavedSettings.getControl("FSInspectColumnConfig")->getSignal()->connect(boost::bind(&LLFloaterInspect::onColumnDisplayModeChanged, this)); + onColumnDisplayModeChanged(); + // refresh(); @@ -103,6 +148,15 @@ LLFloaterInspect::~LLFloaterInspect(void) { LLFloaterReg::showInstance("build", LLSD(), TRUE); } + + // FIRE-22292: Configurable columns + if (mFSInspectColumnConfigConnection.connected()) + { + mFSInspectColumnConfigConnection.disconnect(); + } + + if (mOptionsMenuHandle.get()) mOptionsMenuHandle.get()->die(); + // } void LLFloaterInspect::onOpen(const LLSD& key) @@ -671,3 +725,103 @@ void LLFloaterInspect::draw() LLFloater::draw(); } + +// FIRE-22292: Configurable columns +void LLFloaterInspect::onColumnDisplayModeChanged() +{ + U32 column_config = gSavedSettings.getU32("FSInspectColumnConfig"); + std::vector column_params = mObjectList->getColumnInitParams(); + S32 column_padding = mObjectList->getColumnPadding(); + + S32 default_width = 0; + S32 new_width = 0; + S32 min_width, min_height; + getResizeLimits(&min_width, &min_height); + + std::string current_sort_col = mObjectList->getSortColumnName(); + BOOL current_sort_asc = mObjectList->getSortAscending(); + + mObjectList->clearRows(); + mObjectList->clearColumns(); + mObjectList->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); + } + + mObjectList->addColumn(params); + } + + min_width -= (default_width - new_width - mLastResizeDelta); + mLastResizeDelta = default_width - new_width; + setResizeLimits(min_width, min_height); + + if (getRect().getWidth() < min_width) + { + reshape(min_width, getRect().getHeight()); + } + + if (!current_sort_col.empty()) + { + if ((current_sort_col == "creation_date_sort" && mObjectList->getColumn("creation_date")->getWidth() == -1) || + mObjectList->getColumn(current_sort_col)->getWidth() == -1) + { + mObjectList->clearSortOrder(); + } + else + { + mObjectList->sortByColumn(current_sort_col, current_sort_asc); + } + } + mObjectList->setFilterColumn(0); + mObjectList->dirtyColumns(); + setDirty(); +} + +void LLFloaterInspect::onColumnVisibilityChecked(const LLSD& userdata) +{ + std::string column = userdata.asString(); + U32 column_config = gSavedSettings.getU32("FSInspectColumnConfig"); + + 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("FSInspectColumnConfig", new_value); +} + +bool LLFloaterInspect::onEnableColumnVisibilityChecked(const LLSD& userdata) +{ + std::string column = userdata.asString(); + U32 column_config = gSavedSettings.getU32("FSInspectColumnConfig"); + + return (mColumnBits[column] & column_config); +} +// diff --git a/indra/newview/llfloaterinspect.h b/indra/newview/llfloaterinspect.h index 4ac6c2446c..a5316fe625 100644 --- a/indra/newview/llfloaterinspect.h +++ b/indra/newview/llfloaterinspect.h @@ -40,6 +40,7 @@ class LLUICtrl; // [RLVa:KB] - Checked: RLVa-2.0.1 class LLSelectNode; // [/RLVa:KB] +class LLMenuButton; // FIRE-22292: Configurable columns class LLFloaterInspect : public LLFloater { @@ -88,6 +89,19 @@ private: LLSafeHandle mObjectSelection; boost::signals2::connection mOwnerNameCacheConnection; boost::signals2::connection mCreatorNameCacheConnection; + + // FIRE-22292: Configurable columns + void onColumnDisplayModeChanged(); + void onColumnVisibilityChecked(const LLSD& userdata); + bool onEnableColumnVisibilityChecked(const LLSD& userdata); + + LLMenuButton* mOptionsButton; + LLHandle mOptionsMenuHandle; + + std::map mColumnBits; + S32 mLastResizeDelta; + boost::signals2::connection mFSInspectColumnConfigConnection; + // }; #endif //LL_LLFLOATERINSPECT_H diff --git a/indra/newview/skins/default/xui/de/floater_inspect.xml b/indra/newview/skins/default/xui/de/floater_inspect.xml index d81372a9c2..d93fe2d26d 100644 --- a/indra/newview/skins/default/xui/de/floater_inspect.xml +++ b/indra/newview/skins/default/xui/de/floater_inspect.xml @@ -35,4 +35,5 @@ VRAM: [VRAM_USAGE] KB + + + + + + diff --git a/indra/newview/skins/default/xui/en/menu_fs_inspect_options.xml b/indra/newview/skins/default/xui/en/menu_fs_inspect_options.xml new file mode 100644 index 0000000000..e8da0dd7c3 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_fs_inspect_options.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +