]>
Commit | Line | Data |
---|---|---|
1 | """ | |
2 | This module will do surgery on the wx.DC class in wxPython 2.5.1.5 to | |
3 | make it act like the wx.DC class in later versions will. To use this | |
4 | module simply import it in one of your program's modules before you | |
5 | use any DC's. It does its work upon import and then is done. | |
6 | ||
7 | This module will *only* do something if it is imported in an app | |
8 | running on wxPython 2.5.1.5, for all other versions it will do | |
9 | nothing. This means that you can include it with your application and | |
10 | then if your user is on 2.5.1.5 the DC methods will be updated, but if | |
11 | they are on a newer version (or an older one for that matter) then | |
12 | nothing will be done and your code using DCs will still be compatible. | |
13 | ||
14 | So what does it do? In a nutshell, the old 2.4.x style of method | |
15 | names, where the 'normal' name takes separate parameters for x, y, | |
16 | width and height will be restored, and the new methods that take | |
17 | wx.Point and/or wx.Size (which can also be converted from 2-element | |
18 | sequences) 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' | |
20 | methods 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 | ||
41 | Please note that only the names that you access the methods by will be | |
42 | changed. The names used in docstrings as well as the names used to | |
43 | call the extenaion functions and the names used when raising | |
44 | exceptions will still use the old names. (Of course once a new | |
45 | version of wxPython has been built with this new style then this will | |
46 | no longer apply. The new names will be the real names.) For | |
47 | example:: | |
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 | ||
59 | WARNING: 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 | ||
75 | import 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 | |
100 | def _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 | ||
120 | if 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 |