diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 8eb3e7b122..57331ff62a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -22743,6 +22743,17 @@ Change of this parameter will affect the layout of buttons in notification toast Value 1 + FSAreaSearchColumnConfig + + Comment + Stores the column visibility for the area search + Persist + 1 + Type + U32 + Value + 1023 + diff --git a/indra/newview/fsareasearch.cpp b/indra/newview/fsareasearch.cpp index e5505b1095..fe253a9ad8 100644 --- a/indra/newview/fsareasearch.cpp +++ b/indra/newview/fsareasearch.cpp @@ -121,16 +121,6 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) : mExcludePhysics(true), mExcludeChildPrims(true), mExcludeNeighborRegions(true), - mColumnDistance(true), - mColumnName(true), - mColumnDescription(true), - mColumnPrice(true), - mColumnLandImpact(true), - mColumnPrimCount(true), - mColumnOwner(true), - mColumnGroup(true), - mColumnCreator(true), - mColumnLastOwner(true), mRequestQueuePause(false), mRequestNeedsSent(false) { @@ -951,91 +941,61 @@ void FSAreaSearch::matchObject(FSObjectProperties& details, LLViewerObject* obje LLScrollListItem::Params row_params; row_params.value = object_id.asString(); - if (mColumnDistance) - { - cell_params.column = "distance"; - cell_params.value = llformat("%1.0f m", dist_vec(mPanelList->getAgentLastPosition(), objectp->getPositionGlobal())); // used mAgentLastPosition instead of gAgent->getPositionGlobal for performace - row_params.columns.add(cell_params); - } - - if (mColumnName) - { - cell_params.column = "name"; - cell_params.value = details.name; - row_params.columns.add(cell_params); - } + cell_params.column = "distance"; + cell_params.value = llformat("%1.0f m", dist_vec(mPanelList->getAgentLastPosition(), objectp->getPositionGlobal())); // used mAgentLastPosition instead of gAgent->getPositionGlobal for performace + row_params.columns.add(cell_params); - if (mColumnDescription) - { - cell_params.column = "description"; - cell_params.value = details.description; - row_params.columns.add(cell_params); - } + cell_params.column = "name"; + cell_params.value = details.name; + row_params.columns.add(cell_params); - if (mColumnPrice) - { - cell_params.column = "price"; - if (details.sale_info.isForSale()) - { - S32 price = details.sale_info.getSalePrice(); - cell_params.value = price > 0 ? llformat("%s%d", "L$", details.sale_info.getSalePrice()) : LLTrans::getString("free"); - } - else - { - cell_params.value = " "; - } - row_params.columns.add(cell_params); - } + cell_params.column = "description"; + cell_params.value = details.description; + row_params.columns.add(cell_params); - if (mColumnLandImpact) + cell_params.column = "price"; + if (details.sale_info.isForSale()) { - cell_params.column = "land_impact"; - F32 cost = objectp->getLinksetCost(); - if (cost > 0.001) - { - cell_params.value = cost; - } - else - { - cell_params.value = "..."; - } - row_params.columns.add(cell_params); + S32 price = details.sale_info.getSalePrice(); + cell_params.value = price > 0 ? llformat("%s%d", "L$", details.sale_info.getSalePrice()) : LLTrans::getString("free"); } + else + { + cell_params.value = " "; + } + row_params.columns.add(cell_params); - if (mColumnPrimCount) + cell_params.column = "land_impact"; + F32 cost = objectp->getLinksetCost(); + if (cost > 0.001) { - cell_params.column = "prim_count"; - cell_params.value = objectp->numChildren() + 1; - row_params.columns.add(cell_params); + cell_params.value = cost; } + else + { + cell_params.value = "..."; + } + row_params.columns.add(cell_params); - if (mColumnOwner) - { - cell_params.column = "owner"; - cell_params.value = owner_name; - row_params.columns.add(cell_params); - } + cell_params.column = "prim_count"; + cell_params.value = objectp->numChildren() + 1; + row_params.columns.add(cell_params); - if (mColumnGroup) - { - cell_params.column = "group"; - cell_params.value = group_name; - row_params.columns.add(cell_params); - } + cell_params.column = "owner"; + cell_params.value = owner_name; + row_params.columns.add(cell_params); - if (mColumnCreator) - { - cell_params.column = "creator"; - cell_params.value = creator_name; - row_params.columns.add(cell_params); - } + cell_params.column = "group"; + cell_params.value = group_name; + row_params.columns.add(cell_params); - if (mColumnLastOwner) - { - cell_params.column = "last_owner"; - cell_params.value = last_owner_name; - row_params.columns.add(cell_params); - } + cell_params.column = "creator"; + cell_params.value = creator_name; + row_params.columns.add(cell_params); + + cell_params.column = "last_owner"; + cell_params.value = last_owner_name; + row_params.columns.add(cell_params); LLScrollListItem* list_row = mPanelList->getResultList()->addRow(row_params); @@ -1301,8 +1261,19 @@ FSPanelAreaSearchList::FSPanelAreaSearchList(FSAreaSearch* pointer) : LLPanel(), mCounterText(0), mResultList(0), - mFSAreaSearch(pointer) + mFSAreaSearch(pointer), + mFSRadarColumnConfigConnection() { + mColumnBits["distance"] = 1; + mColumnBits["name"] = 2; + mColumnBits["description"] = 4; + mColumnBits["price"] = 8; + mColumnBits["land_impact"] = 16; + mColumnBits["prim_count"] = 32; + mColumnBits["owner"] = 64; + mColumnBits["group"] = 128; + mColumnBits["creator"] = 256; + mColumnBits["last_owner"] = 512; } BOOL FSPanelAreaSearchList::postBuild() @@ -1322,12 +1293,20 @@ BOOL FSPanelAreaSearchList::postBuild() mAgentLastPosition = gAgent.getPositionGlobal(); + updateResultListColumns(); + mFSRadarColumnConfigConnection = gSavedSettings.getControl("FSAreaSearchColumnConfig")->getSignal()->connect(boost::bind(&FSPanelAreaSearchList::updateResultListColumns, this)); + return LLPanel::postBuild(); } // virtual FSPanelAreaSearchList::~FSPanelAreaSearchList() -{ } +{ + if (mFSRadarColumnConfigConnection.connected()) + { + mFSRadarColumnConfigConnection.disconnect(); + } +} void FSPanelAreaSearchList::onClickRefresh() { @@ -1422,6 +1401,75 @@ void FSPanelAreaSearchList::updateScrollList() } } +void FSPanelAreaSearchList::updateResultListColumns() +{ + U32 column_config = gSavedSettings.getU32("FSAreaSearchColumnConfig"); + std::vector column_params = mResultList->getColumnInitParams(); + std::string current_sort_col = mResultList->getSortColumnName(); + BOOL current_sort_asc = mResultList->getSortAscending(); + + mResultList->clearColumns(); + mResultList->updateLayout(); + + std::vector::iterator param_it; + for (param_it = column_params.begin(); param_it != column_params.end(); ++param_it) + { + LLScrollListColumn::Params p = *param_it; + + 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; + } + else + { + params.width.pixel_width.set(-1, true); + } + + mResultList->addColumn(params); + } + + mResultList->sortByColumn(current_sort_col, current_sort_asc); + mResultList->dirtyColumns(); + mResultList->updateColumns(true); +} + +void FSPanelAreaSearchList::onColumnVisibilityChecked(const LLSD& userdata) +{ + std::string column = userdata.asString(); + U32 column_config = gSavedSettings.getU32("FSAreaSearchColumnConfig"); + + 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("FSAreaSearchColumnConfig", new_value); + + updateResultListColumns(); +} + +bool FSPanelAreaSearchList::onEnableColumnVisibilityChecked(const LLSD& userdata) +{ + std::string column = userdata.asString(); + U32 column_config = gSavedSettings.getU32("FSAreaSearchColumnConfig"); + + return (mColumnBits[column] & column_config); +} + void FSPanelAreaSearchList::updateName(LLUUID id, std::string name) { LLScrollListColumn* creator_column = mResultList->getColumn("creator"); @@ -2101,6 +2149,7 @@ FSPanelAreaSearchOptions::FSPanelAreaSearchOptions(FSAreaSearch* pointer) mFSAreaSearch(pointer) { mCommitCallbackRegistrar.add("AreaSearch.DisplayColumn", boost::bind(&FSPanelAreaSearchOptions::onCommitCheckboxDisplayColumn, this, _2)); + mEnableCallbackRegistrar.add("AreaSearch.EnableColumn", boost::bind(&FSPanelAreaSearchOptions::onEnableColumnVisibilityChecked, this, _2)); } // virtual @@ -2116,122 +2165,12 @@ void FSPanelAreaSearchOptions::onCommitCheckboxDisplayColumn(const LLSD& userdat return; } - FSAreaSearchListCtrl* result_list = mFSAreaSearch->getPanelList()->getResultList(); - result_list->deleteAllItems(); + mFSAreaSearch->getPanelList()->onColumnVisibilityChecked(userdata); +} - std::vector params = result_list->getColumnInitParams(); - result_list->clearColumns(); - const child_list_t* children = getChildList(); - for (child_list_t::const_reverse_iterator it = children->rbegin(); it != children->rend(); ++it) - { - LLCheckBoxCtrl* ctrl = dynamic_cast(*it); - if (ctrl && ctrl->getName().find("show_") != std::string::npos && ctrl->get()) - { - std::string col_name = ctrl->getName().substr(5); - - for (std::vector::iterator pit = params.begin(); pit != params.end(); ++pit) - { - if ((*pit).name.getValue() == col_name) - { - result_list->addColumn(*pit); - break; - } - } - } - } - - /// until C++ supports variable within a variable name, have to do this instead. - /// used switch instead of a huge if then else if then else... - // Please keep in alphabetical order. Provides both optimizations and ease of updating as the list grows. - LLCheckBoxCtrl* checkboxctrl = getChild("show_" + column_name); - char c = column_name.at(0); - switch(c) - { - case 'c': - { - mFSAreaSearch->setColumnCreator(checkboxctrl->get()); - break; - } - case 'd': - { - char d = column_name.at(1); - switch (d) - { - case 'i': - { - mFSAreaSearch->setColumnDistance(checkboxctrl->get()); - break; - } - case 'e': - { - mFSAreaSearch->setColumnDescription(checkboxctrl->get()); - break; - } - default: - break; - } - break; - } - case 'g': - { - mFSAreaSearch->setColumnGroup(checkboxctrl->get()); - break; - } - case 'l': - { - char d = column_name.at(2); - switch (d) - { - case 'n': - { - mFSAreaSearch->setColumnLandImpact(checkboxctrl->get()); - break; - } - case 's': - { - mFSAreaSearch->setColumnLastOwner(checkboxctrl->get()); - break; - } - default: - break; - } - break; - } - case 'n': - { - mFSAreaSearch->setColumnName(checkboxctrl->get()); - break; - } - case 'o': - { - mFSAreaSearch->setColumnOwner(checkboxctrl->get()); - break; - } - case 'p': - { - char d = column_name.at(3); - switch (d) - { - case 'c': - { - mFSAreaSearch->setColumnPrice(checkboxctrl->get()); - break; - } - case 'm': - { - mFSAreaSearch->setColumnPrimCount(checkboxctrl->get()); - break; - } - default: - break; - } - break; - } - default: - break; - } - - result_list->dirtyColumns(); +bool FSPanelAreaSearchOptions::onEnableColumnVisibilityChecked(const LLSD& userdata) +{ + return mFSAreaSearch->getPanelList()->onEnableColumnVisibilityChecked(userdata); } diff --git a/indra/newview/fsareasearch.h b/indra/newview/fsareasearch.h index cca55ca4a7..833bca4a67 100644 --- a/indra/newview/fsareasearch.h +++ b/indra/newview/fsareasearch.h @@ -158,17 +158,6 @@ public: void setFilterDistanceMin(S32 s) { mFilterDistanceMin = s; } void setFilterDistanceMax(S32 s) { mFilterDistanceMax = s; } - void setColumnDistance(bool b) { mColumnDistance = b; } - void setColumnName(bool b) { mColumnName = b; } - void setColumnDescription(bool b) { mColumnDescription = b; } - void setColumnPrice(bool b) { mColumnPrice = b; } - void setColumnLandImpact(bool b) { mColumnLandImpact = b; } - void setColumnPrimCount(bool b) { mColumnPrimCount = b; } - void setColumnOwner(bool b) { mColumnOwner = b; } - void setColumnGroup(bool b) { mColumnGroup = b; } - void setColumnCreator(bool b) { mColumnCreator = b; } - void setColumnLastOwner(bool b) { mColumnLastOwner = b; } - bool isActive() { return mActive; } private: @@ -253,17 +242,6 @@ private: bool mFilterClickAction; U8 mFilterClickActionType; - - bool mColumnDistance; - bool mColumnName; - bool mColumnDescription; - bool mColumnPrice; - bool mColumnLandImpact; - bool mColumnPrimCount; - bool mColumnOwner; - bool mColumnGroup; - bool mColumnCreator; - bool mColumnLastOwner; protected: static void* createPanelList(void* data); @@ -283,6 +261,7 @@ class FSPanelAreaSearchList { LOG_CLASS(FSPanelAreaSearchList); friend class FSAreaSearchMenu; + friend class FSPanelAreaSearchOptions; public: FSPanelAreaSearchList(FSAreaSearch* pointer); @@ -297,6 +276,7 @@ public: void touchObject(LLViewerObject* objectp); FSAreaSearchListCtrl* getResultList() { return mResultList; } + void updateResultListColumns(); void setAgentLastPosition(LLVector3d d) { mAgentLastPosition = d; } LLVector3d getAgentLastPosition() { return mAgentLastPosition; } @@ -310,6 +290,9 @@ private: bool onContextMenuItemClick(const LLSD& userdata); bool onContextMenuItemEnable(const LLSD& userdata); + void onColumnVisibilityChecked(const LLSD& userdata); + bool onEnableColumnVisibilityChecked(const LLSD& userdata); + F32 getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& normal, F32* height, F32* width, F32* depth); LLVector3d mAgentLastPosition; @@ -319,6 +302,9 @@ private: FSAreaSearchListCtrl* mResultList; LLCheckBoxCtrl* mCheckboxBeacons; LLTextBox* mCounterText; + + std::map mColumnBits; + boost::signals2::connection mFSRadarColumnConfigConnection; }; @@ -413,6 +399,7 @@ public: private: void onCommitCheckboxDisplayColumn(const LLSD& userdata); + bool onEnableColumnVisibilityChecked(const LLSD& userdata); FSAreaSearch* mFSAreaSearch; diff --git a/indra/newview/skins/default/xui/en/floater_fs_area_search.xml b/indra/newview/skins/default/xui/en/floater_fs_area_search.xml index b0491ffc32..cd284c6457 100644 --- a/indra/newview/skins/default/xui/en/floater_fs_area_search.xml +++ b/indra/newview/skins/default/xui/en/floater_fs_area_search.xml @@ -590,6 +590,9 @@ + + + + + + + + + +