Lightningbeam/GUI/Win32/DrawableContainer.py

69 lines
2.5 KiB
Python

#--------------------------------------------------------------------
#
# PyGUI - DrawableContainer - Win32
#
#--------------------------------------------------------------------
from GUI import export
from GUI import Canvas
from GUI.Geometry import rect_topleft, rect_size, offset_rect, empty_rect
from GUI.GDrawableContainers import DrawableContainer as GDrawableContainer
import GUI.GDIPlus as gdi
class DrawableContainer(GDrawableContainer):
_double_buffer = True
_win_paint_broken = False
def update(self):
self._win.UpdateWindow()
def with_canvas(self, body):
win = self._win
dc = win.GetDC()
self._win_prepare_dc(dc)
try:
canvas = Canvas._from_win_dc(dc)
body(canvas)
finally:
win.ReleaseDC(dc)
def OnPaint(self):
if not self._win_paint_broken:
try:
win = self._win
dc, ps = win.BeginPaint()
try:
win_update_rect = ps[2]
if not empty_rect(win_update_rect):
#print "DrawableContainer.OnPaint: win_update_rect =", win_update_rect ###
scroll_offset = self._win_scroll_offset()
view_update_rect = offset_rect(win_update_rect, scroll_offset)
if self._double_buffer:
dx, dy = rect_topleft(view_update_rect)
width, height = rect_size(view_update_rect)
buffer = gdi.Bitmap(width, height)
canvas = Canvas._from_win_image(buffer)
canvas.translate(-dx, -dy)
self.draw(canvas, view_update_rect)
graphics = gdi.Graphics.from_dc(dc)
src_rect = (0, 0, width, height)
graphics.DrawImage_rr(buffer, win_update_rect, src_rect)
else:
self._win_prepare_dc(dc)
canvas = Canvas._from_win_dc(dc)
self.draw(canvas, view_update_rect)
finally:
win.EndPaint(ps)
except Exception:
self._win_paint_broken = True
raise
def _win_prepare_dc(self, dc):
dc.SetWindowOrg(self._win_scroll_offset())
def _win_scroll_offset(self):
return (0, 0)
export(DrawableContainer)