diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 63b05f5a1decbddb2a26275c40effe52868c5a46..ff9cf3199edaa7845b8b528e592a53d86c5d9aa1 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -392,8 +392,6 @@ set(viewer_SOURCE_FILES
     llpanelplaceprofile.cpp
     llpanelplaces.cpp
     llpanelplacestab.cpp
-    llpanelpostprogress.cpp
-    llpanelpostresult.cpp
     llpanelprimmediacontrols.cpp
     llpanelprofile.cpp
     llpanelprofileview.cpp
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 08ca1e8ceae6e2137d93e12e72a3da94e3ae27f0..3df715e24b455db7cabe2c0f99168b319b820a88 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -86,7 +86,7 @@
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
 ///----------------------------------------------------------------------------
-LLRect LLFloaterSnapshot::sThumbnailPlaceholderRect;
+LLUICtrl* LLFloaterSnapshot::sThumbnailPlaceholder = NULL;
 LLSnapshotFloaterView* gSnapshotFloaterView = NULL;
 
 const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f;
@@ -1063,10 +1063,18 @@ void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& meta
 class LLFloaterSnapshot::Impl
 {
 public:
+	typedef enum e_status
+	{
+		STATUS_READY,
+		STATUS_WORKING,
+		STATUS_FINISHED
+	} EStatus;
+
 	Impl()
 	:	mAvatarPauseHandles(),
 		mLastToolset(NULL),
-		mAspectRatioCheckOff(false)
+		mAspectRatioCheckOff(false),
+		mStatus(STATUS_READY)
 	{
 	}
 	~Impl()
@@ -1114,6 +1122,8 @@ class LLFloaterSnapshot::Impl
 	static void updateControls(LLFloaterSnapshot* floater);
 	static void updateLayout(LLFloaterSnapshot* floater);
 	static void updateResolutionTextEntry(LLFloaterSnapshot* floater);
+	static void setStatus(EStatus status, bool ok = true, const std::string& msg = LLStringUtil::null);
+	EStatus getStatus() const { return mStatus; }
 
 private:
 	static LLSnapshotLivePreview::ESnapshotType getTypeIndex(const std::string& id);
@@ -1122,6 +1132,9 @@ class LLFloaterSnapshot::Impl
 	static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname);
 	static void checkAutoSnapshot(LLSnapshotLivePreview* floater, BOOL update_thumbnail = FALSE);
 	static void checkAspectRatio(LLFloaterSnapshot *view, S32 index) ;
+	static void setWorking(LLFloaterSnapshot* floater, bool working);
+	static void setFinished(LLFloaterSnapshot* floater, bool finished, bool ok = true, const std::string& msg = LLStringUtil::null);
+
 
 public:
 	std::vector<LLAnimPauseRequest> mAvatarPauseHandles;
@@ -1129,6 +1142,7 @@ class LLFloaterSnapshot::Impl
 	LLToolset*	mLastToolset;
 	LLHandle<LLView> mPreviewHandle;
 	bool mAspectRatioCheckOff ;
+	EStatus mStatus;
 };
 
 // static
@@ -1575,6 +1589,29 @@ void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* float
 	}
 }
 
+// static
+void LLFloaterSnapshot::Impl::setStatus(EStatus status, bool ok, const std::string& msg)
+{
+	LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance();
+	switch (status)
+	{
+	case STATUS_READY:
+		setWorking(floater, false);
+		setFinished(floater, false);
+		break;
+	case STATUS_WORKING:
+		setWorking(floater, true);
+		setFinished(floater, false);
+		break;
+	case STATUS_FINISHED:
+		setWorking(floater, false);
+		setFinished(floater, true, ok, msg);
+		break;
+	}
+
+	floater->impl.mStatus = status;
+}
+
 // static
 void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail)
 {
@@ -1770,6 +1807,44 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
 	return ;
 }
 
