Better fix for modal/modeless wizards.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35725 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba
2005-09-26 13:30:54 +00:00
parent dfdc483a23
commit 94c09a19ec
2 changed files with 15 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Name: generic/wizard.h // Name: wx/generic/wizard.h
// Purpose: declaration of generic wxWizard class // Purpose: declaration of generic wxWizard class
// Author: Vadim Zeitlin // Author: Vadim Zeitlin
// Modified by: Robert Vazan (sizers) // Modified by: Robert Vazan (sizers)
@@ -113,6 +113,9 @@ private:
// Whether RunWizard() was called // Whether RunWizard() was called
bool m_started; bool m_started;
// Whether was modal (modeless has to be destroyed on finish or cancel)
bool m_wasModal;
// Page area sizer will be inserted here with padding // Page area sizer will be inserted here with padding
wxBoxSizer *m_sizerBmpAndPage; wxBoxSizer *m_sizerBmpAndPage;

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Name: generic/wizard.cpp // Name: src/generic/wizard.cpp
// Purpose: generic implementation of wxWizard class // Purpose: generic implementation of wxWizard class
// Author: Vadim Zeitlin // Author: Vadim Zeitlin
// Modified by: Robert Cavanaugh // Modified by: Robert Cavanaugh
@@ -263,10 +263,6 @@ wxSize wxWizardSizer::SiblingSize(wxSizerItem *child)
// generic wxWizard implementation // generic wxWizard implementation
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// FIXME: this is a hack
WX_DEFINE_ARRAY_PTR(wxWizard *, wxModelessWizards);
static wxModelessWizards modelessWizards;
void wxWizard::Init() void wxWizard::Init()
{ {
m_posWizard = wxDefaultPosition; m_posWizard = wxDefaultPosition;
@@ -278,7 +274,7 @@ void wxWizard::Init()
m_calledSetBorder = false; m_calledSetBorder = false;
m_border = 0; m_border = 0;
m_started = false; m_started = false;
modelessWizards.Add(this); m_wasModal = false;
} }
bool wxWizard::Create(wxWindow *parent, bool wxWizard::Create(wxWindow *parent,
@@ -393,7 +389,7 @@ void wxWizard::AddButtonRow(wxBoxSizer *mainColumn)
// was created before the 'next' button. // was created before the 'next' button.
bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA);
int buttonStyle = isPda ? wxBU_EXACTFIT : 0; int buttonStyle = isPda ? wxBU_EXACTFIT : 0;
wxBoxSizer *buttonRow = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *buttonRow = new wxBoxSizer(wxHORIZONTAL);
#ifdef __WXMAC__ #ifdef __WXMAC__
@@ -458,10 +454,10 @@ void wxWizard::DoCreateControls()
return; return;
bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA);
// Horizontal stretching, and if not PDA, border all around // Horizontal stretching, and if not PDA, border all around
int mainColumnSizerFlags = isPda ? wxEXPAND : wxALL|wxEXPAND ; int mainColumnSizerFlags = isPda ? wxEXPAND : wxALL|wxEXPAND ;
// wxWindow::SetSizer will be called at end // wxWindow::SetSizer will be called at end
wxBoxSizer *windowSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *windowSizer = new wxBoxSizer(wxVERTICAL);
@@ -474,10 +470,10 @@ void wxWizard::DoCreateControls()
); );
AddBitmapRow(mainColumn); AddBitmapRow(mainColumn);
if (!isPda) if (!isPda)
AddStaticLine(mainColumn); AddStaticLine(mainColumn);
AddButtonRow(mainColumn); AddButtonRow(mainColumn);
// wxWindow::SetSizer should be followed by wxWindow::Fit, but // wxWindow::SetSizer should be followed by wxWindow::Fit, but
@@ -494,7 +490,7 @@ void wxWizard::SetPageSize(const wxSize& size)
void wxWizard::FinishLayout() void wxWizard::FinishLayout()
{ {
bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA);
// Set to enable wxWizardSizer::GetMaxChildSize // Set to enable wxWizardSizer::GetMaxChildSize
m_started = true; m_started = true;
@@ -661,7 +657,7 @@ bool wxWizard::RunWizard(wxWizardPage *firstPage)
// can't return false here because there is no old page // can't return false here because there is no old page
(void)ShowPage(firstPage, true /* forward */); (void)ShowPage(firstPage, true /* forward */);
modelessWizards.Remove(this); m_wasModal = true;
return ShowModal() == wxID_OK; return ShowModal() == wxID_OK;
} }
@@ -703,7 +699,7 @@ wxSize wxWizard::GetManualPageSize() const
DEFAULT_PAGE_WIDTH = wxSystemSettings::GetMetric(wxSYS_SCREEN_X) / 2; DEFAULT_PAGE_WIDTH = wxSystemSettings::GetMetric(wxSYS_SCREEN_X) / 2;
DEFAULT_PAGE_HEIGHT = wxSystemSettings::GetMetric(wxSYS_SCREEN_Y) / 2; DEFAULT_PAGE_HEIGHT = wxSystemSettings::GetMetric(wxSYS_SCREEN_Y) / 2;
} }
wxSize totalPageSize(DEFAULT_PAGE_WIDTH,DEFAULT_PAGE_HEIGHT); wxSize totalPageSize(DEFAULT_PAGE_WIDTH,DEFAULT_PAGE_HEIGHT);
totalPageSize.IncTo(m_sizePage); totalPageSize.IncTo(m_sizePage);
@@ -805,14 +801,13 @@ void wxWizard::OnWizEvent(wxWizardEvent& event)
} }
} }
if ( ( modelessWizards.Index(this) != wxNOT_FOUND ) && if ( ( !m_wasModal ) &&
event.IsAllowed() && event.IsAllowed() &&
( event.GetEventType() == wxEVT_WIZARD_FINISHED || ( event.GetEventType() == wxEVT_WIZARD_FINISHED ||
event.GetEventType() == wxEVT_WIZARD_CANCEL event.GetEventType() == wxEVT_WIZARD_CANCEL
) )
) )
{ {
modelessWizards.Remove(this);
Destroy(); Destroy();
} }
} }