summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindra/llinventory/llparcel.cpp14
-rwxr-xr-xindra/llinventory/llparcel.h4
-rwxr-xr-xindra/newview/llfloaterland.cpp684
-rwxr-xr-xindra/newview/llfloaterland.h80
-rwxr-xr-xindra/newview/llfloaterregioninfo.cpp40
-rwxr-xr-xindra/newview/llfloaterregioninfo.h2
-rw-r--r--indra/newview/llpanelexperiencelisteditor.cpp14
-rw-r--r--indra/newview/llpanelexperiencelisteditor.h5
-rwxr-xr-xindra/newview/llviewerparcelmgr.h8
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_about_land.xml19
-rw-r--r--indra/newview/skins/default/xui/en/panel_experience_list_editor.xml40
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_experiences.xml104
-rwxr-xr-xindra/newview/skins/default/xui/en/role_actions.xml6
-rwxr-xr-xindra/newview/skins/default/xui/en/strings.xml4
14 files changed, 603 insertions, 421 deletions
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index d2179308c1..0784986e3a 100755
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -41,6 +41,7 @@
#include "message.h"
#include "u64.h"
#include "llregionflags.h"
+#include <boost/range/adaptor/map.hpp>
static const F32 SOME_BIG_NUMBER = 1000.0f;
static const F32 SOME_BIG_NEG_NUMBER = -1000.0f;
@@ -1256,6 +1257,17 @@ void LLParcel::setExperienceKeyType( const LLUUID& experience_key, U32 type )
}
else
{
- mExperienceKeys[experience_key] = type;
+ if(countExperienceKeyType(type) < PARCEL_MAX_EXPERIENCE_LIST)
+ {
+ mExperienceKeys[experience_key] = type;
+ }
}
}
+
+U32 LLParcel::countExperienceKeyType( U32 type )
+{
+ return std::count_if(
+ boost::begin(mExperienceKeys | boost::adaptors::map_values),
+ boost::end(mExperienceKeys | boost::adaptors::map_values),
+ std::bind2nd(std::equal_to<U32>(), type));
+}
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index fe76531317..e68331b99a 100755
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -53,6 +53,9 @@ const S32 PARCEL_MAX_ACCESS_LIST = 300;
//for access/ban lists.
const F32 PARCEL_MAX_ENTRIES_PER_PACKET = 48.f;
+// Maximum number of experiences
+const S32 PARCEL_MAX_EXPERIENCE_LIST = 24;
+
// Weekly charge for listing a parcel in the directory
const S32 PARCEL_DIRECTORY_FEE = 30;
@@ -671,6 +674,7 @@ public:
typedef std::map<LLUUID, U32> xp_type_map_t;
void setExperienceKeyType(const LLUUID& experience_key, U32 type);
+ U32 countExperienceKeyType(U32 type);
U32 getExperienceKeyType(const LLUUID& experience_key)const;
LLAccessEntry::map getExperienceKeysByType(U32 type)const;
void clearExperienceKeysByType(U32 type);
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 9b588dc166..7fbbef5ed3 100755
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -75,6 +75,7 @@
#include "llviewercontrol.h"
#include "roles_constants.h"
#include "lltrans.h"
+#include "llpanelexperiencelisteditor.h"
#include "llgroupactions.h"
@@ -86,7 +87,6 @@ static std::string MATURITY = "[MATURITY]";
// constants used in callbacks below - syntactic sugar.
static const BOOL BUY_GROUP_LAND = TRUE;
static const BOOL BUY_PERSONAL_LAND = FALSE;
-LLPointer<LLParcelSelection> LLPanelLandGeneral::sSelectionForBuyPass = NULL;
// Statics
LLParcelSelectionObserver* LLFloaterLand::sObserver = NULL;
@@ -162,191 +162,117 @@ void send_parcel_select_objects(S32 parcel_local_id, U32 return_type,
msg->sendReliable(region->getHost());
}
-LLParcel* LLFloaterLand::getCurrentSelectedParcel()
+void send_other_clean_time_message(S32 parcel_local_id, S32 other_clean_time)
{
- return mParcel->getParcel();
-};
+ LLMessageSystem *msg = gMessageSystem;
-//static
-LLPanelLandObjects* LLFloaterLand::getCurrentPanelLandObjects()
-{
- LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
- if(land_instance)
- {
- return land_instance->mPanelObjects;
- }
- else
- {
- return NULL;
- }
-}
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (!region) return;
-//static
-LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant()
-{
- LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
- if(land_instance)
- {
- return land_instance->mPanelCovenant;
- }
- else
- {
- return NULL;
- }
-}
+ msg->newMessageFast(_PREHASH_ParcelSetOtherCleanTime);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, parcel_local_id);
+ msg->addS32Fast(_PREHASH_OtherCleanTime, other_clean_time);
-// static
-void LLFloaterLand::refreshAll()
-{
- LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
- if(land_instance)
- {
- land_instance->refresh();
- }
+ msg->sendReliable(region->getHost());
}
-void LLFloaterLand::onOpen(const LLSD& key)
+// inserts maturity info(icon and text) into target textbox
+// names_floater - pointer to floater which contains strings with maturity icons filenames
+// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY]
+void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse)
{
- // moved from triggering show instance in llviwermenu.cpp
-
- if (LLViewerParcelMgr::getInstance()->selectionEmpty())
- {
- LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal());
- }
-
- // Done automatically when the selected parcel's properties arrive
- // (and hence we have the local id).
- // LLViewerParcelMgr::getInstance()->sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_RENTER);
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (!region)
+ return;
- mParcel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection();
-
- // Refresh even if not over a region so we don't get an
- // uninitialized dialog. The dialog is 0-region aware.
- refresh();
-}
+ LLStyle::Params style;
-void LLFloaterLand::onVisibilityChanged(const LLSD& visible)
-{
- if (!visible.asBoolean())
- {
- // Might have been showing owned objects
- LLSelectMgr::getInstance()->unhighlightAll();
+ U8 sim_access = region->getSimAccess();
- // Save which panel we had open
- sLastTab = mTabLand->getCurrentPanelIndex();
- }
-}
+ switch(sim_access)
+ {
+ case SIM_ACCESS_PG:
+ style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_general")));
+ break;
+ case SIM_ACCESS_ADULT:
+ style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_adult")));
+ break;
-LLFloaterLand::LLFloaterLand(const LLSD& seed)
-: LLFloater(seed)
-{
- mFactoryMap["land_general_panel"] = LLCallbackMap(createPanelLandGeneral, this);
- mFactoryMap["land_covenant_panel"] = LLCallbackMap(createPanelLandCovenant, this);
- mFactoryMap["land_objects_panel"] = LLCallbackMap(createPanelLandObjects, this);
- mFactoryMap["land_options_panel"] = LLCallbackMap(createPanelLandOptions, this);
- mFactoryMap["land_audio_panel"] = LLCallbackMap(createPanelLandAudio, this);
- mFactoryMap["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this);
- mFactoryMap["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this);
+ case SIM_ACCESS_MATURE:
+ style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_moderate")));
+ break;
- sObserver = new LLParcelSelectionObserver();
- LLViewerParcelMgr::getInstance()->addObserver( sObserver );
-}
+ default:
+ break;
+ }
-BOOL LLFloaterLand::postBuild()
-{
- setVisibleCallback(boost::bind(&LLFloaterLand::onVisibilityChanged, this, _2));
+ size_t maturity_pos = str_to_parse.find(MATURITY);
- LLTabContainer* tab = getChild<LLTabContainer>("landtab");
-
- mTabLand = (LLTabContainer*) tab;
-
- if (tab)
+ if (maturity_pos == std::string::npos)
{
- tab->selectTab(sLastTab);
+ return;
}
- return TRUE;
-}
+ std::string text_before_rating = str_to_parse.substr(0, maturity_pos);
+ std::string text_after_rating = str_to_parse.substr(maturity_pos + MATURITY.length());
+ target_textbox->setText(text_before_rating);
-// virtual
-LLFloaterLand::~LLFloaterLand()
-{
- LLViewerParcelMgr::getInstance()->removeObserver( sObserver );
- delete sObserver;
- sObserver = NULL;
-}
+ target_textbox->appendImageSegment(style);
-// public
-void LLFloaterLand::refresh()
-{
- mPanelGeneral->refresh();
- mPanelObjects->refresh();
- mPanelOptions->refresh();
- mPanelAudio->refresh();
- mPanelMedia->refresh();
- mPanelAccess->refresh();
- mPanelCovenant->refresh();
+ target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false);
+ target_textbox->appendText(text_after_rating, false);
}
-
-
-void* LLFloaterLand::createPanelLandGeneral(void* data)
+void send_return_objects_message(S32 parcel_local_id, S32 return_type,
+ uuid_list_t* owner_ids = NULL)
{
- LLFloaterLand* self = (LLFloaterLand*)data;
- self->mPanelGeneral = new LLPanelLandGeneral(self->mParcel);
- return self->mPanelGeneral;
-}
+ LLMessageSystem *msg = gMessageSystem;
-// static
-void* LLFloaterLand::createPanelLandCovenant(void* data)
-{
- LLFloaterLand* self = (LLFloaterLand*)data;
- self->mPanelCovenant = new LLPanelLandCovenant(self->mParcel);
- return self->mPanelCovenant;
-}
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (!region) return;
+ msg->newMessageFast(_PREHASH_ParcelReturnObjects);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, parcel_local_id);
+ msg->addU32Fast(_PREHASH_ReturnType, (U32) return_type);
-// static
-void* LLFloaterLand::createPanelLandObjects(void* data)
-{
- LLFloaterLand* self = (LLFloaterLand*)data;
- self->mPanelObjects = new LLPanelLandObjects(self->mParcel);
- return self->mPanelObjects;
-}
+ // Dummy task id, not used
+ msg->nextBlock("TaskIDs");
+ msg->addUUID("TaskID", LLUUID::null);
-// static
-void* LLFloaterLand::createPanelLandOptions(void* data)
-{
- LLFloaterLand* self = (LLFloaterLand*)data;
- self->mPanelOptions = new LLPanelLandOptions(self->mParcel);
- return self->mPanelOptions;
-}
+ // Throw all return ids into the packet.
+ // TODO: Check for too many ids.
+ if (owner_ids)
+ {
+ uuid_list_t::iterator end = owner_ids->end();
+ for (uuid_list_t::iterator it = owner_ids->begin();
+ it != end;
+ ++it)
+ {
+ msg->nextBlockFast(_PREHASH_OwnerIDs);
+ msg->addUUIDFast(_PREHASH_OwnerID, (*it));
+ }
+ }
+ else
+ {
+ msg->nextBlockFast(_PREHASH_OwnerIDs);
+ msg->addUUIDFast(_PREHASH_OwnerID, LLUUID::null);
+ }
-// static
-void* LLFloaterLand::createPanelLandAudio(void* data)
-{
- LLFloaterLand* self = (LLFloaterLand*)data;
- self->mPanelAudio = new LLPanelLandAudio(self->mParcel);
- return self->mPanelAudio;
+ msg->sendReliable(region->getHost());
}
-// static
-void* LLFloaterLand::createPanelLandMedia(void* data)
-{
- LLFloaterLand* self = (LLFloaterLand*)data;
- self->mPanelMedia = new LLPanelLandMedia(self->mParcel);
- return self->mPanelMedia;
-}
-// static
-void* LLFloaterLand::createPanelLandAccess(void* data)
-{
- LLFloaterLand* self = (LLFloaterLand*)data;
- self->mPanelAccess = new LLPanelLandAccess(self->mParcel);
- return self->mPanelAccess;
-}
+LLPointer<LLParcelSelection> LLPanelLandGeneral::sSelectionForBuyPass = NULL;
//---------------------------------------------------------------------------
// LLPanelLandGeneral
@@ -1063,6 +989,8 @@ void LLPanelLandGeneral::onClickStopSellLand(void* data)
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate(parcel);
}
+
+
//---------------------------------------------------------------------------
// LLPanelLandObjects
//---------------------------------------------------------------------------
@@ -1308,66 +1236,6 @@ void LLPanelLandObjects::draw()
LLPanel::draw();
}
-void send_other_clean_time_message(S32 parcel_local_id, S32 other_clean_time)
-{
- LLMessageSystem *msg = gMessageSystem;
-
- LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- if (!region) return;
-
- msg->newMessageFast(_PREHASH_ParcelSetOtherCleanTime);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ParcelData);
- msg->addS32Fast(_PREHASH_LocalID, parcel_local_id);
- msg->addS32Fast(_PREHASH_OtherCleanTime, other_clean_time);
-
- msg->sendReliable(region->getHost());
-}
-
-void send_return_objects_message(S32 parcel_local_id, S32 return_type,
- uuid_list_t* owner_ids = NULL)
-{
- LLMessageSystem *msg = gMessageSystem;
-
- LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- if (!region) return;
-
- msg->newMessageFast(_PREHASH_ParcelReturnObjects);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ParcelData);
- msg->addS32Fast(_PREHASH_LocalID, parcel_local_id);
- msg->addU32Fast(_PREHASH_ReturnType, (U32) return_type);
-
- // Dummy task id, not used
- msg->nextBlock("TaskIDs");
- msg->addUUID("TaskID", LLUUID::null);
-
- // Throw all return ids into the packet.
- // TODO: Check for too many ids.
- if (owner_ids)
- {
- uuid_list_t::iterator end = owner_ids->end();
- for (uuid_list_t::iterator it = owner_ids->begin();
- it != end;
- ++it)
- {
- msg->nextBlockFast(_PREHASH_OwnerIDs);
- msg->addUUIDFast(_PREHASH_OwnerID, (*it));
- }
- }
- else
- {
- msg->nextBlockFast(_PREHASH_OwnerIDs);
- msg->addUUIDFast(_PREHASH_OwnerID, LLUUID::null);
- }
-
- msg->sendReliable(region->getHost());
-}
-
bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -1804,6 +1672,52 @@ void LLPanelLandObjects::onCommitClean(LLUICtrl *caller, void* user_data)
}
+class LLPanelLandOptions
+ : public LLPanel
+{
+public:
+ LLPanelLandOptions(LLSafeHandle<LLParcelSelection>& parcelp);
+ virtual ~LLPanelLandOptions();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+ /*virtual*/ void refresh();
+
+private:
+ // Refresh the "show in search" checkbox and category selector.
+ void refreshSearch();
+
+ static void onCommitAny(LLUICtrl* ctrl, void *userdata);
+ static void onClickSet(void* userdata);
+ static void onClickClear(void* userdata);
+
+private:
+ LLCheckBoxCtrl* mCheckEditObjects;
+ LLCheckBoxCtrl* mCheckEditGroupObjects;
+ LLCheckBoxCtrl* mCheckAllObjectEntry;
+ LLCheckBoxCtrl* mCheckGroupObjectEntry;
+ LLCheckBoxCtrl* mCheckSafe;
+ LLCheckBoxCtrl* mCheckFly;
+ LLCheckBoxCtrl* mCheckGroupScripts;
+ LLCheckBoxCtrl* mCheckOtherScripts;
+
+ LLCheckBoxCtrl* mCheckShowDirectory;
+ LLComboBox* mCategoryCombo;
+ LLComboBox* mLandingTypeCombo;
+
+ LLTextureCtrl* mSnapshotCtrl;
+
+ LLTextBox* mLocationText;
+ LLButton* mSetBtn;
+ LLButton* mClearBtn;
+
+ LLCheckBoxCtrl *mMatureCtrl;
+ LLCheckBoxCtrl *mPushRestrictionCtrl;
+ LLCheckBoxCtrl *mSeeAvatarsCtrl;
+
+ LLSafeHandle<LLParcelSelection>& mParcel;
+};
+
+
//---------------------------------------------------------------------------
// LLPanelLandOptions
//---------------------------------------------------------------------------
@@ -2320,6 +2234,37 @@ void LLPanelLandOptions::onClickClear(void* userdata)
}
+class LLPanelLandAccess
+ : public LLPanel
+{
+public:
+ LLPanelLandAccess(LLSafeHandle<LLParcelSelection>& parcelp);
+ virtual ~LLPanelLandAccess();
+ void refresh();
+ void refresh_ui();
+ void refreshNames();
+ virtual void draw();
+
+ static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);
+ static void onCommitAny(LLUICtrl* ctrl, void *userdata);
+ static void onClickRemoveAccess(void*);
+ static void onClickRemoveBanned(void*);
+
+ virtual BOOL postBuild();
+
+ void onClickAddAccess();
+ void onClickAddBanned();
+ void callbackAvatarCBBanned(const uuid_vec_t& ids);
+ void callbackAvatarCBAccess(const uuid_vec_t& ids);
+
+protected:
+ LLNameListCtrl* mListAccess;
+ LLNameListCtrl* mListBanned;
+
+ LLSafeHandle<LLParcelSelection>& mParcel;
+};
+
+
//---------------------------------------------------------------------------
// LLPanelLandAccess
//---------------------------------------------------------------------------
@@ -2835,6 +2780,7 @@ void LLPanelLandAccess::onClickRemoveBanned(void* data)
}
}
+
//---------------------------------------------------------------------------
// LLPanelLandCovenant
//---------------------------------------------------------------------------
@@ -2948,51 +2894,303 @@ void LLPanelLandCovenant::updateEstateOwnerName(const std::string& name)
}
}
-// inserts maturity info(icon and text) into target textbox
-// names_floater - pointer to floater which contains strings with maturity icons filenames
-// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY]
-void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse)
+class LLPanelLandExperiences
+ : public LLPanel
{
- LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- if (!region)
+public:
+ LLPanelLandExperiences(LLSafeHandle<LLParcelSelection>& parcelp);
+ virtual BOOL postBuild();
+ void refresh();
+
+ void experienceAdded(const LLUUID& id, U32 xp_type, U32 access_type);
+ void experienceRemoved(const LLUUID& id, U32 access_type);
+protected:
+ LLPanelExperienceListEditor* setupList( const char* control_name, U32 xp_type, U32 access_type );
+ void refreshPanel(LLPanelExperienceListEditor* panel, U32 xp_type);
+
+ LLSafeHandle<LLParcelSelection>& mParcel;
+
+
+ LLPanelExperienceListEditor* mAllowed;
+ LLPanelExperienceListEditor* mBlocked;
+};
+
+LLPanelLandExperiences::LLPanelLandExperiences( LLSafeHandle<LLParcelSelection>& parcelp )
+ : mParcel(parcelp)
+{
+
+}
+
+
+BOOL LLPanelLandExperiences::postBuild()
+{
+ mAllowed = setupList("panel_allowed", EXPERIENCE_KEY_TYPE_ALLOWED, AL_ALLOW_EXPERIENCE);
+ mBlocked = setupList("panel_blocked", EXPERIENCE_KEY_TYPE_BLOCKED, AL_BLOCK_EXPERIENCE);
+
+ getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(FALSE);
+ getChild<LLTextBox>("experiences_help_text")->setVisible(FALSE);
+ getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_parcel_text"));
+ getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_parcel_text"));
+
+ return LLPanel::postBuild();
+}
+
+LLPanelExperienceListEditor* LLPanelLandExperiences::setupList( const char* control_name, U32 xp_type, U32 access_type )
+{
+ LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name);
+ if(child)
+ {
+ child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name));
+ child->setMaxExperienceIDs(PARCEL_MAX_EXPERIENCE_LIST);
+ child->setAddedCallback(boost::bind(&LLPanelLandExperiences::experienceAdded, this, _1, xp_type, access_type));
+ child->setRemovedCallback(boost::bind(&LLPanelLandExperiences::experienceRemoved, this, _1, access_type));
+ }
+
+ return child;
+}
+
+void LLPanelLandExperiences::experienceAdded( const LLUUID& id, U32 xp_type, U32 access_type )
+{
+ LLParcel* parcel = mParcel->getParcel();
+ if (parcel)
+ {
+ parcel->setExperienceKeyType(id, xp_type);
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(access_type);
+ refresh();
+ }
+}
+
+void LLPanelLandExperiences::experienceRemoved( const LLUUID& id, U32 access_type )
+{
+ LLParcel* parcel = mParcel->getParcel();
+ if (parcel)
+ {
+ parcel->setExperienceKeyType(id, EXPERIENCE_KEY_TYPE_NONE);
+ LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(access_type);
+ refresh();
+ }
+}
+
+void LLPanelLandExperiences::refreshPanel(LLPanelExperienceListEditor* panel, U32 xp_type)
+{
+ LLParcel *parcel = mParcel->getParcel();
+
+ // Display options
+ if (parcel == NULL || panel == NULL)
+ {
return;
+ }
- LLStyle::Params style;
+ LLAccessEntry::map entries = parcel->getExperienceKeysByType(xp_type);
+ LLAccessEntry::map::iterator it = entries.begin();
+ LLSD ids = LLSD::emptyArray();
+ for (/**/; it != entries.end(); ++it)
+ {
+ ids.append(it->second.mID);
+ }
+ panel->setExperienceIds(ids);
+ panel->setReadonly(!LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS));
+ panel->refreshExperienceCounter();
+}
- U8 sim_access = region->getSimAccess();
+void LLPanelLandExperiences::refresh()
+{
+ refreshPanel(mAllowed, EXPERIENCE_KEY_TYPE_ALLOWED);
+ refreshPanel(mBlocked, EXPERIENCE_KEY_TYPE_BLOCKED);
+}
- switch(sim_access)
+LLParcel* LLFloaterLand::getCurrentSelectedParcel()
+{
+ return mParcel->getParcel();
+};
+
+//static
+LLPanelLandObjects* LLFloaterLand::getCurrentPanelLandObjects()
+{
+ LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
+ if(land_instance)
{
- case SIM_ACCESS_PG:
- style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_general")));
- break;
+ return land_instance->mPanelObjects;
+ }
+ else
+ {
+ return NULL;
+ }
+}
- case SIM_ACCESS_ADULT:
- style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_adult")));
- break;
+//static
+LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant()
+{
+ LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
+ if(land_instance)
+ {
+ return land_instance->mPanelCovenant;
+ }
+ else
+ {
+ return NULL;
+ }
+}
- case SIM_ACCESS_MATURE:
- style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_moderate")));
- break;
+// static
+void LLFloaterLand::refreshAll()
+{
+ LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
+ if(land_instance)
+ {
+ land_instance->refresh();
+ }
+}
- default:
- break;
+void LLFloaterLand::onOpen(const LLSD& key)
+{
+ // moved from triggering show instance in llviwermenu.cpp
+
+ if (LLViewerParcelMgr::getInstance()->selectionEmpty())
+ {
+ LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal());
}
+
+ // Done automatically when the selected parcel's properties arrive
+ // (and hence we have the local id).
+ // LLViewerParcelMgr::getInstance()->sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_RENTER);
- size_t maturity_pos = str_to_parse.find(MATURITY);
+ mParcel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection();
- if (maturity_pos == std::string::npos)
+ // Refresh even if not over a region so we don't get an
+ // uninitialized dialog. The dialog is 0-region aware.
+ refresh();
+}
+
+void LLFloaterLand::onVisibilityChanged(const LLSD& visible)
+{
+ if (!visible.asBoolean())
{
- return;
+ // Might have been showing owned objects
+ LLSelectMgr::getInstance()->unhighlightAll();
+
+ // Save which panel we had open
+ sLastTab = mTabLand->getCurrentPanelIndex();
}
+}
- std::string text_before_rating = str_to_parse.substr(0, maturity_pos);
- std::string text_after_rating = str_to_parse.substr(maturity_pos + MATURITY.length());
- target_textbox->setText(text_before_rating);
+LLFloaterLand::LLFloaterLand(const LLSD& seed)
+: LLFloater(seed)
+{
+ mFactoryMap["land_general_panel"] = LLCallbackMap(createPanelLandGeneral, this);
+ mFactoryMap["land_covenant_panel"] = LLCallbackMap(createPanelLandCovenant, this);
+ mFactoryMap["land_objects_panel"] = LLCallbackMap(createPanelLandObjects, this);
+ mFactoryMap["land_options_panel"] = LLCallbackMap(createPanelLandOptions, this);
+ mFactoryMap["land_audio_panel"] = LLCallbackMap(createPanelLandAudio, this);
+ mFactoryMap["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this);
+ mFactoryMap["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this);
+ mFactoryMap["land_experiences_panel"] = LLCallbackMap(createPanelLandExperiences, this);
- target_textbox->appendImageSegment(style);
+ sObserver = new LLParcelSelectionObserver();
+ LLViewerParcelMgr::getInstance()->addObserver( sObserver );
+}
- target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false);
- target_textbox->appendText(text_after_rating, false);
+BOOL LLFloaterLand::postBuild()
+{
+ setVisibleCallback(boost::bind(&LLFloaterLand::onVisibilityChanged, this, _2));
+
+ LLTabContainer* tab = getChild<LLTabContainer>("landtab");
+
+ mTabLand = (LLTabContainer*) tab;
+
+ if (tab)
+ {
+ tab->selectTab(sLastTab);
+ }
+
+ return TRUE;
+}
+
+
+// virtual
+LLFloaterLand::~LLFloaterLand()
+{
+ LLViewerParcelMgr::getInstance()->removeObserver( sObserver );
+ delete sObserver;
+ sObserver = NULL;
+}
+
+// public
+void LLFloaterLand::refresh()
+{
+ mPanelGeneral->refresh();
+ mPanelObjects->refresh();
+ mPanelOptions->refresh();
+ mPanelAudio->refresh();
+ mPanelMedia->refresh();
+ mPanelAccess->refresh();
+ mPanelCovenant->refresh();
+ mPanelExperiences->refresh();
+}
+
+
+
+void* LLFloaterLand::createPanelLandGeneral(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelGeneral = new LLPanelLandGeneral(self->mParcel);
+ return self->mPanelGeneral;
+}
+
+// static
+void* LLFloaterLand::createPanelLandCovenant(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelCovenant = new LLPanelLandCovenant(self->mParcel);
+ return self->mPanelCovenant;
+}
+
+
+// static
+void* LLFloaterLand::createPanelLandObjects(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelObjects = new LLPanelLandObjects(self->mParcel);
+ return self->mPanelObjects;
+}
+
+// static
+void* LLFloaterLand::createPanelLandOptions(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelOptions = new LLPanelLandOptions(self->mParcel);
+ return self->mPanelOptions;
+}
+
+// static
+void* LLFloaterLand::createPanelLandAudio(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelAudio = new LLPanelLandAudio(self->mParcel);
+ return self->mPanelAudio;
+}
+
+// static
+void* LLFloaterLand::createPanelLandMedia(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelMedia = new LLPanelLandMedia(self->mParcel);
+ return self->mPanelMedia;
+}
+
+// static
+void* LLFloaterLand::createPanelLandAccess(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelAccess = new LLPanelLandAccess(self->mParcel);
+ return self->mPanelAccess;
+}
+
+// static
+void* LLFloaterLand::createPanelLandExperiences(void* data)
+{
+ LLFloaterLand* self = (LLFloaterLand*)data;
+ self->mPanelExperiences = new LLPanelLandExperiences(self->mParcel);
+ return self->mPanelExperiences;
}
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index dccdfc9acb..f354482027 100755
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -66,6 +66,7 @@ class LLPanelLandBan;
class LLPanelLandRenters;
class LLPanelLandCovenant;
class LLParcel;
+class LLPanelLandExperiences;
class LLFloaterLand
: public LLFloater
@@ -101,6 +102,7 @@ protected:
static void* createPanelLandAudio(void* data);
static void* createPanelLandMedia(void* data);
static void* createPanelLandAccess(void* data);
+ static void* createPanelLandExperiences(void* data);
static void* createPanelLandBan(void* data);
@@ -116,6 +118,7 @@ protected:
LLPanelLandMedia* mPanelMedia;
LLPanelLandAccess* mPanelAccess;
LLPanelLandCovenant* mPanelCovenant;
+ LLPanelLandExperiences* mPanelExperiences;
LLSafeHandle<LLParcelSelection> mParcel;
@@ -307,83 +310,6 @@ protected:
};
-class LLPanelLandOptions
-: public LLPanel
-{
-public:
- LLPanelLandOptions(LLSafeHandle<LLParcelSelection>& parcelp);
- virtual ~LLPanelLandOptions();
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void draw();
- /*virtual*/ void refresh();
-
-private:
- // Refresh the "show in search" checkbox and category selector.
- void refreshSearch();
-
- static void onCommitAny(LLUICtrl* ctrl, void *userdata);
- static void onClickSet(void* userdata);
- static void onClickClear(void* userdata);
-
-private:
- LLCheckBoxCtrl* mCheckEditObjects;
- LLCheckBoxCtrl* mCheckEditGroupObjects;
- LLCheckBoxCtrl* mCheckAllObjectEntry;
- LLCheckBoxCtrl* mCheckGroupObjectEntry;
- LLCheckBoxCtrl* mCheckSafe;
- LLCheckBoxCtrl* mCheckFly;
- LLCheckBoxCtrl* mCheckGroupScripts;
- LLCheckBoxCtrl* mCheckOtherScripts;
-
- LLCheckBoxCtrl* mCheckShowDirectory;
- LLComboBox* mCategoryCombo;
- LLComboBox* mLandingTypeCombo;
-
- LLTextureCtrl* mSnapshotCtrl;
-
- LLTextBox* mLocationText;
- LLButton* mSetBtn;
- LLButton* mClearBtn;
-
- LLCheckBoxCtrl *mMatureCtrl;
- LLCheckBoxCtrl *mPushRestrictionCtrl;
- LLCheckBoxCtrl *mSeeAvatarsCtrl;
-
- LLSafeHandle<LLParcelSelection>& mParcel;
-};
-
-
-class LLPanelLandAccess
-: public LLPanel
-{
-public:
- LLPanelLandAccess(LLSafeHandle<LLParcelSelection>& parcelp);
- virtual ~LLPanelLandAccess();
- void refresh();
- void refresh_ui();
- void refreshNames();
- virtual void draw();
-
- static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);
- static void onCommitAny(LLUICtrl* ctrl, void *userdata);
- static void onClickRemoveAccess(void*);
- static void onClickRemoveBanned(void*);
-
- virtual BOOL postBuild();
-
- void onClickAddAccess();
- void onClickAddBanned();
- void callbackAvatarCBBanned(const uuid_vec_t& ids);
- void callbackAvatarCBAccess(const uuid_vec_t& ids);
-
-protected:
- LLNameListCtrl* mListAccess;
- LLNameListCtrl* mListBanned;
-
- LLSafeHandle<LLParcelSelection>& mParcel;
-};
-
-
class LLPanelLandCovenant
: public LLPanel
{
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index d65661c6e9..7037f5b2fd 100755
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -3555,26 +3555,28 @@ void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok)
BOOL LLPanelRegionExperiences::postBuild()
{
- mAllowed = setupList("panel_allowed");
- mTrusted = setupList("panel_trusted");
- mBlocked = setupList("panel_blocked");
+ mAllowed = setupList("panel_allowed", ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE);
+ mTrusted = setupList("panel_trusted", ESTATE_EXPERIENCE_BLOCKED_ADD, ESTATE_EXPERIENCE_BLOCKED_REMOVE);
+ mBlocked = setupList("panel_blocked", ESTATE_EXPERIENCE_TRUSTED_ADD, ESTATE_EXPERIENCE_TRUSTED_REMOVE);
- mAllowed->setAddedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, ESTATE_EXPERIENCE_ALLOWED_ADD, _1));
- mAllowed->setRemovedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, ESTATE_EXPERIENCE_ALLOWED_REMOVE, _1));
- mBlocked->setAddedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, ESTATE_EXPERIENCE_BLOCKED_ADD, _1));
- mBlocked->setRemovedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, ESTATE_EXPERIENCE_BLOCKED_REMOVE, _1));
- mTrusted->setAddedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, ESTATE_EXPERIENCE_TRUSTED_ADD, _1));
- mTrusted->setRemovedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, ESTATE_EXPERIENCE_TRUSTED_REMOVE, _1));
+ getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(TRUE);
+ getChild<LLTextBox>("experiences_help_text")->setText(getString("estate_caption"));
+ getChild<LLTextBox>("trusted_text_help")->setText(getString("trusted_estate_text"));
+ getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_estate_text"));
+ getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_estate_text"));
return LLPanelRegionInfo::postBuild();
}
-LLPanelExperienceListEditor* LLPanelRegionExperiences::setupList( const char* control_name )
+LLPanelExperienceListEditor* LLPanelRegionExperiences::setupList( const char* control_name, U32 add_id, U32 remove_id )
{
LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name);
if(child)
{
- child->getChild<LLTextBox>("text_name")->setText(getString(control_name));
+ child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name));
+ child->setMaxExperienceIDs(ESTATE_MAX_EXPERIENCE_IDS);
+ child->setAddedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, add_id, _1));
+ child->setRemovedCallback(boost::bind(&LLPanelRegionExperiences::itemChanged, this, remove_id, _1));
}
return child;
@@ -3600,18 +3602,10 @@ void LLPanelRegionExperiences::processResponse( const LLSD& content )
mTrusted->setExperienceIds(trusted);
- if (!mAllowed->getReadonly())
- {
- mAllowed->refreshExperienceCounter("RegionInfoAllowedExperiences");
- }
- if (!mBlocked->getReadonly())
- {
- mBlocked->refreshExperienceCounter("RegionInfoBlockedExperiences");
- }
- if (!mTrusted->getReadonly())
- {
- mTrusted->refreshExperienceCounter("RegionInfoTrustedExperiences");
- }
+ mAllowed->refreshExperienceCounter();
+ mBlocked->refreshExperienceCounter();
+ mTrusted->refreshExperienceCounter();
+
}
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 2020cbce2b..79e2837336 100755
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -470,7 +470,7 @@ public:
private:
void refreshRegionExperiences();
- LLPanelExperienceListEditor* setupList(const char* control_name);
+ LLPanelExperienceListEditor* setupList(const char* control_name, U32 add_id, U32 remove_id);
static LLSD addIds( LLPanelExperienceListEditor* panel );
void itemChanged(U32 event_type, const LLUUID& id);
diff --git a/indra/newview/llpanelexperiencelisteditor.cpp b/indra/newview/llpanelexperiencelisteditor.cpp
index 323adbe2b7..6641483054 100644
--- a/indra/newview/llpanelexperiencelisteditor.cpp
+++ b/indra/newview/llpanelexperiencelisteditor.cpp
@@ -48,6 +48,7 @@ LLPanelExperienceListEditor::LLPanelExperienceListEditor()
,mProfile(NULL)
,mRemove(NULL)
,mReadonly(false)
+ ,mMaxExperienceIDs(0)
{
}
@@ -229,12 +230,15 @@ void LLPanelExperienceListEditor::setReadonly( bool val )
checkButtonsEnabled();
}
-void LLPanelExperienceListEditor::refreshExperienceCounter(std::string string_name)
+void LLPanelExperienceListEditor::refreshExperienceCounter()
{
- LLStringUtil::format_map_t args;
- args["[EXPERIENCES]"] = llformat("%d", mItems->getItemCount());
- args["[MAXEXPERIENCES]"] = llformat("%d", ESTATE_MAX_EXPERIENCE_IDS);
- getChild<LLTextBox>("text_name")->setText(LLTrans::getString(string_name, args));
+ if(mMaxExperienceIDs > 0)
+ {
+ LLStringUtil::format_map_t args;
+ args["[EXPERIENCES]"] = llformat("%d", mItems->getItemCount());
+ args["[MAXEXPERIENCES]"] = llformat("%d", mMaxExperienceIDs);
+ getChild<LLTextBox>("text_count")->setText(LLTrans::getString("ExperiencesCounter", args));
+ }
}
boost::signals2::connection LLPanelExperienceListEditor::setAddedCallback( list_changed_signal_t::slot_type cb )
diff --git a/indra/newview/llpanelexperiencelisteditor.h b/indra/newview/llpanelexperiencelisteditor.h
index 189d81f897..f69f0509be 100644
--- a/indra/newview/llpanelexperiencelisteditor.h
+++ b/indra/newview/llpanelexperiencelisteditor.h
@@ -62,10 +62,12 @@ public:
bool getReadonly() const { return mReadonly; }
void setReadonly(bool val);
- void refreshExperienceCounter(std::string string_name);
+ void refreshExperienceCounter();
void addFilter(experience_function func){mFilters.push_back(func);}
void setStickyFunction(experience_function func){mSticky = func;}
+ U32 getMaxExperienceIDs() const { return mMaxExperienceIDs; }
+ void setMaxExperienceIDs(U32 val) { mMaxExperienceIDs = val; }
private:
void onItems();
@@ -91,6 +93,7 @@ private:
LLUUID mKey;
bool mReadonly;
experience_function mSticky;
+ U32 mMaxExperienceIDs;
};
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 6303e67ed3..e2c4bad313 100755
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -218,11 +218,7 @@ public:
// Takes an Access List flag, like AL_ACCESS or AL_BAN
void sendParcelAccessListUpdate(U32 which);
-
- static void sendParcelAccessListUpdate(U32 flags, const std::map<LLUUID, class LLAccessEntry>& entries, LLViewerRegion* region, S32 parcel_local_id);
- static void sendParcelExperienceUpdate( const U32 flags, uuid_vec_t experience_ids, LLViewerRegion* region, S32 parcel_local_id );
-
-
+
// Takes an Access List flag, like AL_ACCESS or AL_BAN
void sendParcelAccessListRequest(U32 flags);
@@ -295,6 +291,8 @@ public:
static BOOL isParcelModifiableByAgent(const LLParcel* parcelp, U64 group_proxy_power);
private:
+ static void sendParcelAccessListUpdate(U32 flags, const std::map<LLUUID, class LLAccessEntry>& entries, LLViewerRegion* region, S32 parcel_local_id);
+ static void sendParcelExperienceUpdate( const U32 flags, uuid_vec_t experience_ids, LLViewerRegion* region, S32 parcel_local_id );
static bool releaseAlertCB(const LLSD& notification, const LLSD& response);
// If the user is claiming land and the current selection
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index a660e812cc..68f981f34f 100755
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -8,7 +8,7 @@
help_topic="floaterland"
save_rect="true"
title="ABOUT LAND"
- width="490">
+ width="590">
<floater.string
name="maturity_icon_general">
"Parcel_PG_Dark"
@@ -47,7 +47,7 @@
tab_height="25"
tab_min_width="67"
top="10"
- width="489">
+ width="589">
<panel
border="false"
follows="all"
@@ -569,8 +569,7 @@
left="0"
top="0"
help_topic="land_covenant_tab"
- name="land_covenant_panel"
- word_wrap="true">
+ name="land_covenant_panel">
<panel.string
name="can_resell"
word_wrap="true">
@@ -2096,5 +2095,17 @@ Only large parcels can be listed in search.
width="100" />
</panel>
</panel>
+ <panel
+ border="true"
+ follows="all"
+ label="EXPERIENCES"
+ layout="topleft"
+ left="0"
+ top="0"
+ help_topic="land_experiences_tab"
+ name="land_experiences_panel"
+ class="land_experiences_panel"
+ filename="panel_region_experiences.xml">
+ </panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/en/panel_experience_list_editor.xml
index acd9471916..128c721992 100644
--- a/indra/newview/skins/default/xui/en/panel_experience_list_editor.xml
+++ b/indra/newview/skins/default/xui/en/panel_experience_list_editor.xml
@@ -13,26 +13,46 @@
name="loading">
loading...
</panel.string>
+ <panel.string
+ name="panel_allowed">
+ Allowed Experiences:
+ </panel.string>
+ <panel.string
+ name="panel_blocked">
+ Blocked Experiences:
+ </panel.string>
+ <panel.string
+ name="panel_trusted">
+ Trusted Experiences:
+ </panel.string>
<panel.string
name="no_results">
(empty)
</panel.string>
- <text
- layout="topleft"
- name="text_name"
- left="3"
- right="-1"
- height="12"
- follows="left|top|right">
- Experience List
- </text>
+ <text
+ layout="topleft"
+ name="text_name"
+ left="3"
+ right="120"
+ height="12"
+ follows="left|top">
+ Experience List
+ </text>
+ <text
+ layout="topleft"
+ name="text_count"
+ left="125"
+ top_pad="-12"
+ right="-1"
+ height="12"
+ follows="top|left">
+ </text>
<scroll_list
draw_heading="false"
left="3"
width="225"
height="77"
follows="all"
- can_resize="false"
name="experience_list">
<columns
width="225"
diff --git a/indra/newview/skins/default/xui/en/panel_region_experiences.xml b/indra/newview/skins/default/xui/en/panel_region_experiences.xml
index b0ef3284f1..ea57bdd164 100644
--- a/indra/newview/skins/default/xui/en/panel_region_experiences.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_experiences.xml
@@ -10,44 +10,67 @@
left="0"
top="320"
width="480">
- <panel.string
- name="panel_allowed">
- Allowed Experiences
- </panel.string>
- <panel.string
- name="panel_blocked">
- Blocked Experiences
- </panel.string>
- <panel.string
- name="panel_trusted">
- Trusted Experiences
- </panel.string>
+ <panel.string
+ name="trusted_estate_text">
+Any Experience may be Trusted.
+
+Trusted Experiences have permission to run on this estate.
+
+Additionally, if the estate does not allow public access, Residents participating in any Trusted Experience may enter the estate and can remain as long as they are in the Experience.
+ </panel.string>
+ <panel.string
+ name="allowed_estate_text">
+Only Experiences that are not Grid-Wide may be Allowed.
- <text
- type="string"
- length="1"
- follows="left|top"
- height="32"
- layout="topleft"
- left="10"
- name="experiences_help_text"
- top="14"
- word_wrap="true">
- Changes to settings on this tab will affect all regions in the estate.
- </text>
+Allowed Experiences have permission to run on this estate.
+ </panel.string>
+ <panel.string
+ name="blocked_estate_text">
+Only Grid-Wide Experiences may be Blocked.
+
+Blocked Experiences may not run on this estate.
+ </panel.string>
+ <panel.string
+ name="estate_caption">
+ Changes to settings on this tab will affect all regions in the estate.
+ </panel.string>
+ <panel.string
+ name="allowed_parcel_text">Only Experiences that are not Grid-Wide may be Allowed.
+
+Allowed Experiences have permission to run on this parcel if they are not Blocked by the estate.
+ </panel.string>
+ <panel.string
+ name="blocked_parcel_text">Only Grid-Wide Experiences may be Blocked.
+
+Blocked Experiences may not run on this parcel.
+ </panel.string>
+ <panel.string
+ name="parcel_caption">
+ </panel.string>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="32"
+ layout="topleft"
+ left="10"
+ name="experiences_help_text"
+ top="14"
+ word_wrap="true"/>
<layout_stack
left="5"
layout="topleft"
follows="all"
- top="40"
right="-5"
- height="280"
- min_height="140"
+ height="260"
orientation="vertical">
<layout_panel
- height="100"
- min_height="100"
- width="530">
+ follows="all"
+ height="50"
+ min_height="50"
+ width="530"
+ visible="false"
+ name="trusted_layout_panel">
<panel follows="all"
width="330"
name="panel_trusted"
@@ -63,16 +86,12 @@
height="200"
follows="top|right"
word_wrap="true">
- Trusted Experiences have permission to run on this estate.
-
-Additionally, if the estate does not allow public access, Residents participating in any Trusted Experience may enter the estate and can remain as long as they are in the Experience.
-
-Any Experience may be Trusted.
</text>
</layout_panel>
<layout_panel
- height="100"
- min_height="100"
+ height="50"
+ min_height="50"
+ follows="all"
width="530">
<panel
width="330"
@@ -89,14 +108,12 @@ Any Experience may be Trusted.
height="200"
follows="top|right"
word_wrap="true">
- Allowed Experiences have permission to run on this estate.
-
-Only Experiences that are not Grid-Wide may be Allowed.
</text>
</layout_panel>
<layout_panel
- height="100"
- min_height="100"
+ height="50"
+ min_height="50"
+ follows="all"
width="530">
<panel
width="330"
@@ -113,9 +130,6 @@ Only Experiences that are not Grid-Wide may be Allowed.
height="200"
follows="top|right"
word_wrap="true">
- Blocked Experiences may not run on this estate.
-
-Only Grid-Wide Experiences may be Blocked.
</text>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml
index 9e429234d3..df38a7c9c8 100755
--- a/indra/newview/skins/default/xui/en/role_actions.xml
+++ b/indra/newview/skins/default/xui/en/role_actions.xml
@@ -194,9 +194,9 @@
longdescription="Members in a role with this ability can edit the meta-data for an experience."
name="experience admin"
value ="49" />
- <action description="Experience Creator"
- longdescription="Members in a role with this ability can create scripts for an experience."
- name="experience creator"
+ <action description="Experience Contributor"
+ longdescription="Members in a role with this ability can contribute scripts for an experience."
+ name="experience contributor"
value ="50" />
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index ef6877b5fa..72b41f922e 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3997,9 +3997,7 @@ Try enclosing path to the editor with double quotes.
<string name="Admin_Experiences_Tab">ADMIN</string>
<string name="Recent_Experiences_Tab">RECENT</string>
<string name="Owned_Experiences_Tab">OWNED</string>
- <string name="RegionInfoAllowedExperiences">Allowed Experiences: ([EXPERIENCES], max [MAXEXPERIENCES])</string>
- <string name="RegionInfoBlockedExperiences">Blocked Experiences: ([EXPERIENCES], max [MAXEXPERIENCES])</string>
- <string name="RegionInfoTrustedExperiences">Trusted Experiences: ([EXPERIENCES], max [MAXEXPERIENCES])</string>
+ <string name="ExperiencesCounter">([EXPERIENCES], max [MAXEXPERIENCES])</string>
<string name="ExperiencePermission1">take over your controls</string>
<string name="ExperiencePermission3">trigger animations on your avatar</string>
<string name="ExperiencePermission4">attach to your avatar</string>