]> git.saurik.com Git - wxWidgets.git/commitdiff
Allow wxPreferencesEditor::Dismiss() to work when using modal dialogs too.
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 16 May 2013 14:43:09 +0000 (14:43 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 16 May 2013 14:43:09 +0000 (14:43 +0000)
The modal dialog case is not really different, the dialog may still need to be
dismissed if the associated object doesn't exist any longer.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74010 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/preferences.h
interface/wx/preferences.h
src/generic/preferencesg.cpp

index ab1e0a2c99cd081e3de0299231f85c00f6dabb71..1a07fd857bd9ac1db0c1b2d06029f3c4ccf2c14d 100644 (file)
@@ -104,8 +104,7 @@ public:
     // platform, i.e. depending on whether the dialog is modal or not.
     virtual void Show(wxWindow* parent);
 
-    // Hide the currently shown dialog, if any. This doesn't do anything on the
-    // platforms using modal preferences dialogs but should be called to
+    // Hide the currently shown dialog, if any. This is typically used to
     // dismiss the dialog if the object whose preferences it is editing was
     // closed.
     void Dismiss();
index 161d78755c97c52913ce87414ba0ceeed3319245..7e0e9f679ead512925f017cdea5038378381c0f3 100644 (file)
@@ -82,9 +82,8 @@ public:
     /**
         Hide the currently shown dialog, if any.
 
-        This doesn't do anything on the platforms using modal preferences
-        dialogs (e.g. Windows) but should be called to dismiss the dialog if
-        the object whose preferences it is editing was closed.
+        This is typically called to dismiss the dialog if the object whose
+        preferences it is editing was closed.
      */
     void Dismiss();
 
index 30365e7ebc44ceb2c8f710a010d73688a6492c6a..231185beed2424b70375655a2cc6ae7df8df303b 100644 (file)
@@ -33,6 +33,7 @@
 #include "wx/sizer.h"
 #include "wx/sharedptr.h"
 #include "wx/scopedptr.h"
+#include "wx/scopeguard.h"
 #include "wx/vector.h"
 
 namespace
@@ -193,12 +194,19 @@ class wxModalPreferencesEditorImpl : public wxGenericPreferencesEditorImplBase
 public:
     wxModalPreferencesEditorImpl()
     {
+        m_dlg = NULL;
         m_currentPage = -1;
     }
 
     virtual void Show(wxWindow* parent)
     {
         wxScopedPtr<wxGenericPrefsDialog> dlg(CreateDialog(parent));
+
+        // Store it for Dismiss() but ensure that the pointer is reset to NULL
+        // when the dialog is destroyed on leaving this function.
+        m_dlg = dlg.get();
+        wxON_BLOCK_EXIT_NULL(m_dlg);
+
         dlg->Fit();
 
         // Restore the previously selected page, if any.
@@ -212,11 +220,18 @@ public:
 
     virtual void Dismiss()
     {
-        // nothing to do
+        if ( m_dlg )
+        {
+            m_dlg->EndModal(wxID_CANCEL);
+            m_dlg = NULL;
+        }
     }
 
 private:
+    wxGenericPrefsDialog* m_dlg;
     int m_currentPage;
+
+    wxDECLARE_NO_COPY_CLASS(wxModalPreferencesEditorImpl);
 };
 
 inline