+// static
+void LLFloaterSnapshot::Impl::setWorking(LLFloaterSnapshot* floater, bool working)
+{
+	LLUICtrl* working_lbl = floater->getChild<LLUICtrl>("working_lbl");
+	working_lbl->setVisible(working);
+	floater->getChild<LLUICtrl>("working_indicator")->setVisible(working);
+
+	if (working)
+	{
+		const std::string panel_name = getActivePanel(floater, false)->getName();
+		const std::string prefix = panel_name.substr(std::string("panel_snapshot_").size());
+		std::string progress_text = floater->getString(prefix + "_" + "progress_str");
+		working_lbl->setValue(progress_text);
+	}
+
+	// All controls should be disable while posting.
+	floater->setCtrlsEnabled(!working);
+	LLPanelSnapshot* active_panel = getActivePanel(floater);
+	if (active_panel)
+	{
+		active_panel->setCtrlsEnabled(!working);
+	}
+}
+
+// static
+void LLFloaterSnapshot::Impl::setFinished(LLFloaterSnapshot* floater, bool finished, bool ok, const std::string& msg)
+{
+	floater->getChild<LLUICtrl>("succeeded_panel")->setVisible(finished && ok);
+	floater->getChild<LLUICtrl>("failed_panel")->setVisible(finished && !ok);
+
+	if (finished)
+	{
+		LLUICtrl* finished_lbl = floater->getChild<LLUICtrl>(ok ? "succeeded_lbl" : "failed_lbl");
+		std::string result_text = floater->getString(msg + "_" + (ok ? "succeeded_str" : "failed_str"));
+		finished_lbl->setValue(result_text);
+	}
+}
+
 static std::string lastSnapshotWidthName(S32 shot_type)
 {
 	switch (shot_type)
@@ -2167,14 +2242,16 @@ void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32
 // static
 void LLFloaterSnapshot::Impl::onSnapshotUploadFinished(LLSideTrayPanelContainer* panel_container, bool status)
 {
-	panel_container->openPanel("panel_post_result", LLSD().with("post-result", status).with("post-type", "profile"));
+	panel_container->openPreviousPanel();
+	setStatus(STATUS_FINISHED, status, "profile");
 }
 
 
 // static
 void LLFloaterSnapshot::Impl::onSendingPostcardFinished(LLSideTrayPanelContainer* panel_container, bool status)
 {
-	panel_container->openPanel("panel_post_result", LLSD().with("post-result", status).with("post-type", "postcard"));
+	panel_container->openPreviousPanel();
+	setStatus(STATUS_FINISHED, status, "postcard");
 }
 
 ///----------------------------------------------------------------------------
@@ -2265,8 +2342,7 @@ BOOL LLFloaterSnapshot::postBuild()
 	LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, panel_container, _1));
 	LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, panel_container, _1));
 
-	// remember preview rect
-	sThumbnailPlaceholderRect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect();
+	sThumbnailPlaceholder = getChild<LLUICtrl>("thumbnail_placeholder");
 
 	// create preview window
 	LLRect full_screen_rect = getRootView()->getRect();
@@ -2307,18 +2383,32 @@ void LLFloaterSnapshot::draw()
 	{		
 		if(previewp->getThumbnailImage())
 		{
-			LLRect& thumbnail_rect = sThumbnailPlaceholderRect;
+			bool working = impl.getStatus() == Impl::STATUS_WORKING;
+			const LLRect& thumbnail_rect = getThumbnailPlaceholderRect();
 			S32 offset_x = thumbnail_rect.mLeft + (thumbnail_rect.getWidth() - previewp->getThumbnailWidth()) / 2 ;
 			S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ;
 
 			glMatrixMode(GL_MODELVIEW);
 			// Apply floater transparency to the texture unless the floater is focused.
 			F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
+			LLColor4 color = working ? LLColor4::grey4 : LLColor4::white;
 			gl_draw_scaled_image(offset_x, offset_y, 
 					previewp->getThumbnailWidth(), previewp->getThumbnailHeight(), 
-					previewp->getThumbnailImage(), LLColor4::white % alpha);
+					previewp->getThumbnailImage(), color % alpha);
 
 			previewp->drawPreviewRect(offset_x, offset_y) ;
+
+			if (working)
+			{
+				gGL.pushUIMatrix();
+				{
+					const LLRect& r = getThumbnailPlaceholderRect();
+					//gGL.translateUI((F32) r.mLeft, (F32) r.mBottom, 0.f);
+					LLUI::translate((F32) r.mLeft, (F32) r.mBottom);
+					sThumbnailPlaceholder->draw();
+				}
+				gGL.popUIMatrix();
+			}
 		}
 	}
 }
@@ -2377,6 +2467,24 @@ S32 LLFloaterSnapshot::notify(const LLSD& info)
 		return 1;
 	}
 
+	if (info.has("set-ready"))
+	{
+		impl.setStatus(Impl::STATUS_READY);
+		return 1;
+	}
+
+	if (info.has("set-working"))
+	{
+		impl.setStatus(Impl::STATUS_WORKING);
+		return 1;
+	}
+
+	if (info.has("set-finished"))
+	{
+		LLSD data = info["set-finished"];
+		impl.setStatus(Impl::STATUS_FINISHED, data["ok"].asBoolean(), data["msg"].asString());
+		return 1;
+	}
 	return 0;
 }
 
@@ -2425,7 +2533,6 @@ void LLFloaterSnapshot::saveTexture()
 	}
 
 	previewp->saveTexture();
-	instance->postSave();
 }
 
 // static
@@ -2447,7 +2554,6 @@ void LLFloaterSnapshot::saveLocal()
 	}
 
 	previewp->saveLocal();
-	instance->postSave();
 }
 
 // static
@@ -2483,6 +2589,7 @@ void LLFloaterSnapshot::postSave()
 	}
 
 	instance->impl.updateControls(instance);
+	instance->impl.setStatus(Impl::STATUS_WORKING);
 }
 
 // static
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index de69824ad0b15b57a72c29d92880a71ed1db8947..2c79c749d60809311dc114e99d61d7bb3c11fbc7 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -67,10 +67,10 @@ class LLFloaterSnapshot : public LLFloater
 	static const LLVector3d& getPosTakenGlobal();
 	static void setAgentEmail(const std::string& email);
 
-	static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholderRect; }
+	static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholder->getRect(); }
 
 private:
-	static LLRect sThumbnailPlaceholderRect;
+	static LLUICtrl* sThumbnailPlaceholder;
 
 	class Impl;
 	Impl& impl;
diff --git a/indra/newview/llpanelpostprogress.cpp b/indra/newview/llpanelpostprogress.cpp
deleted file mode 100644
index 9b7de2cb230f95d57f253d97711df21bb7ee94f3..0000000000000000000000000000000000000000
--- a/indra/newview/llpanelpostprogress.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/** 
- * @file llpanelpostprogress.cpp
- * @brief Displays progress of publishing a snapshot.
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the termsllpanelpostprogress of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterreg.h"
-#include "llpanel.h"
-#include "llsidetraypanelcontainer.h"
-
-/**
- * Displays progress of publishing a snapshot.
- */
-class LLPanelPostProgress
-:	public LLPanel
-{
-	LOG_CLASS(LLPanelPostProgress);
-
-public:
-	/*virtual*/ void onOpen(const LLSD& key);
-};
-
-static LLRegisterPanelClassWrapper<LLPanelPostProgress> panel_class("llpanelpostprogress");
-
-// virtual
-void LLPanelPostProgress::onOpen(const LLSD& key)
-{
-	if (key.has("post-type"))
-	{
-		std::string progress_text = getString(key["post-type"].asString() + "_" + "progress_str");
-		getChild<LLTextBox>("progress_lbl")->setText(progress_text);
-	}
-	else
-	{
-		llwarns << "Invalid key" << llendl;
-	}
-}
diff --git a/indra/newview/llpanelpostresult.cpp b/indra/newview/llpanelpostresult.cpp
deleted file mode 100644
index 2b937d83b9ea3a1823d366cbe20775777fbac098..0000000000000000000000000000000000000000
--- a/indra/newview/llpanelpostresult.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/** 
- * @file llpanelpostresult.cpp
- * @brief Result of publishing a snapshot (success/failure).
- *
- * $LicenseInfo:firstyear=2011&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2011, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterreg.h"
-#include "llpanel.h"
-#include "llsidetraypanelcontainer.h"
-
-/**
- * Displays snapshot publishing result.
- */
-class LLPanelPostResult
-:	public LLPanel
-{
-	LOG_CLASS(LLPanelPostResult);
-
-public:
-	LLPanelPostResult();
-
-	/*virtual*/ void onOpen(const LLSD& key);
-private:
-	void onBack();
-	void onClose();
-};
-
-static LLRegisterPanelClassWrapper<LLPanelPostResult> panel_class("llpanelpostresult");
-
-LLPanelPostResult::LLPanelPostResult()
-{
-	mCommitCallbackRegistrar.add("Snapshot.Result.Back",	boost::bind(&LLPanelPostResult::onBack,		this));
-	mCommitCallbackRegistrar.add("Snapshot.Result.Close",	boost::bind(&LLPanelPostResult::onClose,	this));
-}
-
-
-// virtual
-void LLPanelPostResult::onOpen(const LLSD& key)
-{
-	if (key.isMap() && key.has("post-result") && key.has("post-type"))
-	{
-		bool ok = key["post-result"].asBoolean();
-		std::string type = key["post-type"].asString();
-		std::string result_text = getString(type + "_" + (ok ? "succeeded_str" : "failed_str"));
-		getChild<LLTextBox>("result_lbl")->setText(result_text);
-	}
-	else
-	{
-		llwarns << "Invalid key" << llendl;
-	}
-}
-
-void LLPanelPostResult::onBack()
-{
-	LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
-	if (!parent)
-	{
-		llwarns << "Cannot find panel container" << llendl;
-		return;
-	}
-
-	parent->openPreviousPanel();
-}
-
-void LLPanelPostResult::onClose()
-{
-	LLFloaterReg::hideInstance("snapshot");
-}
diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp
index e89e62c7500fa0d0e784d6d67c1971515d73eea9..893f1ca43c2d13f8354694c5a36d1507def92598 100644
--- a/indra/newview/llpanelsnapshot.cpp
+++ b/indra/newview/llpanelsnapshot.cpp
@@ -35,6 +35,19 @@
 // newview
 #include "llsidetraypanelcontainer.h"
 
+// virtual
+BOOL LLPanelSnapshot::postBuild()
+{
+	updateControls(LLSD());
+	return TRUE;
+}
+
+// virtual
+void LLPanelSnapshot::onOpen(const LLSD& key)
+{
+	setCtrlsEnabled(true);
+}
+
 LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshot::getImageFormat() const
 {
 	return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG;
@@ -107,3 +120,18 @@ void LLPanelSnapshot::updateImageQualityLevel()
 
 	getChild<LLTextBox>("image_quality_level")->setTextArg("[QLVL]", quality_lvl);
 }
+
+void LLPanelSnapshot::goBack()
+{
+	LLSideTrayPanelContainer* parent = getParentContainer();
+	if (parent)
+	{
+		parent->openPreviousPanel();
+	}
+}
+
+void LLPanelSnapshot::cancel()
+{
+	goBack();
+	LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-ready", true));
+}
diff --git a/indra/newview/llpanelsnapshot.h b/indra/newview/llpanelsnapshot.h
index a227317d2f43558427a7ebc378fab6473e4c742f..eaa0bc42c6b447c4714fbf59fbfca61f956c45a3 100644
--- a/indra/newview/llpanelsnapshot.h
+++ b/indra/newview/llpanelsnapshot.h
@@ -37,6 +37,9 @@ class LLSideTrayPanelContainer;
 class LLPanelSnapshot: public LLPanel
 {
 public:
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
+
 	virtual std::string getWidthSpinnerName() const = 0;
 	virtual std::string getHeightSpinnerName() const = 0;
 	virtual std::string getAspectRatioCBName() const = 0;
@@ -48,11 +51,13 @@ class LLPanelSnapshot: public LLPanel
 	virtual LLSpinCtrl* getHeightSpinner();
 	virtual void enableAspectRatioCheckbox(BOOL enable);
 	virtual LLFloaterSnapshot::ESnapshotFormat getImageFormat() const;
-	virtual void updateControls(const LLSD& info) {} ///< Update controls from saved settings
+	virtual void updateControls(const LLSD& info) = 0; ///< Update controls from saved settings
 
 protected:
 	LLSideTrayPanelContainer* getParentContainer();
 	void updateImageQualityLevel();
+	void goBack(); ///< Switch to the default (Snapshot Options) panel
+	void cancel();
 };
 
 #endif // LL_LLPANELSNAPSHOT_H
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
index 6419c37494e8e21f06248f743f0c4116c6232dcd..c781138f88ad936b5ba441dae844ec884bdf275f 100644
--- a/indra/newview/llpanelsnapshotinventory.cpp
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -60,7 +60,6 @@ class LLPanelSnapshotInventory
 	void onCustomResolutionCommit(LLUICtrl* ctrl);
 	void onKeepAspectRatioCommit(LLUICtrl* ctrl);
 	void onSend();
-	void onCancel();
 };
 
 static LLRegisterPanelClassWrapper<LLPanelSnapshotInventory> panel_class("llpanelsnapshotinventory");
@@ -68,7 +67,7 @@ static LLRegisterPanelClassWrapper<LLPanelSnapshotInventory> panel_class("llpane
 LLPanelSnapshotInventory::LLPanelSnapshotInventory()
 {
 	mCommitCallbackRegistrar.add("Inventory.Save",		boost::bind(&LLPanelSnapshotInventory::onSend,		this));
-	mCommitCallbackRegistrar.add("Inventory.Cancel",	boost::bind(&LLPanelSnapshotInventory::onCancel,	this));
+	mCommitCallbackRegistrar.add("Inventory.Cancel",	boost::bind(&LLPanelSnapshotInventory::cancel,		this));
 }
 
 // virtual
@@ -78,7 +77,7 @@ BOOL LLPanelSnapshotInventory::postBuild()
 	getChild<LLUICtrl>(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onCustomResolutionCommit, this, _1));
 	getChild<LLUICtrl>(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onCustomResolutionCommit, this, _1));
 	getChild<LLUICtrl>(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onKeepAspectRatioCommit, this, _1));
