wxWidgets/wxPython/misc/fixdc.py

131 lines
5.7 KiB
Python
Raw Normal View History

"""
This module will do surgery on the wx.DC class in wxPython 2.5.1.5 to
make it act like the wx.DC class in later versions will. To use this
module simply import it in one of your program's modules before you
use any DC's. It does its work upon import and then is done.
This module will *only* do something if it is imported in an app
running on wxPython 2.5.1.5, for all other versions it will do
nothing. This means that you can include it with your application and
then if your user is on 2.5.1.5 the DC methods will be updated, but if
they are on a newer version (or an older one for that matter) then
nothing will be done and your code using DCs will still be compatible.
So what does it do? In a nutshell, the old 2.4.x style of method
names, where the 'normal' name takes separate parameters for x, y,
width and height will be restored, and the new methods that take
wx.Point and/or wx.Size (which can also be converted from 2-element
sequences) will be given new non-default method names. The 2.5.1.5
'XY' style names will be removed. The new names for the 'Point/Size'
methods are:
* BlitPointSize
* CrossHairPoint
* DrawArcPoint
* DrawBitmapPoint
* DrawCheckMarkRect
* DrawCirclePoint
* DrawEllipsePointSize
* DrawEllipticArcPointSize
* DrawIconPoint
* DrawLinePoint
* DrawPointPoint
* DrawRectanglePointSize
* DrawRotatedTextPoint
* DrawRoundedRectanglePointSize
* DrawTextPoint
* FloodFillPoint
* GetPixelPoint
* SetClippingRegionPointSize
Please note that only the names that you access the methods by will be
changed. The names used in docstrings as well as the names used to
call the extenaion functions and the names used when raising
exceptions will still use the old names. (Of course once a new
version of wxPython has been built with this new style then this will
no longer apply. The new names will be the real names.) For
example::
Traceback (most recent call last):
File "/usr/lib/python2.3/site-packages/wx/lib/buttons.py", line 272, in OnPaint
self.DrawBezel(dc, x1, y1, x2, y2)
File "/usr/lib/python2.3/site-packages/wx/lib/buttons.py", line 220, in DrawBezel
dc.DrawLine((x1+i, y1), (x1+i, y2-i))
File "/usr/lib/python2.3/site-packages/wx/gdi.py", line 2293, in DrawLine
return _gdi.DC_DrawLineXY(*args, **kwargs)
TypeError: DC_DrawLineXY() takes exactly 5 arguments (3 given)
WARNING: If you import this module then the wx.DC class will be
changed for the entire application, so if you use code from
the wx.lib package (or 3rd party modules that have already
been converted to the doomed 2.5.1.5 implementaion of the DC
Draw methods) then that code will break as shown above. This
is an all-or-nothing fix, (just like the next version of
wxPython will be,) so you *will* need to do something to
resolve this situation if you run into it. The best thing to
do of course is to correct the library module to work with
the corrected DC semantics and then send me a patch, although
it probably won't be too long before the library modules are
updated in CVS so you could get a copy of them there.
--Robin
"""
import wx
_names = [
("BlitXY", "Blit", "BlitPointSize"),
("CrossHairXY", "CrossHair", "CrossHairPoint"),
("DrawArcXY", "DrawArc", "DrawArcPoint"),
("DrawBitmapXY", "DrawBitmap", "DrawBitmapPoint"),
("DrawCheckMarkXY", "DrawCheckMark", "DrawCheckMarkRect"),
("DrawCircleXY", "DrawCircle", "DrawCirclePoint"),
("DrawEllipseXY", "DrawEllipse", "DrawEllipsePointSize"),
("DrawEllipticArcXY", "DrawEllipticArc", "DrawEllipticArcPointSize"),
("DrawIconXY", "DrawIcon", "DrawIconPoint"),
("DrawLineXY", "DrawLine", "DrawLinePoint"),
("DrawPointXY", "DrawPoint", "DrawPointPoint"),
("DrawRectangleXY", "DrawRectangle", "DrawRectanglePointSize"),
("DrawRotatedTextXY", "DrawRotatedText", "DrawRotatedTextPoint"),
("DrawRoundedRectangleXY", "DrawRoundedRectangle", "DrawRoundedRectanglePointSize"),
("DrawTextXY", "DrawText", "DrawTextPoint"),
("FloodFillXY", "FloodFill", "FloodFillPoint"),
("GetPixelXY", "GetPixel", "GetPixelPoint"),
("SetClippingRegionXY", "SetClippingRegion", "SetClippingRegionPointSize"),
]
# this is a bit of handy code from the Python Cookbook
def _renamefunction(function, name):
"""
This function returns a function identical to the given one, but
with the given name.
"""
from types import FunctionType, CodeType
c = function.func_code
if c.co_name != name:
# rename the code object.
c = CodeType(c.co_argcount, c.co_nlocals, c.co_stacksize,
c.co_flags, c.co_code, c.co_consts,
c.co_names, c.co_varnames, c.co_filename,
name, c.co_firstlineno, c.co_lnotab)
if function.func_defaults != None:
return FunctionType(c, function.func_globals, name,
function.func_defaults)
return FunctionType(c, function.func_globals, name)
if wx.VERSION[:4] == (2,5,1,5):
for old, norm, new in _names:
m_old = getattr(wx.DC, old)
m_norm = getattr(wx.DC, norm)
setattr(wx.DC, new, _renamefunction(m_norm, new))
setattr(wx.DC, norm, _renamefunction(m_old, norm))
delattr(wx.DC, old)
del old, norm, new, m_old, m_norm