This commit is contained in:
parent
6bea832bde
commit
f3ebe974d9
@ -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.
|
||||
|
@ -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()
|
||||
|
9
item.py
9
item.py
@ -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
43
tool.py
@ -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
12
view.py
@ -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()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user