-	return TRUE;
+	return LLPanelSnapshot::postBuild();
 }
 
 // virtual
@@ -88,6 +87,7 @@ void LLPanelSnapshotInventory::onOpen(const LLSD& key)
 	getChild<LLComboBox>(getImageSizeComboName())->selectNthItem(0); // FIXME? has no effect
 #endif
 	updateCustomResControls();
+	LLPanelSnapshot::onOpen(key);
 }
 
 void LLPanelSnapshotInventory::updateCustomResControls()
@@ -132,21 +132,6 @@ void LLPanelSnapshotInventory::onKeepAspectRatioCommit(LLUICtrl* ctrl)
 
 void LLPanelSnapshotInventory::onSend()
 {
-	// Switch to upload progress display.
-	LLSideTrayPanelContainer* parent = getParentContainer();
-	if (parent)
-	{
-		parent->openPanel("panel_post_progress", LLSD().with("post-type", "inventory"));
-	}
-
 	LLFloaterSnapshot::saveTexture();
-}
-
-void LLPanelSnapshotInventory::onCancel()
-{
-	LLSideTrayPanelContainer* parent = getParentContainer();
-	if (parent)
-	{
-		parent->openPreviousPanel();
-	}
+	LLFloaterSnapshot::postSave();
 }
diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp
index 5dc32d228f0e8a6a69853bb67d4cd47973908817..b67c4ec673fd776b63860af588dadfbab3b0320f 100644
--- a/indra/newview/llpanelsnapshotlocal.cpp
+++ b/indra/newview/llpanelsnapshotlocal.cpp
@@ -64,7 +64,6 @@ class LLPanelSnapshotLocal
 	void onKeepAspectRatioCommit(LLUICtrl* ctrl);
 	void onQualitySliderCommit(LLUICtrl* ctrl);
 	void onSend();
-	void onCancel();
 };
 
 static LLRegisterPanelClassWrapper<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal");
@@ -72,7 +71,7 @@ static LLRegisterPanelClassWrapper<LLPanelSnapshotLocal> panel_class("llpanelsna
 LLPanelSnapshotLocal::LLPanelSnapshotLocal()
 {
 	mCommitCallbackRegistrar.add("Local.Save",		boost::bind(&LLPanelSnapshotLocal::onSend,		this));
-	mCommitCallbackRegistrar.add("Local.Cancel",	boost::bind(&LLPanelSnapshotLocal::onCancel,	this));
+	mCommitCallbackRegistrar.add("Local.Cancel",	boost::bind(&LLPanelSnapshotLocal::cancel,		this));
 }
 
 // virtual
@@ -85,15 +84,14 @@ BOOL LLPanelSnapshotLocal::postBuild()
 	getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onQualitySliderCommit, this, _1));
 	getChild<LLUICtrl>("local_format_combo")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onFormatComboCommit, this, _1));
 
-	updateControls(LLSD());
-
-	return TRUE;
+	return LLPanelSnapshot::postBuild();
 }
 
 // virtual
 void LLPanelSnapshotLocal::onOpen(const LLSD& key)
 {
 	updateCustomResControls();
+	LLPanelSnapshot::onOpen(key);
 }
 
 // virtual
@@ -195,15 +193,11 @@ void LLPanelSnapshotLocal::onQualitySliderCommit(LLUICtrl* ctrl)
 
 void LLPanelSnapshotLocal::onSend()
 {
-	LLFloaterSnapshot::saveLocal();
-	onCancel();
-}
+	LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance();
 
-void LLPanelSnapshotLocal::onCancel()
-{
-	LLSideTrayPanelContainer* parent = getParentContainer();
-	if (parent)
-	{
-		parent->openPreviousPanel();
-	}
+	floater->notify(LLSD().with("set-working", true));
+	LLFloaterSnapshot::saveLocal();
+	LLFloaterSnapshot::postSave();
+	goBack();
+	floater->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local")));
 }
diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp
index c2b83d5c197095385c09d3a0d3e56471184f4d79..9f3f6d7cb6950c957863abfe8038c2b80cdf0bcf 100644
--- a/indra/newview/llpanelsnapshotpostcard.cpp
+++ b/indra/newview/llpanelsnapshotpostcard.cpp
@@ -76,7 +76,6 @@ class LLPanelSnapshotPostcard
 	void onQualitySliderCommit(LLUICtrl* ctrl);
 	void onTabButtonPress(S32 btn_idx);
 	void onSend();
