From 85260f24dea6546ecfff376bac1d8838237ec2fe Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Thu, 22 Aug 2002 00:00:04 +0000 Subject: [PATCH] A more dynamic wxWizard sample, and a fix for wxGrid wrappers git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16668 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/demo/wxWizard.py | 126 +++++++++++++++++++++++++++++++++--- wxPython/src/grid.i | 2 +- wxPython/src/msw/grid.cpp | 2 +- wxPython/src/msw/misc2.cpp | 87 +++++++++++++++++++++++++ wxPython/src/msw/misc2.py | 9 +++ wxPython/src/msw/wizard.cpp | 3 + wxPython/src/wizard.i | 6 ++ 7 files changed, 224 insertions(+), 11 deletions(-) diff --git a/wxPython/demo/wxWizard.py b/wxPython/demo/wxWizard.py index 053567fadc..402a307031 100644 --- a/wxPython/demo/wxWizard.py +++ b/wxPython/demo/wxWizard.py @@ -6,21 +6,88 @@ import images #---------------------------------------------------------------------- +def makePageTitle(wizPg, title): + sizer = wxBoxSizer(wxVERTICAL) + wizPg.SetSizer(sizer) + title = wxStaticText(wizPg, -1, title) + title.SetFont(wxFont(18, wxSWISS, wxNORMAL, wxBOLD)) + sizer.AddWindow(title, 0, wxALIGN_CENTRE|wxALL, 5) + sizer.AddWindow(wxStaticLine(wizPg, -1), 0, wxEXPAND|wxALL, 5) + return sizer + +#---------------------------------------------------------------------- + class TitledPage(wxWizardPageSimple): def __init__(self, parent, title): wxWizardPageSimple.__init__(self, parent) - self.sizer = sizer = wxBoxSizer(wxVERTICAL) - self.SetSizer(sizer) + self.sizer = makePageTitle(self, title) + + +#---------------------------------------------------------------------- + +class SkipNextPage(wxPyWizardPage): + def __init__(self, parent, title): + wxPyWizardPage.__init__(self, parent) + self.next = self.prev = None + self.sizer = makePageTitle(self, title) + + self.cb = wxCheckBox(self, -1, "Skip next page") + self.sizer.Add(self.cb, 0, wxALL, 5) - title = wxStaticText(self, -1, title) - title.SetFont(wxFont(18, wxSWISS, wxNORMAL, wxBOLD)) - sizer.AddWindow(title, 0, wxALIGN_CENTRE|wxALL, 5) - sizer.AddWindow(wxStaticLine(self, -1), 0, wxEXPAND|wxALL, 5) + def SetNext(self, next): + self.next = next + def SetPrev(self, prev): + self.prev = prev + # Classes derived from wxPyWizardPanel must override + # GetNext and GetPrev, and may also override GetBitmap + # as well as all those methods overridable by + # wxPyWindow. + + def GetNext(self): + """If the checkbox is set then return the next page's next page""" + next = self.next + if self.cb.GetValue(): + next = next.GetNext() + return next + + def GetPrev(self): + return self.prev + #---------------------------------------------------------------------- +class UseAltBitmapPage(wxPyWizardPage): + def __init__(self, parent, title): + wxPyWizardPage.__init__(self, parent) + self.next = self.prev = None + self.sizer = makePageTitle(self, title) + + self.sizer.Add(wxStaticText(self, -1, "This page uses a different bitmap"), + 0, wxALL, 5) + + def SetNext(self, next): + self.next = next + + def SetPrev(self, prev): + self.prev = prev + + def GetNext(self): + return self.next + + def GetPrev(self): + return self.prev + + def GetBitmap(self): + # You usually wouldn't need to override this method + # since you can set a non-default bitmap in the + # wxWizardPageSimple constructor, but if you need to + # dynamically change the bitmap based on the + # contents of the wizard, or need to also change the + # next/prev order then it can be done by overriding + # GetBitmap. + return images.getWizTest2Bitmap() #---------------------------------------------------------------------- @@ -61,7 +128,14 @@ class TestPanel(wxPanel): def OnWizCancel(self, evt): - pass + page = evt.GetPage() + self.log.write("OnWizCancel: %s\n" % page.__class__) + + # Show how to prevent cancelling of the wizard. The + # other events can be Veto'd too. + if page is self.page1: + wxMessageBox("Cancelling on the first page has been prevented.", "Sorry") + evt.Veto() def OnRunSimpleWizard(self, evt): @@ -72,13 +146,15 @@ class TestPanel(wxPanel): page2 = TitledPage(wizard, "Page 2") page3 = TitledPage(wizard, "Page 3") page4 = TitledPage(wizard, "Page 4") + self.page1 = page1 - page1.sizer.Add(wxStaticText(page1, -1, """\ + page1.sizer.Add(wxStaticText(page1, -1, """ This wizard is totally useless, but is meant to show how to chain simple wizard pages together in a non-dynamic manner. IOW, the order of the pages never changes, and so the wxWizardPageSimple class can easily be used for the pages.""")) wizard.FitToPage(page1) + page4.sizer.Add(wxStaticText(page4, -1, "\nThis is the last page.")) # Use the convenience Chain function to connect the pages wxWizardPageSimple_Chain(page1, page2) @@ -93,7 +169,39 @@ wxWizardPageSimple class can easily be used for the pages.""")) def OnRunDynamicWizard(self, evt): - pass + # Create the wizard and the pages + wizard = wxWizard(self, self.ID_wiz, "Simple Wizard", + images.getWizTest1Bitmap()) + + page1 = TitledPage(wizard, "Page 1") + page2 = SkipNextPage(wizard, "Page 2") + page3 = TitledPage(wizard, "Page 3") + page4 = UseAltBitmapPage(wizard, "Page 4") + page5 = TitledPage(wizard, "Page 5") + self.page1 = page1 + + page1.sizer.Add(wxStaticText(page1, -1, """ +This wizard shows the ability to choose at runtime the order +of the pages and also which bitmap is shown. +""")) + wizard.FitToPage(page1) + page5.sizer.Add(wxStaticText(page5, -1, "\nThis is the last page.")) + + # Set the initial order of the pages + page1.SetNext(page2) + page2.SetPrev(page1) + page2.SetNext(page3) + page3.SetPrev(page2) + page3.SetNext(page4) + page4.SetPrev(page3) + page4.SetNext(page5) + page5.SetPrev(page4) + + + if wizard.RunWizard(page1): + wxMessageBox("Wizard completed successfully", "That's all folks!") + else: + wxMessageBox("Wizard was cancelled", "That's all folks!") #---------------------------------------------------------------------- diff --git a/wxPython/src/grid.i b/wxPython/src/grid.i index 147ca26bf4..bb353e2e8d 100644 --- a/wxPython/src/grid.i +++ b/wxPython/src/grid.i @@ -398,7 +398,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) void CBNAME(int a, const wxString& c) { \ bool found; \ wxPyBeginBlockThreads(); \ - if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* s = wx2PyString(c); \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iO)",a,s)); \ Py_DECREF(s); \ diff --git a/wxPython/src/msw/grid.cpp b/wxPython/src/msw/grid.cpp index 9af5e6c4c4..25954b9060 100644 --- a/wxPython/src/msw/grid.cpp +++ b/wxPython/src/msw/grid.cpp @@ -425,7 +425,7 @@ wxPyMake_TEMPLATE(wxGridTableBase) void CBNAME(int a, const wxString& c) { \ bool found; \ wxPyBeginBlockThreads(); \ - if (wxPyCBH_findCallback(m_myInst, #CBNAME)) { \ + if ((found = wxPyCBH_findCallback(m_myInst, #CBNAME))) { \ PyObject* s = wx2PyString(c); \ wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iO)",a,s)); \ Py_DECREF(s); \ diff --git a/wxPython/src/msw/misc2.cpp b/wxPython/src/msw/misc2.cpp index 1c55aa1c0a..6fbe6cab8b 100644 --- a/wxPython/src/msw/misc2.cpp +++ b/wxPython/src/msw/misc2.cpp @@ -6567,6 +6567,90 @@ static PyObject *_wrap_wxProcess_CloseOutput(PyObject *self, PyObject *args, PyO return _resultobj; } +#define wxProcess_IsInputOpened(_swigobj) (_swigobj->IsInputOpened()) +static PyObject *_wrap_wxProcess_IsInputOpened(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxPyProcess * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxProcess_IsInputOpened",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxPyProcess_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxProcess_IsInputOpened. Expected _wxPyProcess_p."); + return NULL; + } + } +{ + PyThreadState* __tstate = wxPyBeginAllowThreads(); + _result = (bool )wxProcess_IsInputOpened(_arg0); + + wxPyEndAllowThreads(__tstate); + if (PyErr_Occurred()) return NULL; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxProcess_IsInputAvailable(_swigobj) (_swigobj->IsInputAvailable()) +static PyObject *_wrap_wxProcess_IsInputAvailable(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxPyProcess * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxProcess_IsInputAvailable",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxPyProcess_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxProcess_IsInputAvailable. Expected _wxPyProcess_p."); + return NULL; + } + } +{ + PyThreadState* __tstate = wxPyBeginAllowThreads(); + _result = (bool )wxProcess_IsInputAvailable(_arg0); + + wxPyEndAllowThreads(__tstate); + if (PyErr_Occurred()) return NULL; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxProcess_IsErrorAvailable(_swigobj) (_swigobj->IsErrorAvailable()) +static PyObject *_wrap_wxProcess_IsErrorAvailable(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxPyProcess * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxProcess_IsErrorAvailable",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxPyProcess_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxProcess_IsErrorAvailable. Expected _wxPyProcess_p."); + return NULL; + } + } +{ + PyThreadState* __tstate = wxPyBeginAllowThreads(); + _result = (bool )wxProcess_IsErrorAvailable(_arg0); + + wxPyEndAllowThreads(__tstate); + if (PyErr_Occurred()) return NULL; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + static void *SwigwxJoystickTowxObject(void *ptr) { wxJoystick *src; wxObject *dest; @@ -10483,6 +10567,9 @@ static PyMethodDef misc2cMethods[] = { { "wxJoystick_GetPosition", (PyCFunction) _wrap_wxJoystick_GetPosition, METH_VARARGS | METH_KEYWORDS }, { "delete_wxJoystick", (PyCFunction) _wrap_delete_wxJoystick, METH_VARARGS | METH_KEYWORDS }, { "new_wxJoystick", (PyCFunction) _wrap_new_wxJoystick, METH_VARARGS | METH_KEYWORDS }, + { "wxProcess_IsErrorAvailable", (PyCFunction) _wrap_wxProcess_IsErrorAvailable, METH_VARARGS | METH_KEYWORDS }, + { "wxProcess_IsInputAvailable", (PyCFunction) _wrap_wxProcess_IsInputAvailable, METH_VARARGS | METH_KEYWORDS }, + { "wxProcess_IsInputOpened", (PyCFunction) _wrap_wxProcess_IsInputOpened, METH_VARARGS | METH_KEYWORDS }, { "wxProcess_CloseOutput", (PyCFunction) _wrap_wxProcess_CloseOutput, METH_VARARGS | METH_KEYWORDS }, { "wxProcess_GetOutputStream", (PyCFunction) _wrap_wxProcess_GetOutputStream, METH_VARARGS | METH_KEYWORDS }, { "wxProcess_GetErrorStream", (PyCFunction) _wrap_wxProcess_GetErrorStream, METH_VARARGS | METH_KEYWORDS }, diff --git a/wxPython/src/msw/misc2.py b/wxPython/src/msw/misc2.py index df54b3c25f..39aa1535ff 100644 --- a/wxPython/src/msw/misc2.py +++ b/wxPython/src/msw/misc2.py @@ -604,6 +604,15 @@ class wxProcessPtr(wxEvtHandlerPtr): def CloseOutput(self, *_args, **_kwargs): val = apply(misc2c.wxProcess_CloseOutput,(self,) + _args, _kwargs) return val + def IsInputOpened(self, *_args, **_kwargs): + val = apply(misc2c.wxProcess_IsInputOpened,(self,) + _args, _kwargs) + return val + def IsInputAvailable(self, *_args, **_kwargs): + val = apply(misc2c.wxProcess_IsInputAvailable,(self,) + _args, _kwargs) + return val + def IsErrorAvailable(self, *_args, **_kwargs): + val = apply(misc2c.wxProcess_IsErrorAvailable,(self,) + _args, _kwargs) + return val def __repr__(self): return "" % (self.this,) class wxProcess(wxProcessPtr): diff --git a/wxPython/src/msw/wizard.cpp b/wxPython/src/msw/wizard.cpp index 9f43004ac8..0e33f29e18 100644 --- a/wxPython/src/msw/wizard.cpp +++ b/wxPython/src/msw/wizard.cpp @@ -2264,6 +2264,9 @@ SWIGEXPORT(void) initwizardc() { PyDict_SetItemString(d,"wxEVT_WIZARD_PAGE_CHANGING", PyInt_FromLong((long) wxEVT_WIZARD_PAGE_CHANGING)); PyDict_SetItemString(d,"wxEVT_WIZARD_CANCEL", PyInt_FromLong((long) wxEVT_WIZARD_CANCEL)); PyDict_SetItemString(d,"wxEVT_WIZARD_HELP", PyInt_FromLong((long) wxEVT_WIZARD_HELP)); + + wxClassInfo::CleanUpClasses(); + wxClassInfo::InitializeClasses(); { int i; for (i = 0; _swig_mapping[i].n1; i++) diff --git a/wxPython/src/wizard.i b/wxPython/src/wizard.i index 5a1e4dbdca..b53e3d313c 100644 --- a/wxPython/src/wizard.i +++ b/wxPython/src/wizard.i @@ -343,6 +343,12 @@ public: //---------------------------------------------------------------------- + +%init %{ + wxClassInfo::CleanUpClasses(); + wxClassInfo::InitializeClasses(); +%} + //---------------------------------------------------------------------- // This file gets appended to the shadow class file. //---------------------------------------------------------------------- -- 2.45.2