Changeset 1817
- Timestamp:
- 08/02/07 01:35:54 (1 year ago)
- Files:
-
- gaphas/trunk/gaphas/quadtree.py (modified) (1 diff)
- gaphas/trunk/gaphas/view.py (modified) (29 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
gaphas/trunk/gaphas/quadtree.py
r1813 r1817 117 117 """ 118 118 x_y_w_h = zip(*map(operator.getitem, self._ids.itervalues(), [0] * len(self._ids))) 119 if not x_y_w_h: 120 return 0, 0, 0, 0 119 121 x0 = min(x_y_w_h[0]) 120 122 y0 = min(x_y_w_h[1]) gaphas/trunk/gaphas/view.py
r1814 r1817 48 48 self._dirty_matrix_items = set() 49 49 50 50 51 matrix = property(lambda s: s._matrix, 51 52 doc="Canvas to view transformation matrix") 53 52 54 53 55 def _set_canvas(self, canvas): … … 67 69 canvas = property(lambda s: s._canvas, _set_canvas) 68 70 71 69 72 def emit(self, args, **kwargs): 70 73 """ … … 72 75 """ 73 76 pass 77 74 78 75 79 def select_item(self, item): … … 86 90 self.emit('selection-changed', self._selected_items) 87 91 92 88 93 def unselect_item(self, item): 89 94 """ … … 95 100 self.emit('selection-changed', self._selected_items) 96 101 102 97 103 def select_all(self): 98 104 for item in self.canvas.get_all_items(): 99 105 self.select_item(item) 106 100 107 101 108 def unselect_all(self): … … 108 115 self.emit('selection-changed', self._selected_items) 109 116 117 110 118 selected_items = property(lambda s: s._selected_items, 111 119 select_item, unselect_all, 112 120 "Items selected by the view") 121 113 122 114 123 def _set_focused_item(self, item): … … 126 135 self.emit('focus-changed', item) 127 136 137 128 138 def _del_focused_item(self): 129 139 """ … … 132 142 self.focused_item = None 133 143 144 134 145 focused_item = property(lambda s: s._focused_item, 135 146 _set_focused_item, _del_focused_item, 136 147 "The item with focus (receives key events a.o.)") 148 137 149 138 150 def _set_hovered_item(self, item): … … 146 158 self.emit('hover-changed', item) 147 159 160 148 161 def _del_hovered_item(self): 149 162 """ … … 152 165 self.hovered_item = None 153 166 167 154 168 hovered_item = property(lambda s: s._hovered_item, 155 169 _set_hovered_item, _del_hovered_item, … … 186 200 self.emit('painter-changed') 187 201 202 188 203 painter = property(lambda s: s._painter, _set_painter) 204 189 205 190 206 def get_item_at_point(self, x, y, selected=True): … … 228 244 map(self.select_item, items) 229 245 246 230 247 def zoom(self, factor): 231 248 """ … … 237 254 map(self.update_matrix, self._canvas.get_all_items()) 238 255 self.request_update(self._canvas.get_all_items()) 256 239 257 240 258 def set_item_bounding_box(self, item, bounds): … … 254 272 self._qtree.add(item=item, bounds=bounds, data=Rectangle(ix0, iy0, x1=ix1, y1=iy1)) 255 273 256 # Update bounding box of parent items where appropriate (only extent)257 #parent = self.canvas.get_parent(item)258 #if parent:259 # try:260 # parent_bounds = self._qtree.get_bounds(parent)261 # except KeyError:262 # pass # No bounds, do nothing263 # else:264 # if not bounds in parent_bounds:265 # self.set_item_bounding_box(parent, bounds + parent_bounds)266 274 267 275 def get_item_bounding_box(self, item): … … 271 279 return self._qtree.get_bounds(item) 272 280 281 273 282 def get_canvas_size(self): 274 283 """ 275 The canvas size (width, height) in canvascoordinates, determined284 The canvas size (width, height) in view coordinates, determined 276 285 from the origin (0, 0). 277 286 """ 278 inverse = Matrix(*self._matrix) 279 inverse.invert() 280 x, y, w, h = self._qtree.bounds 281 ww, wh = inverse.transform_point(x + w, y + h) 282 return self._matrix.transform_distance(ww, wh) 287 x, y, w, h = self._qtree.soft_bounds 288 return x + w, y + h 289 283 290 284 291 bounding_box = property(lambda s: s._qtree.bounds) 292 285 293 286 294 def update_bounding_box(self, cr, items=None): … … 300 308 # Update the view's bounding box with the rest of the items 301 309 self._bounds = Rectangle(*self._qtree.soft_bounds) 310 302 311 303 312 def paint(self, cr): … … 379 388 } 380 389 390 381 391 def __init__(self, canvas=None): 382 392 super(GtkView, self).__init__() … … 389 399 | gtk.gdk.KEY_RELEASE_MASK) 390 400 391 self.hadjustment = gtk.Adjustment() 392 self.vadjustment = gtk.Adjustment() 401 self._hadjustment = gtk.Adjustment() 402 self._vadjustment = gtk.Adjustment() 403 self._hadjustment.connect('value-changed', self.on_adjustment_changed) 404 self._vadjustment.connect('value-changed', self.on_adjustment_changed) 393 405 394 406 self._tool = DefaultTool() … … 400 412 self._update_bounding_box = set() 401 413 414 402 415 def emit(self, *args, **kwargs): 403 416 """ … … 405 418 """ 406 419 gtk.DrawingArea.emit(self, *args, **kwargs) 420 407 421 408 422 def _set_canvas(self, canvas): … … 420 434 self._canvas.register_view(self) 421 435 436 422 437 canvas = property(lambda s: s._canvas, _set_canvas) 438 423 439 424 440 def _set_tool(self, tool): … … 429 445 self.emit('tool-changed') 430 446 447 431 448 tool = property(lambda s: s._tool, _set_tool) 432 449 433 def _set_hadjustment(self, adj): 434 """ 435 Set horizontal adjustment object, for scrollbars. 436 """ 437 #if self._hadjustment: 438 # self._hadjustment.disconnect(self.on_adjustment_changed) 439 self._hadjustment = adj 440 adj.connect('value_changed', self.on_adjustment_changed) 441 442 hadjustment = property(lambda s: s._hadjustment, _set_hadjustment) 443 444 def _set_vadjustment(self, adj): 445 """ 446 Set vertical adjustment object, for scrollbars. 447 """ 448 #if self._vadjustment: 449 # self._vadjustment.disconnect(self.on_adjustment_changed) 450 self._vadjustment = adj 451 adj.connect('value_changed', self.on_adjustment_changed) 452 453 vadjustment = property(lambda s: s._vadjustment, _set_vadjustment) 450 451 hadjustment = property(lambda s: s._hadjustment) 452 453 454 vadjustment = property(lambda s: s._vadjustment) 455 454 456 455 457 def zoom(self, factor): … … 460 462 a = self.allocation 461 463 super(GtkView, self).queue_draw_area(0, 0, a.width, a.height) 464 462 465 463 466 def _update_adjustment(self, adjustment, value, canvas_size, viewport_size): … … 470 473 (20.0, 20.0, 10.0) 471 474 """ 472 size = min(canvas_size, viewport_size)473 475 canvas_size += viewport_size 474 if size != adjustment.page_size or canvas_size != adjustment.upper:475 adjustment.page_size = size476 adjustment.page_increment = size477 adjustment.step_increment = size/10476 if viewport_size != adjustment.page_size or canvas_size != adjustment.upper: 477 adjustment.page_size = viewport_size 478 adjustment.page_increment = viewport_size 479 adjustment.step_increment = viewport_size/10 478 480 adjustment.upper = canvas_size 479 481 adjustment.lower = 0 480 adjustment.changed()481 482 482 value = max(0, min(value, canvas_size - size))483 value = max(0, min(value, canvas_size - viewport_size)) 483 484 if value != adjustment.value: 484 485 adjustment.value = value 485 adjustment.value_changed() 486 486 487 488 @async(single=True) 487 489 def update_adjustments(self, allocation=None): 488 490 """ … … 500 502 canvas_size=h, 501 503 viewport_size=allocation.height) 502 self._qtree.resize((0, 0, allocation.width, allocation.height)) 504 505 x, y, w, h = self._qtree.bounds 506 if w != allocation.width or h != allocation.height: 507 self._qtree.resize((0, 0, allocation.width, allocation.height)) 503 508 504 509 @async(single=False, priority=PRIORITY_HIGH_IDLE) … … 586 591 vbounds = Rectangle(x0, y0, x1=x1, y1=y1) 587 592 self._qtree.add(i, vbounds, bounds) 593 self.update_adjustments() 588 594 589 595 # Request bb recalculation for all 'really' dirty items … … 624 630 # Draw no more than nessesary. 625 631 cr.rectangle(x, y, w, h) 626 #print 'clip to', x, y, w, h627 632 cr.clip() 628 633 … … 638 643 cr.restore() 639 644 self._idle_queue_draw_item(*update_bounding_box) 645 self.update_adjustments() 640 646 finally: 641 647 update_bounding_box.clear() … … 686 692 """ 687 693 if adj is self._hadjustment: 688 self._matrix.translate( - self._matrix[4] / self._matrix[0] - adj.value , 0)694 self._matrix.translate(- self._matrix[4] / self._matrix[0] - adj.value , 0) 689 695 elif adj is self._vadjustment: 690 self._matrix.translate(0, - self._matrix[5] / self._matrix[3] - adj.value )696 self._matrix.translate(0, - self._matrix[5] / self._matrix[3] - adj.value) 691 697 692 698 # Force recalculation of the bounding boxes:
