From d7069a2a66e9ed3332ffbaed3e3772b98bea7bbc Mon Sep 17 00:00:00 2001 From: Aleric Inglewood Date: Mon, 26 Nov 2012 20:41:10 +0100 Subject: [PATCH] Fix cancelling "Save" while "Keep open after save" is unchecked. This causes a failure to save local file, or when clicking Cancel in the file chooser, to keep the image and keep the snapshot floater open so a retry to save the image can be attempted. --- indra/newview/llfloatersnapshot.cpp | 80 ++++++++++++++++++++++++++--- indra/newview/llfloatersnapshot.h | 2 + indra/newview/llviewerwindow.cpp | 10 ++++ 3 files changed, 85 insertions(+), 7 deletions(-) diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index e7700cd65..6e34143e0 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -167,6 +167,9 @@ public: LLFloaterPostcard* savePostcard(); void saveTexture(); void saveLocal(); + void saveLocalDone(bool success); + void close(LLFloaterSnapshot* view); + void doCloseAfterSave(); BOOL setThumbnailImageSize() ; void generateThumbnailImage(BOOL force_update = FALSE) ; @@ -222,6 +225,10 @@ private: BOOL mSnapshotActive; LLViewerWindow::ESnapshotType mSnapshotBufferType; + bool mCallbackHappened; + bool mSaveLocalSuccessful; + LLFloaterSnapshot* mCloseCalled; + public: static std::set sList; BOOL mKeepAspectRatio ; @@ -1116,13 +1123,61 @@ void LLSnapshotLivePreview::saveTexture() void LLSnapshotLivePreview::saveLocal() { - gViewerWindow->saveImageNumbered(mFormattedImage); + mCallbackHappened = false; + mSaveLocalSuccessful = false; + mCloseCalled = NULL; + gViewerWindow->saveImageNumbered(mFormattedImage); // This calls saveLocalDone() immediately, or later. +} - // Relinquish image memory. Save button will be disabled as a side-effect. - mFormattedImage = NULL; - mFormattedDataSize = 0; - updateSnapshot(FALSE, FALSE); - addUsedBy(SNAPSHOT_LOCAL); +void LLSnapshotLivePreview::close(LLFloaterSnapshot* view) +{ + if (getSnapshotType() != LLSnapshotLivePreview::SNAPSHOT_LOCAL) + { + view->close(); + } + else + { + mCloseCalled = view; + if (mCallbackHappened) + { + doCloseAfterSave(); + } + else + { + view->setEnabled(FALSE); + } + } +} + +void LLSnapshotLivePreview::saveLocalDone(bool success) +{ + mCallbackHappened = true; + mSaveLocalSuccessful = success; + if (success) + { + // Disable Save button. + addUsedBy(LLSnapshotLivePreview::SNAPSHOT_LOCAL); + } + if (mCloseCalled) + { + doCloseAfterSave(); + } +} + +void LLSnapshotLivePreview::doCloseAfterSave() +{ + if (mSaveLocalSuccessful) + { + // Relinquish image memory. + mFormattedImage = NULL; + mFormattedDataSize = 0; + updateSnapshot(FALSE, FALSE); + mCloseCalled->close(); + } + else + { + mCloseCalled->setEnabled(TRUE); + } } ///---------------------------------------------------------------------------- @@ -1600,6 +1655,17 @@ void LLFloaterSnapshot::Impl::onCommitSave(LLUICtrl* ctrl, void* data) onClickKeep(data); } +// Called from LLViewerWindow::saveImageNumbered, LLViewerWindow::saveImageNumbered_continued1 and LLViewerWindow::saveImageNumbered_continued2. +//static +void LLFloaterSnapshot::saveLocalDone(bool success) +{ + LLSnapshotLivePreview* previewp = LLFloaterSnapshot::Impl::getPreviewView(sInstance); + if (previewp) + { + previewp->saveLocalDone(success); + } +} + // static void LLFloaterSnapshot::Impl::onClickKeep(void* data) { @@ -1635,7 +1701,7 @@ void LLFloaterSnapshot::Impl::onClickKeep(void* data) if (gSavedSettings.getBOOL("CloseSnapshotOnKeep")) { - view->close(); + previewp->close(view); } else { diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 60ecf5483..718bb7bea 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -67,6 +67,8 @@ public: static S32 getUIWinHeightShort() {return sUIWinHeightShort ;} static S32 getUIWinWidth() {return sUIWinWidth ;} + static void saveLocalDone(bool success); + private: class Impl; Impl& impl; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index bbfbf83dc..d245928dc 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3990,6 +3990,7 @@ void LLViewerWindow::saveImageNumbered(LLPointer image) { if (!image) { + LLFloaterSnapshot::saveLocalDone(false); return; } @@ -4038,6 +4039,10 @@ void LLViewerWindow::saveImageNumbered_continued1(LLPointer im saveImageNumbered_continued2(image, extension); } + else + { + LLFloaterSnapshot::saveLocalDone(false); + } } void LLViewerWindow::saveImageNumbered_continued2(LLPointer image, std::string const& extension) @@ -4064,6 +4069,11 @@ void LLViewerWindow::saveImageNumbered_continued2(LLPointer im if (image->save(filepath)) { playSnapshotAnimAndSound(); + LLFloaterSnapshot::saveLocalDone(true); + } + else + { + LLFloaterSnapshot::saveLocalDone(false); } }