Changeset 1838

Show
Ignore:
Timestamp:
08/05/07 23:39:39 (1 year ago)
Author:
arj..@yirdis.nl
Message:

Free resources (e.g. Item.matrix_[vi]2[iv]) when a GtkView is destroyed. also free registration from canvas.

Files:

Legend:

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

    r1824 r1838  
    55import unittest 
    66import gtk 
    7 from gaphas.view import GtkView 
     7from gaphas.view import View, GtkView 
    88from gaphas.canvas import Canvas, Context 
    99from gaphas.item import Line 
     
    112112        window.destroy() 
    113113 
     114    def test_view_registration(self): 
     115        canvas = Canvas() 
     116 
     117        # Simple views do not register on the canvas 
     118         
     119        view = View(canvas) 
     120        assert len(canvas._registered_views) == 0 
     121         
     122        # GTK view does register for updates though 
     123 
     124        view = GtkView(canvas) 
     125        assert len(canvas._registered_views) == 1 
     126         
     127        view.canvas = None 
     128        assert len(canvas._registered_views) == 0 
     129 
     130        view.canvas = canvas 
     131        assert len(canvas._registered_views) == 1 
     132 
     133    def test_view_registration_2(self): 
     134        """ 
     135        Test view registration and destroy when view is destroyed. 
     136        """ 
     137        canvas = Canvas() 
     138        view = GtkView(canvas) 
     139        window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     140        window.add(view) 
     141        window.show_all() 
     142 
     143        box = Box() 
     144        canvas.add(box) 
     145 
     146        assert hasattr(box, '_matrix_i2v') 
     147        assert hasattr(box, '_matrix_v2i') 
     148 
     149        assert box._matrix_i2v[view] 
     150        assert box._matrix_v2i[view] 
     151 
     152        assert len(canvas._registered_views) == 1 
     153        assert view in canvas._registered_views 
     154 
     155        window.destroy() 
     156 
     157        assert len(canvas._registered_views) == 0 
     158 
     159        assert not box._matrix_i2v.has_key(view) 
     160        assert not box._matrix_v2i.has_key(view) 
     161         
     162 
    114163         
    115164if __name__ == '__main__': 
  • gaphas/trunk/gaphas/view.py

    r1829 r1838  
    390390 
    391391    def __init__(self, canvas=None): 
    392         super(GtkView, self).__init__(
    393         View.__init__(self
     392        gtk.DrawingArea.__init__(self
     393        View.__init__(self, canvas
    394394        self.set_flags(gtk.CAN_FOCUS) 
    395395        self.add_events(gtk.gdk.BUTTON_PRESS_MASK 
     
    405405 
    406406        self._tool = DefaultTool() 
    407         self.canvas = canvas 
    408407 
    409408        # Set background to white. 
     
    634633        gtk.DrawingArea.do_realize(self) 
    635634        allocation = self.allocation 
    636         print 'allocation', allocation.width, allocation.height 
    637635 
    638636        if self._canvas: 
    639637            self.request_update(self._canvas.get_all_items()) 
    640638 
     639    def do_unrealize(self): 
     640        if self.canvas: 
     641            for item in self.canvas.get_all_items(): 
     642                try: 
     643                    del item._matrix_i2v[self] 
     644                    del item._matrix_v2i[self] 
     645                except KeyError: 
     646                    pass 
     647            self.canvas = None 
     648        self._qtree = None 
     649 
     650        self._dirty_items = None 
     651        self._dirty_matrix_items = None 
     652 
     653        gtk.DrawingArea.do_unrealize(self) 
    641654 
    642655    def do_expose_event(self, event):