Changeset 1817

Show
Ignore:
Timestamp:
08/02/07 01:35:54 (1 year ago)
Author:
arj..@yirdis.nl
Message:
  • made scrollbars work properly.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gaphas/trunk/gaphas/quadtree.py

    r1813 r1817  
    117117        """ 
    118118        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 
    119121        x0 = min(x_y_w_h[0]) 
    120122        y0 = min(x_y_w_h[1]) 
  • gaphas/trunk/gaphas/view.py

    r1814 r1817  
    4848        self._dirty_matrix_items = set() 
    4949 
     50 
    5051    matrix = property(lambda s: s._matrix, 
    5152                      doc="Canvas to view transformation matrix") 
     53 
    5254 
    5355    def _set_canvas(self, canvas): 
     
    6769    canvas = property(lambda s: s._canvas, _set_canvas) 
    6870 
     71 
    6972    def emit(self, args, **kwargs): 
    7073        """ 
     
    7275        """ 
    7376        pass 
     77 
    7478 
    7579    def select_item(self, item): 
     
    8690            self.emit('selection-changed', self._selected_items) 
    8791 
     92 
    8893    def unselect_item(self, item): 
    8994        """ 
     
    95100            self.emit('selection-changed', self._selected_items) 
    96101 
     102 
    97103    def select_all(self): 
    98104        for item in self.canvas.get_all_items(): 
    99105            self.select_item(item) 
     106 
    100107 
    101108    def unselect_all(self): 
     
    108115        self.emit('selection-changed', self._selected_items) 
    109116 
     117 
    110118    selected_items = property(lambda s: s._selected_items, 
    111119                              select_item, unselect_all, 
    112120                              "Items selected by the view") 
     121 
    113122 
    114123    def _set_focused_item(self, item): 
     
    126135            self.emit('focus-changed', item) 
    127136 
     137 
    128138    def _del_focused_item(self): 
    129139        """ 
     
    132142        self.focused_item = None 
    133143         
     144 
    134145    focused_item = property(lambda s: s._focused_item, 
    135146                            _set_focused_item, _del_focused_item, 
    136147                            "The item with focus (receives key events a.o.)") 
     148 
    137149 
    138150    def _set_hovered_item(self, item): 
     
    146158            self.emit('hover-changed', item) 
    147159 
     160 
    148161    def _del_hovered_item(self): 
    149162        """ 
     
    152165        self.hovered_item = None 
    153166         
     167 
    154168    hovered_item = property(lambda s: s._hovered_item, 
    155169                            _set_hovered_item, _del_hovered_item, 
     
    186200        self.emit('painter-changed') 
    187201 
     202 
    188203    painter = property(lambda s: s._painter, _set_painter) 
     204 
    189205 
    190206    def get_item_at_point(self, x, y, selected=True): 
     
    228244        map(self.select_item, items) 
    229245 
     246 
    230247    def zoom(self, factor): 
    231248        """ 
     
    237254        map(self.update_matrix, self._canvas.get_all_items()) 
    238255        self.request_update(self._canvas.get_all_items()) 
     256 
    239257 
    240258    def set_item_bounding_box(self, item, bounds): 
     
    254272        self._qtree.add(item=item, bounds=bounds, data=Rectangle(ix0, iy0, x1=ix1, y1=iy1)) 
    255273 
    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 nothing 
    263         #    else: 
    264         #        if not bounds in parent_bounds: 
    265         #            self.set_item_bounding_box(parent, bounds + parent_bounds) 
    266274 
    267275    def get_item_bounding_box(self, item): 
     
    271279        return self._qtree.get_bounds(item) 
    272280 
     281 
    273282    def get_canvas_size(self): 
    274283        """ 
    275         The canvas size (width, height) in canvas coordinates, determined 
     284        The canvas size (width, height) in view coordinates, determined 
    276285        from the origin (0, 0). 
    277286        """ 
    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 
    283290 
    284291    bounding_box = property(lambda s: s._qtree.bounds) 
     292 
    285293 
    286294    def update_bounding_box(self, cr, items=None): 
     
    300308        # Update the view's bounding box with the rest of the items 
    301309        self._bounds = Rectangle(*self._qtree.soft_bounds) 
     310 
    302311 
    303312    def paint(self, cr): 
     
    379388    } 
    380389 
     390 
    381391    def __init__(self, canvas=None): 
    382392        super(GtkView, self).__init__() 
     
    389399                        | gtk.gdk.KEY_RELEASE_MASK) 
    390400 
    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) 
    393405 
    394406        self._tool = DefaultTool() 
     
    400412        self._update_bounding_box = set() 
    401413 
     414 
    402415    def emit(self, *args, **kwargs): 
    403416        """ 
     
    405418        """ 
    406419        gtk.DrawingArea.emit(self, *args, **kwargs) 
     420 
    407421 
    408422    def _set_canvas(self, canvas): 
     
    420434            self._canvas.register_view(self) 
    421435 
     436 
    422437    canvas = property(lambda s: s._canvas, _set_canvas) 
     438 
    423439 
    424440    def _set_tool(self, tool): 
     
    429445        self.emit('tool-changed') 
    430446 
     447 
    431448    tool = property(lambda s: s._tool, _set_tool) 
    432449 
    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 
    454456 
    455457    def zoom(self, factor): 
     
    460462        a = self.allocation 
    461463        super(GtkView, self).queue_draw_area(0, 0, a.width, a.height) 
     464 
    462465 
    463466    def _update_adjustment(self, adjustment, value, canvas_size, viewport_size): 
     
    470473        (20.0, 20.0, 10.0) 
    471474        """ 
    472         size = min(canvas_size, viewport_size) 
    473475        canvas_size += viewport_size 
    474         if size != adjustment.page_size or canvas_size != adjustment.upper: 
    475             adjustment.page_size = size 
    476             adjustment.page_increment = size 
    477             adjustment.step_increment = size/10 
     476        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 
    478480            adjustment.upper = canvas_size 
    479481            adjustment.lower = 0 
    480             adjustment.changed() 
    481482         
    482         value = max(0, min(value, canvas_size - size)) 
     483        value = max(0, min(value, canvas_size - viewport_size)) 
    483484        if value != adjustment.value: 
    484485            adjustment.value = value 
    485             adjustment.value_changed() 
    486  
     486 
     487 
     488    @async(single=True) 
    487489    def update_adjustments(self, allocation=None): 
    488490        """ 
     
    500502                                canvas_size=h, 
    501503                                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)) 
    503508         
    504509    @async(single=False, priority=PRIORITY_HIGH_IDLE) 
     
    586591                    vbounds = Rectangle(x0, y0, x1=x1, y1=y1) 
    587592                    self._qtree.add(i, vbounds, bounds) 
     593                    self.update_adjustments() 
    588594 
    589595                # Request bb recalculation for all 'really' dirty items 
     
    624630        # Draw no more than nessesary. 
    625631        cr.rectangle(x, y, w, h) 
    626         #print 'clip to', x, y, w, h 
    627632        cr.clip() 
    628633 
     
    638643                    cr.restore() 
    639644                self._idle_queue_draw_item(*update_bounding_box) 
     645                self.update_adjustments() 
    640646            finally: 
    641647                update_bounding_box.clear() 
     
    686692        """ 
    687693        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) 
    689695        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
    691697 
    692698        # Force recalculation of the bounding boxes: