X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2f90df854ed9630ab60ac7729287807e4d1d8286..6230a84fdc327322f7bc6073b92cf34a8f92c47b:/utils/wxPython/src/helpers.h diff --git a/utils/wxPython/src/helpers.h b/utils/wxPython/src/helpers.h index 4ea09be213..bcf992aca6 100644 --- a/utils/wxPython/src/helpers.h +++ b/utils/wxPython/src/helpers.h @@ -1,4 +1,4 @@ -///////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// // Name: helpers.h // Purpose: Helper functions/classes for the wxPython extenaion module // @@ -66,10 +66,10 @@ PyObject* __wxSetDictionary(PyObject*, PyObject* args); void wxPyEventThunker(wxObject*, wxEvent& event); -HELPEREXPORT PyObject* wxPyConstructObject(void* ptr, char* className); +HELPEREXPORT PyObject* wxPyConstructObject(void* ptr, const char* className); HELPEREXPORT bool wxPyRestoreThread(); HELPEREXPORT void wxPySaveThread(bool doSave); -HELPEREXPORT PyObject* wxPy_ConvertList(wxListBase* list, char* className); +HELPEREXPORT PyObject* wxPy_ConvertList(wxListBase* list, const char* className); //---------------------------------------------------------------------- // These are helpers used by the typemaps @@ -182,11 +182,51 @@ private: }; +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// These classes can be derived from in Python and passed through the event +// system without loosing anything. They do this by keeping a reference to +// themselves and some special case handling in wxPyCallback::EventThunker. + + +class wxPyEvtSelfRef { +public: + wxPyEvtSelfRef(); + ~wxPyEvtSelfRef(); + + void SetSelf(PyObject* self, bool clone=FALSE); + PyObject* GetSelf() const; + +protected: + PyObject* m_self; + bool m_cloned; +}; + + +class wxPyEvent : public wxEvent, public wxPyEvtSelfRef { + DECLARE_DYNAMIC_CLASS(wxPyEvent) +public: + wxPyEvent(int id=0); + ~wxPyEvent(); + + void CopyObject(wxObject& dest) const; +}; + + +class wxPyCommandEvent : public wxCommandEvent, public wxPyEvtSelfRef { + DECLARE_DYNAMIC_CLASS(wxPyCommandEvent) +public: + wxPyCommandEvent(wxEventType commandType = wxEVT_NULL, int id=0); + ~wxPyCommandEvent(); + + void CopyObject(wxObject& dest) const; +}; + //--------------------------------------------------------------------------- // These macros are used to implement the virtual methods that should // redirect to a Python method if one exists. The names designate the -// return type, if any as well as any parameter types. +// return type, if any, as well as any parameter types. //--------------------------------------------------------------------------- #define PYPRIVATE \ @@ -415,13 +455,15 @@ private: #define IMP_PYCALLBACK_BOOL_DC4DBLBOOL(CLASS, PCLASS, CBNAME) \ bool CLASS::CBNAME(wxDC& a, double b, double c, double d, double e, bool f) { \ bool doSave = wxPyRestoreThread(); \ + bool rval; \ if (m_myInst.findCallback(#CBNAME)) \ - return m_myInst.callCallback(Py_BuildValue("(Oddddi)", \ + rval = m_myInst.callCallback(Py_BuildValue("(Oddddi)", \ wxPyConstructObject(&a, "wxDC"), \ b, c, d, e, (int)f)); \ else \ - return PCLASS::CBNAME(a, b, c, d, e, f); \ + rval = PCLASS::CBNAME(a, b, c, d, e, f); \ wxPySaveThread(doSave); \ + return rval; \ } \ bool CLASS::base_##CBNAME(wxDC& a, double b, double c, double d, double e, bool f) {\ return PCLASS::CBNAME(a, b, c, d, e, f); \ @@ -624,6 +666,29 @@ private: //--------------------------------------------------------------------------- +#define DEC_PYCALLBACK_BOOL_STRINGSTRING(CBNAME) \ + bool CBNAME(const wxString& a, const wxString& b); \ + bool base_##CBNAME(const wxString& a, const wxString& b); + + +#define IMP_PYCALLBACK_BOOL_STRINGSTRING(CLASS, PCLASS, CBNAME) \ + bool CLASS::CBNAME(const wxString& a, const wxString& b) { \ + bool rval; \ + bool doSave = wxPyRestoreThread(); \ + if (m_myInst.findCallback(#CBNAME)) \ + rval = m_myInst.callCallback(Py_BuildValue("(ss)", \ + a.c_str(), b.c_str())); \ + else \ + rval = PCLASS::CBNAME(a, b); \ + wxPySaveThread(doSave); \ + return rval; \ + } \ + bool CLASS::base_##CBNAME(const wxString& a, const wxString& b) { \ + return PCLASS::CBNAME(a, b); \ + } + +//--------------------------------------------------------------------------- + #define DEC_PYCALLBACK_STRING_(CBNAME) \ wxString CBNAME(); \ wxString base_##CBNAME(); @@ -639,12 +704,12 @@ private: rval = PyString_AsString(PyObject_Str(ro)); \ } \ else \ - rval = PCLASS::CBNAME(a); \ + rval = PCLASS::CBNAME(); \ wxPySaveThread(doSave); \ return rval; \ } \ - bool CLASS::base_##CBNAME(const wxString& a) { \ - return PCLASS::CBNAME(a); \ + wxString CLASS::base_##CBNAME() { \ + return PCLASS::CBNAME(); \ } //--------------------------------------------------------------------------- @@ -763,6 +828,131 @@ private: return PCLASS::CBNAME(); \ } +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK_DR_2WXCDR(CBNAME) \ + wxDragResult CBNAME(wxCoord x, wxCoord y, wxDragResult def); \ + wxDragResult base_##CBNAME(wxCoord x, wxCoord y, wxDragResult def); + + +#define IMP_PYCALLBACK_DR_2WXCDR(CLASS, PCLASS, CBNAME) \ + wxDragResult CLASS::CBNAME(wxCoord a, wxCoord b, wxDragResult c) { \ + bool doSave = wxPyRestoreThread(); \ + int rval; \ + if (m_myInst.findCallback(#CBNAME)) \ + rval = m_myInst.callCallback(Py_BuildValue("(iii)", a,b,c));\ + else \ + rval = PCLASS::CBNAME(a, b, c); \ + wxPySaveThread(doSave); \ + return (wxDragResult)rval; \ + } \ + wxDragResult CLASS::base_##CBNAME(wxCoord a, wxCoord b, wxDragResult c) { \ + return PCLASS::CBNAME(a, b, c); \ + } + +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK_BOOL_DR(CBNAME) \ + bool CBNAME(wxDragResult a); \ + bool base_##CBNAME(wxDragResult a); + + +#define IMP_PYCALLBACK_BOOL_DR(CLASS, PCLASS, CBNAME) \ + bool CLASS::CBNAME(wxDragResult a) { \ + bool doSave = wxPyRestoreThread(); \ + bool rval; \ + if (m_myInst.findCallback(#CBNAME)) \ + rval = m_myInst.callCallback(Py_BuildValue("(i)", a)); \ + else \ + rval = PCLASS::CBNAME(a); \ + wxPySaveThread(doSave); \ + return rval; \ + } \ + bool CLASS::base_##CBNAME(wxDragResult a) { \ + return PCLASS::CBNAME(a); \ + } + +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK_DR_2WXCDR_pure(CBNAME) \ + wxDragResult CBNAME(wxCoord x, wxCoord y, wxDragResult def); + + +#define IMP_PYCALLBACK_DR_2WXCDR_pure(CLASS, PCLASS, CBNAME) \ + wxDragResult CLASS::CBNAME(wxCoord a, wxCoord b, wxDragResult c) { \ + bool doSave = wxPyRestoreThread(); \ + int rval; \ + if (m_myInst.findCallback(#CBNAME)) \ + rval = m_myInst.callCallback(Py_BuildValue("(iii)", a,b,c));\ + wxPySaveThread(doSave); \ + return (wxDragResult)rval; \ + } \ + +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK_BOOL_INTINTSTR_pure(CBNAME) \ + bool CBNAME(int a, int b, const wxString& c); + + +#define IMP_PYCALLBACK_BOOL_INTINTSTR_pure(CLASS, PCLASS, CBNAME) \ + bool CLASS::CBNAME(int a, int b, const wxString& c) { \ + bool rval; \ + bool doSave = wxPyRestoreThread(); \ + if (m_myInst.findCallback(#CBNAME)) \ + rval = m_myInst.callCallback(Py_BuildValue("(iis)",a,b,c.c_str()));\ + wxPySaveThread(doSave); \ + return rval; \ + } \ + +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK_SIZET_(CBNAME) \ + size_t CBNAME(); \ + size_t base_##CBNAME(); + + +#define IMP_PYCALLBACK_SIZET_(CLASS, PCLASS, CBNAME) \ + size_t CLASS::CBNAME() { \ + size_t rval; \ + bool doSave = wxPyRestoreThread(); \ + if (m_myInst.findCallback(#CBNAME)) \ + rval = m_myInst.callCallback(Py_BuildValue("()")); \ + else \ + rval = PCLASS::CBNAME(); \ + wxPySaveThread(doSave); \ + return rval; \ + } \ + size_t CLASS::base_##CBNAME() { \ + return PCLASS::CBNAME(); \ + } + +//--------------------------------------------------------------------------- + +#define DEC_PYCALLBACK_DATAFMT_SIZET(CBNAME) \ + wxDataFormat CBNAME(); \ + wxDataFormat base_##CBNAME(); + + +#define IMP_PYCALLBACK_DATAFMT_SIZET(CLASS, PCLASS, CBNAME) \ + wxDataFormat CLASS::CBNAME(size_t a) { \ + wxDataFormat rval; \ + bool doSave = wxPyRestoreThread(); \ + if (m_myInst.findCallback(#CBNAME)) { \ + PyObject* ro; \ + wxDataFormat* ptr; \ + ro = m_myInst.callCallbackObj(Py_BuildValue("(i)", a)); \ + if (! SWIG_GetPtrObj(ro, (void **)&ptr, "_wxDataFormat_p")) \ + rval = *ptr; \ + } \ + else \ + rval = PCLASS::CBNAME(a); \ + wxPySaveThread(doSave); \ + return rval; \ + } \ + wxDataFormat CLASS::base_##CBNAME(size_t a) { \ + return PCLASS::CBNAME(a); \ + } + //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- @@ -771,3 +961,4 @@ private: +