summaryrefslogtreecommitdiff
path: root/indra/newview/llfloaterexperienceprofile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llfloaterexperienceprofile.cpp')
-rw-r--r--indra/newview/llfloaterexperienceprofile.cpp353
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));
+ }
+}