summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llenvironment.cpp6
-rw-r--r--indra/newview/llenvironment.h4
-rw-r--r--indra/newview/llfloatereditextdaycycle.cpp1
-rw-r--r--indra/newview/llfloatermyenvironment.cpp678
-rw-r--r--indra/newview/llfloatermyenvironment.h16
-rw-r--r--indra/newview/llinventorybridge.cpp2
-rw-r--r--indra/newview/llinventorypanel.cpp5
-rw-r--r--indra/newview/llinventorypanel.h4
-rw-r--r--indra/newview/llpaneleditsky.cpp35
-rw-r--r--indra/newview/llpaneleditsky.h3
-rw-r--r--indra/newview/llpaneleditwater.cpp18
-rw-r--r--indra/newview/llpaneleditwater.h1
-rw-r--r--indra/newview/llpanelmaininventory.cpp9
-rw-r--r--indra/newview/llpanelmaininventory.h1
-rw-r--r--indra/newview/llsettingsvo.cpp9
-rw-r--r--indra/newview/llviewerparcelmgr.cpp21
-rw-r--r--indra/newview/llviewerparcelmgr.h1
-rw-r--r--indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.pngbin475 -> 429 bytes
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_environments.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml554
-rw-r--r--indra/newview/skins/default/xui/en/menu_settings_add.xml37
-rw-r--r--indra/newview/skins/default/xui/en/menu_settings_gear.xml103
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml10
24 files changed, 715 insertions, 829 deletions
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index ee5eec59a3..289d0c5388 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -366,9 +366,9 @@ bool LLEnvironment::canAgentUpdateParcelEnvironment(bool useselected) const
{
if (!LLEnvironment::instance().isExtendedEnvironmentEnabled())
return false;
- // *TODO*
- //LLParcel* parcel = (useselected) ? LLViewerParcelMgr::instance().getParcelSelection() : LLViewerParcelMgr::instance().getAgentParcel();
- LLParcel* parcel = LLViewerParcelMgr::instance().getAgentParcel();
+
+ LLParcel *parcel(LLViewerParcelMgr::instance().getAgentOrSelectedParcel());
+
if (parcel)
{
return parcel->allowTerraformBy(gAgent.getID());
diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h
index d9a1494424..6f8d4b5203 100644
--- a/indra/newview/llenvironment.h
+++ b/indra/newview/llenvironment.h
@@ -149,14 +149,14 @@ public:
bool canEdit() const;
bool isExtendedEnvironmentEnabled() const;
bool isInventoryEnabled() const;
- bool canAgentUpdateParcelEnvironment(bool useselected = false) const;
+ bool canAgentUpdateParcelEnvironment(bool useselected = true) const;
bool canAgentUpdateRegionEnvironment() const;
LLSettingsDay::ptr_t getCurrentDay() const { return mCurrentEnvironment->getDayCycle(); }
LLSettingsSky::ptr_t getCurrentSky() const { return mCurrentEnvironment->getSky(); }
LLSettingsWater::ptr_t getCurrentWater() const { return mCurrentEnvironment->getWater(); }
- static void getAtmosphericModelSettings(AtmosphericModelSettings& settingsOut, const LLSettingsSky::ptr_t &psky);
+ static void getAtmosphericModelSettings(AtmosphericModelSettings& settingsOut, const LLSettingsSky::ptr_t &psky);
void update(const LLViewerCamera * cam);
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index ba524c4dc5..295788a03a 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -964,7 +964,6 @@ void LLFloaterEditExtDayCycle::setTabsData(LLTabContainer * tabcontainer, const
{
panel->setSettings(settings);
panel->setEnabled(editable);
- panel->refresh();
panel->setAllChildrenEnabled(editable);
}
}
diff --git a/indra/newview/llfloatermyenvironment.cpp b/indra/newview/llfloatermyenvironment.cpp
index 83cd726eb8..a42a356c49 100644
--- a/indra/newview/llfloatermyenvironment.cpp
+++ b/indra/newview/llfloatermyenvironment.cpp
@@ -47,6 +47,9 @@
#include "llviewerinventory.h"
#include "llviewercontrol.h"
#include "llfloaterperms.h"
+#include "llenvironment.h"
+#include "llparcel.h"
+#include "llviewerparcelmgr.h"
//=========================================================================
namespace
@@ -59,8 +62,24 @@ namespace
const std::string BUTTON_NEWSETTINGS("btn_gear");
const std::string BUTTON_GEAR("btn_newsettings");
const std::string BUTTON_DELETE("btn_del");
- const std::string BUTTON_EDIT("btn_edit");
+
+ const std::string ACTION_DOCREATE("MyEnvironments.DoCreate");
+ const std::string ACTION_DOEDIT("MyEnvironments.DoEdit");
+ const std::string ACTION_DOAPPLY("MyEnvironments.DoApply");
+ const std::string ACTION_COPYPASTE("MyEnvironments.CopyPaste");
+ const std::string ENABLE_ACTION("MyEnvironments.EnableAction");
+ const std::string ENABLE_CANAPPLY("MyEnvironments.CanApply");
+ const std::string ENABLE_ENVIRONMENT("MyEnvironments.EnvironmentEnabled");
+
+ const std::string PARAMETER_REGION("region");
+ const std::string PARAMETER_PARCEL("parcel");
+ const std::string PARAMETER_LOCAL("local");
+
+ const std::string PARAMETER_EDIT("edit");
+ const std::string PARAMETER_COPY("copy");
+ const std::string PARAMETER_PASTE("paste");
+ const std::string PARAMETER_COPYUUID("copy_uuid");
}
//=========================================================================
@@ -137,18 +156,15 @@ LLFloaterMyEnvironment::LLFloaterMyEnvironment(const LLSD& key) :
mTypeFilter((0x01 << static_cast<U64>(LLSettingsType::ST_DAYCYCLE)) | (0x01 << static_cast<U64>(LLSettingsType::ST_SKY)) | (0x01 << static_cast<U64>(LLSettingsType::ST_WATER))),
mSelectedAsset()
{
-
-#if 0
- mObserver = new LLFloaterGestureObserver(this);
- LLGestureMgr::instance().addObserver(mObserver);
+ mCommitCallbackRegistrar.add(ACTION_DOCREATE, [this](LLUICtrl *, const LLSD &userdata) { onDoCreate(userdata); });
+ mCommitCallbackRegistrar.add(ACTION_DOEDIT, [this](LLUICtrl *, const LLSD &userdata) {});
+ mCommitCallbackRegistrar.add(ACTION_DOAPPLY, [this](LLUICtrl *, const LLSD &userdata) { onDoApply(userdata.asString()); });
+ mCommitCallbackRegistrar.add(ACTION_COPYPASTE, [this](LLUICtrl *, const LLSD &userdata) {});
- mCommitCallbackRegistrar.add("Gesture.Action.ToogleActiveState", boost::bind(&LLFloaterGesture::onActivateBtnClick, this));
- mCommitCallbackRegistrar.add("Gesture.Action.ShowPreview", boost::bind(&LLFloaterGesture::onClickEdit, this));
- mCommitCallbackRegistrar.add("Gesture.Action.CopyPaste", boost::bind(&LLFloaterGesture::onCopyPasteAction, this, _2));
- mCommitCallbackRegistrar.add("Gesture.Action.SaveToCOF", boost::bind(&LLFloaterGesture::addToCurrentOutFit, this));
+ mEnableCallbackRegistrar.add(ENABLE_ACTION, [this](LLUICtrl *, const LLSD &userdata) { return canAction(userdata.asString()); });
+ mEnableCallbackRegistrar.add(ENABLE_CANAPPLY, [this](LLUICtrl *, const LLSD &userdata) { return canApply(userdata.asString()); });
+ mEnableCallbackRegistrar.add(ENABLE_ENVIRONMENT, [](LLUICtrl *, const LLSD &) { return LLEnvironment::instance().isInventoryEnabled(); });
- mEnableCallbackRegistrar.add("Gesture.EnableAction", boost::bind(&LLFloaterGesture::isActionEnabled, this, _2));
-#endif
}
LLFloaterMyEnvironment::~LLFloaterMyEnvironment()
@@ -171,7 +187,7 @@ BOOL LLFloaterMyEnvironment::postBuild()
mInventoryList->setFilterTypes(filter_types);
-// mInventoryList->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));
+ mInventoryList->setSelectCallback([this](const std::deque<LLFolderViewItem*>&, BOOL) { onSelectionChange(); });
mInventoryList->setShowFolderState(mShowFolders);
mInventoryList->setFilterSettingsTypes(mTypeFilter);
}
@@ -181,11 +197,7 @@ BOOL LLFloaterMyEnvironment::postBuild()
childSetCommitCallback(CHECK_WATER, [this](LLUICtrl*, void*) { onFilterCheckChange(); }, nullptr);
childSetCommitCallback(CHECK_SHOWFOLDERS, [this](LLUICtrl*, void*) { onShowFoldersChange(); }, nullptr);
- /*TODO: Enable these*/
- getChild<LLUICtrl>(BUTTON_NEWSETTINGS)->setEnabled(false);
- getChild<LLUICtrl>(BUTTON_GEAR)->setEnabled(false);
- getChild<LLUICtrl>(BUTTON_DELETE)->setEnabled(false);
- getChild<LLUICtrl>(BUTTON_EDIT)->setEnabled(false);
+ childSetCommitCallback(BUTTON_DELETE, [this](LLUICtrl *, void*) { onDeleteSelected(); }, nullptr);
return TRUE;
}
@@ -198,11 +210,8 @@ void LLFloaterMyEnvironment::refresh()
getChild<LLCheckBoxCtrl>(CHECK_SKIES)->setValue(LLSD::Boolean(mTypeFilter & (0x01 << static_cast<U64>(LLSettingsType::ST_SKY))));
getChild<LLCheckBoxCtrl>(CHECK_WATER)->setValue(LLSD::Boolean(mTypeFilter & (0x01 << static_cast<U64>(LLSettingsType::ST_WATER))));
-// if (mInventoryList)
-// {
-// LLUUID obj_id = findItemByAssetId(mSelectedAsset, false, false);
-// mInventoryList->setSelection(obj_id, false);
-// }
+ refreshButtonStates();
+
}
void LLFloaterMyEnvironment::onOpen(const LLSD& key)
@@ -212,6 +221,13 @@ void LLFloaterMyEnvironment::onOpen(const LLSD& key)
if (key.has("asset_id") && mInventoryList)
{
mSelectedAsset = key["asset_id"].asUUID();
+
+ if (!mSelectedAsset.isNull())
+ {
+ LLUUID obj_id = findItemByAssetId(mSelectedAsset, false, false);
+ if (!obj_id.isNull())
+ mInventoryList->setSelection(obj_id, false);
+ }
}
else
{
@@ -247,6 +263,146 @@ void LLFloaterMyEnvironment::onFilterCheckChange()
mInventoryList->setFilterSettingsTypes(mTypeFilter);
}
+void LLFloaterMyEnvironment::onSelectionChange()
+{
+ refreshButtonStates();
+}
+
+void LLFloaterMyEnvironment::onDeleteSelected()
+{
+ uuid_vec_t selected;
+
+ getSelectedIds(selected);
+ if (selected.empty())
+ return;
+
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ for (const LLUUID& itemid: selected)
+ {
+ LLInventoryItem* inv_item = gInventory.getItem(itemid);
+
+ if (inv_item && inv_item->getInventoryType() == LLInventoryType::IT_SETTINGS)
+ {
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate old_folder(inv_item->getParentUUID(), -1);
+ update.push_back(old_folder);
+ LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1);
+ update.push_back(new_folder);
+ gInventory.accountForUpdate(update);
+
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item);
+ new_item->setParent(trash_id);
+ new_item->updateParentOnServer(FALSE);
+ gInventory.updateItem(new_item);
+ }
+ }
+ gInventory.notifyObservers();
+}
+
+
+void LLFloaterMyEnvironment::onDoCreate(const LLSD &data)
+{
+ menu_create_inventory_item(mInventoryList, NULL, data);
+}
+
+void LLFloaterMyEnvironment::onDoApply(const std::string &context)
+{
+ uuid_vec_t selected;
+ getSelectedIds(selected);
+
+ if (selected.size() != 1) // Exactly one item selected.
+ return;
+
+ LLUUID item_id(selected.front());
+
+ LLInventoryItem* itemp = gInventory.getItem(item_id);
+
+ if (itemp && itemp->getInventoryType() == LLInventoryType::IT_SETTINGS)
+ {
+ LLUUID asset_id = itemp->getAssetUUID();
+
+ if (context == PARAMETER_REGION)
+ {
+ LLEnvironment::instance().updateRegion(asset_id, -1, -1);
+ }
+ else if (context == PARAMETER_PARCEL)
+ {
+ LLParcel *parcel(LLViewerParcelMgr::instance().getAgentOrSelectedParcel());
+ if (!parcel)
+ {
+ LL_WARNS("ENVIRONMENT") << "Unable to determine parcel." << LL_ENDL;
+ return;
+ }
+ LLEnvironment::instance().updateParcel(parcel->getLocalID(), asset_id, -1, -1);
+ }
+ else if (context == PARAMETER_LOCAL)
+ {
+ LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, asset_id);
+ LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
+ }
+ }
+}
+
+
+bool LLFloaterMyEnvironment::canAction(const std::string &context)
+{
+// uuid_vec_t selected;
+// getSelectedIds(selected);
+//
+// if (selected.empty())
+// return false;
+//
+// if (context == PARAMETER_EDIT)
+// {
+// }
+// else if (context == PARAMETER_COPY)
+// {
+// }
+// else if (context == PARAMETER_PASTE)
+// {
+// }
+// else if (context == PARAMETER_COPYUUID)
+// {
+// }
+
+ return false;
+}
+
+bool LLFloaterMyEnvironment::canApply(const std::string &context)
+{
+ uuid_vec_t selected;
+ getSelectedIds(selected);
+
+ if (selected.size() != 1) // Exactly one item selected.
+ return false;
+
+ if (context == PARAMETER_REGION)
+ {
+ return LLEnvironment::instance().canAgentUpdateRegionEnvironment();
+ }
+ else if (context == PARAMETER_PARCEL)
+ {
+ return LLEnvironment::instance().canAgentUpdateParcelEnvironment();
+ }
+ else
+ {
+ return (context == PARAMETER_LOCAL);
+ }
+}
+
+//-------------------------------------------------------------------------
+void LLFloaterMyEnvironment::refreshButtonStates()
+{
+ bool settings_ok = LLEnvironment::instance().isInventoryEnabled();
+
+ uuid_vec_t selected;
+ getSelectedIds(selected);
+
+ getChild<LLUICtrl>(BUTTON_GEAR)->setEnabled(settings_ok);
+ getChild<LLUICtrl>(BUTTON_NEWSETTINGS)->setEnabled(true);
+ getChild<LLUICtrl>(BUTTON_DELETE)->setEnabled(settings_ok && !selected.empty());
+}
+
//-------------------------------------------------------------------------
LLUUID LLFloaterMyEnvironment::findItemByAssetId(LLUUID asset_id, bool copyable_only, bool ignore_library)
{
@@ -293,477 +449,13 @@ LLUUID LLFloaterMyEnvironment::findItemByAssetId(LLUUID asset_id, bool copyable_
return LLUUID::null;
}
-#if 0
-void LLFloaterGesture::done()
+void LLFloaterMyEnvironment::getSelectedIds(uuid_vec_t& ids) const
{
- //this method can be called twice: for GestureFolder and once after loading all sudir of GestureFolder
- if (gInventory.isCategoryComplete(mGestureFolderID))
- {
- LL_DEBUGS("Gesture")<< "mGestureFolderID loaded" << LL_ENDL;
- // we load only gesture folder without childred.
- LLInventoryModel::cat_array_t* categories;
- LLInventoryModel::item_array_t* items;
- uuid_vec_t unloaded_folders;
- LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL;
- gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items);
- if (categories->empty())
- {
- gInventory.removeObserver(this);
- LL_INFOS("Gesture")<< "Gesture dos NOT contains sub-directories."<< LL_ENDL;
- return;
- }
- LL_DEBUGS("Gesture")<< "There are " << categories->size() << " Folders "<< LL_ENDL;
- for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); it != categories->end(); it++)
- {
- if (!gInventory.isCategoryComplete(it->get()->getUUID()))
- {
- unloaded_folders.push_back(it->get()->getUUID());
- LL_DEBUGS("Gesture")<< it->get()->getName()<< " Folder added to fetchlist"<< LL_ENDL;
- }
-
- }
- if (!unloaded_folders.empty())
- {
- LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL;
- setFetchIDs(unloaded_folders);
- startFetch();
- }
- else
- {
- LL_DEBUGS("Gesture")<< "All Gesture subdirectories have been loaded."<< LL_ENDL;
- gInventory.removeObserver(this);
- buildGestureList();
- }
- }
- else
- {
- LL_WARNS("Gesture")<< "Gesture list was NOT loaded"<< LL_ENDL;
- }
-}
+ LLInventoryPanel::selected_items_t items = mInventoryList->getSelectedItems();
-// virtual
-
-void LLFloaterGesture::refreshAll()
-{
- if (!mGestureList) return;
-
- buildGestureList();
-
- if (mSelectedID.isNull())
- {
- mGestureList->selectFirstItem();
- }
- else
- {
- if (! mGestureList->setCurrentByID(mSelectedID))
- {
- mGestureList->selectFirstItem();
- }
- }
-
- // Update button labels
- onCommitList();
-}
-
-void LLFloaterGesture::buildGestureList()
-{
- S32 scroll_pos = mGestureList->getScrollPos();
- uuid_vec_t selected_items;
- getSelectedIds(selected_items);
- LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL;
- mGestureList->deleteAllItems();
-
- LLGestureMgr::item_map_t::const_iterator it;
- const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
- for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
- {
- addGesture(it->first,it->second, mGestureList);
- }
- if (gInventory.isCategoryComplete(mGestureFolderID))
- {
- LLIsType is_gesture(LLAssetType::AT_GESTURE);
- LLInventoryModel::cat_array_t categories;
- LLInventoryModel::item_array_t items;
- gInventory.collectDescendentsIf(mGestureFolderID, categories, items,
- LLInventoryModel::EXCLUDE_TRASH, is_gesture);
-
- for (LLInventoryModel::item_array_t::iterator it = items.begin(); it!= items.end(); ++it)
- {
- LLInventoryItem* item = it->get();
- if (active_gestures.find(item->getUUID()) == active_gestures.end())
- {
- // if gesture wasn't loaded yet, we can display only name
- addGesture(item->getUUID(), NULL, mGestureList);
- }
- }
- }
-
- // attempt to preserve scroll position through re-builds
- // since we do re-build whenever something gets dirty
- for(uuid_vec_t::iterator it = selected_items.begin(); it != selected_items.end(); it++)
- {
- mGestureList->selectByID(*it);
- }
- mGestureList->setScrollPos(scroll_pos);
-}
-
-void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list )
-{
- // Note: Can have NULL item if inventory hasn't arrived yet.
- static std::string item_name = getString("loading");
- LLInventoryItem* item = gInventory.getItem(item_id);
- if (item)
- {
- item_name = item->getName();
- }
-
- static std::string font_style = "NORMAL";
- // If gesture is playing, bold it
-
- LLSD element;
- element["id"] = item_id;
-
- if (gesture)
- {
- if (gesture->mPlaying)
- {
- font_style = "BOLD";
- }
- item_name = gesture->mName;
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = gesture->mTrigger;
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
-
- std::string key_string;
- std::string buffer;
-
- if (gesture->mKey == KEY_NONE)
- {
- buffer = "---";
- key_string = "~~~"; // alphabetize to end
- }
- else
- {
- key_string = LLKeyboard::stringFromKey(gesture->mKey);
- buffer = LLKeyboard::stringFromAccelerator(gesture->mMask,
- gesture->mKey);
- }
-
- element["columns"][1]["column"] = "shortcut";
- element["columns"][1]["value"] = buffer;
- element["columns"][1]["font"]["name"] = "SANSSERIF";
- element["columns"][1]["font"]["style"] = font_style;
-
- // hidden column for sorting
- element["columns"][2]["column"] = "key";
- element["columns"][2]["value"] = key_string;
- element["columns"][2]["font"]["name"] = "SANSSERIF";
- element["columns"][2]["font"]["style"] = font_style;
-
- // Only add "playing" if we've got the name, less confusing. JC
- if (item && gesture->mPlaying)
- {
- item_name += " " + getString("playing");
- }
- element["columns"][3]["column"] = "name";
- element["columns"][3]["value"] = item_name;
- element["columns"][3]["font"]["name"] = "SANSSERIF";
- element["columns"][3]["font"]["style"] = font_style;
- }
- else
- {
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = "";
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
- element["columns"][1]["column"] = "shortcut";
- element["columns"][1]["value"] = "---";
- element["columns"][1]["font"]["name"] = "SANSSERIF";
- element["columns"][1]["font"]["style"] = font_style;
- element["columns"][2]["column"] = "key";
- element["columns"][2]["value"] = "~~~";
- element["columns"][2]["font"]["name"] = "SANSSERIF";
- element["columns"][2]["font"]["style"] = font_style;
- element["columns"][3]["column"] = "name";
- element["columns"][3]["value"] = item_name;
- element["columns"][3]["font"]["name"] = "SANSSERIF";
- element["columns"][3]["font"]["style"] = font_style;
- }
-
- LL_DEBUGS("Gesture") << "Added gesture [" << item_name << "]" << LL_ENDL;
-
- LLScrollListItem* sl_item = list->addElement(element, ADD_BOTTOM);
- if(sl_item)
- {
- LLFontGL::StyleFlags style = LLGestureMgr::getInstance()->isGestureActive(item_id) ? LLFontGL::BOLD : LLFontGL::NORMAL;
- // *TODO find out why ["font"]["style"] does not affect font style
- ((LLScrollListText*)sl_item->getColumn(0))->setFontStyle(style);
- }
-}
-
-void LLFloaterGesture::getSelectedIds(uuid_vec_t& ids)
-{
- std::vector<LLScrollListItem*> items = mGestureList->getAllSelected();
- for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++)
- {
- ids.push_back((*it)->getUUID());
- }
-}
-
-bool LLFloaterGesture::isActionEnabled(const LLSD& command)
-{
- // paste copy_uuid edit_gesture
- std::string command_name = command.asString();
- if("paste" == command_name)
- {
- if(!LLClipboard::instance().hasContents())
- return false;
-
- std::vector<LLUUID> ids;
- LLClipboard::instance().pasteFromClipboard(ids);
- for(std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
- {
- LLInventoryItem* item = gInventory.getItem(*it);
-
- if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
- {
- return true;
- }
- }
- return false;
- }
- else if("copy_uuid" == command_name || "edit_gesture" == command_name)
- {
- return mGestureList->getAllSelected().size() == 1;
- }
- return true;
-}
-
-void LLFloaterGesture::onClickPlay()
-{
- const LLUUID& item_id = mGestureList->getCurrentID();
- if(item_id.isNull()) return;
-
- LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL;
- if(!LLGestureMgr::instance().isGestureActive(item_id))
- {
- // we need to inform server about gesture activating to be consistent with LLPreviewGesture and LLGestureComboList.
- BOOL inform_server = TRUE;
- BOOL deactivate_similar = FALSE;
- LLGestureMgr::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
- LLViewerInventoryItem *item = gInventory.getItem(item_id);
- llassert(item);
- if (item)
- {
- LLGestureMgr::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar);
- LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
- }
- }
- else
- {
- playGesture(item_id);
- }
-}
-
-void LLFloaterGesture::onClickNew()
-{
- LLPointer<LLInventoryCallback> cb = new GestureShowCallback();
- create_inventory_item(gAgent.getID(),
- gAgent.getSessionID(),
- LLUUID::null,
- LLTransactionID::tnull,
- "New Gesture",
- "",
- LLAssetType::AT_GESTURE,
- LLInventoryType::IT_GESTURE,
- NO_INV_SUBTYPE,
- PERM_MOVE | LLFloaterPerms::getNextOwnerPerms("Gestures"),
- cb);
-}
-
-void LLFloaterGesture::onActivateBtnClick()
-{
- uuid_vec_t ids;
- getSelectedIds(ids);
- if(ids.empty())
- return;
-
- LLGestureMgr* gm = LLGestureMgr::getInstance();
- uuid_vec_t::const_iterator it = ids.begin();
- BOOL first_gesture_state = gm->isGestureActive(*it);
- BOOL is_mixed = FALSE;
- while( ++it != ids.end() )
- {
- if(first_gesture_state != gm->isGestureActive(*it))
- {
- is_mixed = TRUE;
- break;
- }
- }
- for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); it++)
- {
- if(is_mixed)
- {
- gm->activateGesture(*it);
- }
- else
- {
- if(first_gesture_state)
- {
- gm->deactivateGesture(*it);
- }
- else
- {
- gm->activateGesture(*it);
- }
- }
- }
-}
-
-void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
-{
- std::string command_name = command.asString();
- // Since we select this command, the inventory items must have already arrived
- if("copy_gesture" == command_name)
- {
- uuid_vec_t ids;
- getSelectedIds(ids);
- // Make sure the clipboard is empty
- LLClipboard::instance().reset();
- for(uuid_vec_t::iterator it = ids.begin(); it != ids.end(); it++)
- {
- LLInventoryItem* item = gInventory.getItem(*it);
- if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
- {
- LLWString item_name = utf8str_to_wstring(item->getName());
- LLClipboard::instance().addToClipboard(item_name, 0, item_name.size());
- }
- }
- }
- else if ("paste" == command_name)
- {
- std::vector<LLUUID> ids;
- LLClipboard::instance().pasteFromClipboard(ids);
- if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID))
- return;
- LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID);
- llassert(gesture_dir);
- LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this);
-
- for(std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
- {
- LLInventoryItem* item = gInventory.getItem(*it);
- if(gesture_dir && item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
- {
- LLStringUtil::format_map_t string_args;
- string_args["[COPY_NAME]"] = item->getName();
- LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << " "<< item->getUUID() << " into "
- << gesture_dir->getName() << " "<< gesture_dir->getUUID() << LL_ENDL;
- copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(),
- gesture_dir->getUUID(), getString("copy_name", string_args), cb);
- }
- }
- LLClipboard::instance().reset();
- }
- else if ("copy_uuid" == command_name)
- {
- LLClipboard::instance().copyToClipboard(mGestureList->getCurrentID(),LLAssetType::AT_GESTURE);
- }
-}
-
-void LLFloaterGesture::onClickEdit()
-{
- const LLUUID& item_id = mGestureList->getCurrentID();
-
- LLInventoryItem* item = gInventory.getItem(item_id);
- if (!item) return;
-
- LLPreviewGesture* previewp = LLPreviewGesture::show(item_id, LLUUID::null);
- if (!previewp->getHost())
- {
- previewp->setRect(gFloaterView->findNeighboringPosition(this, previewp));
- }
-}
-
-void LLFloaterGesture::onCommitList()
-{
- const LLUUID& item_id = mGestureList->getCurrentID();
-
- mSelectedID = item_id;
- if (LLGestureMgr::instance().isGesturePlaying(item_id))
- {
- getChildView("play_btn")->setVisible( false);
- getChildView("stop_btn")->setVisible( true);
- }
- else
- {
- getChildView("play_btn")->setVisible( true);
- getChildView("stop_btn")->setVisible( false);
- }
-}
-
-void LLFloaterGesture::onDeleteSelected()
-{
- uuid_vec_t ids;
- getSelectedIds(ids);
- if(ids.empty())
- return;
-
- const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- LLGestureMgr* gm = LLGestureMgr::getInstance();
- for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); it++)
- {
- const LLUUID& selected_item = *it;
- LLInventoryItem* inv_item = gInventory.getItem(selected_item);
- if (inv_item && inv_item->getInventoryType() == LLInventoryType::IT_GESTURE)
- {
- if(gm->isGestureActive(selected_item))
- {
- gm->deactivateGesture(selected_item);
- }
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate old_folder(inv_item->getParentUUID(), -1);
- update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1);
- update.push_back(new_folder);
- gInventory.accountForUpdate(update);
-
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item);
- new_item->setParent(trash_id);
- // no need to restamp it though it's a move into trash because
- // it's a brand new item already.
- new_item->updateParentOnServer(FALSE);
- gInventory.updateItem(new_item);
- }
- }
- gInventory.notifyObservers();
- buildGestureList();
-}
-
-void LLFloaterGesture::addToCurrentOutFit()
-{
- uuid_vec_t ids;
- getSelectedIds(ids);
- LLAppearanceMgr* am = LLAppearanceMgr::getInstance();
- LLPointer<LLInventoryCallback> cb = new LLUpdateAppearanceOnDestroy;
- for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); it++)
- {
- am->addCOFItemLink(*it, cb);
- }
-}
-
-void LLFloaterGesture::playGesture(LLUUID item_id)
-{
- LL_DEBUGS("Gesture")<<"Playing gesture "<< item_id<<LL_ENDL;
-
- if (LLGestureMgr::instance().isGesturePlaying(item_id))
- {
- LLGestureMgr::instance().stopGesture(item_id);
- }
- else
- {
- LLGestureMgr::instance().playGesture(item_id);
- }
+ for (auto itemview : items)
+ {
+ LLFolderViewModelItemInventory* itemp = static_cast<LLFolderViewModelItemInventory*>(itemview->getViewModelItem());
+ ids.push_back(itemp->getUUID());
+ }
}
-#endif
diff --git a/indra/newview/llfloatermyenvironment.h b/indra/newview/llfloatermyenvironment.h
index f3ff9f779d..9d9659576d 100644
--- a/indra/newview/llfloatermyenvironment.h
+++ b/indra/newview/llfloatermyenvironment.h
@@ -60,14 +60,22 @@ public:
private:
LLInventoryPanel * mInventoryList;
-
- void onShowFoldersChange();
- void onFilterCheckChange();
-
U64 mTypeFilter;
LLInventoryFilter::EFolderShow mShowFolders;
LLUUID mSelectedAsset;
+ void onShowFoldersChange();
+ void onFilterCheckChange();
+ void onSelectionChange();
+ void onDeleteSelected();
+ void onDoCreate(const LLSD &data);
+ void onDoApply(const std::string &context);
+ bool canAction(const std::string &context);
+ bool canApply(const std::string &context);
+
+ void getSelectedIds(uuid_vec_t& ids) const;
+ void refreshButtonStates();
+
static LLUUID findItemByAssetId(LLUUID asset_id, bool copyable_only, bool ignore_library);
#if 0
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 44a9d0bff4..85e2974c1b 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -6926,7 +6926,7 @@ void LLSettingsBridge::performAction(LLInventoryModel* model, std::string action
return;
LLUUID asset_id = item->getAssetUUID();
- LLParcel *parcel = LLViewerParcelMgr::instance().getAgentParcel();
+ LLParcel *parcel = LLViewerParcelMgr::instance().getAgentOrSelectedParcel();
if (!parcel)
{
LL_WARNS("INVENTORY") << "could not identify parcel." << LL_ENDL;
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index b60999e64a..d84ce16792 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -1102,6 +1102,11 @@ void LLInventoryPanel::clearSelection()
mSelectThisID.setNull();
}
+LLInventoryPanel::selected_items_t LLInventoryPanel::getSelectedItems() const
+{
+ return mFolderRoot.get()->getSelectionList();
+}
+
void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
{
// Schedule updating the folder view context menu when all selected items become complete (STORM-373).
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 79d39c8b82..e2da06b8d8 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -144,6 +144,8 @@ public:
virtual ~LLInventoryPanel();
public:
+ typedef std::set<LLFolderViewItem*> selected_items_t;
+
LLInventoryModel* getModel() { return mInventory; }
LLFolderViewModelInventory& getRootViewModel() { return mInventoryViewModel; }
@@ -168,6 +170,8 @@ public:
void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);
void setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);
void clearSelection();
+ selected_items_t getSelectedItems() const;
+
bool isSelectionRemovable();
LLInventoryFilter& getFilter();
const LLInventoryFilter& getFilter() const;
diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp
index 3c976c299e..41d351b481 100644
--- a/indra/newview/llpaneleditsky.cpp
+++ b/indra/newview/llpaneleditsky.cpp
@@ -112,6 +112,18 @@ BOOL LLPanelSettingsSkyAtmosTab::postBuild()
return TRUE;
}
+//virtual
+void LLPanelSettingsSkyAtmosTab::setEnabled(BOOL enabled)
+{
+ LLPanelSettingsSky::setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_HAZE_HORIZON)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_HAZE_DENSITY)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_SCENE_GAMMA)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_DENSITY_MULTIP)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_DISTANCE_MULTIP)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_MAX_ALT)->setEnabled(enabled);
+}
+
void LLPanelSettingsSkyAtmosTab::refresh()
{
if (!mSkySettings)
@@ -211,6 +223,20 @@ BOOL LLPanelSettingsSkyCloudTab::postBuild()
return TRUE;
}
+//virtual
+void LLPanelSettingsSkyCloudTab::setEnabled(BOOL enabled)
+{
+ LLPanelSettingsSky::setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_CLOUD_COVERAGE)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCALE)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_X)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_Y)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_D)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_X)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_Y)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_CLOUD_DETAIL_D)->setEnabled(enabled);
+}
+
void LLPanelSettingsSkyCloudTab::refresh()
{
if (!mSkySettings)
@@ -315,6 +341,15 @@ BOOL LLPanelSettingsSkySunMoonTab::postBuild()
return TRUE;
}
+//virtual
+void LLPanelSettingsSkySunMoonTab::setEnabled(BOOL enabled)
+{
+ LLPanelSettingsSky::setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_GLOW_FOCUS)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_GLOW_SIZE)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_SKY_STAR_BRIGHTNESS)->setEnabled(enabled);
+}
+
void LLPanelSettingsSkySunMoonTab::refresh()
{
if (!mSkySettings)
diff --git a/indra/newview/llpaneleditsky.h b/indra/newview/llpaneleditsky.h
index 56ae9dc7bb..7c49c839ec 100644
--- a/indra/newview/llpaneleditsky.h
+++ b/indra/newview/llpaneleditsky.h
@@ -62,6 +62,7 @@ public:
LLPanelSettingsSkyAtmosTab();
virtual BOOL postBuild() override;
+ virtual void setEnabled(BOOL enabled) override;
protected:
virtual void refresh() override;
@@ -86,6 +87,7 @@ public:
LLPanelSettingsSkyCloudTab();
virtual BOOL postBuild() override;
+ void setEnabled(BOOL enabled) override;
protected:
virtual void refresh() override;
@@ -108,6 +110,7 @@ public:
LLPanelSettingsSkySunMoonTab();
virtual BOOL postBuild() override;
+ virtual void setEnabled(BOOL enabled) override;
protected:
virtual void refresh() override;
diff --git a/indra/newview/llpaneleditwater.cpp b/indra/newview/llpaneleditwater.cpp
index 21b2868e7b..9d9a183ffd 100644
--- a/indra/newview/llpaneleditwater.cpp
+++ b/indra/newview/llpaneleditwater.cpp
@@ -107,6 +107,24 @@ BOOL LLPanelSettingsWaterMainTab::postBuild()
return TRUE;
}
+//virtual
+void LLPanelSettingsWaterMainTab::setEnabled(BOOL enabled)
+{
+ LLPanelSettingsWater::setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_WATER_FOG_DENSITY)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_WATER_UNDERWATER_MOD)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_WATER_FRESNEL_SCALE)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_WATER_FRESNEL_OFFSET)->setEnabled(enabled);
+
+ getChild<LLUICtrl>(FIELD_WATER_NORMAL_SCALE_X)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_WATER_NORMAL_SCALE_Y)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_WATER_NORMAL_SCALE_Z)->setEnabled(enabled);
+
+ getChild<LLUICtrl>(FIELD_WATER_SCALE_ABOVE)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_WATER_SCALE_BELOW)->setEnabled(enabled);
+ getChild<LLUICtrl>(FIELD_WATER_BLUR_MULTIP)->setEnabled(enabled);
+}
+
//==========================================================================
void LLPanelSettingsWaterMainTab::refresh()
{
diff --git a/indra/newview/llpaneleditwater.h b/indra/newview/llpaneleditwater.h
index 1b70bf265c..5a04f98b05 100644
--- a/indra/newview/llpaneleditwater.h
+++ b/indra/newview/llpaneleditwater.h
@@ -66,6 +66,7 @@ public:
LLPanelSettingsWaterMainTab();
virtual BOOL postBuild() override;
+ virtual void setEnabled(BOOL enabled) override;
protected:
virtual void refresh() override;
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index a9ad41e6f7..b5e24b6efb 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -58,6 +58,7 @@
#include "llsidepanelinventory.h"
#include "llfolderview.h"
#include "llradiogroup.h"
+#include "llenvironment.h"
const std::string FILTERS_FILENAME("filters.xml");
@@ -128,6 +129,9 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
+ mEnableCallbackRegistrar.add("Inventory.EnvironmentEnabled", [](LLUICtrl *, const LLSD &) { return LLPanelMainInventory::hasSettingsInventory(); });
+
+
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
}
@@ -1555,5 +1559,10 @@ void LLPanelMainInventory::setUploadCostIfNeeded()
}
}
+bool LLPanelMainInventory::hasSettingsInventory()
+{
+ return LLEnvironment::instance().isInventoryEnabled();
+}
+
// List Commands //
////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 732a3b04e3..a6bdee233d 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -161,6 +161,7 @@ protected:
BOOL isActionChecked(const LLSD& userdata);
void onCustomAction(const LLSD& command_name);
bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
+ static bool hasSettingsInventory();
/**
* Set upload cost in "Upload" sub menu.
*/
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index b728cbc314..a5187b7363 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -95,6 +95,13 @@ void LLSettingsVOBase::createInventoryItem(const LLSettingsBase::ptr_t &settings
LLTransactionID tid;
U32 nextOwnerPerm = LLPermissions::DEFAULT.getMaskNextOwner();
+ if (!LLEnvironment::instance().isInventoryEnabled())
+ {
+ LL_WARNS("SETTINGS") << "Region does not support settings inventory objects." << LL_ENDL;
+ LLNotificationsUtil::add("SettingsUnsuported");
+ return;
+ }
+
tid.generate();
LLPointer<LLInventoryCallback> cb = new LLSettingsInventoryCB([settings, callback](const LLUUID &inventoryId) {
@@ -127,6 +134,7 @@ void LLSettingsVOBase::updateInventoryItem(const LLSettingsBase::ptr_t &settings
if (!LLEnvironment::instance().isInventoryEnabled())
{
LL_WARNS("SETTINGS") << "Region does not support settings inventory objects." << LL_ENDL;
+ LLNotificationsUtil::add("SettingsUnsuported");
return;
}
@@ -156,6 +164,7 @@ void LLSettingsVOBase::updateInventoryItem(const LLSettingsBase::ptr_t &settings
if (!LLEnvironment::instance().isInventoryEnabled())
{
LL_WARNS("SETTINGS") << "Region does not support settings inventory objects." << LL_ENDL;
+ LLNotificationsUtil::add("SettingsUnsuported");
return;
}
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index d05d11625f..ed529975d2 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -647,6 +647,27 @@ LLParcel *LLViewerParcelMgr::getAgentParcel() const
return mAgentParcel;
}
+
+LLParcel * LLViewerParcelMgr::getAgentOrSelectedParcel() const
+{
+ LLParcel *parcel(nullptr);
+
+ LLParcelSelectionHandle sel_handle(getFloatingParcelSelection());
+ if (sel_handle)
+ {
+ LLParcelSelection *selection(sel_handle.get());
+ if (selection)
+ {
+ parcel = selection->getParcel();
+ }
+ }
+
+ if (!parcel)
+ parcel = LLViewerParcelMgr::instance().getAgentParcel();
+
+ return parcel;
+}
+
// Return whether the agent can build on the land they are on
bool LLViewerParcelMgr::allowAgentBuild() const
{
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 29219843c9..06dae6e57e 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -154,6 +154,7 @@ public:
//LLParcel *getParcelSelection() const;
LLParcel *getAgentParcel() const;
+ LLParcel *getAgentOrSelectedParcel() const;
BOOL inAgentParcel(const LLVector3d &pos_global) const;
diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png
index b627232012..8888e134d1 100644
--- a/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png
+++ b/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/en/floater_my_environments.xml b/indra/newview/skins/default/xui/en/floater_my_environments.xml
index 74921e8b64..83416f60d7 100644
--- a/indra/newview/skins/default/xui/en/floater_my_environments.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_environments.xml
@@ -110,13 +110,12 @@
top_pad="0"
left_delta="-3"
width="200" />
-
</layout_panel>
<layout_panel
auto_resize="false"
user_resize="true"
tab_group="1"
- height="62"
+ height="31"
name="pnl_control"
font="SansSerifBold">
<panel
@@ -142,7 +141,7 @@
top="5"
tool_tip="More options"
width="18" />
- <button
+ <menu_button
follows="bottom|left"
font="SansSerifBigBold"
height="18"
@@ -151,8 +150,9 @@
image_disabled="AddItem_Disabled"
layout="topleft"
left_pad="5"
+ menu_filename="menu_settings_add.xml"
name="btn_newsettings"
- tool_tip="Make new gesture"
+ tool_tip="Make new setting"
top_delta="0"
width="18" />
<button
@@ -165,20 +165,10 @@
layout="topleft"
name="btn_del"
right="-5"
- tool_tip="Delete this gesture"
+ tool_tip="Delete this setting"
top_delta="0"
width="18" />
</panel>
- <button
- follows="top|left"
- height="23"
- label="Edit"
- layout="topleft"
- left="6"
- name="btn_edit"
- top_pad="5"
- width="83" />
-
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 6dea791dd9..6f04785e8c 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -324,6 +324,8 @@
<menu_item_call.on_click
function="Inventory.DoCreate"
parameter="sky"/>
+ <menu_item_call.on_enable
+ function="Inventory.EnvironmentEnabled" />
</menu_item_call>
<menu_item_call
label="New Water"
@@ -332,6 +334,8 @@
<menu_item_call.on_click
function="Inventory.DoCreate"
parameter="water"/>
+ <menu_item_call.on_enable
+ function="Inventory.EnvironmentEnabled" />
</menu_item_call>
<menu_item_call
label="New Day Cycle"
@@ -340,6 +344,8 @@
<menu_item_call.on_click
function="Inventory.DoCreate"
parameter="daycycle"/>
+ <menu_item_call.on_enable
+ function="Inventory.EnvironmentEnabled" />
</menu_item_call>
</menu>
<menu
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
index 7c31bfe54d..0caae9f2ef 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -1,277 +1,285 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu
- layout="topleft"
- left="0"
- mouse_opaque="false"
- can_tear_off="false"
- name="menu_inventory_add"
- visible="false">
- <menu
- create_jump_keys="true"
- label="Upload"
- layout="topleft"
- name="upload"
- tear_off="true">
- <menu_item_call
- label="Image (L$[COST])..."
- layout="topleft"
- name="Upload Image"
- shortcut="control|U">
- <menu_item_call.on_click
- function="File.UploadImage"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_call
- label="Sound (L$[COST])..."
- layout="topleft"
- name="Upload Sound">
- <menu_item_call.on_click
- function="File.UploadSound"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_call
- label="Animation (L$[COST])..."
- layout="topleft"
- name="Upload Animation">
- <menu_item_call.on_click
- function="File.UploadAnim"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_call
- label="Model..."
- layout="topleft"
- name="Upload Model">
- <menu_item_call.on_click
- function="File.UploadModel"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUploadModel" />
- <menu_item_call.on_visible
- function="File.VisibleUploadModel"/>
- </menu_item_call>
- <menu_item_call
- label="Bulk (L$[COST] per file)..."
- layout="topleft"
- name="Bulk Upload">
- <menu_item_call.on_click
- function="File.UploadBulk"
- parameter="" />
- </menu_item_call>
- </menu>
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ can_tear_off="false"
+ name="menu_inventory_add"
+ visible="false">
+ <menu
+ create_jump_keys="true"
+ label="Upload"
+ layout="topleft"
+ name="upload"
+ tear_off="true">
+ <menu_item_call
+ label="Image (L$[COST])..."
+ layout="topleft"
+ name="Upload Image"
+ shortcut="control|U">
+ <menu_item_call.on_click
+ function="File.UploadImage"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sound (L$[COST])..."
+ layout="topleft"
+ name="Upload Sound">
+ <menu_item_call.on_click
+ function="File.UploadSound"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Animation (L$[COST])..."
+ layout="topleft"
+ name="Upload Animation">
+ <menu_item_call.on_click
+ function="File.UploadAnim"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
+ <menu_item_call
+ label="Model..."
+ layout="topleft"
+ name="Upload Model">
+ <menu_item_call.on_click
+ function="File.UploadModel"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUploadModel" />
+ <menu_item_call.on_visible
+ function="File.VisibleUploadModel"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Bulk (L$[COST] per file)..."
+ layout="topleft"
+ name="Bulk Upload">
+ <menu_item_call.on_click
+ function="File.UploadBulk"
+ parameter="" />
+ </menu_item_call>
+ </menu>
- <menu_item_call
- label="New Folder"
- layout="topleft"
- name="New Folder">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="category" />
- </menu_item_call>
- <menu_item_call
- label="New Script"
- layout="topleft"
- name="New Script">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="lsl" />
- </menu_item_call>
- <menu_item_call
- label="New Notecard"
- layout="topleft"
- name="New Note">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="notecard" />
- </menu_item_call>
- <menu_item_call
- label="New Gesture"
- layout="topleft"
- name="New Gesture">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="gesture" />
- </menu_item_call>
- <menu
- height="175"
- label="New Clothes"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="New Clothes"
- top_pad="514"
- width="125">
- <menu_item_call
- label="New Shirt"
- layout="topleft"
- name="New Shirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shirt" />
- </menu_item_call>
- <menu_item_call
- label="New Pants"
- layout="topleft"
- name="New Pants">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="pants" />
- </menu_item_call>
- <menu_item_call
- label="New Shoes"
- layout="topleft"
- name="New Shoes">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shoes" />
- </menu_item_call>
- <menu_item_call
- label="New Socks"
- layout="topleft"
- name="New Socks">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="socks" />
- </menu_item_call>
- <menu_item_call
- label="New Jacket"
- layout="topleft"
- name="New Jacket">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="jacket" />
- </menu_item_call>
- <menu_item_call
- label="New Skirt"
- layout="topleft"
- name="New Skirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="skirt" />
- </menu_item_call>
- <menu_item_call
- label="New Gloves"
- layout="topleft"
- name="New Gloves">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="gloves" />
- </menu_item_call>
- <menu_item_call
- label="New Undershirt"
- layout="topleft"
- name="New Undershirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="undershirt" />
- </menu_item_call>
- <menu_item_call
- label="New Underpants"
- layout="topleft"
- name="New Underpants">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="underpants" />
- </menu_item_call>
- <menu_item_call
- label="New Alpha"
- layout="topleft"
- name="New Alpha">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="alpha" />
- </menu_item_call>
- <menu_item_call
- label="New Tattoo"
- layout="topleft"
- name="New Tattoo">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="tattoo" />
- </menu_item_call>
- <menu_item_call
- label="New Physics"
- layout="topleft"
- name="New Physics">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="physics" />
- </menu_item_call>
- </menu>
- <menu
- height="85"
- label="New Body Parts"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="New Body Parts"
- top_pad="514"
- width="118">
- <menu_item_call
- label="New Shape"
- layout="topleft"
- name="New Shape">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shape" />
- </menu_item_call>
- <menu_item_call
- label="New Skin"
- layout="topleft"
- name="New Skin">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="skin" />
- </menu_item_call>
- <menu_item_call
- label="New Hair"
- layout="topleft"
- name="New Hair">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="hair" />
- </menu_item_call>
- <menu_item_call
- label="New Eyes"
- layout="topleft"
- name="New Eyes">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="eyes" />
- </menu_item_call>
- </menu>
- <menu
- label="New Settings"
- layout="topleft"
- name="New Settings">
- <menu_item_call
- label="New Sky"
- layout="topleft"
- name="New Sky">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="sky"/>
- </menu_item_call>
- <menu_item_call
- label="New Water"
- layout="topleft"
- name="New Water">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="water"/>
- </menu_item_call>
- <menu_item_call
- label="New Day Cycle"
- layout="topleft"
- name="New Day Cycle">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="daycycle"/>
- </menu_item_call>
- </menu>
+ <menu_item_call
+ label="New Folder"
+ layout="topleft"
+ name="New Folder">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="category" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Script"
+ layout="topleft"
+ name="New Script">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="lsl" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Notecard"
+ layout="topleft"
+ name="New Note">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="notecard" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Gesture"
+ layout="topleft"
+ name="New Gesture">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="gesture" />
+ </menu_item_call>
+ <menu
+ height="175"
+ label="New Clothes"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="New Clothes"
+ top_pad="514"
+ width="125">
+ <menu_item_call
+ label="New Shirt"
+ layout="topleft"
+ name="New Shirt">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="shirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Pants"
+ layout="topleft"
+ name="New Pants">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="pants" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Shoes"
+ layout="topleft"
+ name="New Shoes">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="shoes" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Socks"
+ layout="topleft"
+ name="New Socks">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="socks" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Jacket"
+ layout="topleft"
+ name="New Jacket">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="jacket" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Skirt"
+ layout="topleft"
+ name="New Skirt">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="skirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Gloves"
+ layout="topleft"
+ name="New Gloves">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="gloves" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Undershirt"
+ layout="topleft"
+ name="New Undershirt">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="undershirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Underpants"
+ layout="topleft"
+ name="New Underpants">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="underpants" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Alpha"
+ layout="topleft"
+ name="New Alpha">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="alpha" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Tattoo"
+ layout="topleft"
+ name="New Tattoo">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="tattoo" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Physics"
+ layout="topleft"
+ name="New Physics">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="physics" />
+ </menu_item_call>
+ </menu>
+ <menu
+ height="85"
+ label="New Body Parts"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="New Body Parts"
+ top_pad="514"
+ width="118">
+ <menu_item_call
+ label="New Shape"
+ layout="topleft"
+ name="New Shape">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="shape" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Skin"
+ layout="topleft"
+ name="New Skin">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="skin" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Hair"
+ layout="topleft"
+ name="New Hair">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="hair" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Eyes"
+ layout="topleft"
+ name="New Eyes">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="eyes" />
+ </menu_item_call>
+ </menu>
+ <menu
+ label="New Settings"
+ layout="topleft"
+ name="New Settings">
+ <menu_item_call
+ label="New Sky"
+ layout="topleft"
+ name="New Sky">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="sky"/>
+ <menu_item_call.on_enable
+ function="Inventory.EnvironmentEnabled" />
+
+ </menu_item_call>
+ <menu_item_call
+ label="New Water"
+ layout="topleft"
+ name="New Water">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="water"/>
+ <menu_item_call.on_enable
+ function="Inventory.EnvironmentEnabled" />
+
+ </menu_item_call>
+ <menu_item_call
+ label="New Day Cycle"
+ layout="topleft"
+ name="New Day Cycle">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="daycycle"/>
+ <menu_item_call.on_enable
+ function="Inventory.EnvironmentEnabled" />
+ </menu_item_call>
+ </menu>
</menu> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/menu_settings_add.xml b/indra/newview/skins/default/xui/en/menu_settings_add.xml
new file mode 100644
index 0000000000..a4782cfdc3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_settings_add.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ layout="topleft"
+ mouse_opaque="false"
+ name="menu_settings_add"
+ visible="false">
+ <menu_item_call
+ label="New Sky"
+ layout="topleft"
+ name="New Sky">
+ <menu_item_call.on_click
+ function="MyEnvironments.DoCreate"
+ parameter="sky"/>
+ <menu_item_call.on_enable
+ function="MyEnvironments.EnvironmentEnabled" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Water"
+ layout="topleft"
+ name="New Water">
+ <menu_item_call.on_click
+ function="MyEnvironments.DoCreate"
+ parameter="water"/>
+ <menu_item_call.on_enable
+ function="MyEnvironments.EnvironmentEnabled" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Day Cycle"
+ layout="topleft"
+ name="New Day Cycle">
+ <menu_item_call.on_click
+ function="MyEnvironments.DoCreate"
+ parameter="daycycle"/>
+ <menu_item_call.on_enable
+ function="MyEnvironments.EnvironmentEnabled" />
+ </menu_item_call>
+</toggleable_menu> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/menu_settings_gear.xml b/indra/newview/skins/default/xui/en/menu_settings_gear.xml
index 73fae4f693..1d65ff3d99 100644
--- a/indra/newview/skins/default/xui/en/menu_settings_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_settings_gear.xml
@@ -1,57 +1,86 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu
- layout="topleft"
- mouse_opaque="false"
- name="menu_settings_gear"
- visible="false">
+ layout="topleft"
+ mouse_opaque="false"
+ name="menu_settings_gear"
+ visible="false">
<menu_item_call
- label="Apply Selected Setting to Myself"
- layout="topleft"
- name="activate">
+ label="Edit"
+ layout="topleft"
+ name="edit_settings">
<on_click
- function="Gesture.Action.ToogleActiveState" />
+ function="MyEnvironments.DoEdit" />
+ <on_enable
+ function="MyEnvironments.EnableAction"
+ parameter="edit_settings" />
</menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Separator" />
<menu_item_call
- label="Copy"
- layout="topleft"
- name="copy_settings">
- <on_click
- function="Gesture.Action.CopyPaste"
- parameter="copy_gesture" />
- <on_enable
- function="Gesture.EnableAction"
- parameter="copy_gesture" />
+ name="Settings Apply Local"
+ layout="topleft"
+ label="Apply Only To Myself">
+ <menu_item_call.on_click
+ function="MyEnvironments.DoApply"
+ parameter="local" />
+ </menu_item_call>
+ <menu_item_call
+ name="Settings Apply Parcel"
+ layout="topleft"
+ label="Apply To Parcel">
+ <menu_item_call.on_click
+ function="MyEnvironments.DoApply"
+ parameter="parcel" />
+ <menu_item_call.on_enable
+ function="MyEnvironments.CanApply"
+ parameter="parcel"/>
+ </menu_item_call>
+ <menu_item_call
+ name="Settings Apply Region"
+ layout="topleft"
+ label="Apply To Region">
+ <menu_item_call.on_click
+ function="MyEnvironments.DoApply"
+ parameter="region" />
+ <menu_item_call.on_enable
+ function="MyEnvironments.CanApply"
+ parameter="region"/>
</menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Separator" />
<menu_item_call
- label="Paste"
- layout="topleft"
- name="paste_settings">
+ label="Copy"
+ layout="topleft"
+ name="copy_settings">
<on_click
- function="Gesture.Action.CopyPaste"
- parameter="paste" />
+ function="MyEnvironments.CopyPaste"
+ parameter="copy" />
<on_enable
- function="Gesture.EnableAction"
- parameter="paste" />
+ function="MyEnvironments.EnableAction"
+ parameter="copy" />
</menu_item_call>
<menu_item_call
- label="Copy UUID"
- layout="topleft"
- name="copy_uuid">
+ label="Paste"
+ layout="topleft"
+ name="paste_settings">
<on_click
- function="Gesture.Action.CopyPaste"
- parameter="copy_uuid" />
+ function="MyEnvironments.CopyPaste"
+ parameter="paste" />
<on_enable
- function="Gesture.EnableAction"
- parameter="copy_uuid" />
+ function="MyEnvironments.EnableAction"
+ parameter="paste" />
</menu_item_call>
<menu_item_call
- label="Edit"
- layout="topleft"
- name="edit_settings">
+ label="Copy UUID"
+ layout="topleft"
+ name="copy_uuid">
<on_click
- function="Gesture.Action.ShowPreview" />
+ function="MyEnvironments.CopyPaste"
+ parameter="copy_uuid" />
<on_enable
- function="Gesture.EnableAction"
- parameter="edit_settings" />
+ function="MyEnvironments.EnableAction"
+ parameter="copy_uuid" />
</menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 6473ec9bc3..26e947b3ca 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -11150,5 +11150,15 @@ Unable to set the environment for this parcel.
Please enter or select a parcel that you have rights to modify.
<tag>fail</tag>
</notification>
+
+ <notification
+ icon="notify.tga"
+ name="SettingsUnsuported"
+ persist="true"
+ type="alertmodal">
+Settings are not supported on this region.
+Please move to a settings enabled region and retry your action.
+ <tag>fail</tag>
+ </notification>
</notifications>