From 7235f8680cc96a52097059ce7d93fc974a7372c9 Mon Sep 17 00:00:00 2001 From: Wim van der Meer Date: Mon, 19 Jul 2010 11:18:25 +0000 Subject: [PATCH] Prevent the 'Settings...' button from opening multiple windows git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37585 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/screenshot/ScreenshotWindow.cpp | 84 ++++++++++++++++++------ src/apps/screenshot/ScreenshotWindow.h | 3 +- 2 files changed, 66 insertions(+), 21 deletions(-) diff --git a/src/apps/screenshot/ScreenshotWindow.cpp b/src/apps/screenshot/ScreenshotWindow.cpp index e7eb221227..a8114f9bd6 100644 --- a/src/apps/screenshot/ScreenshotWindow.cpp +++ b/src/apps/screenshot/ScreenshotWindow.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +44,10 @@ #include "Utility.h" +#undef B_TRANSLATE_CONTEXT +#define B_TRANSLATE_CONTEXT "ScreenshotWindow" + + enum { kActiveWindow, kIncludeBorder, @@ -56,22 +61,47 @@ enum { }; +// #pragma mark - QuitMessageFilter + + +class QuitMessageFilter : public BMessageFilter { +public: + QuitMessageFilter(BWindow** window) + : + BMessageFilter((uint32)B_QUIT_REQUESTED), + fWindow(window) + { + } + virtual filter_result Filter(BMessage* message, BHandler** target) + { + *fWindow = NULL; + return B_DISPATCH_MESSAGE; + } + +private: + BWindow** fWindow; + +}; + + +// #pragma mark - DirectoryRefFilter + + class DirectoryRefFilter : public BRefFilter { public: virtual ~DirectoryRefFilter() { } - virtual bool Filter(const entry_ref* ref, BNode* node, - struct stat_beos* stat, const char* filetype) - { - return node->IsDirectory(); - } + virtual bool Filter(const entry_ref* ref, BNode* node, + struct stat_beos* stat, const char* filetype) + { + return node->IsDirectory(); + } }; -#undef B_TRANSLATE_CONTEXT -#define B_TRANSLATE_CONTEXT "ScreenshotWindow" +// #pragma mark - ScreenshotWindow ScreenshotWindow::ScreenshotWindow(const Utility& utility, bool silent, @@ -86,6 +116,7 @@ ScreenshotWindow::ScreenshotWindow(const Utility& utility, bool silent, fScreenshot(NULL), fOutputPathPanel(NULL), fLastSelectedPath(NULL), + fSettingsWindow(NULL), fDelay(0), fIncludeBorder(false), fIncludeCursor(false), @@ -262,6 +293,7 @@ ScreenshotWindow::MessageReceived(BMessage* message) fNameControl->SetText(_FindValidFileName( fNameControl->Text()).String()); _UpdateFilenameSelection(); + _ShowSettings(false); break; case kLocationChanged: @@ -308,7 +340,7 @@ ScreenshotWindow::MessageReceived(BMessage* message) break; case kSettings: - _ShowSettings(); + _ShowSettings(true); break; default: @@ -327,9 +359,6 @@ ScreenshotWindow::Quit() } -// #pragma - private - - void ScreenshotWindow::_NewScreenshot(bool silent, bool clipboard) { @@ -555,8 +584,11 @@ ScreenshotWindow::_SaveScreenshot() void -ScreenshotWindow::_ShowSettings() +ScreenshotWindow::_ShowSettings(bool activate) { + if (!fSettingsWindow && !activate) + return; + // Find a translator translator_id translator = 0; BTranslatorRoster *roster = BTranslatorRoster::Default(); @@ -568,7 +600,8 @@ ScreenshotWindow::_ShowSettings() for (int32 x = 0; x < numTranslators; x++) { const translation_format* formats = NULL; int32 numFormats; - if (roster->GetOutputFormats(translators[x], &formats, &numFormats) == B_OK) { + if (roster->GetOutputFormats(translators[x], &formats, + &numFormats) == B_OK) { for (int32 i = 0; i < numFormats; ++i) { if (formats[i].type == static_cast(fImageFileType)) { translator = translators[x]; @@ -584,7 +617,7 @@ ScreenshotWindow::_ShowSettings() if (!foundTranslator) return; - // Create a window with a configuration view + // Create a window with a configuration view BView *view; BRect rect(0, 0, 239, 239); @@ -594,12 +627,23 @@ ScreenshotWindow::_ShowSettings() BAlert *alert = new BAlert(NULL, strerror(err), "OK"); alert->Go(); } else { - BWindow* window = new BWindow(rect, "Translator Settings", - B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, - B_NOT_ZOOMABLE | B_NOT_RESIZABLE); - window->AddChild(view); - window->CenterOnScreen(); - window->Show(); + if (fSettingsWindow) { + fSettingsWindow->RemoveChild(fSettingsWindow->ChildAt(0)); + float width, height; + view->GetPreferredSize(&width, &height); + fSettingsWindow->ResizeTo(width, height); + fSettingsWindow->AddChild(view); + if (activate) + fSettingsWindow->Activate(); + } else { + fSettingsWindow = new BWindow(rect, "Translator Settings", + B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, + B_NOT_ZOOMABLE | B_NOT_RESIZABLE); + fSettingsWindow->AddFilter(new QuitMessageFilter(&fSettingsWindow)); + fSettingsWindow->AddChild(view); + fSettingsWindow->CenterOnScreen(); + fSettingsWindow->Show(); + } } } diff --git a/src/apps/screenshot/ScreenshotWindow.h b/src/apps/screenshot/ScreenshotWindow.h index af815965da..4b24c1f0c0 100644 --- a/src/apps/screenshot/ScreenshotWindow.h +++ b/src/apps/screenshot/ScreenshotWindow.h @@ -50,7 +50,7 @@ private: void _UpdateFilenameSelection(); void _SetupTranslatorMenu(); status_t _SaveScreenshot(); - void _ShowSettings(); + void _ShowSettings(bool activate); BString _FindValidFileName(const char* name); BPath _GetDirectory(); void _ReadSettings(); @@ -69,6 +69,7 @@ private: BBitmap* fScreenshot; BFilePanel* fOutputPathPanel; BMenuItem* fLastSelectedPath; + BWindow* fSettingsWindow; bigtime_t fDelay; bool fIncludeBorder;