ACME-1459: Experience tab added to the about land tab for editing parcel Experiences

meow-7.2.2
dolphin 2014-05-16 15:52:39 -07:00
parent 9a7458f9e3
commit 4c7b0cb528
14 changed files with 633 additions and 451 deletions

View File

@ -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));
}

View File

@ -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);

View File

@ -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()
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());
}
// 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)
{
LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
if(land_instance)
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
if (!region)
return;
LLStyle::Params style;
U8 sim_access = region->getSimAccess();
switch(sim_access)
{
return land_instance->mPanelObjects;
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;
case SIM_ACCESS_MATURE:
style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_moderate")));
break;
default:
break;
}
size_t maturity_pos = str_to_parse.find(MATURITY);
if (maturity_pos == std::string::npos)
{
return;
}
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);
target_textbox->appendImageSegment(style);
target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false);
target_textbox->appendText(text_after_rating, false);
}
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
{
return NULL;
}
}
//static
LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant()
{
LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
if(land_instance)
{
return land_instance->mPanelCovenant;
}
else
{
return NULL;
}
}
// static
void LLFloaterLand::refreshAll()
{
LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
if(land_instance)
{
land_instance->refresh();
}
}
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);
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();
}
void LLFloaterLand::onVisibilityChanged(const LLSD& visible)
{
if (!visible.asBoolean())
{
// Might have been showing owned objects
LLSelectMgr::getInstance()->unhighlightAll();
// Save which panel we had open
sLastTab = mTabLand->getCurrentPanelIndex();
}
}
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);
sObserver = new LLParcelSelectionObserver();
LLViewerParcelMgr::getInstance()->addObserver( sObserver );
}
BOOL LLFloaterLand::postBuild()
{
setVisibleCallback(boost::bind(&LLFloaterLand::onVisibilityChanged, this, _2));
LLTabContainer* tab = getChild<LLTabContainer>("landtab");
mTabLand = (LLTabContainer*) tab;
if (tab)
{
tab->selectTab(sLastTab);
msg->nextBlockFast(_PREHASH_OwnerIDs);
msg->addUUIDFast(_PREHASH_OwnerID, LLUUID::null);
}
return TRUE;
msg->sendReliable(region->getHost());
}
// 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();
}
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;
}
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)
return;
public:
LLPanelLandExperiences(LLSafeHandle<LLParcelSelection>& parcelp);
virtual BOOL postBuild();
void refresh();
LLStyle::Params style;
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);
U8 sim_access = region->getSimAccess();
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;
case SIM_ACCESS_MATURE:
style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_moderate")));
break;
default:
break;
}
size_t maturity_pos = str_to_parse.find(MATURITY);
LLSafeHandle<LLParcelSelection>& mParcel;
if (maturity_pos == std::string::npos)
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;
}
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);
target_textbox->appendImageSegment(style);
target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false);
target_textbox->appendText(text_after_rating, false);
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();
}
void LLPanelLandExperiences::refresh()
{
refreshPanel(mAllowed, EXPERIENCE_KEY_TYPE_ALLOWED);
refreshPanel(mBlocked, EXPERIENCE_KEY_TYPE_BLOCKED);
}
LLParcel* LLFloaterLand::getCurrentSelectedParcel()
{
return mParcel->getParcel();
};
//static
LLPanelLandObjects* LLFloaterLand::getCurrentPanelLandObjects()
{
LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
if(land_instance)
{
return land_instance->mPanelObjects;
}
else
{
return NULL;
}
}
//static
LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant()
{
LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
if(land_instance)
{
return land_instance->mPanelCovenant;
}
else
{
return NULL;
}
}
// static
void LLFloaterLand::refreshAll()
{
LLFloaterLand* land_instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land");
if(land_instance)
{
land_instance->refresh();
}
}
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);
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();
}
void LLFloaterLand::onVisibilityChanged(const LLSD& visible)
{
if (!visible.asBoolean())
{
// Might have been showing owned objects
LLSelectMgr::getInstance()->unhighlightAll();
// Save which panel we had open
sLastTab = mTabLand->getCurrentPanelIndex();
}
}
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);
sObserver = new LLParcelSelectionObserver();
LLViewerParcelMgr::getInstance()->addObserver( sObserver );
}
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;
}

View File

@ -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
{

View File

@ -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();
}

View File

@ -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);

View File

@ -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 )

View File

@ -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;
};

View File

@ -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

View File

@ -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>

View File

@ -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"

View File

@ -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.
<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>
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.
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>

View File

@ -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>

View File

@ -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>