]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/src/_dc.i
demo tweaks
[wxWidgets.git] / wxPython / src / _dc.i
index 5c5e193d64ce870a97bc1ae5bfd4dc4c26f8f4fc..e61213b4518d292109ee4bcd23c07637e5aca6a3 100644 (file)
@@ -13,6 +13,7 @@
 // Not a %module
 
 
+
 //---------------------------------------------------------------------------
 
 %{
@@ -52,7 +53,7 @@ public:
 
 
 
-#if 0  // The old way
+#if defined(wxUSE_DC_OLD_METHODS)
 
     bool FloodFill(wxCoord x, wxCoord y, const wxColour& col, int style = wxFLOOD_SURFACE);
     //bool GetPixel(wxCoord x, wxCoord y, wxColour *col) const;
@@ -75,18 +76,18 @@ public:
     void DrawCircle(wxCoord x, wxCoord y, wxCoord radius);
     void DrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
     void DrawIcon(const wxIcon& icon, wxCoord x, wxCoord y);
-    void DrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask = FALSE);
+    void DrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask = False);
     void DrawText(const wxString& text, wxCoord x, wxCoord y);
     void DrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle);
     bool Blit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
               wxDC *source, wxCoord xsrc, wxCoord ysrc,
-              int rop = wxCOPY, bool useMask = FALSE,
+              int rop = wxCOPY, bool useMask = False,
               wxCoord xsrcMask = -1, wxCoord ysrcMask = -1);
 
 
 
 #else  // The new way
-    
+
     %name(FloodFillXY) bool FloodFill(wxCoord x, wxCoord y, const wxColour& col, int style = wxFLOOD_SURFACE);
     bool FloodFill(const wxPoint& pt, const wxColour& col, int style = wxFLOOD_SURFACE);
 
@@ -140,8 +141,8 @@ public:
     %name(DrawIconXY) void DrawIcon(const wxIcon& icon, wxCoord x, wxCoord y);
     void DrawIcon(const wxIcon& icon, const wxPoint& pt);
 
-    %name(DrawBitmapXY) void DrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask = FALSE);
-    void DrawBitmap(const wxBitmap &bmp, const wxPoint& pt, bool useMask = FALSE);
+    %name(DrawBitmapXY) void DrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask = False);
+    void DrawBitmap(const wxBitmap &bmp, const wxPoint& pt, bool useMask = False);
 
     %name(DrawTextXY) void DrawText(const wxString& text, wxCoord x, wxCoord y);
     void DrawText(const wxString& text, const wxPoint& pt);
@@ -149,25 +150,31 @@ public:
     %name(DrawRotatedTextXY) void DrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle);
     void DrawRotatedText(const wxString& text, const wxPoint& pt, double angle);
 
-    
+
     %name(BlitXY) bool Blit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
                             wxDC *source, wxCoord xsrc, wxCoord ysrc,
-                            int rop = wxCOPY, bool useMask = FALSE,
+                            int rop = wxCOPY, bool useMask = False,
                             wxCoord xsrcMask = -1, wxCoord ysrcMask = -1);
