diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 3c042afba7d7a44220636a75ca343376ed29586e..70c2bc52d6246faa999486c99676094740d51ec1 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -109,6 +109,7 @@ include_directories(SYSTEM set(viewer_SOURCE_FILES alchatcommand.cpp + alfloaterregiontracker.cpp alpanelquicksettings.cpp alpanelquicksettingspulldown.cpp groupchatlistener.cpp @@ -717,6 +718,7 @@ set(viewer_HEADER_FILES CMakeLists.txt ViewerInstall.cmake alchatcommand.h + alfloaterregiontracker.h alpanelquicksettings.h alpanelquicksettingspulldown.h alscriptdefinitions.h diff --git a/indra/newview/alfloaterregiontracker.cpp b/indra/newview/alfloaterregiontracker.cpp new file mode 100644 index 0000000000000000000000000000000000000000..210d2d6ab3c12afa20dc6c611ae8a8e3cd22553c --- /dev/null +++ b/indra/newview/alfloaterregiontracker.cpp @@ -0,0 +1,275 @@ +/** +* @file alfloaterregiontracker.cpp +* @brief Region tracking floater +* +* $LicenseInfo:firstyear=2013&license=viewerlgpl$ +* Alchemy Viewer Source Code +* Copyright (C) 2014, Alchemy Viewer Project. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" + +#include "alfloaterregiontracker.h" + +// library +#include "llbutton.h" +#include "lldir.h" +#include "llfile.h" +#include "llscrolllistctrl.h" +#include "llsd.h" +#include "llsdserialize.h" +#include "llsdserialize_xml.h" +#include "lltextbox.h" + +// newview +#include "llagent.h" +#include "llfloaterworldmap.h" +#include "llfloaterreg.h" +#include "llnotificationsutil.h" +#include "llviewermessage.h" +#include "llworldmap.h" +#include "llworldmapmessage.h" + +#define TRACKER_FILE "tracked_regions.json" + +ALFloaterRegionTracker::ALFloaterRegionTracker(const LLSD& key) + : LLFloater(key), + LLEventTimer(5.f), + mRefreshRegionListBtn(NULL), + mRemoveRegionBtn(NULL), + mOpenMapBtn(NULL), + mRegionScrollList(NULL) +{ + loadFromJSON(); +} + +ALFloaterRegionTracker::~ALFloaterRegionTracker() +{ + saveToJSON(); +} + +BOOL ALFloaterRegionTracker::postBuild() +{ + mRefreshRegionListBtn = getChild<LLButton>("refresh"); + mRefreshRegionListBtn->setClickedCallback(boost::bind(&ALFloaterRegionTracker::refresh, this)); + + mRemoveRegionBtn = getChild<LLButton>("remove"); + mRemoveRegionBtn->setClickedCallback(boost::bind(&ALFloaterRegionTracker::removeRegions, this)); + + mOpenMapBtn = getChild<LLButton>("open_map"); + mOpenMapBtn->setClickedCallback(boost::bind(&ALFloaterRegionTracker::openMap, this)); + + mRegionScrollList = getChild<LLScrollListCtrl>("region_list"); + mRegionScrollList->setCommitOnSelectionChange(TRUE); + mRegionScrollList->setCommitCallback(boost::bind(&ALFloaterRegionTracker::updateHeader, this)); + mRegionScrollList->setDoubleClickCallback(boost::bind(&ALFloaterRegionTracker::openMap, this)); + + updateHeader(); + + return LLFloater::postBuild(); +} + +void ALFloaterRegionTracker::onOpen(const LLSD& key) +{ + requestRegionData(); +} + +void ALFloaterRegionTracker::updateHeader() +{ + S32 num_selected(mRegionScrollList->getNumSelected()); + mRefreshRegionListBtn->setEnabled(mRegionMap.size() != 0); + mRemoveRegionBtn->setEnabled(!!num_selected); + mOpenMapBtn->setEnabled(num_selected == 1); +} + +void ALFloaterRegionTracker::refresh() +{ + if (!mRegionMap.size()) + { + updateHeader(); + return; + } + + const std::string& saved_selected_value = mRegionScrollList->getSelectedValue().asString(); + mRegionScrollList->deleteAllItems(); + + const std::string& cur_region_name = gAgent.getRegion()->getName(); + + for (LLSD::map_const_iterator it = mRegionMap.beginMap(); it != mRegionMap.endMap(); it++) + { + const std::string& sim_name = it->first; + const LLSD& data = it->second; + if (data.isMap()) // Assume the rest is correct. + { + LLScrollListCell::Params label; + LLScrollListCell::Params maturity; + LLScrollListCell::Params region; + LLScrollListCell::Params count; + label.column("region_label").type("text").value(data["label"].asString()); + maturity.column("region_maturity_icon").type("icon").font_halign(LLFontGL::HCENTER); + region.column("region_name").type("text").value(sim_name); + count.column("region_agent_count").type("text").value("..."); + if (LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromName(sim_name)) + { + maturity.value(info->getAccessIcon()); + + info->updateAgentCount(LLTimer::getElapsedSeconds()); + S32 agent_count = info->getAgentCount(); + if (info->isDown()) + { + label.color(LLColor4::red); + maturity.color(LLColor4::red); + region.color(LLColor4::red); + count.color(LLColor4::red); + count.value(0); + } + else + count.value((sim_name == cur_region_name) ? agent_count + 1 : agent_count); + } + else + { + label.color(LLColor4::grey); + maturity.color(LLColor4::grey); + region.color(LLColor4::grey); + count.color(LLColor4::grey); + + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(sim_name); + if (!mEventTimer.getStarted()) mEventTimer.start(); + } + LLScrollListItem::Params row; + row.value = sim_name; + row.columns.add(label); + row.columns.add(maturity); + row.columns.add(region); + row.columns.add(count); + mRegionScrollList->addRow(row); + } + } + if (!saved_selected_value.empty()) + mRegionScrollList->selectByValue(saved_selected_value); +} + +BOOL ALFloaterRegionTracker::tick() +{ + mEventTimer.stop(); + refresh(); + return FALSE; +} + +void ALFloaterRegionTracker::requestRegionData() +{ + if (!mRegionMap.size()) + return; + + for (LLSD::map_const_iterator it = mRegionMap.beginMap(); it != mRegionMap.endMap(); it++) + { + const auto& name = it->first; + if (LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromName(name)) + { + info->updateAgentCount(LLTimer::getElapsedSeconds()); + } + else + { + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(name); + } + } + mEventTimer.start(); +} + +void ALFloaterRegionTracker::removeRegions() +{ + for (auto* item : mRegionScrollList->getAllSelected()) + { + mRegionMap.erase(item->getValue().asString()); + } + mRegionScrollList->deleteSelectedItems(); + saveToJSON(); + updateHeader(); +} + +bool ALFloaterRegionTracker::saveToJSON() +{ + const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, TRACKER_FILE); + llofstream out_file; + out_file.open(filename); + if (out_file.is_open()) + { + LLSDSerialize::toPrettyNotation(mRegionMap, out_file); + out_file.close(); + return true; + } + return false; +} + +bool ALFloaterRegionTracker::loadFromJSON() +{ + const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, TRACKER_FILE); + llifstream in_file; + in_file.open(filename); + if (in_file.is_open()) + { + LLSDSerialize::fromNotation(mRegionMap, in_file, LLSDSerialize::SIZE_UNLIMITED); + in_file.close(); + return true; + } + return false; +} + +std::string ALFloaterRegionTracker::getRegionLabelIfExists(const std::string& name) +{ + return mRegionMap.get(name)["label"].asString(); +} + +void ALFloaterRegionTracker::onRegionAddedCallback(const LLSD& notification, const LLSD& response) +{ + const S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option == 0) + { + const std::string& name = notification["payload"]["name"].asString(); + std::string label = response["label"].asString(); + LLStringUtil::trim(label); + if (!name.empty() && !label.empty()) + { + if (mRegionMap.has(name)) + { + for (LLSD::map_iterator it = mRegionMap.beginMap(); it != mRegionMap.endMap(); it++) + if (it->first == name) it->second["label"] = label; + } + else + { + LLSD region; + region["label"] = label; + mRegionMap.insert(name, region); + } + saveToJSON(); + refresh(); + } + } +} + +void ALFloaterRegionTracker::openMap() +{ + const std::string& region = mRegionScrollList->getFirstSelected()->getValue().asString(); + LLFloaterWorldMap* worldmap_floaterp = LLFloaterWorldMap::getInstance(); + if (!region.empty() && worldmap_floaterp) + { + worldmap_floaterp->trackURL(region, 128, 128, 0); + LLFloaterReg::showInstance("world_map", "center"); + } +} diff --git a/indra/newview/alfloaterregiontracker.h b/indra/newview/alfloaterregiontracker.h new file mode 100644 index 0000000000000000000000000000000000000000..4292dbb0bfe0a3cee07b9a711c77a17902b309d6 --- /dev/null +++ b/indra/newview/alfloaterregiontracker.h @@ -0,0 +1,65 @@ +/** +* @file alfloaterregiontracker.h +* @brief Region tracking floater +* +* $LicenseInfo:firstyear=2013&license=viewerlgpl$ +* Alchemy Viewer Source Code +* Copyright (C) 2014, Alchemy Viewer Project. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* $/LicenseInfo$ +*/ + +#pragma once + +#include "lleventtimer.h" +#include "llfloater.h" + +class LLButton; +class LLSD; +class LLScrollListCtrl; + +class ALFloaterRegionTracker : public LLFloater, public LLEventTimer +{ + friend class LLFloaterReg; +private: + ALFloaterRegionTracker(const LLSD& key); + virtual ~ALFloaterRegionTracker(); +public: + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void refresh(); + /*virtual*/ BOOL tick(); + +private: + void updateHeader(); + void requestRegionData(); + void removeRegions(); + bool saveToJSON(); + bool loadFromJSON(); + void openMap(); + +public: + std::string getRegionLabelIfExists(const std::string& name); + void onRegionAddedCallback(const LLSD& notification, const LLSD& response); + +private: + LLSD mRegionMap; + LLButton* mRefreshRegionListBtn; + LLButton* mRemoveRegionBtn; + LLButton* mOpenMapBtn; + LLScrollListCtrl* mRegionScrollList; +}; \ No newline at end of file diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index d1014aa24499fb5dca7655e9f58fad634a679cea..0d7a37bbb68ceddc835660c9e2f8c48818d91ca5 100755 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -10,6 +10,16 @@ is_running_function="Floater.IsOpen" is_running_parameters="about_land" /> + <command name="regiontracker" + available_in_toybox="true" + icon="Command_RegionTracker_Icon" + label_ref="Command_RegionTracker_Label" + tooltip_ref="Command_RegionTracker_Tooltip" + execute_function="Floater.ToggleOrBringToFront" + execute_parameters="region_tracker" + is_running_function="Floater.IsOpen" + is_running_parameters="region_tracker" + /> <command name="appearance" available_in_toybox="true" icon="Command_Appearance_Icon" diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 4505d90368bda0db34a5ebbd63a20b9295a79e09..f7964178e1baab5d033ba0ff06cb7c6b2c4cffcd 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -34,6 +34,7 @@ #include "llfloaterworldmap.h" +#include "alfloaterregiontracker.h" #include "llagent.h" #include "llagentcamera.h" #include "llbutton.h" @@ -266,7 +267,8 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key) mCommitCallbackRegistrar.add("WMap.ShowAgent", boost::bind(&LLFloaterWorldMap::onShowAgentBtn, this)); mCommitCallbackRegistrar.add("WMap.Clear", boost::bind(&LLFloaterWorldMap::onClearBtn, this)); mCommitCallbackRegistrar.add("WMap.CopySLURL", boost::bind(&LLFloaterWorldMap::onCopySLURL, this)); - + mCommitCallbackRegistrar.add("WMap.TrackRegion", boost::bind(&LLFloaterWorldMap::onTrackRegion, this)); + gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLFloaterWorldMap::onChangeMaturity, this)); } @@ -492,6 +494,7 @@ void LLFloaterWorldMap::draw() // getChildView("Clear")->setEnabled((BOOL)tracking_status); getChildView("Show Destination")->setEnabled((BOOL)tracking_status || LLWorldMap::getInstance()->isTracking()); getChildView("copy_slurl")->setEnabled((mSLURL.isValid()) ); + getChild<LLButton>("track_region")->setEnabled((BOOL) tracking_status || LLWorldMap::getInstance()->isTracking()); setMouseOpaque(TRUE); getDragHandle()->setMouseOpaque(TRUE); @@ -1303,6 +1306,28 @@ void LLFloaterWorldMap::onCopySLURL() LLNotificationsUtil::add("CopySLURL", args); } +void LLFloaterWorldMap::onTrackRegion() +{ + ALFloaterRegionTracker* floaterp = LLFloaterReg::getTypedInstance<ALFloaterRegionTracker>("region_tracker"); + if (floaterp) + { + if (LLTracker::getTrackingStatus() != LLTracker::TRACKING_NOTHING) + { + std::string sim_name; + LLWorldMap::getInstance()->simNameFromPosGlobal(LLTracker::getTrackedPositionGlobal(), sim_name); + if (!sim_name.empty()) + { + const std::string& temp_label = floaterp->getRegionLabelIfExists(sim_name); + LLSD args, payload; + args["REGION"] = sim_name; + args["LABEL"] = !temp_label.empty() ? temp_label : sim_name; + payload["name"] = sim_name; + LLNotificationsUtil::add("RegionTrackerAdd", args, payload, boost::bind(&ALFloaterRegionTracker::onRegionAddedCallback, floaterp, _1, _2)); + } + } + } +} + // protected void LLFloaterWorldMap::centerOnTarget(BOOL animate) { diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 84ca5a7a71e2d1a36b41679ad9cd10e3eb5e6a54..31b4ba416179b84a5f05c919758e49dcee328dd8 100755 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -128,6 +128,7 @@ protected: void onShowTargetBtn(); void onShowAgentBtn(); void onCopySLURL(); + void onTrackRegion(); void centerOnTarget(BOOL animate); void updateLocation(); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 10d51259565bce652d358309cc566b09aeb60ca2..58a4eab86548a4e6bf6b8390d33f4a4f6785ab74 100755 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -30,6 +30,7 @@ #include "llfloaterreg.h" #include "llviewerfloaterreg.h" +#include "alfloaterregiontracker.h" #include "llcommandhandler.h" #include "llcompilequeue.h" #include "llfasttimerview.h" @@ -308,6 +309,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("region_debug_console", "floater_region_debug_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionDebugConsole>); LLFloaterReg::add("region_info", "floater_region_info.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionInfo>); LLFloaterReg::add("region_restarting", "floater_region_restarting.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionRestarting>); + LLFloaterReg::add("region_tracker", "floater_region_tracker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<ALFloaterRegionTracker>); LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>); LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>); diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index bfae142812f7e97fd690d500648903aea3961032..5291541ae747a8d66ab7aa5b86ec29e22273adbd 100755 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -37,7 +37,7 @@ #include "llgltexture.h" // Timers to temporise database requests -const F32 AGENTS_UPDATE_TIMER = 60.0; // Seconds between 2 agent requests for a region +const F32 AGENTS_UPDATE_TIMER = 30.f; // Seconds between 2 agent requests for a region const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // Seconds before we consider re-requesting item data for the grid //--------------------------------------------------------------------------- diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index af873be770bbda9c1e0f2bb91fde2e651958a5a0..abfcf3aea7e711f352d9c8f8e9176c504d6d82bb 100755 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -123,7 +123,8 @@ public: std::string getName() const { return mName; } const std::string getFlagsString() const { return LLViewerRegion::regionFlagsToString(mRegionFlags); } const std::string getAccessString() const { return LLViewerRegion::accessToString((U8)mAccess); } - const std::string getShortAccessString() const { return LLViewerRegion::accessToShortString((U8)mAccess); } // <alchemy/> + const std::string getShortAccessString() const { return LLViewerRegion::accessToShortString(static_cast<U8>(mAccess)); } // <alchemy/> + const std::string getAccessIcon() const { return LLViewerRegion::getAccessIcon(static_cast<U8>(mAccess)); } const S32 getAgentCount() const; // Compute the total agents count LLPointer<LLViewerFetchedTexture> getLandForSaleImage(); // Get the overlay image, fetch it if necessary diff --git a/indra/newview/skins/default/xui/en/floater_region_tracker.xml b/indra/newview/skins/default/xui/en/floater_region_tracker.xml new file mode 100644 index 0000000000000000000000000000000000000000..bfe8543b04c4f3b7c7c7da349586d593be1206b6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_region_tracker.xml @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + name="region_tracker" + title="REGION TRACKER" + help_topic="floater_region_tracker" + single_instance="true" + reuse_instance="true" + layout="topleft" + height="250" + width="408" + min_height="150" + min_width="30" + can_resize="true"> + <text + follows="left|top" + height="31" + left="5" + top="0" + right="-8" + layout="topleft" + valign="center" + font="SansSerifBig" + name="region_label_text" + value="Add regions from the World Map" /> + <button + right="-76" + top_pad="-29" + halign="center" + height="31" + layout="topleft" + follows="top|right" + width="31" + mouse_opaque="true" + name="refresh" + image_overlay="Refresh_Off" /> + <button + left_pad="5" + halign="center" + height="31" + layout="topleft" + follows="top|right" + width="31" + mouse_opaque="true" + name="remove" + image_overlay="TrashItem_Off" /> + <button + left_pad="5" + halign="center" + height="31" + layout="topleft" + follows="top|right" + width="31" + mouse_opaque="true" + name="open_map" + image_overlay="Command_Map_Icon" /> + <scroll_list + name="region_list" + tool_tip="Double click an entry to open it on the world map." + height="210" + width="400" + layout="topleft" + follows="all" + top_pad="5" + left="5" + multi_select="true" + draw_heading="true" + column_padding="0" + search_column="0"> + <scroll_list.columns + name="region_label" + label="Label" + dynamicwidth="true" + width="100" /> + <scroll_list.columns + name="region_maturity_icon" + dynamicwidth="true" + width="26" /> + <scroll_list.columns + name="region_name" + label="Region" + dynamicwidth="true" + width="130" /> + <scroll_list.columns + name="region_agent_count" + label="Count" + dynamicwidth="true" + width="30" /> + </scroll_list> + </floater> diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 26c7278f4869ee1ee1ddddfca15fafbbad93ceab..6b869a5308c63f94d2a91192c0f6f197e8bab046 100755 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -630,10 +630,23 @@ top_pad="5" name="Show Destination" tool_tip="Center map on selected location" - width="213"> + width="104"> <button.commit_callback function="WMap.ShowTarget" /> </button> + <button + enabled="false" + follows="right|bottom" + height="23" + label="Track Region" + left_pad="5" + name="track_region" + tool_tip="Add the region to the region tracker" + top_delta="0" + width="104"> + <button.commit_callback + function="WMap.TrackRegion" /> + </button> </panel> <panel follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 879b5cb911ff2989be1591eb826bbb8b0265efdd..a5b2f9ecc5cbe7f2b2c2c571e8d004c29f47facd 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -10354,4 +10354,25 @@ Cannot create large prims that intersect other players. Please re-try when othe type="notifytip"> Dice Roll: [RESULT] </notification> + + <notification + icon="alert.tga" + name="RegionTrackerAdd" + type="alert"> +What label would you like to use for +the region "[REGION]"? + <tag>confirm</tag> + <form name="form"> + <input name="label" type="text">[LABEL]</input> + <button + default="true" + index="0" + name="OK" + text="OK"/> + <button + index="1" + name="Cancel" + text="Cancel"/> + </form> + </notification> </notifications> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index b619fba98b8368adf4724a097c91068e11c5bdec..55447a8cfe00328ff0be63e72cd56fb91f87058e 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -4061,6 +4061,7 @@ Try enclosing path to the editor with double quotes. <string name="Command_Preferences_Label">Preferences</string> <string name="Command_Profile_Label">Profile</string> <string name="Command_Quick_Settings_Label">Quick Settings</string> + <string name="Command_RegionTracker_Label">Region Tracker</string> <string name="Command_Scripts_Label">Scripts</string> <string name="Command_Stats_Label">Statistics</string> <string name="Command_Search_Label">Search</string> @@ -4097,7 +4098,8 @@ Try enclosing path to the editor with double quotes. <string name="Command_Places_Tooltip">Places you've saved</string> <string name="Command_Preferences_Tooltip">Preferences</string> <string name="Command_Profile_Tooltip">Edit or view your profile</string> - <string name="Command_Quick_Settings_Tooltip">Quick Settings</string> + <string name="Command_Quick_Settings_Tooltip">Quick preferences</string> + <string name="Command_RegionTracker_Tooltip">Track various regions status</string> <string name="Command_Scripts_Tooltip">Scripts attached to your avatar</string> <string name="Command_Stats_Tooltip">Statistics like FPS, network usage and sim performance</string> <string name="Command_Search_Tooltip">Find places, events, people</string>