Lightningbeam/GUI/Gtk/DrawableContainer.py

73 lines
2.3 KiB
Python

#
# Python GUI - DrawableViews - Gtk
#
import os, traceback
from math import floor, ceil
import gtk
from gtk import gdk
from GUI import export
from GUI import Canvas, Event, rgb
from GUI.StdColors import grey
from GUI.GDrawableContainers import DrawableContainer as GDrawableContainer
class DrawableContainer(GDrawableContainer):
_background_color = grey
def __init__(self, _gtk_outer = None, **kwds):
gtk_layout = gtk.Layout()
gtk_layout.add_events(gdk.EXPOSURE_MASK)
gtk_layout.show()
self._gtk_connect(gtk_layout, 'expose-event',
self._gtk_expose_event_signal)
if _gtk_outer:
_gtk_outer.add(gtk_layout)
else:
_gtk_outer = gtk_layout
GDrawableContainer.__init__(self, _gtk_outer = _gtk_outer, _gtk_inner = gtk_layout,
_gtk_focus = gtk_layout, _gtk_input = gtk_layout)
self.set(**kwds)
#
# Other methods
#
def with_canvas(self, proc):
hadj, vadj = self._gtk_adjustments()
clip = rect_sized((hadj.value, vadj.value), self.size)
canvas = Canvas._from_gdk_drawable(self._gtk_inner_widget.bin_window)
proc(canvas)
def invalidate_rect(self, (l, t, r, b)):
gdk_window = self._gtk_inner_widget.bin_window
if gdk_window:
gdk_rect = (int(floor(l)), int(floor(t)),
int(ceil(r - l)), int(ceil(b - t)))
#print "View.invalidate_rect: gdk_rect =", gdk_rect ###
gdk_window.invalidate_rect(gdk_rect, 0)
def update(self):
gdk_window = self._gtk_inner_widget.bin_window
gdk_window.process_updates()
#
# Internal
#
def _gtk_expose_event_signal(self, gtk_event):
try:
#print "View._gtk_expose_event_signal:", self ###
l, t, w, h = gtk_event.area
clip = (l, t, l + w, t + h)
#print "...clip =", clip ###
gtk_layout = self._gtk_inner_widget
canvas = Canvas._from_gdk_drawable(gtk_layout.bin_window)
update = self._draw_background(canvas, clip)
self.draw(canvas, update)
except:
print "------------------ Exception while drawing ------------------"
traceback.print_exc()
export(DrawableContainer)