From b0778bf27e21bd103402529d0601a900438c2034 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Tue, 30 Apr 2013 20:30:51 -0500 Subject: [PATCH] Template fun to compress our legacy menu<->floater glue. --- indra/newview/llfloatergesture.cpp | 6 + indra/newview/llfloatergesture.h | 1 + indra/newview/llviewermenu.cpp | 261 +++++++------------------ indra/newview/slfloatermediafilter.cpp | 34 +--- indra/newview/slfloatermediafilter.h | 7 +- 5 files changed, 77 insertions(+), 232 deletions(-) diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index f7b27c18b..4a146a4e2 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -186,6 +186,12 @@ void LLFloaterGesture::toggleVisibility() } } +// static +bool LLFloaterGesture::instanceVisible() +{ + return sInstance && sInstance->getVisible(); +} + // static void LLFloaterGesture::refreshAll() { diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h index ba4da14f2..487990a43 100644 --- a/indra/newview/llfloatergesture.h +++ b/indra/newview/llfloatergesture.h @@ -64,6 +64,7 @@ public: static void show(); static void toggleVisibility(); static void refreshAll(); + static bool instanceVisible(); protected: // Reads from the gesture manager's list of active gestures diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 5030d0f2e..63fce86b9 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6643,6 +6643,64 @@ void handle_viewer_disable_message_log(void*) gMessageSystem->stopLogging(); } +struct MenuFloaterDict : public LLSingleton +{ + typedef std::map, boost::function > > menu_floater_map_t; + menu_floater_map_t mEntries; + MenuFloaterDict() + { + registerFloater("about", boost::bind(&LLFloaterAbout::show,(void*)NULL)); + //registerFloater("about region", boost::bind(&LLFloaterRegionInfo::showInstance,LLSD())); + registerFloater("buy currency", boost::bind(&LLFloaterBuyCurrency::buyCurrency)); + registerFloater("displayname", boost::bind(&LLFloaterDisplayName::show)); + //registerFloater("friends", boost::bind(&LLFloaterMyFriends::toggleInstance,0), boost::bind(&LLFloaterMyFriends::instanceVisible,0)); + registerFloater("gestures", boost::bind(&LLFloaterGesture::toggleVisibility), boost::bind(&LLFloaterGesture::instanceVisible)); + registerFloater("grid options", boost::bind(&LLFloaterBuildOptions::show,(void*)NULL)); + registerFloater("help tutorial",boost::bind(&LLFloaterHUD::showHUD)); + registerFloater("im", boost::bind(&LLFloaterChatterBox::toggleInstance,LLSD()), boost::bind(&LLFloaterMyFriends::instanceVisible,0)); + //registerFloater("lag meter", boost::bind(&LLFloaterLagMeter::showInstance,LLSD())); + registerFloater("my land", boost::bind(&LLFloaterLandHoldings::show,(void*)NULL)); + registerFloater("preferences", boost::bind(&LLFloaterPreference::show,(void*)NULL)); + registerFloater("script errors",boost::bind(&LLFloaterScriptDebug::show,LLUUID::null)); + //registerFloater("script info", boost::bind(&LLFloaterScriptLimits::showInstance,LLSD())); + // Phoenix: Wolfspirit: Enabled Show Floater out of viewer menu + registerFloater("toolbar", boost::bind(&LLToolBar::toggle,(void*)NULL), boost::bind(&LLToolBar::visible,(void*)NULL)); + registerFloater("world map", boost::bind(&LLFloaterWorldMap::toggle,(void*)NULL)); + + registerFloater ("about land"); + registerFloater ("about region"); + registerFloater ("active speakers"); + registerFloater ("areasearch"); + registerFloater ("beacons"); + registerFloater ("camera controls"); + registerFloater ("chat history"); + registerFloater ("communicate"); + registerFloater ("friends",0); + registerFloater ("lag meter"); + registerFloater ("media filter"); + registerFloater ("mini map"); + registerFloater ("movement controls"); + registerFloater ("mute list"); + registerFloater ("outbox"); + registerFloater ("perm prefs"); + registerFloater ("script info"); + registerFloater ("stat bar"); + registerFloater ("teleport history"); + registerFloater ("pathfinding_characters"); + registerFloater ("pathfinding_linksets"); + } + void registerFloater(const std::string& name, boost::function show, boost::function visible = NULL) + { + mEntries.insert( std::make_pair( name, std::make_pair( show, visible ) ) ); + } + template + void registerFloater(const std::string& name, const LLSD& key = LLSD()) + { + registerFloater(name, boost::bind(&T::toggleInstance,key), boost::bind(&T::instanceVisible,key)); + } + +}; + // TomY TODO: Move! class LLShowFloater : public view_listener_t { @@ -6650,9 +6708,10 @@ class LLShowFloater : public view_listener_t { std::string floater_name = userdata.asString(); if (floater_name.empty()) return false; - if (floater_name == "gestures") + MenuFloaterDict::menu_floater_map_t::iterator it = MenuFloaterDict::instance().mEntries.find(floater_name); + if(it != MenuFloaterDict::instance().mEntries.end() && it->second.first != NULL) { - LLFloaterGesture::toggleVisibility(); + it->second.first(); } else if (floater_name == "appearance") { @@ -6665,75 +6724,10 @@ class LLShowFloater : public view_listener_t { new LLMakeOutfitDialog(false); } - // Phoenix: Wolfspirit: Enabled Show Floater out of viewer menu - else if (floater_name == "displayname") - { - LLFloaterDisplayName::show(); - } - else if (floater_name == "friends") - { - LLFloaterMyFriends::toggleInstance(0); - } - else if (floater_name == "preferences") - { - LLFloaterPreference::show(NULL); - } - else if (floater_name == "toolbar") - { - LLToolBar::toggle(NULL); - } - else if (floater_name == "chat history") - { - LLFloaterChat::toggleInstance(LLSD()); - } - else if (floater_name == "teleport history") - { - LLFloaterTeleportHistory::toggleInstance(); - } - else if (floater_name == "im") - { - LLFloaterChatterBox::toggleInstance(LLSD()); - } else if (floater_name == "inventory") { LLInventoryView::toggleVisibility(NULL); } - else if (floater_name == "mute list") - { - LLFloaterMute::toggleInstance(); - } - else if (floater_name == "media filter") - { - SLFloaterMediaFilter::toggleInstance(); - } - else if (floater_name == "camera controls") - { - LLFloaterCamera::toggleInstance(); - } - else if (floater_name == "movement controls") - { - LLFloaterMove::toggleInstance(); - } - else if (floater_name == "world map") - { - LLFloaterWorldMap::toggle(NULL); - } - else if (floater_name == "mini map") - { - LLFloaterMap::toggleInstance(); - } - else if (floater_name == "stat bar") - { - LLFloaterStats::toggleInstance(); - } - else if (floater_name == "my land") - { - LLFloaterLandHoldings::show(NULL); - } - else if (floater_name == "about land") - { - LLFloaterLand::showInstance(); - } else if (floater_name == "buy land") { // [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) @@ -6749,35 +6743,13 @@ class LLShowFloater : public view_listener_t LLViewerParcelMgr::getInstance()->startBuyLand(); } - else if (floater_name == "about region") - { - LLFloaterRegionInfo::showInstance(); - } - else if (floater_name == "areasearch") - { - JCFloaterAreaSearch::toggleInstance(); - } - else if (floater_name == "grid options") - { - LLFloaterBuildOptions::show(NULL); - } - else if (floater_name == "script errors") - { - LLFloaterScriptDebug::show(LLUUID::null); - } - else if (floater_name == "script info") - { - LLFloaterScriptLimits::showInstance(); - } + else if (floater_name == "help f1") { llinfos << "Spawning HTML help window" << llendl; gViewerHtmlHelp.show(); } - else if (floater_name == "help tutorial") - { - LLFloaterHUD::showHUD(); - } + else if (floater_name == "complaint reporter") { // Prevent menu from appearing in screen shot. @@ -6791,48 +6763,12 @@ class LLShowFloater : public view_listener_t LLFloaterBump::show(NULL); } } - else if (floater_name == "lag meter") - { - LLFloaterLagMeter::showInstance(); - } else if (floater_name == "bug reporter") { // Prevent menu from appearing in screen shot. gMenuHolder->hideMenus(); LLFloaterReporter::showFromMenu(BUG_REPORT); } - else if (floater_name == "buy currency") - { - LLFloaterBuyCurrency::buyCurrency(); - } - else if (floater_name == "about") - { - LLFloaterAbout::show(NULL); - } - else if (floater_name == "active speakers") - { - LLFloaterActiveSpeakers::toggleInstance(LLSD()); - } - else if (floater_name == "beacons") - { - LLFloaterBeacons::toggleInstance(LLSD()); - } - else if (floater_name == "perm prefs") - { - LLFloaterPerms::toggleInstance(LLSD()); - } - else if (floater_name == "outbox") - { - LLFloaterOutbox::toggleInstance(LLSD()); - } - else if (floater_name == "pathfinding_linksets") - { - LLFloaterPathfindingLinksets::toggleInstance(LLSD()); - } - else if (floater_name == "pathfinding_characters") - { - LLFloaterPathfindingCharacters::toggleInstance(LLSD()); - } else // Simple codeless floater { LLFloater* floater = LLUICtrlFactory::getInstance()->getBuiltFloater(floater_name); @@ -6852,81 +6788,16 @@ class LLFloaterVisible : public view_listener_t std::string control_name = userdata["control"].asString(); std::string floater_name = userdata["data"].asString(); bool new_value = false; - if (floater_name == "friends") + MenuFloaterDict::menu_floater_map_t::iterator it = MenuFloaterDict::instance().mEntries.find(floater_name); + if(it != MenuFloaterDict::instance().mEntries.end() && it->second.second != NULL) { - new_value = LLFloaterMyFriends::instanceVisible(0); - } - else if (floater_name == "communicate") - { - new_value = LLFloaterChatterBox::instanceVisible(); - } - else if (floater_name == "toolbar") - { - new_value = LLToolBar::visible(NULL); - } - else if (floater_name == "chat history") - { - new_value = LLFloaterChat::instanceVisible(); - } - else if (floater_name == "teleport history") - { - new_value = LLFloaterTeleportHistory::instanceVisible(); - } - else if (floater_name == "im") - { - new_value = LLFloaterMyFriends::instanceVisible(0); - } - else if (floater_name == "mute list") - { - new_value = LLFloaterMute::instanceVisible(); - } - else if (floater_name == "media filter") - { - new_value = SLFloaterMediaFilter::instanceVisible(); - } - else if (floater_name == "camera controls") - { - new_value = LLFloaterCamera::instanceVisible(); - } - else if (floater_name == "movement controls") - { - new_value = LLFloaterMove::instanceVisible(); - } - else if (floater_name == "stat bar") - { - new_value = LLFloaterStats::instanceVisible(); - } - else if (floater_name == "active speakers") - { - new_value = LLFloaterActiveSpeakers::instanceVisible(LLSD()); - } - else if (floater_name == "beacons") - { - new_value = LLFloaterBeacons::instanceVisible(LLSD()); + new_value = it->second.second(); } else if (floater_name == "inventory") { LLInventoryView* iv = LLInventoryView::getActiveInventory(); new_value = (NULL != iv && TRUE == iv->getVisible()); } - else if (floater_name == "areasearch") - { - JCFloaterAreaSearch* instn = JCFloaterAreaSearch::getInstance(); - if (!instn) new_value = false; - else new_value = instn->getVisible(); - } - else if (floater_name == "outbox") - { - new_value = LLFloaterOutbox::instanceVisible(LLSD()); - } - else if (floater_name == "pathfinding_linksets") - { - new_value = LLFloaterPathfindingLinksets::instanceVisible(LLSD()); - } - else if (floater_name == "pathfinding_characters") - { - new_value = LLFloaterPathfindingCharacters::instanceVisible(LLSD()); - } gMenuHolder->findControl(control_name)->setValue(new_value); return true; } diff --git a/indra/newview/slfloatermediafilter.cpp b/indra/newview/slfloatermediafilter.cpp index 7b287e015..54f829126 100644 --- a/indra/newview/slfloatermediafilter.cpp +++ b/indra/newview/slfloatermediafilter.cpp @@ -45,7 +45,7 @@ SLFloaterMediaFilter* SLFloaterMediaFilter::sInstance = NULL; bool SLFloaterMediaFilter::sIsWhitelist = false; bool SLFloaterMediaFilter::sShowIPs = false; -SLFloaterMediaFilter::SLFloaterMediaFilter() : LLFloater(std::string("media filter")), mIsDirty(false) +SLFloaterMediaFilter::SLFloaterMediaFilter(const LLSD& key) : LLFloater(std::string("media filter")), mIsDirty(false) { LLUICtrlFactory::getInstance()->buildFloater(this, "floater_media_filter.xml"); } @@ -206,38 +206,6 @@ void SLFloaterMediaFilter::setDirty() } } -BOOL SLFloaterMediaFilter::instanceVisible() -{ - if (sInstance) - { - return sInstance->getVisible(); - } - else - { - return FALSE; - } -} - -void SLFloaterMediaFilter::toggleInstance() -{ - if (sInstance) - { - if (sInstance->getVisible()) - { - sInstance->destroy(); - } - else - { - sInstance->open(); - } - } - else - { - sInstance = new SLFloaterMediaFilter(); - sInstance->open(); - } -} - void SLFloaterMediaFilter::onClearLists(void* data) { LLViewerParcelMedia::clearDomainFilterList(); diff --git a/indra/newview/slfloatermediafilter.h b/indra/newview/slfloatermediafilter.h index aafa5a2b5..dbf974602 100644 --- a/indra/newview/slfloatermediafilter.h +++ b/indra/newview/slfloatermediafilter.h @@ -39,17 +39,16 @@ class LLScrollListCtrl; class LLButton; -class SLFloaterMediaFilter : public LLFloater +class SLFloaterMediaFilter : public LLFloater, public LLFloaterSingleton { + friend class LLUISingleton >; public: - SLFloaterMediaFilter(); + SLFloaterMediaFilter(const LLSD& key = LLSD()); BOOL postBuild(); virtual void draw(); virtual ~SLFloaterMediaFilter(); static void setDirty(); - static BOOL instanceVisible(); - static void toggleInstance(); static void onClearLists(void*); static void onShowIPs(void*);