-	void onCancel();
 
 	bool mHasFirstMsgFocus;
 };
@@ -87,7 +86,7 @@ LLPanelSnapshotPostcard::LLPanelSnapshotPostcard()
 :	mHasFirstMsgFocus(false)
 {
 	mCommitCallbackRegistrar.add("Postcard.Send",		boost::bind(&LLPanelSnapshotPostcard::onSend,	this));
-	mCommitCallbackRegistrar.add("Postcard.Cancel",		boost::bind(&LLPanelSnapshotPostcard::onCancel,	this));
+	mCommitCallbackRegistrar.add("Postcard.Cancel",		boost::bind(&LLPanelSnapshotPostcard::cancel,	this));
 	mCommitCallbackRegistrar.add("Postcard.Message",	boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress,	this, 0));
 	mCommitCallbackRegistrar.add("Postcard.Settings",	boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress,	this, 1));
 
@@ -118,9 +117,7 @@ BOOL LLPanelSnapshotPostcard::postBuild()
 
 	getChild<LLButton>("message_btn")->setToggleState(TRUE);
 
-	updateControls(LLSD());
-
-	return TRUE;
+	return LLPanelSnapshot::postBuild();
 }
 
 // virtual
@@ -128,6 +125,7 @@ void LLPanelSnapshotPostcard::onOpen(const LLSD& key)
 {
 	gSavedSettings.setS32("SnapshotFormat", getImageFormat());
 	updateCustomResControls();
+	LLPanelSnapshot::onOpen(key);
 }
 
 // virtual
@@ -212,17 +210,11 @@ void LLPanelSnapshotPostcard::sendPostcard()
 	postcard["subject"] = subject;
 	postcard["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString();
 	LLPostCard::send(LLFloaterSnapshot::getImageData(), postcard);
-	LLFloaterSnapshot::postSave();
 
 	// Give user feedback of the event.
 	gViewerWindow->playSnapshotAnimAndSound();
 
-	// Switch to upload progress display.
-	LLSideTrayPanelContainer* parent = getParentContainer();
-	if (parent)
-	{
-		parent->openPanel("panel_post_progress", LLSD().with("post-type", "postcard"));
-	}
+	LLFloaterSnapshot::postSave();
 }
 
 void LLPanelSnapshotPostcard::onMsgFormFocusRecieved()
@@ -325,12 +317,3 @@ void LLPanelSnapshotPostcard::onSend()
 	// Send postcard.
 	sendPostcard();
 }
-
-void LLPanelSnapshotPostcard::onCancel()
-{
-	LLSideTrayPanelContainer* parent = getParentContainer();
-	if (parent)
-	{
-		parent->openPreviousPanel();
-	}
-}
diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp
index 80a379a5a0a0698609ee777993e72191f20ca15c..33237fd84f3b7002500d04aa9b2780f051ebea89 100644
--- a/indra/newview/llpanelsnapshotprofile.cpp
+++ b/indra/newview/llpanelsnapshotprofile.cpp
@@ -62,7 +62,6 @@ class LLPanelSnapshotProfile
 	void updateCustomResControls(); ///< Enable/disable custom resolution controls (spinners and checkbox)
 
 	void onSend();
-	void onCancel();
 	void onResolutionComboCommit(LLUICtrl* ctrl);
 	void onCustomResolutionCommit(LLUICtrl* ctrl);
 	void onKeepAspectRatioCommit(LLUICtrl* ctrl);
@@ -73,7 +72,7 @@ static LLRegisterPanelClassWrapper<LLPanelSnapshotProfile> panel_class("llpanels
 LLPanelSnapshotProfile::LLPanelSnapshotProfile()
 {
 	mCommitCallbackRegistrar.add("PostToProfile.Send",		boost::bind(&LLPanelSnapshotProfile::onSend,		this));
-	mCommitCallbackRegistrar.add("PostToProfile.Cancel",	boost::bind(&LLPanelSnapshotProfile::onCancel,	this));
+	mCommitCallbackRegistrar.add("PostToProfile.Cancel",	boost::bind(&LLPanelSnapshotProfile::cancel,		this));
 }
 
 // virtual
@@ -83,13 +82,15 @@ BOOL LLPanelSnapshotProfile::postBuild()
 	getChild<LLUICtrl>(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onCustomResolutionCommit, this, _1));
 	getChild<LLUICtrl>(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onCustomResolutionCommit, this, _1));
 	getChild<LLUICtrl>(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onKeepAspectRatioCommit, this, _1));
