Lightningbeam/GUI/GtkGI/DrawableContainers.py

70 lines
2.1 KiB
Python

#
# Python GUI - DrawableViews - Gtk
#
import os, traceback
from math import floor, ceil
from gi.repository import Gtk, Gdk, cairo
from GUI.Canvases import Canvas
from GUI.Events import Event
from GUI.GDrawableContainers import DrawableContainer as GDrawableContainer
class DrawableContainer(GDrawableContainer):
#_extent_origin = (0, 0)
def __init__(self, _gtk_outer = None, **kwds):
gtk_layout = Gtk.Layout()
gtk_layout.add_events(Gdk.EventMask.EXPOSURE_MASK)
gtk_layout.show()
self._gtk_connect(gtk_layout, 'draw', self._gtk_draw_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)
context = Gdk.cairo_create(self._gtk_inner_widget.get_bin_window())
self._gtk_prepare_cairo_context(context)
canvas = Canvas._from_cairo_context(context)
proc(canvas)
def invalidate_rect(self, (l, t, r, b)):
x = int(floor(l))
y = int(floor(t))
w = int(ceil(r - l))
h = int(ceil(b - t))
self._gtk_inner_widget.queue_draw_area(x, y, w, h)
def update(self):
gdk_window = self._gtk_inner_widget.bin_window
gdk_window.process_updates()
#
# Internal
#
def _gtk_draw_signal(self, context):
try:
self._gtk_prepare_cairo_context(context)
clip = context.clip_extents()
canvas = Canvas._from_cairo_context(context)
self.draw(canvas, clip)
except:
print "------------------ Exception while drawing ------------------"
traceback.print_exc()
def _gtk_prepare_cairo_context(self, context):
pass