From 985b7277e824c39275d9a06c6262b6f394b02133 Mon Sep 17 00:00:00 2001 From: prep Date: Mon, 8 Apr 2013 17:10:46 -0400 Subject: WIP SH-4035: confirmation when closing appearance window when changes present --- indra/newview/llsidepanelappearance.cpp | 88 +++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 3 deletions(-) (limited to 'indra/newview/llsidepanelappearance.cpp') 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 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("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; -- cgit v1.3 From 67790d0dd8fec2750906ae3d3fed1e735be6b078 Mon Sep 17 00:00:00 2001 From: "prep@lindenlab.com" Date: Tue, 9 Apr 2013 15:14:51 -0500 Subject: SH-4035: Bug fix to handle closing the panel when editing a specific wearable --- indra/newview/llsidepanelappearance.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 53b5593ac9..3899450804 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -131,7 +131,9 @@ void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaBack() void LLSidepanelAppearance::onClose(LLFloaterSidePanelContainer* obj) { mLLFloaterSidePanelContainer = obj; - if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !LLAppearanceMgr::getInstance()->isOutfitLocked() ) + if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && + !LLAppearanceMgr::getInstance()->isOutfitLocked() || + ( mEditWearable->isAvailable() && mEditWearable->isDirty() ) ) { LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveViaClose,pSelf,_1,_2) ); -- cgit v1.3 From 24fa7736dd123429425d91b2b72c3b3b7110b764 Mon Sep 17 00:00:00 2001 From: "prep@lindenlab.com" Date: Tue, 9 Apr 2013 15:30:51 -0500 Subject: SH-4035: Removed unneeded functional call --- indra/newview/llsidepanelappearance.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 3899450804..ae6ceabdaa 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -93,7 +93,6 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notifica if ( option == 0 ) { gSavedSettings.setBOOL("ExitOutfitEditWithoutSave", TRUE); - mEditWearable->revertChanges(); LLAppearanceMgr::getInstance()->wearBaseOutfit(); mLLFloaterSidePanelContainer->close(); return true; -- cgit v1.3 From 2798c355c441f8d92a02537eca6e253c8fbf2bc4 Mon Sep 17 00:00:00 2001 From: "prep@lindenlab.com" Date: Wed, 10 Apr 2013 16:53:46 -0500 Subject: SH-4035:Added ignore message to notification --- indra/newview/llsidepanelappearance.cpp | 6 +----- indra/newview/skins/default/xui/en/notifications.xml | 7 ++++--- 2 files changed, 5 insertions(+), 8 deletions(-) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index ae6ceabdaa..6d2b643434 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -77,13 +77,11 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaBack(const LLSD& notificat 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; } @@ -91,13 +89,11 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notifica { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if ( option == 0 ) - { - gSavedSettings.setBOOL("ExitOutfitEditWithoutSave", TRUE); + { LLAppearanceMgr::getInstance()->wearBaseOutfit(); mLLFloaterSidePanelContainer->close(); return true; } - gSavedSettings.setBOOL("ExitOutfitEditWithoutSave", FALSE); return false; } diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 2170283af2..1ff63c6def 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -10039,9 +10039,10 @@ Cannot create large prims that intersect other players. Please re-try when othe Closing this window will discard any changes you have made. confirm + yestext="OK" + ignoretext="Don't show me this again."/> - + -- cgit v1.3 From 766daa73a29d34cb3410c033fc99bfc156844c92 Mon Sep 17 00:00:00 2001 From: "prep@lindenlab.com" Date: Fri, 12 Apr 2013 10:09:44 -0500 Subject: Sh-4035: Fix for skin changes not being reverted after cancel --- indra/newview/llsidepanelappearance.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 6d2b643434..7b89e0617b 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -90,6 +90,7 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notifica S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if ( option == 0 ) { + mEditWearable->revertChanges(); LLAppearanceMgr::getInstance()->wearBaseOutfit(); mLLFloaterSidePanelContainer->close(); return true; -- cgit v1.3 From 0a413e1dc82bbe18c5c9fe510b10e33f8fb0a93c Mon Sep 17 00:00:00 2001 From: "prep@lindenlab.com" Date: Tue, 16 Apr 2013 11:54:16 -0500 Subject: Fix for SH-4108 - observer does not see the outfit change when closing appearance panel. --- indra/newview/llsidepanelappearance.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 7b89e0617b..3c21219dc1 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -136,6 +136,7 @@ void LLSidepanelAppearance::onClose(LLFloaterSidePanelContainer* obj) } else { + LLVOAvatarSelf::onCustomizeEnd(FALSE); mLLFloaterSidePanelContainer->close(); } } -- cgit v1.3 From 392f561b6c28aede2b61bc9cc2cc75de587926b6 Mon Sep 17 00:00:00 2001 From: prep Date: Wed, 17 Apr 2013 11:08:40 -0400 Subject: Fix for SH-4123: outfit update corrected for edit/save/abandon sequence --- indra/newview/llsidepanelappearance.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 3c21219dc1..75da23b558 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -90,8 +90,9 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notifica S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if ( option == 0 ) { + //revert curernt edits mEditWearable->revertChanges(); - LLAppearanceMgr::getInstance()->wearBaseOutfit(); + LLVOAvatarSelf::onCustomizeEnd(FALSE); mLLFloaterSidePanelContainer->close(); return true; } -- cgit v1.3 From b29e6f656eb28d557ef4488a022b6757a58d29e1 Mon Sep 17 00:00:00 2001 From: prep Date: Wed, 17 Apr 2013 11:32:49 -0400 Subject: Fix for SH-4124: Closing appearance panel also closes the edit wearable panel if it was active --- indra/newview/llsidepanelappearance.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 75da23b558..77e9604460 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -92,6 +92,7 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notifica { //revert curernt edits mEditWearable->revertChanges(); + toggleWearableEditPanel(FALSE); LLVOAvatarSelf::onCustomizeEnd(FALSE); mLLFloaterSidePanelContainer->close(); return true; @@ -138,6 +139,7 @@ void LLSidepanelAppearance::onClose(LLFloaterSidePanelContainer* obj) else { LLVOAvatarSelf::onCustomizeEnd(FALSE); + toggleWearableEditPanel(FALSE); mLLFloaterSidePanelContainer->close(); } } -- cgit v1.3 From 3f1d360a04c4e4d8f07b7e93cd926961ae379430 Mon Sep 17 00:00:00 2001 From: "prep@lindenlab.com" Date: Fri, 10 May 2013 13:57:02 -0500 Subject: SH-4035: Removed prompt to save if av just has outfit changes. Hooked up logic to handle ctrl+w and ctrl+shift+w confirmation prompts --- indra/llui/llfloater.cpp | 31 +++++++++++++++++++++---- indra/llui/llfloater.h | 3 ++- indra/llui/llpanel.cpp | 22 ++++++++++++++++-- indra/llui/llpanel.h | 10 +++++++- indra/newview/llfloatersidepanelcontainer.cpp | 33 +++++++++++++++++++++++++++ indra/newview/llfloatersidepanelcontainer.h | 3 ++- indra/newview/llsidepanelappearance.cpp | 22 ++++++++++-------- 7 files changed, 104 insertions(+), 20 deletions(-) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 09e27a264a..28dfda8faf 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -704,9 +704,15 @@ void LLFloater::openFloater(const LLSD& key) dirtyRect(); } +void LLFloater::verifyClose() +{ + LLPanel::handleCloseConfirmation(); +} + void LLFloater::closeFloater(bool app_quitting) { llinfos << "Closing floater " << getName() << llendl; + if (app_quitting) { LLFloater::sQuitting = true; @@ -781,7 +787,7 @@ void LLFloater::closeFloater(bool app_quitting) dirtyRect(); // Close callbacks - onClose(app_quitting); + onClose(app_quitting); mCloseSignal(this, LLSD(app_quitting)); // Hide or Destroy @@ -1788,11 +1794,19 @@ void LLFloater::initRectControl() void LLFloater::closeFrontmostFloater() { LLFloater* floater_to_close = gFloaterView->getFrontmostClosableFloater(); - if(floater_to_close) + if( floater_to_close ) { - floater_to_close->closeFloater(); + if ( floater_to_close->mVerifyUponClose ) + { + floater_to_close->verifyClose(); + //Closing of the window handle in the subclass - so bug out here. + return; + } + else + { + floater_to_close->closeFloater(); + } } - // if nothing took focus after closing focused floater // give it to next floater (to allow closing multiple windows via keyboard in rapid succession) if (gFocusMgr.getKeyboardFocus() == NULL) @@ -2631,7 +2645,14 @@ void LLFloaterView::closeAllChildren(bool app_quitting) if (floaterp->canClose() && !floaterp->isDead() && (app_quitting || floaterp->getVisible())) { - floaterp->closeFloater(app_quitting); + if ( floaterp->mVerifyUponClose ) + { + floaterp->verifyClose(); + } + else + { + floaterp->closeFloater(app_quitting); + } } } } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 4dba1e645f..bf71b527b3 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -225,6 +225,7 @@ public: // If allowed, close the floater cleanly, releasing focus. virtual void closeFloater(bool app_quitting = false); + virtual void verifyClose(); // Close the floater or its host. Use when hidding or toggling a floater instance. virtual void closeHostedFloater(); @@ -303,7 +304,7 @@ public: /*virtual*/ void setVisible(BOOL visible); // do not override /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); // do not override - + void handleCloseConfirmation( ); void setFrontmost(BOOL take_focus = TRUE); virtual void setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD()); diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 67472ad166..01165a5718 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -114,7 +114,9 @@ LLPanel::LLPanel(const LLPanel::Params& p) mCommitCallbackRegistrar(false), mEnableCallbackRegistrar(false), mXMLFilename(p.filename), - mVisibleSignal(NULL) + mVisibleSignal(NULL), + mCloseConfirmationSignal(NULL), + mVerifyUponClose(false) // *NOTE: Be sure to also change LLPanel::initFromParams(). We have too // many classes derived from LLPanel to retrofit them all to pass in params. { @@ -127,6 +129,7 @@ LLPanel::LLPanel(const LLPanel::Params& p) LLPanel::~LLPanel() { delete mVisibleSignal; + delete mCloseConfirmationSignal; } // virtual @@ -349,6 +352,14 @@ void LLPanel::handleVisibilityChange ( BOOL new_visibility ) (*mVisibleSignal)(this, LLSD(new_visibility) ); // Pass BOOL as LLSD } + +void LLPanel::handleCloseConfirmation( ) +{ + if (mCloseConfirmationSignal) + { + (*mCloseConfirmationSignal)(this, LLSD() ); + } +} void LLPanel::setFocus(BOOL b) { if( b && !hasFocus()) @@ -959,10 +970,17 @@ boost::signals2::connection LLPanel::setVisibleCallback( const commit_signal_t:: { mVisibleSignal = new commit_signal_t(); } - return mVisibleSignal->connect(cb); } +boost::signals2::connection LLPanel::setCloseConfirmationCallback( const commit_signal_t::slot_type& cb ) +{ + if (!mCloseConfirmationSignal) + { + mCloseConfirmationSignal = new commit_signal_t(); + } + return mCloseConfirmationSignal->connect(cb); +} static LLFastTimer::DeclareTimer FTM_BUILD_PANELS("Build Panels"); //----------------------------------------------------------------------------- diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index e63b41f97c..1b0beaa5c8 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -116,6 +116,8 @@ public: /*virtual*/ void draw(); /*virtual*/ BOOL handleKeyHere( KEY key, MASK mask ); /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); + void handleCloseConfirmation( ); + // From LLFocusableElement /*virtual*/ void setFocus( BOOL b ); @@ -251,6 +253,10 @@ public: std::string getXMLFilename() { return mXMLFilename; }; boost::signals2::connection setVisibleCallback( const commit_signal_t::slot_type& cb ); + boost::signals2::connection setCloseConfirmationCallback( const commit_signal_t::slot_type& cb ); + +public: + const BOOL confirmClose() const { return mVerifyUponClose; } protected: // Override to set not found list @@ -260,6 +266,7 @@ protected: EnableCallbackRegistry::ScopedRegistrar mEnableCallbackRegistrar; commit_signal_t* mVisibleSignal; // Called when visibility changes, passes new visibility as LLSD() + commit_signal_t* mCloseConfirmationSignal; std::string mHelpTopic; // the name of this panel's help topic to display in the Help Viewer typedef std::deque factory_stack_t; @@ -267,7 +274,8 @@ protected: // for setting the xml filename when building panel in context dependent cases std::string mXMLFilename; - + //Specific close-down logic in subclass + BOOL mVerifyUponClose; private: BOOL mBgVisible; // any background at all? BOOL mBgOpaque; // use opaque color or image diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 4dd558c9c0..43ee54ecd2 100644 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -45,6 +45,39 @@ LLFloaterSidePanelContainer::LLFloaterSidePanelContainer(const LLSD& key, const // Prevent transient floaters (e.g. IM windows) from hiding // when this floater is clicked. LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this); + //We want this container to handle the shutdown logic of the sidepanelappearance. + mVerifyUponClose = TRUE; +} + +BOOL LLFloaterSidePanelContainer::postBuild() +{ + setCloseConfirmationCallback( boost::bind(&LLFloaterSidePanelContainer::onConfirmationClose,this,_2)); + return TRUE; +} + +void LLFloaterSidePanelContainer::onConfirmationClose( const LLSD &confirm ) +{ + /* + LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); + if (panel_outfit_edit) + { + LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit); + if (parent == this ) + { + LLSidepanelAppearance* panel_appearance = dynamic_cast(getPanel("appearance")); + panel_appearance->onClose(this); + } + else + { + LLFloater::onClickCloseBtn(); + } + } + else + { + LLFloater::onClickCloseBtn(); + } + */ + onClickCloseBtn(); } LLFloaterSidePanelContainer::~LLFloaterSidePanelContainer() diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 940673b643..26fc092200 100644 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -50,8 +50,9 @@ public: ~LLFloaterSidePanelContainer(); /*virtual*/ void onOpen(const LLSD& key); - /*virtual*/ void onClickCloseBtn(); + /*virtual*/ BOOL postBuild(); + void onConfirmationClose( const LLSD &confirm ); LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 77e9604460..f77275fd1c 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -90,11 +90,12 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notifica S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if ( option == 0 ) { - //revert curernt edits - mEditWearable->revertChanges(); - toggleWearableEditPanel(FALSE); - LLVOAvatarSelf::onCustomizeEnd(FALSE); - mLLFloaterSidePanelContainer->close(); + //revert current edits + mEditWearable->revertChanges(); + //LLAppearanceMgr::getInstance()->wearBaseOutfit(); + toggleWearableEditPanel(FALSE); + LLVOAvatarSelf::onCustomizeEnd( FALSE ); + mLLFloaterSidePanelContainer->close(); return true; } return false; @@ -115,7 +116,7 @@ void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaClose() void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaBack() { - if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !mSidePanelJustOpened && !LLAppearanceMgr::getInstance()->isOutfitLocked() ) + if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !mSidePanelJustOpened /*&& !LLAppearanceMgr::getInstance()->isOutfitLocked()*/ ) { LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveViaBack,pSelf,_1,_2) ); @@ -128,9 +129,9 @@ void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaBack() void LLSidepanelAppearance::onClose(LLFloaterSidePanelContainer* obj) { - mLLFloaterSidePanelContainer = obj; - if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && - !LLAppearanceMgr::getInstance()->isOutfitLocked() || + mLLFloaterSidePanelContainer = obj; + if ( /*LLAppearanceMgr::getInstance()->isOutfitDirty() && */ + /*!LLAppearanceMgr::getInstance()->isOutfitLocked() ||*/ ( mEditWearable->isAvailable() && mEditWearable->isDirty() ) ) { LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; @@ -275,8 +276,9 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility) void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility) { - if (new_visibility["visible"].asBoolean()) + if (new_visibility["visible"].asBoolean() ) { + const BOOL is_outfit_edit_visible = mOutfitEdit && mOutfitEdit->getVisible(); const BOOL is_wearable_edit_visible = mEditWearable && mEditWearable->getVisible(); -- cgit v1.3 From 69df2f1b0430dc00519b08bd2f0abd6712d3d2bc Mon Sep 17 00:00:00 2001 From: "prep@lindenlab.com" Date: Mon, 13 May 2013 11:54:37 -0500 Subject: SH-4035: Hooked up logic to handle 'me->appearance'. Refactored out some commonly used code in llfloatersidepanelcontainer --- indra/newview/llfloatersidepanelcontainer.cpp | 83 +++++++++++++++------------ indra/newview/llfloatersidepanelcontainer.h | 5 ++ indra/newview/llsidepanelappearance.cpp | 34 +++++++++++ indra/newview/llsidepanelappearance.h | 4 +- 4 files changed, 87 insertions(+), 39 deletions(-) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 43ee54ecd2..3ea39cf196 100644 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -56,30 +56,11 @@ BOOL LLFloaterSidePanelContainer::postBuild() } void LLFloaterSidePanelContainer::onConfirmationClose( const LLSD &confirm ) -{ - /* - LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); - if (panel_outfit_edit) - { - LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit); - if (parent == this ) - { - LLSidepanelAppearance* panel_appearance = dynamic_cast(getPanel("appearance")); - panel_appearance->onClose(this); - } - else - { - LLFloater::onClickCloseBtn(); - } - } - else - { - LLFloater::onClickCloseBtn(); - } - */ +{ onClickCloseBtn(); } + LLFloaterSidePanelContainer::~LLFloaterSidePanelContainer() { LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this); @@ -92,20 +73,10 @@ void LLFloaterSidePanelContainer::onOpen(const LLSD& key) void LLFloaterSidePanelContainer::onClickCloseBtn() { - LLPanelOutfitEdit* panel_outfit_edit = - dynamic_cast(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); - if (panel_outfit_edit) + LLSidepanelAppearance* panel = getSidePanelAppearance(); + if ( panel ) { - LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit); - if (parent == this ) - { - LLSidepanelAppearance* panel_appearance = dynamic_cast(getPanel("appearance")); - panel_appearance->onClose(this); - } - else - { - LLFloater::onClickCloseBtn(); - } + panel->onClose( this ); } else { @@ -114,7 +85,7 @@ void LLFloaterSidePanelContainer::onClickCloseBtn() } void LLFloaterSidePanelContainer::close() { - LLFloater::onClickCloseBtn(); + LLFloater::onClickCloseBtn(); } LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params) @@ -124,7 +95,7 @@ LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_na if (!getVisible()) { - openFloater(); + openFloater(); } LLPanel* panel = NULL; @@ -145,10 +116,30 @@ LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_na void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, const LLSD& key) { - LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance(floater_name); + //If we're already open then check whether anything is dirty + LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance(floater_name); if (floaterp) { - floaterp->openChildPanel(sMainPanelName, key); + if ( floaterp->getVisible() ) + { + LLSidepanelAppearance* panel = floaterp->getSidePanelAppearance(); + if ( panel ) + { + if ( panel->checkForDirtyEdits() ) + { + panel->onClickConfirmExitWithoutSaveIntoAppearance(); + } + else + { + //or a call into some new f() that just shows inv panel? + floaterp->openChildPanel(sMainPanelName, key); + } + } + } + else + { + floaterp->openChildPanel(sMainPanelName, key); + } } } @@ -172,3 +163,19 @@ LLPanel* LLFloaterSidePanelContainer::getPanel(const std::string& floater_name, return NULL; } + +LLSidepanelAppearance* LLFloaterSidePanelContainer::getSidePanelAppearance() +{ + LLSidepanelAppearance* panel_appearance = NULL; + LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); + if (panel_outfit_edit) + { + LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit); + if (parent == this ) + { + panel_appearance = dynamic_cast(getPanel("appearance")); + } + } + return panel_appearance; + +} \ No newline at end of file diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 26fc092200..974934b48f 100644 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -30,6 +30,8 @@ #include "llfloater.h" +class LLSidepanelAppearance; + /** * Class LLFloaterSidePanelContainer * @@ -81,6 +83,9 @@ public: } return panel; } + +private: + LLSidepanelAppearance* getSidePanelAppearance(); }; #endif // LL_LLFLOATERSIDEPANELCONTAINER_H diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index f77275fd1c..cf759dd8f7 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -114,6 +114,35 @@ void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaClose() } } + +bool LLSidepanelAppearance::callBackExitWithoutSaveIntoAppearance(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if ( option == 0 ) + { + //revert current edits + mEditWearable->revertChanges(); + toggleWearableEditPanel(FALSE); + LLVOAvatarSelf::onCustomizeEnd( FALSE ); + //mLLFloaterSidePanelContainer->close(); + showOutfitsInventoryPanel(); + return true; + } + return false; +} + +void LLSidepanelAppearance::onClickConfirmExitWithoutSaveIntoAppearance() +{ + if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !LLAppearanceMgr::getInstance()->isOutfitLocked() ) + { + LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; + LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveIntoAppearance,pSelf,_1,_2) ); + } + else + { + showOutfitsInventoryPanel(); + } +} void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaBack() { if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !mSidePanelJustOpened /*&& !LLAppearanceMgr::getInstance()->isOutfitLocked()*/ ) @@ -629,3 +658,8 @@ void LLSidepanelAppearance::updateScrollingPanelList() mEditWearable->updateScrollingPanelList(); } } + +bool LLSidepanelAppearance::checkForDirtyEdits() +{ + return ( mEditWearable->isDirty() ) ? true : false; +} \ No newline at end of file diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 85e7734567..caf5be62e9 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -73,7 +73,9 @@ public: void onClickConfirmExitWithoutSaveViaBack(); bool callBackExitWithoutSaveViaClose(const LLSD& notification, const LLSD& response); void onClickConfirmExitWithoutSaveViaClose(); - + bool checkForDirtyEdits(); + bool callBackExitWithoutSaveIntoAppearance(const LLSD& notification, const LLSD& response); + void onClickConfirmExitWithoutSaveIntoAppearance(); private: void onFilterEdit(const std::string& search_string); -- cgit v1.3 From b7161fcd58853fb60900e51a4ac221b02941905e Mon Sep 17 00:00:00 2001 From: "prep@lindenlab.com" Date: Mon, 13 May 2013 16:03:22 -0500 Subject: SH-4035: Removed prompt to save if av just has outfit changes and you click on the back button --- indra/newview/llsidepanelappearance.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index cf759dd8f7..1b56aff3b6 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -145,12 +145,14 @@ void LLSidepanelAppearance::onClickConfirmExitWithoutSaveIntoAppearance() } void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaBack() { - if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !mSidePanelJustOpened /*&& !LLAppearanceMgr::getInstance()->isOutfitLocked()*/ ) + /* + 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(); } -- cgit v1.3 From c498f53d9ab02a41886b55762883d116801fd39b Mon Sep 17 00:00:00 2001 From: "prep@lindenlab.com" Date: Tue, 28 May 2013 11:51:11 -0500 Subject: Sh-4035: Updated implementation according to new specs. Fixed a couple of outstanding bugs. --- indra/llui/llfloater.cpp | 12 ++ indra/llui/llpanel.cpp | 3 +- indra/llui/llpanel.h | 5 +- indra/newview/llfloatersidepanelcontainer.cpp | 13 ++- indra/newview/llfloatersidepanelcontainer.h | 3 + indra/newview/llsidepanelappearance.cpp | 125 ++++++++++++--------- indra/newview/llsidepanelappearance.h | 14 ++- .../newview/skins/default/xui/en/notifications.xml | 30 ++++- 8 files changed, 139 insertions(+), 66 deletions(-) (limited to 'indra/newview/llsidepanelappearance.cpp') diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 28dfda8faf..ae4961559e 100755 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -713,6 +713,18 @@ void LLFloater::closeFloater(bool app_quitting) { llinfos << "Closing floater " << getName() << llendl; + if (!app_quitting) + { + if ( mVerifyUponClose && !mForceCloseAfterVerify ) + { + onClose( app_quitting ); + if ( mForceCloseAfterVerify ) + { + return; + } + } + } + if (app_quitting) { LLFloater::sQuitting = true; diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 01165a5718..7b7920f866 100755 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -116,7 +116,8 @@ LLPanel::LLPanel(const LLPanel::Params& p) mXMLFilename(p.filename), mVisibleSignal(NULL), mCloseConfirmationSignal(NULL), - mVerifyUponClose(false) + mVerifyUponClose(false), + mForceCloseAfterVerify(false) // *NOTE: Be sure to also change LLPanel::initFromParams(). We have too // many classes derived from LLPanel to retrofit them all to pass in params. { diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index 1b0beaa5c8..d48fab6dd9 100755 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -255,8 +255,6 @@ public: boost::signals2::connection setVisibleCallback( const commit_signal_t::slot_type& cb ); boost::signals2::connection setCloseConfirmationCallback( const commit_signal_t::slot_type& cb ); -public: - const BOOL confirmClose() const { return mVerifyUponClose; } protected: // Override to set not found list @@ -276,6 +274,9 @@ protected: std::string mXMLFilename; //Specific close-down logic in subclass BOOL mVerifyUponClose; +public: + BOOL mForceCloseAfterVerify; + private: BOOL mBgVisible; // any background at all? BOOL mBgOpaque; // use opaque color or image diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index d5bb8157cf..13a9ba1695 100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -70,7 +70,16 @@ void LLFloaterSidePanelContainer::onOpen(const LLSD& key) { getChild(sMainPanelName)->onOpen(key); } - +void LLFloaterSidePanelContainer::onClose(bool app_quitting) +{ + mForceCloseAfterVerify = true; + LLSidepanelAppearance* panel = getSidePanelAppearance(); + if ( panel ) + { + panel->mRevertSet = true; + panel->onCloseFromAppearance( this ); + } +} void LLFloaterSidePanelContainer::onClickCloseBtn() { LLSidepanelAppearance* panel = getSidePanelAppearance(); @@ -127,7 +136,7 @@ void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, con { if ( panel->checkForDirtyEdits() ) { - panel->onClickConfirmExitWithoutSaveIntoAppearance(); + panel->onClickConfirmExitWithoutSaveIntoAppearance( floaterp ); } else { diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 974934b48f..dc85570f7e 100755 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -44,6 +44,8 @@ class LLSidepanelAppearance; */ class LLFloaterSidePanelContainer : public LLFloater { + friend class LLSidePanelAppearance; + private: static const std::string sMainPanelName; @@ -52,6 +54,7 @@ public: ~LLFloaterSidePanelContainer(); /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void onClose(bool app_quitting); /*virtual*/ void onClickCloseBtn(); /*virtual*/ BOOL postBuild(); void onConfirmationClose( const LLSD &confirm ); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 858ed06544..70da576c83 100755 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -50,6 +50,7 @@ #include "llviewerwearable.h" #include "llnotificationsutil.h" #include "llfloatersidepanelcontainer.h" +#include "llviewerfoldertype.h" static LLRegisterPanelClassWrapper t_appearance("sidepanel_appearance"); @@ -85,58 +86,86 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaBack(const LLSD& notificat return false; } -bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notification, const LLSD& response) +void LLSidepanelAppearance::onCloseFromAppearance(LLFloaterSidePanelContainer* obj) { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if ( option == 0 ) - { - //revert current edits - mEditWearable->revertChanges(); - //LLAppearanceMgr::getInstance()->wearBaseOutfit(); - toggleWearableEditPanel(FALSE); - LLVOAvatarSelf::onCustomizeEnd( FALSE ); - mLLFloaterSidePanelContainer->close(); - return true; - } - return false; -} - -void LLSidepanelAppearance::onClickConfirmExitWithoutSaveViaClose() -{ - if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !LLAppearanceMgr::getInstance()->isOutfitLocked() ) + mLLFloaterSidePanelContainer = obj; + if ( mEditWearable->isAvailable() && mEditWearable->isDirty() ) { LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveViaClose,pSelf,_1,_2) ); } else - { - showOutfitsInventoryPanel(); + { + LLVOAvatarSelf::onCustomizeEnd(FALSE); + toggleWearableEditPanel(FALSE); + mLLFloaterSidePanelContainer->mForceCloseAfterVerify=false; } } - - -bool LLSidepanelAppearance::callBackExitWithoutSaveIntoAppearance(const LLSD& notification, const LLSD& response) +bool LLSidepanelAppearance::onSaveCommit(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (0 == option) + { + std::string outfit_name = response["message"].asString(); + LLStringUtil::trim(outfit_name); + std::string current_outfit_name; + + LLAppearanceMgr::getInstance()->getBaseOutfitName(current_outfit_name); + + if ( current_outfit_name == outfit_name ) + { + LLAppearanceMgr::getInstance()->updateBaseOutfit(); + } + else + { + LLUUID outfit_folder = LLAppearanceMgr::getInstance()->makeNewOutfitLinks( outfit_name,FALSE ); + } + + LLVOAvatarSelf::onCustomizeEnd( FALSE ); + mLLFloaterSidePanelContainer->close(); + } + + return false; +} +bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notification, const LLSD& response) +{ S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if ( option == 0 ) { - //revert current edits - mEditWearable->revertChanges(); - toggleWearableEditPanel(FALSE); + std::string outfit_name; + if (!LLAppearanceMgr::getInstance()->getBaseOutfitName(outfit_name)) + { + outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT); + } + + LLSD args; + args["DESC"] = outfit_name; + + LLSD payload; + LLNotificationsUtil::add("SaveOutfitEither", args, payload, boost::bind(&LLSidepanelAppearance::onSaveCommit, this, _1, _2)); + showOutfitEditPanel(); + return false; + } + else if ( option == 1 ) + { + mEditWearable->revertChanges(); + toggleWearableEditPanel(FALSE); + showOutfitEditPanel(); LLVOAvatarSelf::onCustomizeEnd( FALSE ); - //mLLFloaterSidePanelContainer->close(); - showOutfitsInventoryPanel(); - return true; + mRevertSet = true; + return false; } + mLLFloaterSidePanelContainer->mForceCloseAfterVerify = false; + //mRevertSet = true; return false; } -void LLSidepanelAppearance::onClickConfirmExitWithoutSaveIntoAppearance() +void LLSidepanelAppearance::onClickConfirmExitWithoutSaveIntoAppearance( LLFloaterSidePanelContainer* obj ) { - if ( LLAppearanceMgr::getInstance()->isOutfitDirty() && !LLAppearanceMgr::getInstance()->isOutfitLocked() ) + mLLFloaterSidePanelContainer = obj; + if ( LLAppearanceMgr::getInstance()->isOutfitDirty() || mEditWearable->isDirty() ) { LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; - LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveIntoAppearance,pSelf,_1,_2) ); + LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveViaClose,pSelf,_1,_2) ); } else { @@ -145,33 +174,19 @@ void LLSidepanelAppearance::onClickConfirmExitWithoutSaveIntoAppearance() } 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(); - } + showOutfitsInventoryPanel(); } void LLSidepanelAppearance::onClose(LLFloaterSidePanelContainer* obj) -{ - mLLFloaterSidePanelContainer = obj; - if ( /*LLAppearanceMgr::getInstance()->isOutfitDirty() && */ - /*!LLAppearanceMgr::getInstance()->isOutfitLocked() ||*/ - ( mEditWearable->isAvailable() && mEditWearable->isDirty() ) ) +{ mLLFloaterSidePanelContainer = obj; + if ( mEditWearable->isAvailable() && mEditWearable->isDirty() ) { LLSidepanelAppearance* pSelf = (LLSidepanelAppearance *)this; LLNotificationsUtil::add("ConfirmExitWithoutSave", LLSD(), LLSD(), boost::bind(&LLSidepanelAppearance::callBackExitWithoutSaveViaClose,pSelf,_1,_2) ); } else - { + { LLVOAvatarSelf::onCustomizeEnd(FALSE); - toggleWearableEditPanel(FALSE); mLLFloaterSidePanelContainer->close(); } } @@ -183,7 +198,8 @@ LLSidepanelAppearance::LLSidepanelAppearance() : mOutfitEdit(NULL), mCurrOutfitPanel(NULL), mOpened(false), - mSidePanelJustOpened(true) + mSidePanelJustOpened(true), + mRevertSet(false) { LLOutfitObserver& outfit_observer = LLOutfitObserver::instance(); outfit_observer.addBOFReplacedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, "")); @@ -264,11 +280,15 @@ void LLSidepanelAppearance::onOpen(const LLSD& key) { // No specific panel requested. // If we're opened for the first time then show My Outfits. - // Else do nothing. + // Else show outfit edit panel if (!mOpened) { showOutfitsInventoryPanel(); } + else + { + showOutfitEditPanel(); + } } else { @@ -665,3 +685,4 @@ bool LLSidepanelAppearance::checkForDirtyEdits() { return ( mEditWearable->isDirty() ) ? true : false; } + diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index caf5be62e9..5042e92f4b 100755 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -50,7 +50,8 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); - void onClose(LLFloaterSidePanelContainer* obj); + /*virtual*/ void onClose(LLFloaterSidePanelContainer* obj); + void onClickCloseBtn(); void refreshCurrentOutfitName(const std::string& name = ""); @@ -72,10 +73,9 @@ public: bool callBackExitWithoutSaveViaBack(const LLSD& notification, const LLSD& response); void onClickConfirmExitWithoutSaveViaBack(); bool callBackExitWithoutSaveViaClose(const LLSD& notification, const LLSD& response); - void onClickConfirmExitWithoutSaveViaClose(); bool checkForDirtyEdits(); - bool callBackExitWithoutSaveIntoAppearance(const LLSD& notification, const LLSD& response); - void onClickConfirmExitWithoutSaveIntoAppearance(); + void onClickConfirmExitWithoutSaveIntoAppearance(LLFloaterSidePanelContainer* obj); + void onCloseFromAppearance(LLFloaterSidePanelContainer* obj); private: void onFilterEdit(const std::string& search_string); @@ -88,6 +88,9 @@ private: void toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch = FALSE); void toggleWearableEditPanel(BOOL visible, LLViewerWearable* wearable = NULL, BOOL disable_camera_switch = FALSE); + + bool onSaveCommit(const LLSD& notification, const LLSD& response); + LLFilterEditor* mFilterEditor; LLPanelOutfitsInventory* mPanelOutfitsInventory; LLPanelOutfitEdit* mOutfitEdit; @@ -115,6 +118,9 @@ private: bool mSidePanelJustOpened; LLFloaterSidePanelContainer* mLLFloaterSidePanelContainer; +public: + + bool mRevertSet; }; #endif //LL_LLSIDEPANELAPPEARANCE_H diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 07c8ecc4dd..860dabdcc8 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -10118,13 +10118,33 @@ Cannot create large prims that intersect other players. Please re-try when othe icon="alertmodal.tga" name="ConfirmExitWithoutSave" type="alertmodal"> - Closing this window will discard any changes you have made. + You have not saved the changes to your outfit. Would you like to save it now? confirm + name="yesnocancelbuttons" + notext="Revert" + yestext="Yes" + canceltext="Dismiss"/> + + + + + Save outfit (defaults to current outfit): + confirm +
+ + [DESC] + +