]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/src/_pen.i
Build fix for motif.
[wxWidgets.git] / wxPython / src / _pen.i
index 911f63d1d072ee4164a6d94fa118f6b8ca3a37d8..e0fca1cb17ca0907d1ff6b6cc25cb7cd3ac1a8d1 100644 (file)
@@ -29,6 +29,8 @@
 %newgroup
 
 
+MustHaveApp(wxPen);
+
 class wxPen : public wxGDIObject {
 public:
     wxPen(wxColour& colour, int width=1, int style=wxSOLID);
@@ -54,22 +56,47 @@ public:
         PyObject* GetDashes() {
             wxDash* dashes;
             int count = self->GetDashes(&dashes);
-            bool blocked = wxPyBeginBlockThreads();
+            wxPyBlock_t blocked = wxPyBeginBlockThreads();
             PyObject* retval = PyList_New(0);
-            for (int x=0; x<count; x++)
-                PyList_Append(retval, PyInt_FromLong(dashes[x]));
+            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) {
+            wxPyBlock_t 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);
+        }
     }
-    
-    %extend {
-        bool __eq__(const wxPen* other) { return other ? (*self == *other) : False; }
-        bool __ne__(const wxPen* other) { return other ? (*self != *other) : True;  }
+    %pythoncode {
+    def SetDashes(self, dashes):
+        """
+        Associate a list of dash lengths with the Pen.
+        """
+        self._SetDashes(self, dashes)
     }
 
+    
 #ifndef __WXMAC__
-//  wxDash* GetDash() const;
     int GetDashCount() const;
 #endif
     
@@ -78,42 +105,13 @@ public:
     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 };
 
 //---------------------------------------------------------------------------