]> git.saurik.com Git - wxWidgets.git/blame - wxPython/misc/fixdc.py
Return correct values for GetFieldRect() when using themes.
[wxWidgets.git] / wxPython / misc / fixdc.py
CommitLineData
a8d55739
RD
1"""
2This module will do surgery on the wx.DC class in wxPython 2.5.1.5 to
3make it act like the wx.DC class in later versions will. To use this
4module simply import it in one of your program's modules before you
5use any DC's. It does its work upon import and then is done.
6
7This module will *only* do something if it is imported in an app
8running on wxPython 2.5.1.5, for all other versions it will do
9nothing. This means that you can include it with your application and
10then if your user is on 2.5.1.5 the DC methods will be updated, but if
11they are on a newer version (or an older one for that matter) then
12nothing will be done and your code using DCs will still be compatible.
13
14So what does it do? In a nutshell, the old 2.4.x style of method
15names, where the 'normal' name takes separate parameters for x, y,
16width and height will be restored, and the new methods that take
17wx.Point and/or wx.Size (which can also be converted from 2-element
18sequences) will be given new non-default method names. The 2.5.1.5
19'XY' style names will be removed. The new names for the 'Point/Size'
20methods are:
21
22 * BlitPointSize
23 * CrossHairPoint
24 * DrawArcPoint
25 * DrawBitmapPoint
26 * DrawCheckMarkRect
27 * DrawCirclePoint
28 * DrawEllipsePointSize
29 * DrawEllipticArcPointSize
30 * DrawIconPoint
31 * DrawLinePoint
32 * DrawPointPoint
33 * DrawRectanglePointSize
34 * DrawRotatedTextPoint
35 * DrawRoundedRectanglePointSize
36 * DrawTextPoint
37 * FloodFillPoint
38 * GetPixelPoint
39 * SetClippingRegionPointSize
40
41Please note that only the names that you access the methods by will be
42changed. The names used in docstrings as well as the names used to
43call the extenaion functions and the names used when raising
44exceptions will still use the old names. (Of course once a new
45version of wxPython has been built with this new style then this will
46no longer apply. The new names will be the real names.) For
47example::
48
49 Traceback (most recent call last):
50 File "/usr/lib/python2.3/site-packages/wx/lib/buttons.py", line 272, in OnPaint
51 self.DrawBezel(dc, x1, y1, x2, y2)
52 File "/usr/lib/python2.3/site-packages/wx/lib/buttons.py", line 220, in DrawBezel
53 dc.DrawLine((x1+i, y1), (x1+i, y2-i))
54 File "/usr/lib/python2.3/site-packages/wx/gdi.py", line 2293, in DrawLine
55 return _gdi.DC_DrawLineXY(*args, **kwargs)
56 TypeError: DC_DrawLineXY() takes exactly 5 arguments (3 given)
57
58
59WARNING: If you import this module then the wx.DC class will be
60 changed for the entire application, so if you use code from
61 the wx.lib package (or 3rd party modules that have already
62 been converted to the doomed 2.5.1.5 implementaion of the DC
63 Draw methods) then that code will break as shown above. This
64 is an all-or-nothing fix, (just like the next version of
65 wxPython will be,) so you *will* need to do something to
66 resolve this situation if you run into it. The best thing to
67 do of course is to correct the library module to work with
68 the corrected DC semantics and then send me a patch, although
69 it probably won't be too long before the library modules are
70 updated in CVS so you could get a copy of them there.
71
72--Robin
73"""
74
75import wx
76
77_names = [
78 ("BlitXY", "Blit", "BlitPointSize"),
79 ("CrossHairXY", "CrossHair", "CrossHairPoint"),
80 ("DrawArcXY", "DrawArc", "DrawArcPoint"),
81 ("DrawBitmapXY", "DrawBitmap", "DrawBitmapPoint"),
82 ("DrawCheckMarkXY", "DrawCheckMark", "DrawCheckMarkRect"),
83 ("DrawCircleXY", "DrawCircle", "DrawCirclePoint"),
84 ("DrawEllipseXY", "DrawEllipse", "DrawEllipsePointSize"),
85 ("DrawEllipticArcXY", "DrawEllipticArc", "DrawEllipticArcPointSize"),
86 ("DrawIconXY", "DrawIcon", "DrawIconPoint"),
87 ("DrawLineXY", "DrawLine", "DrawLinePoint"),
88 ("DrawPointXY", "DrawPoint", "DrawPointPoint"),
89 ("DrawRectangleXY", "DrawRectangle", "DrawRectanglePointSize"),
90 ("DrawRotatedTextXY", "DrawRotatedText", "DrawRotatedTextPoint"),
91 ("DrawRoundedRectangleXY", "DrawRoundedRectangle", "DrawRoundedRectanglePointSize"),
92 ("DrawTextXY", "DrawText", "DrawTextPoint"),
93 ("FloodFillXY", "FloodFill", "FloodFillPoint"),
94 ("GetPixelXY", "GetPixel", "GetPixelPoint"),
95 ("SetClippingRegionXY", "SetClippingRegion", "SetClippingRegionPointSize"),
96]
97
98
99# this is a bit of handy code from the Python Cookbook
100def _renamefunction(function, name):
101 """
102 This function returns a function identical to the given one, but
103 with the given name.
104 """
105 from types import FunctionType, CodeType
106
107 c = function.func_code
108 if c.co_name != name:
109 # rename the code object.
110 c = CodeType(c.co_argcount, c.co_nlocals, c.co_stacksize,
111 c.co_flags, c.co_code, c.co_consts,
112 c.co_names, c.co_varnames, c.co_filename,
113 name, c.co_firstlineno, c.co_lnotab)
114 if function.func_defaults != None:
115 return FunctionType(c, function.func_globals, name,
116 function.func_defaults)
117 return FunctionType(c, function.func_globals, name)
118
119
120if wx.VERSION[:4] == (2,5,1,5):
121 for old, norm, new in _names:
122 m_old = getattr(wx.DC, old)
123 m_norm = getattr(wx.DC, norm)
124 setattr(wx.DC, new, _renamefunction(m_norm, new))
125 setattr(wx.DC, norm, _renamefunction(m_old, norm))
126 delattr(wx.DC, old)
127
128 del old, norm, new, m_old, m_norm
129
130