-    bool Blit(const wxPoint& destPt, const wxSize& sz,  
+    bool Blit(const wxPoint& destPt, const wxSize& sz,
               wxDC *source, const wxPoint& srcPt,
-              int rop = wxCOPY, bool useMask = FALSE,
+              int rop = wxCOPY, bool useMask = False,
               const wxPoint& srcPtMask = wxDefaultPosition);
 
 #endif
-    
+
     void DrawLines(int points, wxPoint* points_array, wxCoord xoffset = 0, wxCoord yoffset = 0);
 
     void DrawPolygon(int points, wxPoint* points_array,
                      wxCoord xoffset = 0, wxCoord yoffset = 0,
                      int fillStyle = wxODDEVEN_RULE);
 
+    // TODO:  Figure out a good typemap for this...
+    //        Convert the first 3 args from a sequence of sequences?
+//     void DrawPolyPolygon(int n, int count[], wxPoint points[],
+//                           wxCoord xoffset = 0, wxCoord yoffset = 0,
+//                           int fillStyle = wxODDEVEN_RULE);
 
+    
     // this version puts both optional bitmap and the text into the given
     // rectangle and aligns is as specified by alignment parameter; it also
     // will emphasize the character with the given index if it is != -1 and
@@ -192,7 +199,7 @@ public:
     void DrawSpline(int points, wxPoint* points_array);
 
 
-    
+
     // global DC operations
     // --------------------
 
@@ -204,7 +211,7 @@ public:
     virtual void StartPage();
     virtual void EndPage();
 
-    
+
     // set objects to use for drawing
     // ------------------------------
 
@@ -215,18 +222,21 @@ public:
     virtual void SetBackgroundMode(int mode);
     virtual void SetPalette(const wxPalette& palette);
 
-    
+
     // clipping region
     // ---------------
 
-    void SetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
-    //void SetClippingRegion(const wxPoint& pt, const wxSize& sz)
+    %name(SetClippingRegionXY)void SetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
+    void SetClippingRegion(const wxPoint& pt, const wxSize& sz);
     %name(SetClippingRect) void SetClippingRegion(const wxRect& rect);
     %name(SetClippingRegionAsRegion) void SetClippingRegion(const wxRegion& region);
 
     virtual void DestroyClippingRegion();
 
-    void GetClippingBox(wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord *OUTPUT) const;
+    DocDeclA(
+        void, GetClippingBox(wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord *OUTPUT) const,
+        "GetClippingBox() -> (x, y, width, height)");
+
     %extend {
         wxRect GetClippingRect() {
             wxRect rect;
@@ -234,37 +244,69 @@ public:
             return rect;
         }
     }
-    
 
-    
+
+
     // text extent
     // -----------
 
     virtual wxCoord GetCharHeight() const;
     virtual wxCoord GetCharWidth() const;
 
-    // only works for single line strings
-    void GetTextExtent(const wxString& string, wxCoord *OUTPUT, wxCoord *OUTPUT);
-    %name(GetFullTextExtent)void GetTextExtent(const wxString& string,
-                       wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord* OUTPUT,
-                       wxFont* font = NULL);
+
+    DocDeclAStr(
+        void, GetTextExtent(const wxString& string, wxCoord *OUTPUT, wxCoord *OUTPUT),
+        "GetTextExtent(wxString string) -> (width, height)",
+        "Get the width and height of the text using the current font.\n"
+        "Only works for single line strings.");
+    DocDeclAStrName(
+        void, GetTextExtent(const wxString& string,
+                            wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord* OUTPUT,
+                            wxFont* font = NULL),
+        "GetFullTextExtent(wxString string, Font font=None) ->\n   (width, height, descent, externalLeading)",
+        "Get the width, height, decent and leading of the text using the current or specified font.\n"
+        "Only works for single line strings.",
+        GetFullTextExtent);
+
 
     // works for single as well as multi-line strings
-    void GetMultiLineTextExtent(const wxString& text, wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord *OUTPUT,
-                                wxFont *font = NULL);
+    DocDeclAStr(
+        void, GetMultiLineTextExtent(const wxString& text,
+                                     wxCoord *OUTPUT, wxCoord *OUTPUT, wxCoord *OUTPUT,
+                                     wxFont *font = NULL),
+        "GetMultiLineTextExtent(wxString string, Font font=None) ->\n   (width, height, descent, externalLeading)",
+        "Get the width, height, decent and leading of the text using the current or specified font.\n"
+        "Works for single as well as multi-line strings.");
+
+    
+    %extend {
+        wxArrayInt GetPartialTextExtents(const wxString& text) {
+            wxArrayInt widths;
+            self->GetPartialTextExtents(text, widths);
+            return widths;
+        }
+    }
     
 
     // size and resolution
     // -------------------
 
-    // in device units
-    %name(GetSizeTuple)void GetSize(int* OUTPUT, int* OUTPUT);
+    DocStr(GetSize, "Get the DC size in device units.");
     wxSize GetSize();
+    DocDeclAName(
+        void, GetSize( int *OUTPUT, int *OUTPUT ),
+        "GetSizeTuple() -> (width, height)",
+        GetSizeTuple);
+
 
-    // in mm
-    %name(GetSizeMMWH)void GetSizeMM(int* OUTPUT, int* OUTPUT) const;
+    DocStr(GetSizeMM, "Get the DC size in milimeters.");
     wxSize GetSizeMM() const;
-    
+    DocDeclAName(
+        void, GetSizeMM( int *OUTPUT, int *OUTPUT ) const,
+        "GetSizeMMTuple() -> (width, height)",
+        GetSizeMMTuple);
+
+
 
     // coordinates conversions
     // -----------------------
@@ -294,7 +336,7 @@ public:
 
     virtual bool Ok() const;
 
-    
+
 
     int GetBackgroundMode() const;
     const wxBrush&  GetBackground() const;
@@ -310,19 +352,36 @@ public:
     int GetMapMode() const;
     virtual void SetMapMode(int mode);
 
-    virtual void GetUserScale(double *OUTPUT, double *OUTPUT) const;
+
+    DocDeclA(
+        virtual void, GetUserScale(double *OUTPUT, double *OUTPUT) const,
+        "GetUserScale() -> (xScale, yScale)");
+
     virtual void SetUserScale(double x, double y);
 
-    virtual void GetLogicalScale(double *OUTPUT, double *OUTPUT);
+
+    DocDeclA(
+        virtual void, GetLogicalScale(double *OUTPUT, double *OUTPUT),
+        "GetLogicalScale() -> (xScale, yScale)");
+
     virtual void SetLogicalScale(double x, double y);
 
-    %name(GetLogicalOriginTuple) void GetLogicalOrigin(wxCoord *OUTPUT, wxCoord *OUTPUT) const;
+
     wxPoint GetLogicalOrigin() const;
+    DocDeclAName(
+        void, GetLogicalOrigin(wxCoord *OUTPUT, wxCoord *OUTPUT) const,
+        "GetLogicalOriginTuple() -> (x,y)",
+        GetLogicalOriginTuple);
+
     virtual void SetLogicalOrigin(wxCoord x, wxCoord y);
 
-    
-    %name(GetDeviceOriginTuple) void GetDeviceOrigin(wxCoord *OUTPUT, wxCoord *OUTPUT) const;
+
     wxPoint GetDeviceOrigin() const;
+    DocDeclAName(
+        void, GetDeviceOrigin(wxCoord *OUTPUT, wxCoord *OUTPUT) const,
+        "GetDeviceOriginTuple() -> (x,y)",
+        GetDeviceOriginTuple);
+
     virtual void SetDeviceOrigin(wxCoord x, wxCoord y);
 
     virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp);
@@ -332,7 +391,7 @@ public:
 
     virtual void SetOptimization(bool opt);
     virtual bool GetOptimization();
-    
+
 
     // bounding box
     // ------------
@@ -347,10 +406,12 @@ public:
     wxCoord MaxY() const;
 
 
+    DocA(GetBoundingBox,
+         "GetBoundingBox() -> (x1,y1, x2,y2)");
     %extend {
         void GetBoundingBox(int* OUTPUT, int* OUTPUT, int* OUTPUT, int* OUTPUT);
         // See below for implementation
-    }    
+    }
     %pythoncode { def __nonzero__(self): return self.Ok() };
 
 
@@ -441,8 +502,8 @@ public:
 
 
     def DrawPolygonList(self, polygons, pens=None, brushes=None):
-        ## Note: This does not currently support fill style or offset
-        ## you can always use the non-List version if need be.
+        %## Note: This does not currently support fill style or offset
+        %## you can always use the non-List version if need be.
         if pens is None:
            pens = []
         elif isinstance(pens, wx.Pen):
@@ -459,22 +520,22 @@ public:
 
 
     def DrawTextList(self, textList, coords, foregrounds = None, backgrounds = None, fonts = None):
-        ## NOTE: this does not currently support changing the font
-        ##       Make sure you set Background mode to wxSolid (DC.SetBackgroundMode)
-        ##       If you want backgounds to do anything.
+        %## NOTE: this does not currently support changing the font
+        %##       Make sure you set Background mode to wxSolid (DC.SetBackgroundMode)
+        %##       If you want backgounds to do anything.
         if type(textList) == type(''):
            textList = [textList]
         elif len(textList) != len(coords):
            raise ValueError('textlist and coords must have same length')
         if foregrounds is None:
            foregrounds = []
-        elif isinstance(foregrounds, wxColour):
+        elif isinstance(foregrounds, wx.Colour):
            foregrounds = [foregrounds]
         elif len(foregrounds) != len(coords):
            raise ValueError('foregrounds and coords must have same length')
         if backgrounds is None:
            backgrounds = []
-        elif isinstance(backgrounds, wxColour):
+        elif isinstance(backgrounds, wx.Colour):
            backgrounds = [backgrounds]
         elif len(backgrounds) != len(coords):
            raise ValueError('backgrounds and coords must have same length')
@@ -502,42 +563,154 @@ class wxMemoryDC : public wxDC {
 public:
     wxMemoryDC();
     %name(MemoryDCFromDC) wxMemoryDC(wxDC* oldDC);
-        
+
     void SelectObject(const wxBitmap& bitmap);
 };
 
 //---------------------------------------------------------------------------
 %newgroup
 
+
+%{
+//-=-=-=-=-=-=-=-=-=-=-    
+
+#if 1
+// Use the standard wxBufferedDC
+#include <wx/dcbuffer.h>
+
+#else
+
+//  Or, temporarily put a set of classes here similar to the old buffered DC
+//  classes until the real ones can be fixed to work "correctly" again.
+
 class wxBufferedDC : public wxMemoryDC
 {
+private:
+    wxDC        *m_dc;
+    wxBitmap    m_buffer;
+
 public:
-    %addtofunc wxBufferedDC( wxDC *dc, const wxBitmap &buffer ) 
+
+    wxBufferedDC() : m_dc( 0 ) {}
+    
+    wxBufferedDC( wxDC *dc, const wxBitmap &buffer )
+        : m_dc( dc ), m_buffer( buffer )
+    {
+        SelectObject( m_buffer );
+    }
+       
+    wxBufferedDC( wxDC *dc, const wxSize &area )
+        : m_dc( dc ), m_buffer( area.GetWidth(), area.GetHeight() )
+    {
+        SelectObject( m_buffer );
+    }
+
+    ~wxBufferedDC() {
+        if( m_dc != 0 )
+            UnMask();
+    }
+
+
+    void Init( wxDC *dc, const wxBitmap &buffer ) {
+        wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap,
+                      _T("wxBufferedDC already initialised") );
+        m_dc = dc;
+        m_buffer = buffer;
+        SelectObject( m_buffer );
+    }
+
+    void Init( wxDC *dc, const wxSize &area ) {
+        wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap,
+                      _T("wxBufferedDC already initialised") );
+        m_dc = dc;
+        m_buffer = wxBitmap( area.GetWidth(), area.GetHeight() );
+        SelectObject( m_buffer );
+    }
+
+    void UnMask() {
+        wxASSERT_MSG( m_dc != 0, _T("No low level DC associated with buffer (anymore)") );
+        m_dc->Blit( 0, 0, m_buffer.GetWidth(), m_buffer.GetHeight(), this, 0, 0 );
+        m_dc = 0;
+    }
+};
+
+class wxBufferedPaintDC : public wxBufferedDC
+{
+private:
+    wxPaintDC    m_paintdc;
+
+public:
+    wxBufferedPaintDC( wxWindow *window, const wxBitmap &buffer = wxNullBitmap )
+        : m_paintdc( window )
+    {
+        window->PrepareDC( m_paintdc );
+
+        if( buffer != wxNullBitmap )
+            Init( &m_paintdc, buffer );
+        else
+            Init( &m_paintdc, window->GetClientSize() );
+    }
+        
+    ~wxBufferedPaintDC() {
+        UnMask();
+    }
+};
+
+#endif
+//-=-=-=-=-=-=-=-=-=-=-    
+%}
+
+
+
+
+class wxBufferedDC : public wxMemoryDC
+{
+public:
+    %pythonAppend wxBufferedDC
         "self._dc = args[0] # save a ref so the other dc will not be deleted before self";
-    %addtofunc wxBufferedDC( wxDC *dc, const wxSize &area ) 
-        "val._dc = args[0] # save a ref so the other dc will not be deleted before self";
 
+    %nokwargs wxBufferedDC;
+    
     // Construct a wxBufferedDC using a user supplied buffer.
     wxBufferedDC( wxDC *dc, const wxBitmap &buffer );
 
-        // Construct a wxBufferedDC with an internal buffer of 'area'
-        // (where area is usually something like the size of the window
-        // being buffered)
+    // Construct a wxBufferedDC with an internal buffer of 'area'
+    // (where area is usually something like the size of the window
+    // being buffered)
+    wxBufferedDC( wxDC *dc, const wxSize &area );
+
+    
+    // TODO: Keep this one too?
+    %pythonAppend wxBufferedDC( wxDC *dc, const wxSize &area )
+        "val._dc = args[0] # save a ref so the other dc will not be deleted before self";
     %name(BufferedDCInternalBuffer) wxBufferedDC( wxDC *dc, const wxSize &area );
 
-        // Blits the buffer to the dc, and detaches the dc from
-        // the buffer.  Usually called in the dtor or by the dtor
-        // of derived classes if the BufferedDC must blit before
-        // the derived class (which may own the dc it's blitting
-        // to) is destroyed.
+    
+    // The buffer is blit to the real DC when the BufferedDC is destroyed.
+    ~wxBufferedDC();
+
+    
+    // Blits the buffer to the dc, and detaches the dc from
+    // the buffer.  Usually called in the dtor or by the dtor
+    // of derived classes if the BufferedDC must blit before
+    // the derived class (which may own the dc it's blitting
+    // to) is destroyed.
     void UnMask();
 };
 
 
