X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d14a1e28567de23c586bc80017073d0c39f8d18f..31ad423e4fb556ec225a63b161154d3bf3445c1b:/wxPython/src/_pen.i diff --git a/wxPython/src/_pen.i b/wxPython/src/_pen.i index 3c0677b5fb..5f9f7a278e 100644 --- a/wxPython/src/_pen.i +++ b/wxPython/src/_pen.i @@ -29,6 +29,8 @@ %newgroup +MustHaveApp(wxPen); + class wxPen : public wxGDIObject { public: wxPen(wxColour& colour, int width=1, int style=wxSOLID); @@ -54,56 +56,62 @@ public: PyObject* GetDashes() { wxDash* dashes; int count = self->GetDashes(&dashes); - wxPyBeginBlockThreads(); + bool blocked = wxPyBeginBlockThreads(); PyObject* retval = PyList_New(0); - for (int x=0; x<count; x++) - PyList_Append(retval, PyInt_FromLong(dashes[x])); - wxPyEndBlockThreads(); + for (int x=0; x<count; x++) { + PyObject* pyint = PyInt_FromLong(dashes[x]); + PyList_Append(retval, pyint); + Py_DECREF(pyint); + } + wxPyEndBlockThreads(blocked); return retval; } + + void _SetDashes(PyObject* _self, PyObject* pyDashes) { + bool blocked = wxPyBeginBlockThreads(); + int size = PyList_Size(pyDashes); + wxDash* dashes = (wxDash*)byte_LIST_helper(pyDashes); + + // black magic warning! The array of wxDashes needs to exist as + // long as the pen does because wxPen does not copy the array. So + // stick a copy in a Python string object and attach it to _self, + // and then call SetDashes with a pointer to that array. Then + // when the Python pen object is destroyed the array will be + // cleaned up too. + PyObject* strDashes = PyString_FromStringAndSize((char*)dashes, size*sizeof(wxDash)); + PyObject_SetAttrString(_self, "_dashes", strDashes); + + self->SetDashes(size, (wxDash*)PyString_AS_STRING(strDashes)); + delete [] dashes; + Py_DECREF(strDashes); + wxPyEndBlockThreads(blocked); + } + } + %pythoncode { + def SetDashes(self, dashes): + """ + Associate a list of dash lengths with the Pen. + """ + self._SetDashes(self, dashes) } + +#ifndef __WXMAC__ + int GetDashCount() const; +#endif + #ifdef __WXMSW__ wxBitmap* GetStipple(); void SetStipple(wxBitmap& stipple); #endif - %pythoncode { def __nonzero__(self): return self.Ok() } -}; - - -// The list of ints for the dashes needs to exist for the life of the pen -// so we make it part of the class to save it. See pyclasses.h - -%{ -wxPyPen::~wxPyPen() -{ - if (m_dash) - delete [] m_dash; -} - -void wxPyPen::SetDashes(int nb_dashes, const wxDash *dash) -{ - if (m_dash) - delete [] m_dash; - m_dash = new wxDash[nb_dashes]; - for (int i=0; i<nb_dashes; i++) { - m_dash[i] = dash[i]; + + %extend { + bool __eq__(const wxPen* other) { return other ? (*self == *other) : False; } + bool __ne__(const wxPen* other) { return other ? (*self != *other) : True; } } - wxPen::SetDashes(nb_dashes, m_dash); -} -%} - - -class wxPyPen : public wxPen { -public: - wxPyPen(wxColour& colour, int width=1, int style=wxSOLID); - ~wxPyPen(); - - void SetDashes(int dashes, wxDash* dashes_array); + %pythoncode { def __nonzero__(self): return self.Ok() } }; -// wxPyPen is aliased to wxPen -%pythoncode { Pen = PyPen }; //---------------------------------------------------------------------------