diff options
Diffstat (limited to 'indra/newview/llfloaterexperienceprofile.cpp')
-rw-r--r-- | indra/newview/llfloaterexperienceprofile.cpp | 353 |
1 files changed, 297 insertions, 56 deletions
diff --git a/indra/newview/llfloaterexperienceprofile.cpp b/indra/newview/llfloaterexperienceprofile.cpp index 895fd5ee4d..292f6f0952 100644 --- a/indra/newview/llfloaterexperienceprofile.cpp +++ b/indra/newview/llfloaterexperienceprofile.cpp @@ -27,19 +27,25 @@ #include "llviewerprecompiledheaders.h" +#include "llagent.h" #include "llexpandabletextbox.h" #include "llexperiencecache.h" #include "llfloaterexperienceprofile.h" #include "llfloaterreg.h" +#include "llhttpclient.h" #include "lllayoutstack.h" #include "llsdserialize.h" #include "llslurl.h" +#include "lltabcontainer.h" #include "lltextbox.h" #include "lltexturectrl.h" #include "lltrans.h" #include "llviewerregion.h" -#include "llagent.h" -#include "llhttpclient.h" +#include "lllineeditor.h" +#include "llcombobox.h" +#include "llcheckboxctrl.h" +#include "llnotificationsutil.h" +#include "llappviewer.h" #define XML_PANEL_EXPERIENCE_PROFILE "floater_experienceprofile.xml" #define TF_NAME "experience_title" @@ -48,6 +54,7 @@ #define TF_MRKT "marketplace" #define TF_MATURITY "ContentRatingText" #define TF_OWNER "OwnerText" +#define EDIT "edit_" #define IMG_LOGO "logo" @@ -60,6 +67,10 @@ #define BTN_ALLOW "allow_btn" #define BTN_FORGET "forget_btn" #define BTN_BLOCK "block_btn" +#define BTN_CANCEL "cancel_btn" +#define BTN_SAVE "save_btn" +#define BTN_ENABLE "enable_btn" +#define BTN_PRIVATE "private_btn" LLFloaterExperienceProfile::LLFloaterExperienceProfile(const LLSD& data) @@ -69,78 +80,97 @@ LLFloaterExperienceProfile::LLFloaterExperienceProfile(const LLSD& data) , mDescriptionPanel(NULL) , mLocationPanel(NULL) , mMarketplacePanel(NULL) + , mSaveCompleteAction(NOTHING) + , mDirty(false) + , mForceClose(false) { } + LLFloaterExperienceProfile::~LLFloaterExperienceProfile() { } -class ExperiencePreferencesResponder : public LLHTTPClient::Responder +template<class T> +class HandleResponder : public LLHTTPClient::Responder { public: - ExperiencePreferencesResponder(const LLHandle<LLFloaterExperienceProfile>& parent):mParent(parent) + HandleResponder(const LLHandle<T>& parent):mParent(parent){} + LLHandle<T> mParent; + + virtual void error(U32 status, const std::string& reason) { + llwarns << "HandleResponder failed with code: " << status<< ", reason: " << reason << llendl; } +}; - LLHandle<LLFloaterExperienceProfile> mParent; +class ExperienceUpdateResponder : public HandleResponder<LLFloaterExperienceProfile> +{ +public: + ExperienceUpdateResponder(const LLHandle<LLFloaterExperienceProfile>& parent):HandleResponder(parent) + { + } virtual void result(const LLSD& content) { LLFloaterExperienceProfile* parent=mParent.get(); if(parent) { - parent->setPreferences(content); + parent->onSaveComplete(content); } } - virtual void error(U32 status, const std::string& reason) - { - lldebugs << "ExperiencePreferencesResponder failed with code: " << status<< ", reason: " << reason << llendl; - } }; -class IsAdminResponder : public LLHTTPClient::Responder + +class ExperiencePreferencesResponder : public HandleResponder<LLFloaterExperienceProfile> { public: - IsAdminResponder(const LLHandle<LLFloaterExperienceProfile>& parent):mParent(parent) + ExperiencePreferencesResponder(const LLHandle<LLFloaterExperienceProfile>& parent):HandleResponder(parent) + { + } + + + virtual void result(const LLSD& content) { + LLFloaterExperienceProfile* parent=mParent.get(); + if(parent) + { + parent->setPreferences(content); + } } +}; - LLHandle<LLFloaterExperienceProfile> mParent; +class IsAdminResponder : public HandleResponder<LLFloaterExperienceProfile> +{ +public: + IsAdminResponder(const LLHandle<LLFloaterExperienceProfile>& parent):HandleResponder(parent) + { + } + virtual void result(const LLSD& content) { LLFloaterExperienceProfile* parent = mParent.get(); if(!parent) return; - - LLButton* edit=parent->getChild<LLButton>(BTN_EDIT); - if(content.has("experience_ids")) + bool enabled = true; + LLViewerRegion* region = gAgent.getRegion(); + if (!region) { - LLUUID id=parent->getKey().asUUID(); - const LLSD& xp_ids = content["experience_ids"]; - LLSD::array_const_iterator it = xp_ids.beginArray(); - while(it != xp_ids.endArray()) - { - if(it->asUUID() == id) - { - edit->setVisible(TRUE); - return; - } - ++it; - } + enabled = false; } - edit->setVisible(FALSE); - - //parent->getChild<LLButton>(BTN_EDIT)->setVisible(content["status"].asBoolean()); - } - virtual void error(U32 status, const std::string& reason) - { - lldebugs << "IsAdminResponder failed with code: " << status<< ", reason: " << reason << llendl; + else + { + std::string url=region->getCapability("UpdateExperience"); + if(url.empty()) + enabled = false; + } + + parent->getChild<LLButton>(BTN_EDIT)->setVisible(enabled && content["status"].asBoolean()); } }; @@ -160,16 +190,10 @@ BOOL LLFloaterExperienceProfile::postBuild() LLViewerRegion* region = gAgent.getRegion(); if (region) { - // std::string lookup_url=region->getCapability("IsExperienceAdmin"); - // if(!lookup_url.empty()) - // { - // LLHTTPClient::get(lookup_url+"/"+mExperienceId.asString(), new IsAdminResponder(getDerivedHandle<LLFloaterExperienceProfile>())); - // } - - std::string lookup_url=region->getCapability("GetAdminExperiences"); + std::string lookup_url=region->getCapability("IsExperienceAdmin"); if(!lookup_url.empty()) { - LLHTTPClient::get(lookup_url, new IsAdminResponder(getDerivedHandle<LLFloaterExperienceProfile>())); + LLHTTPClient::get(lookup_url+"?experience_id="+mExperienceId.asString(), new IsAdminResponder(getDerivedHandle<LLFloaterExperienceProfile>())); } lookup_url=region->getCapability("ExperiencePreferences"); @@ -180,14 +204,25 @@ BOOL LLFloaterExperienceProfile::postBuild() } } - - - childSetAction(BTN_EDIT, boost::bind(&LLFloaterExperienceProfile::onClickEdit, this)); childSetAction(BTN_ALLOW, boost::bind(&LLFloaterExperienceProfile::onClickPermission, this, "Allow")); childSetAction(BTN_FORGET, boost::bind(&LLFloaterExperienceProfile::onClickForget, this)); childSetAction(BTN_BLOCK, boost::bind(&LLFloaterExperienceProfile::onClickPermission, this, "Block")); + childSetAction(BTN_CANCEL, boost::bind(&LLFloaterExperienceProfile::onClickCancel, this)); + childSetAction(BTN_SAVE, boost::bind(&LLFloaterExperienceProfile::onClickSave, this)); + + + getChild<LLUICtrl>(EDIT TF_NAME)->setCommitCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this)); + getChild<LLUICtrl>(EDIT TF_DESC)->setCommitCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this)); + getChild<LLUICtrl>(EDIT TF_SLURL)->setCommitCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this)); + getChild<LLUICtrl>(EDIT TF_MATURITY)->setCommitCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this)); + getChild<LLUICtrl>(EDIT TF_MRKT)->setCommitCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this)); + getChild<LLLineEditor>(EDIT TF_NAME)->setCommitCallback(boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this)); + childSetAction(EDIT BTN_ENABLE, boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this)); + childSetAction(EDIT BTN_PRIVATE, boost::bind(&LLFloaterExperienceProfile::onFieldChanged, this)); + getChild<LLTextEditor>(EDIT TF_DESC)->setCommitOnFocusLost(TRUE); + return TRUE; } @@ -202,7 +237,20 @@ void LLFloaterExperienceProfile::experienceCallback(LLHandle<LLFloaterExperience void LLFloaterExperienceProfile::onClickEdit() { + LLTabContainer* tabs = getChild<LLTabContainer>("tab_container"); + + tabs->selectTabByName("edit_panel_experience_info"); +} + + +void LLFloaterExperienceProfile::onClickCancel() +{ + changeToView(); +} +void LLFloaterExperienceProfile::onClickSave() +{ + doSave(NOTHING); } @@ -238,7 +286,7 @@ void LLFloaterExperienceProfile::onClickForget() LLHTTPClient::del(lookup_url+"?"+mExperienceId.asString(), new ExperiencePreferencesResponder(getDerivedHandle<LLFloaterExperienceProfile>())); } -bool LLFloaterExperienceProfile::setMaturityString( U8 maturity, LLTextBox* child ) +bool LLFloaterExperienceProfile::setMaturityString( U8 maturity, LLTextBox* child, LLComboBox* combo ) { LLStyle::Params style; std::string access; @@ -246,16 +294,19 @@ bool LLFloaterExperienceProfile::setMaturityString( U8 maturity, LLTextBox* chil { style.image(LLUI::getUIImage(getString("maturity_icon_general"))); access = LLTrans::getString("SIM_ACCESS_PG"); + combo->setCurrentByIndex(2); } else if(maturity <= SIM_ACCESS_MATURE) { style.image(LLUI::getUIImage(getString("maturity_icon_moderate"))); access = LLTrans::getString("SIM_ACCESS_MATURE"); + combo->setCurrentByIndex(1); } else if(maturity <= SIM_ACCESS_ADULT) { style.image(LLUI::getUIImage(getString("maturity_icon_adult"))); access = LLTrans::getString("SIM_ACCESS_ADULT"); + combo->setCurrentByIndex(0); } else { @@ -286,29 +337,38 @@ void LLFloaterExperienceProfile::refreshExperience( const LLSD& experience ) LLTextBox* child = getChild<LLTextBox>(TF_NAME); child->setText(experience[LLExperienceCache::NAME].asString()); - + + LLLineEditor* linechild = getChild<LLLineEditor>(EDIT TF_NAME); + linechild->setText(experience[LLExperienceCache::NAME].asString()); + std::string value = experience[LLExperienceCache::DESCRIPTION].asString(); LLExpandableTextBox* exchild = getChild<LLExpandableTextBox>(TF_DESC); exchild->setText(value); mDescriptionPanel->setVisible(value.length()>0); + + LLTextEditor* edit_child = getChild<LLTextEditor>(EDIT TF_DESC); + edit_child->setText(value); value = experience[LLExperienceCache::SLURL].asString(); child = getChild<LLTextBox>(TF_SLURL); child->setText(value); mLocationPanel->setVisible(value.length()>0); + + linechild = getChild<LLLineEditor>(EDIT TF_SLURL); + linechild->setText(value); - child = getChild<LLTextBox>(TF_MATURITY); - setMaturityString((U8)(experience[LLExperienceCache::MATURITY].asInteger()), child); + setMaturityString((U8)(experience[LLExperienceCache::MATURITY].asInteger()), getChild<LLTextBox>(TF_MATURITY), getChild<LLComboBox>(EDIT TF_MATURITY)); child = getChild<LLTextBox>(TF_OWNER); - LLUUID id = experience[LLExperienceCache::OWNER_ID].asUUID(); - if(experience[LLExperienceCache::GROUP_ID].asUUID() == id) + LLUUID id = experience[LLExperienceCache::GROUP_ID].asUUID(); + if(id.notNull()) { value = LLSLURL("group", id, "inspect").getSLURLString(); } else { + id = experience[LLExperienceCache::AGENT_ID].asUUID(); value = LLSLURL("agent", id, "inspect").getSLURLString(); } child->setText(value); @@ -324,6 +384,7 @@ void LLFloaterExperienceProfile::refreshExperience( const LLSD& experience ) std::istringstream is(value); if(LLSDParser::PARSE_FAILURE != parser->parse(is, data, value.size())) { + value=""; if(data.has(TF_MRKT)) { value=data[TF_MRKT].asString(); @@ -336,21 +397,31 @@ void LLFloaterExperienceProfile::refreshExperience( const LLSD& experience ) { mMarketplacePanel->setVisible(FALSE); } + + linechild = getChild<LLLineEditor>(EDIT TF_MRKT); + linechild->setText(value); if(data.has(IMG_LOGO)) { LLTextureCtrl* logo = getChild<LLTextureCtrl>(IMG_LOGO); logo->setImageAssetID(data[IMG_LOGO].asUUID()); mImagePanel->setVisible(TRUE); + + logo = getChild<LLTextureCtrl>(EDIT IMG_LOGO); + logo->setImageAssetID(data[IMG_LOGO].asUUID()); } } - - - + LLCheckBoxCtrl* enable = getChild<LLCheckBoxCtrl>(EDIT BTN_ENABLE); + enable->set( 0 == (mExperienceDetails[LLExperienceCache::PROPERTIES].asInteger() & LLExperienceCache::PROPERTY_DISABLED)); + enable = getChild<LLCheckBoxCtrl>(EDIT BTN_PRIVATE); + enable->set( 0 != (mExperienceDetails[LLExperienceCache::PROPERTIES].asInteger() & LLExperienceCache::PROPERTY_PRIVATE)); - + mDirty=false; + setCanClose(!mDirty); + + getChild<LLButton>(BTN_SAVE)->setEnabled(mDirty); } void LLFloaterExperienceProfile::setPreferences( const LLSD& content ) @@ -402,3 +473,173 @@ void LLFloaterExperienceProfile::setPreferences( const LLSD& content ) button=getChild<LLButton>(BTN_BLOCK); button->setEnabled(TRUE); } + +void LLFloaterExperienceProfile::onFieldChanged() +{ + mDirty=true; + setCanClose(!mDirty); + getChild<LLButton>(BTN_SAVE)->setEnabled(mDirty); +} + + +BOOL LLFloaterExperienceProfile::canClose() +{ + if(mForceClose || !mDirty) + { + return TRUE; + } + else + { + // Bring up view-modal dialog: Save changes? Yes, No, Cancel + LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLFloaterExperienceProfile::handleSaveChangesDialog, this, _1, _2, CLOSE)); + return FALSE; + } +} + +bool LLFloaterExperienceProfile::handleSaveChangesDialog( const LLSD& notification, const LLSD& response, int action ) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + switch( option ) + { + case 0: // "Yes" + // close after saving + doSave( action ); + break; + + case 1: // "No" + if(action != NOTHING) + { + mForceClose = TRUE; + if(action==CLOSE) + { + closeFloater(); + } + else + { + changeToView(); + } + } + break; + + case 2: // "Cancel" + default: + // If we were quitting, we didn't really mean it. + LLAppViewer::instance()->abortQuit(); + break; + } + return false; +} + +void LLFloaterExperienceProfile::doSave( int success_action ) +{ + mSaveCompleteAction=success_action; + + LLViewerRegion* region = gAgent.getRegion(); + if (!region) + return; + + std::string url=region->getCapability("UpdateExperience"); + if(url.empty()) + return; + + LLSD package=mExperienceDetails; + + package[LLExperienceCache::NAME] = getChild<LLLineEditor>(EDIT TF_NAME)->getText(); + package[LLExperienceCache::DESCRIPTION] = getChild<LLTextEditor>(EDIT TF_DESC)->getText(); + package[LLExperienceCache::SLURL] = getChild<LLLineEditor>(EDIT TF_SLURL)->getText(); + + package[LLExperienceCache::MATURITY] = getChild<LLComboBox>(EDIT TF_MATURITY)->getSelectedValue().asInteger(); + + LLSD metadata; + + metadata[TF_MRKT] = getChild<LLLineEditor>(EDIT TF_MRKT)->getText(); + metadata[IMG_LOGO] = getChild<LLTextureCtrl>(EDIT IMG_LOGO)->getImageAssetID(); + + LLPointer<LLSDXMLFormatter> formatter = new LLSDXMLFormatter(); + + std::ostringstream os; + if(formatter->format(metadata, os)) + { + package[LLExperienceCache::METADATA]=os.str(); + } + + int properties = package[LLExperienceCache::PROPERTIES].asInteger(); + LLCheckBoxCtrl* enable = getChild<LLCheckBoxCtrl>(EDIT BTN_ENABLE); + if(enable->get()) + { + properties &= ~LLExperienceCache::PROPERTY_DISABLED; + } + else + { + properties |= LLExperienceCache::PROPERTY_DISABLED; + } + + enable = getChild<LLCheckBoxCtrl>(EDIT BTN_PRIVATE); + if(enable->get()) + { + properties |= LLExperienceCache::PROPERTY_PRIVATE; + } + else + { + properties &= ~LLExperienceCache::PROPERTY_PRIVATE; + } + + package[LLExperienceCache::PROPERTIES] = properties; + + LLHTTPClient::post(url, package, new ExperienceUpdateResponder(getDerivedHandle<LLFloaterExperienceProfile>())); +} + +void LLFloaterExperienceProfile::onSaveComplete( const LLSD& content ) +{ + LLUUID id = getExperienceId(); + + if(!content.has("experience_keys")) + { + llwarns << "LLFloaterExperienceProfile::onSaveComplete called with bad content" << llendl; + return; + } + + const LLSD& experiences = content["experience_keys"]; + + LLSD::array_const_iterator it = experiences.beginArray(); + if(it == experiences.endArray()) + { + llwarns << "LLFloaterExperienceProfile::onSaveComplete called with empty content" << llendl; + return; + } + + if(!it->has(LLExperienceCache::EXPERIENCE_ID) || ((*it)[LLExperienceCache::EXPERIENCE_ID].asUUID() != id)) + { + llwarns << "LLFloaterExperienceProfile::onSaveComplete called with unexpected experience id" << llendl; + return; + } + + refreshExperience(*it); + LLExperienceCache::fetch(id, true); + + if(mSaveCompleteAction==VIEW) + { + LLTabContainer* tabs = getChild<LLTabContainer>("tab_container"); + tabs->selectTabByName("panel_experience_info"); + } + else if(mSaveCompleteAction == CLOSE) + { + closeFloater(); + } +} + +void LLFloaterExperienceProfile::changeToView() +{ + if(mForceClose || !mDirty) + { + refreshExperience(mExperienceDetails); + LLTabContainer* tabs = getChild<LLTabContainer>("tab_container"); + + tabs->selectTabByName("panel_experience_info"); + } + else + { + // Bring up view-modal dialog: Save changes? Yes, No, Cancel + LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLFloaterExperienceProfile::handleSaveChangesDialog, this, _1, _2, VIEW)); + } +} |