70 lines
2.1 KiB
Python
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
|