+
+
+// Creates a double buffered wxPaintDC, optionally allowing the
+// user to specify their own buffer to use.
 class wxBufferedPaintDC : public wxBufferedDC
 {
 public:
+
+    // If no bitmap is supplied by the user, a temporary one will be created.
     wxBufferedPaintDC( wxWindow *window, const wxBitmap &buffer = wxNullBitmap );
+
 };
 
 
@@ -585,7 +758,7 @@ class wxMirrorDC : public wxDC
 public:
     // constructs a mirror DC associated with the given real DC
     //
-    // if mirror parameter is true, all vertical and horizontal coordinates are
+    // if mirror parameter is True, all vertical and horizontal coordinates are
     // exchanged, otherwise this class behaves in exactly the same way as a
     // plain DC
     //
@@ -603,7 +776,7 @@ class wxPostScriptDC : public wxDC {
 public:
     wxPostScriptDC(const wxPrintData& printData);
 //     %name(PostScriptDC2)wxPostScriptDC(const wxString& output,
-//                                          bool interactive = TRUE,
+//                                          bool interactive = True,
 //                                          wxWindow* parent = NULL);
 
     wxPrintData& GetPrintData();
@@ -617,7 +790,7 @@ public:
 %newgroup
 
 
-#ifdef __WXMSW__
+#if defined(__WXMSW__) || defined(__WXMAC__)
 
 %{
 #include <wx/metafile.h>
@@ -635,8 +808,10 @@ public:
     int GetWidth();
     int GetHeight();
 
+#ifdef __WXMSW__
     const wxString& GetFileName() const;
-
+#endif
+    
     %pythoncode { def __nonzero__(self): return self.Ok() }
 };
 
@@ -660,13 +835,13 @@ public:
 class wxMetaFile : public wxObject {
 public:
     wxMetaFile(const wxString&)
-        { PyErr_SetNone(PyExc_NotImplementedError); }
+        { wxPyRaiseNotImplemented(); }
 };
 
 class wxMetaFileDC : public wxClientDC {
 public:
     wxMetaFileDC(const wxString&, int, int, const wxString&)
-        { PyErr_SetNone(PyExc_NotImplementedError); }
+        { wxPyRaiseNotImplemented(); }
 };
 
 %}
@@ -697,7 +872,7 @@ public:
 //     %name(PrinterDC2) wxPrinterDC(const wxString& driver,
 //                                     const wxString& device,
 //                                     const wxString& output,
-//                                     bool interactive = TRUE,
+//                                     bool interactive = True,
 //                                     int orientation = wxPORTRAIT);
 };
 
@@ -706,22 +881,67 @@ public:
 class  wxPrinterDC : public wxClientDC {
 public:
     wxPrinterDC(const wxPrintData&)
-        { PyErr_SetNone(PyExc_NotImplementedError); }
-    
+        { wxPyRaiseNotImplemented(); }
+
 //     wxPrinterDC(const wxString&, const wxString&, const wxString&, bool, int)
-//         { PyErr_SetNone(PyExc_NotImplementedError); }
+//         { wxPyRaiseNotImplemented(); }
 };
 %}
+
 class  wxPrinterDC : public wxDC {
 public:
     wxPrinterDC(const wxPrintData& printData);
 //     %name(PrinterDC2) wxPrinterDC(const wxString& driver,
 //                                     const wxString& device,
 //                                     const wxString& output,
-//                                     bool interactive = TRUE,
+//                                     bool interactive = True,
 //                                     int orientation = wxPORTRAIT);
 };
 #endif
 
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+// Now define some Python classes that rename the Draw methods to be
+// compatible with the DC Draw methods in 2.4.  See also wxPython/_wx.py.
+
+
+%define MAKE_OLD_DC_CLASS(classname)
+    %pythoncode {
+    class classname##_old(classname):
+        """DC class that has methods with 2.4 compatible parameters."""
+        FloodFill = classname.FloodFillXY
+        GetPixel = classname.GetPixelXY
+        DrawLine = classname.DrawLineXY
+        CrossHair = classname.CrossHairXY
+        DrawArc = classname.DrawArcXY
+        DrawCheckMark = classname.DrawCheckMarkXY
+        DrawEllipticArc = classname.DrawEllipticArcXY
+        DrawPoint = classname.DrawPointXY
+        DrawRectangle = classname.DrawRectangleXY
+        DrawRoundedRectangle = classname.DrawRoundedRectangleXY
+        DrawCircle = classname.DrawCircleXY
+        DrawEllipse = classname.DrawEllipseXY
+        DrawIcon = classname.DrawIconXY
+        DrawBitmap = classname.DrawBitmapXY
+        DrawText = classname.DrawTextXY
+        DrawRotatedText = classname.DrawRotatedTextXY
+        Blit = classname.BlitXY
+    }
+%enddef
+
+MAKE_OLD_DC_CLASS(DC);
+MAKE_OLD_DC_CLASS(MemoryDC);
+MAKE_OLD_DC_CLASS(BufferedDC);
+MAKE_OLD_DC_CLASS(BufferedPaintDC);
+MAKE_OLD_DC_CLASS(ScreenDC);
+MAKE_OLD_DC_CLASS(ClientDC);
+MAKE_OLD_DC_CLASS(PaintDC);
+MAKE_OLD_DC_CLASS(WindowDC);
+MAKE_OLD_DC_CLASS(MirrorDC);
+MAKE_OLD_DC_CLASS(PostScriptDC);
+MAKE_OLD_DC_CLASS(MetaFileDC);
+MAKE_OLD_DC_CLASS(PrinterDC);
+
+
 //---------------------------------------------------------------------------