-	return TRUE;
+
+	return LLPanelSnapshot::postBuild();
 }
 
 // virtual
 void LLPanelSnapshotProfile::onOpen(const LLSD& key)
 {
 	updateCustomResControls();
+	LLPanelSnapshot::onOpen(key);
 }
 
 // virtual
@@ -119,22 +120,6 @@ void LLPanelSnapshotProfile::onSend()
 
 	LLWebProfile::uploadImage(LLFloaterSnapshot::getImageData(), caption, add_location);
 	LLFloaterSnapshot::postSave();
-
-	// Switch to upload progress display.
-	LLSideTrayPanelContainer* parent = getParentContainer();
-	if (parent)
-	{
-		parent->openPanel("panel_post_progress", LLSD().with("post-type", "profile"));
-	}
-}
-
-void LLPanelSnapshotProfile::onCancel()
-{
-	LLSideTrayPanelContainer* parent = getParentContainer();
-	if (parent)
-	{
-		parent->openPreviousPanel();
-	}
 }
 
 void LLPanelSnapshotProfile::onResolutionComboCommit(LLUICtrl* ctrl)
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index bc48561196e05ebb4874469878f69ef0067cbedb..22d6ba5bdba0264499b75cdd69d99bb4cbd8fc90 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -17,6 +17,54 @@
      name="unknown">
         unknown
     </floater.string>
+    <string
+     name="postcard_progress_str">
+        Sending Email
+    </string>
+    <string
+     name="profile_progress_str">
+        Posting
+    </string>
+    <string
+     name="inventory_progress_str">
+        Saving to Inventory
+    </string>
+    <string
+     name="local_progress_str">
+        Saving to Computer
+    </string>
+ 	<string
+ 	 name="profile_succeeded_str">
+ 	    Your Profile Feed has been updated!
+ 	</string>
+ 	<string
+ 	 name="postcard_succeeded_str">
+ 	    Email Sent!
+ 	</string>
+ 	<string
+ 	 name="inventory_succeeded_str">
+ 	    Saved to Inventory!
+ 	</string>
+ 	<string
+ 	 name="local_succeeded_str">
+ 	    Saved to Computer!
+ 	</string>
+ 	<string
+ 	 name="profile_failed_str">
+ 	    Failed to update your Profile Feed.
+ 	</string>
+ 	<string
+ 	 name="postcard_failed_str">
+ 	    Failed to send email.
+ 	</string>
+ 	<string
+ 	 name="inventory_failed_str">
+ 	    Failed to save to inventory.
+ 	</string>
+ 	<string
+ 	 name="local_failed_str">
+ 	    Failed to save to computer.
+ 	</string>
    <view_border 
     bevel_style="in"
     follows="left|top" 
@@ -65,8 +113,34 @@
     name="thumbnail_placeholder"
     top="50"
     follows="left|top"
-    left="10"
-    />
+    left="10">
+      <loading_indicator
+       follows="left|top"
+       height="48"
+       layout="topleft"
+       name="working_indicator"
+       left="101"
+       top="46"
+       visible="false"
+       width="48" />
+      <text
+       follows="left|top|right"
+       font="SansSerifBold"
+       height="14"
+       layout="topleft"
+       left="5"
+       length="1"
+       halign="center"
+       name="working_lbl"
+       right="-5"
+       top="98"
+       translate="false"
+       type="string"
+       visible="false"
+       width="130">
+          Working
+      </text>
+  </ui_ctrl>
   <view_border 
    bevel_style="in" 
    height="21"
@@ -146,18 +220,6 @@
        layout="topleft"
        name="panel_snapshot_local"
        filename="panel_snapshot_local.xml" />
-      <panel
-       class="llpanelpostprogress"
-       follows="all"
-       layout="topleft"
-       name="panel_post_progress"
-       filename="panel_post_progress.xml" />
-      <panel
-       class="llpanelpostresult"
-       follows="all"
-       layout="topleft"
-       name="panel_post_result"
-       filename="panel_post_result.xml" />
     </panel_container>
     <panel
      height="295"
