diff options
-rwxr-xr-x | indra/llinventory/llparcel.cpp | 14 | ||||
-rwxr-xr-x | indra/llinventory/llparcel.h | 4 | ||||
-rwxr-xr-x | indra/newview/llfloaterland.cpp | 684 | ||||
-rwxr-xr-x | indra/newview/llfloaterland.h | 80 | ||||
-rwxr-xr-x | indra/newview/llfloaterregioninfo.cpp | 40 | ||||
-rwxr-xr-x | indra/newview/llfloaterregioninfo.h | 2 | ||||
-rw-r--r-- | indra/newview/llpanelexperiencelisteditor.cpp | 14 | ||||
-rw-r--r-- | indra/newview/llpanelexperiencelisteditor.h | 5 | ||||
-rwxr-xr-x | indra/newview/llviewerparcelmgr.h | 8 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/floater_about_land.xml | 19 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/panel_experience_list_editor.xml | 40 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/panel_region_experiences.xml | 104 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/role_actions.xml | 6 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/strings.xml | 4 |
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> |