diff options
| author | prep <prep@lindenlab.com> | 2013-04-08 17:10:46 -0400 | 
|---|---|---|
| committer | prep <prep@lindenlab.com> | 2013-04-08 17:10:46 -0400 | 
| commit | 985b7277e824c39275d9a06c6262b6f394b02133 (patch) | |
| tree | 8abf593f00f19912b6fe03a2129e73b20111c9d4 | |
| parent | beeefb45269f45ea717f58b30a0985951ae23c20 (diff) | |
WIP SH-4035: confirmation when closing appearance window when changes present
| -rw-r--r-- | indra/newview/llfloatersidepanelcontainer.cpp | 16 | ||||
| -rw-r--r-- | indra/newview/llfloatersidepanelcontainer.h | 2 | ||||
| -rw-r--r-- | indra/newview/llinspectavatar.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llsidepanelappearance.cpp | 88 | ||||
| -rw-r--r-- | indra/newview/llsidepanelappearance.h | 16 | ||||
| -rw-r--r-- | indra/newview/llspeakers.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/notifications.xml | 13 | 
7 files changed, 126 insertions, 19 deletions
| diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 5f9556a870..b1f9a18d6f 100644 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -67,15 +67,17 @@ void LLFloaterSidePanelContainer::onClickCloseBtn()  		if (parent == this )  		{  			LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance")); -			if ( panel_appearance ) -			{ -				panel_appearance->getWearable()->onClose(); -				panel_appearance->showOutfitsInventoryPanel(); -			} +			panel_appearance->onClose(this);			  		}  	} -	 -	LLFloater::onClickCloseBtn(); +	else +	{ +		LLFloater::onClickCloseBtn(); +	} +} +void LLFloaterSidePanelContainer::close() +{ +		LLFloater::onClickCloseBtn();  }  LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params) diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 491723471f..940673b643 100644 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -55,6 +55,8 @@ public:  	LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params); +	void close(); +  	static void showPanel(const std::string& floater_name, const LLSD& key);  	static void showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key); diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 0b3268eb54..6ff16742dd 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -292,10 +292,7 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)  	delete mPropertiesRequest;  	mPropertiesRequest = NULL;  } -/* -prep# -	virtual void httpFailure() -	*/ +  void LLInspectAvatar::updateVolumeSlider()  { diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 74fa5a87bb..53b5593ac9 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -48,6 +48,8 @@  #include "llviewerregion.h"  #include "llvoavatarself.h"  #include "llviewerwearable.h" +#include "llnotificationsutil.h" +#include "llfloatersidepanelcontainer.h"  static LLRegisterPanelClassWrapper<LLSidepanelAppearance> t_appearance("sidepanel_appearance"); @@ -70,13 +72,84 @@ private:  	LLSidepanelAppearance *mPanel;  }; +bool LLSidepanelAppearance::callBackExitWithoutSaveViaBack(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if ( option == 0 )  +	{		 +		gSavedSettings.setBOOL("ExitOutfitEditWithoutSave", TRUE);		 +		LLAppearanceMgr::instance().setOutfitDirty( true );		 +		showOutfitsInventoryPanel(); +		LLAppearanceMgr::getInstance()->wearBaseOutfit();		 +		return true; +	} +	gSavedSettings.setBOOL("ExitOutfitEditWithoutSave", FALSE); +	return false; +} + +bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if ( option == 0 )  +	{		 +		gSavedSettings.setBOOL("ExitOutfitEditWithoutSave", TRUE); +		mEditWearable->revertChanges(); +		LLAppearanceMgr::getInstance()->wearBaseOutfit(); +		mLLFloaterSidePanelContainer->close(); +		return true; +	} +	gSavedSettings.setBOOL("ExitOutfitEditWithoutSave", FALSE);	 +	return false; +} + +void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaClose() +{ +	if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !LLAppearanceMgr::getInstance()->isOutfitLocked() ) +	{ +		LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; +		LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveViaClose,pSelf,_1,_2) ); +	} +	else +	{ +		showOutfitsInventoryPanel(); +	} +} + +void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaBack() +{ +	if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !mSidePanelJustOpened && !LLAppearanceMgr::getInstance()->isOutfitLocked() ) +	{ +		LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; +		LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveViaBack,pSelf,_1,_2) ); +	} +	else +	{ +		showOutfitsInventoryPanel(); +	} +} + +void LLSidepanelAppearance::onClose(LLFloaterSidePanelContainer* obj) +{ +	mLLFloaterSidePanelContainer = obj; +	if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !LLAppearanceMgr::getInstance()->isOutfitLocked() ) +	{ +		LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; +		LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveViaClose,pSelf,_1,_2) ); +	} +	else +	{ +		mLLFloaterSidePanelContainer->close(); +	} +} +  LLSidepanelAppearance::LLSidepanelAppearance() :  	LLPanel(),  	mFilterSubString(LLStringUtil::null),  	mFilterEditor(NULL),  	mOutfitEdit(NULL),  	mCurrOutfitPanel(NULL), -	mOpened(false) +	mOpened(false), +	mSidePanelJustOpened(true)  {  	LLOutfitObserver& outfit_observer =  LLOutfitObserver::instance();  	outfit_observer.addBOFReplacedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, "")); @@ -85,6 +158,8 @@ LLSidepanelAppearance::LLSidepanelAppearance() :  	gAgentWearables.addLoadingStartedCallback(boost::bind(&LLSidepanelAppearance::setWearablesLoading, this, true));  	gAgentWearables.addLoadedCallback(boost::bind(&LLSidepanelAppearance::setWearablesLoading, this, false)); + +  }  LLSidepanelAppearance::~LLSidepanelAppearance() @@ -119,8 +194,8 @@ BOOL LLSidepanelAppearance::postBuild()  	{  		LLButton* back_btn = mOutfitEdit->getChild<LLButton>("back_btn");  		if (back_btn) -		{ -			back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::showOutfitsInventoryPanel, this)); +		{			 +			back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaBack, this));  		}  	} @@ -144,6 +219,7 @@ BOOL LLSidepanelAppearance::postBuild()  	setVisibleCallback(boost::bind(&LLSidepanelAppearance::onVisibilityChange,this,_2)); +  	return TRUE;  } @@ -183,6 +259,12 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)  void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)  { +	//handle leaving and subsequent user verification of discarding any unsaved data +	if ( mSidePanelJustOpened ) +	{ +		mSidePanelJustOpened = false; +	} +  	LLSD visibility;  	visibility["visible"] = new_visibility.asBoolean();  	visibility["reset_accordion"] = false; diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 762f557a80..85e7734567 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -38,9 +38,11 @@ class LLCurrentlyWornFetchObserver;  class LLPanelEditWearable;  class LLViewerWearable;  class LLPanelOutfitsInventory; +class LLFloaterSidePanelContainer;  class LLSidepanelAppearance : public LLPanel -{ +{	 +  	LOG_CLASS(LLSidepanelAppearance);  public:  	LLSidepanelAppearance(); @@ -48,6 +50,8 @@ public:  	/*virtual*/ BOOL postBuild();  	/*virtual*/ void onOpen(const LLSD& key);	 +				void onClose(LLFloaterSidePanelContainer* obj); +	void onClickCloseBtn();  	void refreshCurrentOutfitName(const std::string& name = ""); @@ -65,6 +69,11 @@ public:  	void updateScrollingPanelList();  	void updateToVisibility( const LLSD& new_visibility );  	LLPanelEditWearable* getWearable(){ return mEditWearable; } +	bool callBackExitWithoutSaveViaBack(const LLSD& notification, const LLSD& response); +	void onClickConfirmExitWithoutSaveViaBack(); +	bool callBackExitWithoutSaveViaClose(const LLSD& notification, const LLSD& response); +	void onClickConfirmExitWithoutSaveViaClose(); +  private:  	void onFilterEdit(const std::string& search_string); @@ -85,6 +94,7 @@ private:  	LLButton*					mOpenOutfitBtn;  	LLButton*					mEditAppearanceBtn;  	LLButton*					mNewOutfitBtn; +	  	LLPanel*					mCurrOutfitPanel;  	LLTextBox*					mCurrentLookName; @@ -99,6 +109,10 @@ private:  	// Gets set to true when we're opened for the first time.  	bool mOpened; +	// Set to true if sidepanel has just been opened +	bool mSidePanelJustOpened; +	LLFloaterSidePanelContainer* mLLFloaterSidePanelContainer; +  };  #endif //LL_LLSIDEPANELAPPEARANCE_H diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 3c3c699d17..bf209df863 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -855,10 +855,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)  		}  	}  } -/*prep# -	virtual void httpFailure() -		llwarns << dumpResponse() << llendl; -		*/ +  void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id)  {  	LLPointer<LLSpeaker> speakerp = findSpeaker(speaker_id); diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 105bef7321..2170283af2 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -10030,5 +10030,18 @@ Cannot create large prims that intersect other players.  Please re-try when othe       name="okignore"       yestext="OK"/>    </notification> + + +  <notification +   icon="alertmodal.tga" +   name="ConfirmExitWithoutSave" +   type="alertmodal"> +    Closing this window will discard any changes you have made. +    <tag>confirm</tag> +    <usetemplate +     name="okcancelbuttons" +     notext="Cancel" +     yestext="OK"/> +  </notification>  </notifications> | 