diff --git a/indra/newview/skins/default/xui/en/panel_post_progress.xml b/indra/newview/skins/default/xui/en/panel_post_progress.xml
deleted file mode 100644
index 418e6e7527e0323a342a8cfaccab1da2af70d061..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_post_progress.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- height="380"
- layout="topleft"
- name="panel_post_progress"
- width="490">
-    <string
-     name="postcard_progress_str">
-        Sending Email
-    </string>
-    <string
-     name="profile_progress_str">
-        Posting
-    </string>
-    <string
-     name="inventory_progress_str">
-        Saving to Inventory
-    </string>
-    <string
-     name="local_progress_str">
-        Saving to Computer
-    </string>
-    <view_border
-     follows="left|top"
-     height="110"
-     layout="topleft"
-     left="40"
-     name="rect"
-     top="120"
-     width="190"
-    />
-    <loading_indicator
-     follows="left|top"
-     height="40"
-     left_delta="75"
-     layout="topleft"
-     top_delta="20"
-     width="40"
-    />
-    <text
-     follows="top|left"
-     font="SansSerifLargeBold"
-     halign="center"
-     height="20"
-     layout="topleft"
-     left_delta="-75"
-     length="1"
-     name="progress_lbl"
-     translate="false"
-     type="string"
-     top_pad="10"
-     width="190">
-        Working
-    </text>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_post_result.xml b/indra/newview/skins/default/xui/en/panel_post_result.xml
deleted file mode 100644
index 4a64b8469b672928d63ff817e35c4cb11121376c..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_post_result.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- height="380"
- layout="topleft"
- name="panel_post_result"
- width="490">
- 	<string
- 	 name="profile_succeeded_str">
- 	    Your Profile Feed has been updated!
- 	</string>
- 	<string
- 	 name="postcard_succeeded_str">
- 	    Email Sent!
- 	</string>
- 	<string
- 	 name="inventory_succeeded_str">
- 	    Saved to Inventory!
- 	</string>
- 	<string
- 	 name="local_succeeded_str">
- 	    Saved to Computer!
- 	</string>
- 	<string
- 	 name="profile_failed_str">
- 	    Failed to update your Profile Feed.
- 	</string>
- 	<string
- 	 name="postcard_failed_str">
- 	    Failed to send email.
- 	</string>
- 	<string
- 	 name="inventory_failed_str">
- 	    Failed to save to inventory.
- 	</string>
- 	<string
- 	 name="local_failed_str">
- 	    Failed to save to computer.
- 	</string>
-    <text
-     follows="top|left|right"
-     font="SansSerif"
-     halign="center"
-     height="30"
-     layout="topleft"
-     left="20"
-     length="1"
-     name="result_lbl"
-     right="-20"
-     type="string"
-     top="100"
-     word_wrap="true">
-        Result
-    </text>
-    <button
-     follows="left|top"
-     height="22"
-     label="Done, Close This Window"
-     layout="topleft"
-     left="10"
-     name="close_btn"
-     top_pad="10"
-     width="160">
-        <commit_callback
-         function="Snapshot.Result.Close" />
-    </button>
-    <button
-     follows="right|top"
-     height="22"
-     label="Main Menu"
-     layout="topleft"
-     name="back_btn"
-     right="-10"
-     top_delta="0"
-     width="80">
-        <commit_callback
-         function="Snapshot.Result.Back" />
-    </button>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
index e6324f8923eb7f022502e728ec4dd4c1f7b6c114..6fb17ed6a6beb81b8b9b1654d26247d982027cda 100644
--- a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
@@ -77,4 +77,68 @@
     <button.commit_callback
      function="Snapshot.SaveToComputer" />
   </button>
+  <panel
+   background_visible="true"
+   bg_alpha_color="0.9 1 0.9 1"
+   bottom="-10"
+   follows="left|bottom|right"
+   font="SansSerifLarge"
+   halign="center"
+   height="20"
+   layout="topleft"
+   left_delta="0"
+   length="1"
+   name="succeeded_panel"
+   right="-10"
+   type="string"
+   visible="false">
+      <text
+       follows="all"
+       font="SansSerif"
+       halign="center"
+       height="18"
+       layout="topleft"
+       left="1"
+       length="1"
+       name="succeeded_lbl"
+       right="-1"
+       text_color="0.2 0.5 0.2 1"
+       top="4"
+       translate="false"
+       type="string">
+          Succeeded
+      </text>
+  </panel>
+  <panel
+   background_visible="true"
+   bg_alpha_color="1 0.9 0.9 1"
+   bottom="-10"
+   follows="left|bottom|right"
+   font="SansSerifLarge"
+   halign="center"
+   height="20"
+   layout="topleft"
+   left_delta="0"
+   length="1"
+   name="failed_panel"
+   right="-10"
+   type="string"
+   visible="false">
+      <text
+       follows="all"
+       font="SansSerif"
+       halign="center"
+       height="18"
+       layout="topleft"
+       left="1"
+       length="1"
+       name="failed_lbl"
+       right="-1"
+       text_color="0.5 0.2 0.2 1"
+       top="4"
+       translate="false"
+       type="string">
+          Failed
+      </text>
+  </panel>
 </panel>