This commit is contained in:
Arjan Molenaar 2006-03-31 20:21:37 +00:00
parent 6bea832bde
commit f3ebe974d9
5 changed files with 59 additions and 13 deletions

View File

@ -1,3 +1,7 @@
2006-03-31 Arjan Molenaar <arjan_at_yirdis_dot_nl>
* tool.py: Made item select and move work.
2006-03-29 Arjan Molenaar <arjan_at_yirdis_dot_nl>
* view.py, examples.py, tool.py: Added first bit of behavior.

View File

@ -25,7 +25,7 @@ class Box(Item):
self._handles[2].y = self._handles[3].y = self._height
def draw(self, context):
print 'Box.draw', self
#print 'Box.draw', self
c = context.cairo
c.rectangle(0,0, self._width, self._height)
if context.hovered:
@ -44,7 +44,7 @@ class Text(Item):
def draw(self, context):
print 'Text.draw', self
#print 'Text.draw', self
c = context.cairo
c.show_text('Hello')
context.draw_children()

View File

@ -36,7 +36,7 @@ class Item(object):
def __init__(self):
self._canvas = None
self.matrix = Matrix()
self._matrix = Matrix()
def _set_canvas(self, canvas):
assert not canvas or not self._canvas or self._canvas is canvas
@ -47,6 +47,13 @@ class Item(object):
canvas = property(lambda s: s._canvas, _set_canvas, _del_canvas)
def _set_matrix(self, matrix):
if not isinstance(matrix, Matrix):
matrix = Matrix(*matrix)
self._matrix = matrix
matrix = property(lambda s: s._matrix, _set_matrix)
def request_update(self):
if self._canvas:
self._canvas.request_update(self)

43
tool.py
View File

@ -1,6 +1,7 @@
"""Tools are used to add interactive behavior to a View.
"""
import cairo
import gtk
DEBUG_TOOL = False
@ -77,20 +78,48 @@ class Tool(object):
class DefaultTool(Tool):
def __init__(self):
pass
self.last_x = 0
self.last_y = 0
def on_button_press(self, view, event):
print dir(event)
self.last_x, self.last_y = event.x, event.y
# Deselect all items unless CTRL or SHIFT is pressed
# or the item is already selected.
if not (event.state & (gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK)
or view.hovered_item in view.selected_items) :
del view.selected_items
if view.hovered_item:
if not event.state & (gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK):
del view.selected_items
view.focused_item = view.hovered_item
def on_motion_notify(self, view, event):
"""Normally, just check which item is under the mouse pointer
and make it the view.hovered_item.
"""
"""
old_hovered = view.hovered_item
view.hovered_item = view.get_item_at_point(event.x, event.y)
if event.state & gtk.gdk.BUTTON_PRESS_MASK:
for i in view.selected_items:
# Set a redraw request before the item is updated
view.queue_draw_item(i, handles=True)
# Calculate the distance the item has to be moved
inverse = cairo.Matrix(*tuple(i._matrix_w2i))
inverse.invert()
dx, dy = event.x - self.last_x, event.y - self.last_y
# Move the item and schedule it for an update
i.matrix.translate(*inverse.transform_distance(dx, dy))
i.request_update()
i.canvas.update_matrices()
b = i._view_bounds
view.queue_draw_item(i, handles=True)
view.queue_draw_area(b[0] + dx, b[1] + dy, b[2] - b[0], b[3] - b[1])
else:
old_hovered = view.hovered_item
view.hovered_item = view.get_item_at_point(event.x, event.y)
self.last_x, self.last_y = event.x, event.y
return True
if __name__ == '__main__':
import doctest
doctest.testmod()
# vim: sw=4:et:ai

12
view.py
View File

@ -12,7 +12,7 @@ from canvas import Context
from geometry import Rectangle
# Handy debug flag for drawing bounding boxes around the items.
DEBUG_DRAW_BOUNDING_BOX = True
DEBUG_DRAW_BOUNDING_BOX = False
class DrawContext(Context):
"""Special context for draw()'ing the item. The draw-context contains
@ -203,6 +203,11 @@ class View(gtk.DrawingArea):
x, y = item._matrix_w2i.transform_point(h.x, h.y)
self.queue_draw_area(x - 5, y - 5, 10, 10)
def queue_draw_area(self, x, y, w, h):
"""Wrap draw_area to convert all values to ints.
"""
super(View, self).queue_draw_area(int(x), int(y), int(w+1), int(h+1))
# def do_size_allocate(self, allocation):
# super(View, self).do_size_allocate(allocation);
# # TODO: update adjustments (v+h)
@ -232,7 +237,8 @@ class View(gtk.DrawingArea):
if self._calculate_bounding_box:
item._view_bounds = the_context._bounds
print item, the_context._bounds
item._view_bounds.x1 += 1
item._view_bounds.y1 += 1
if DEBUG_DRAW_BOUNDING_BOX:
ctx = cairo_context
@ -285,7 +291,7 @@ class View(gtk.DrawingArea):
self.window.draw_rectangle(self.style.white_gc, True,
area.x, area.y, area.width, area.height)
print 'expose', area.x, area.y, area.width, area.height, event.count
#print 'expose', area.x, area.y, area.width, area.height, event.count
if self._canvas:
context = self.window.cairo_create()