/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/legend.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/legend.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 854 by frank, Wed May 7 18:24:13 2003 UTC revision 1231 by jonathan, Wed Jun 18 14:46:57 2003 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001, 2002, 2003 by Intevation GmbH  # Copyright (c) 2001, 2002, 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Jonathan Coles <[email protected]>  # Jonathan Coles <[email protected]>
4    # Frank Koormann <[email protected]>
5  #  #
6  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
7  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
# Line 13  import resource Line 14  import resource
14    
15  from wxPython.wx import *  from wxPython.wx import *
16    
17  from Thuban.Model.layer import Layer  from Thuban.Model.layer import BaseLayer
18  from Thuban.Model.map import Map  from Thuban.Model.map import Map
 from Thuban.Model.scalebar import ScaleBar  
 from Thuban.Model.messages import *  
19  from Thuban.Model.classification import ClassGroup  from Thuban.Model.classification import ClassGroup
20    
21  from Thuban.UI.messages import *  from Thuban.Model.messages import \
22        MAP_STACKING_CHANGED, MAP_LAYERS_ADDED, MAP_LAYERS_REMOVED, LAYER_CHANGED,\
23        LAYER_VISIBILITY_CHANGED, TITLE_CHANGED
24    
25    from Thuban.UI.messages import SCALE_CHANGED
26    
27  from Thuban.UI.classifier import ClassDataPreviewer  from Thuban.UI.classifier import ClassDataPreviewer
28  from Thuban.UI.dock import DockPanel  from Thuban.UI.dock import DockPanel
29    from Thuban.UI.scalebar import ScaleBar
30    
31  from Thuban.Lib.connector import ConnectorError  from Thuban.Lib.connector import ConnectorError
32    
33  ID_LEGEND_RAISE = 4001  ID_LEGEND_TOP = 4001
34  ID_LEGEND_LOWER = 4002  ID_LEGEND_RAISE = 4002
35  ID_LEGEND_TREE = 4003  ID_LEGEND_LOWER = 4003
36  ID_LEGEND_PROPS = 4004  ID_LEGEND_BOTTOM = 4004
37  ID_LEGEND_SHOWLAYER = 4005  ID_LEGEND_TREE = 4005
38  ID_LEGEND_HIDELAYER = 4006  ID_LEGEND_PROPS = 4006
39    ID_LEGEND_SHOWLAYER = 4007
40    ID_LEGEND_HIDELAYER = 4008
41    
42  BMP_SIZE_W = 30  BMP_SIZE_W = 15
43  BMP_SIZE_H = 15  BMP_SIZE_H = 15
44    
45    TOP_BMP = "top_layer"
46  RAISE_BMP = "raise_layer"  RAISE_BMP = "raise_layer"
47  LOWER_BMP = "lower_layer"  LOWER_BMP = "lower_layer"
48    BOTTOM_BMP = "bottom_layer"
49  SHOW_BMP  = "show_layer"  SHOW_BMP  = "show_layer"
50  HIDE_BMP  = "hide_layer"  HIDE_BMP  = "hide_layer"
51  PROPS_BMP = "layer_properties"  PROPS_BMP = "layer_properties"
# Line 57  class LegendPanel(DockPanel): Line 66  class LegendPanel(DockPanel):
66          self.toolBar = wxToolBar(self, -1)          self.toolBar = wxToolBar(self, -1)
67          self.toolBar.SetToolBitmapSize(wxSize(24, 24))          self.toolBar.SetToolBitmapSize(wxSize(24, 24))
68    
69            bmp = resource.GetBitmapResource(TOP_BMP, wxBITMAP_TYPE_XPM)
70            self.toolBar.AddTool(ID_LEGEND_TOP, bmp,
71                shortHelpString=_("Top Layer"))
72    
73          bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)
74          self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,          self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
75              shortHelpString=_("Raise Layer"))              shortHelpString=_("Raise Layer"))
# Line 65  class LegendPanel(DockPanel): Line 78  class LegendPanel(DockPanel):
78          self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,          self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
79              shortHelpString=_("Lower Layer"))              shortHelpString=_("Lower Layer"))
80    
81            bmp = resource.GetBitmapResource(BOTTOM_BMP, wxBITMAP_TYPE_XPM)
82            self.toolBar.AddTool(ID_LEGEND_BOTTOM, bmp,
83                shortHelpString=_("Bottom Layer"))
84    
85          bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)          bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)
86          self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,          self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
87              shortHelpString=_("Show Layer"))              shortHelpString=_("Show Layer"))
# Line 80  class LegendPanel(DockPanel): Line 97  class LegendPanel(DockPanel):
97          self.toolBar.Realize()          self.toolBar.Realize()
98          panelBox.Add(self.toolBar, 0, wxGROW, 0)          panelBox.Add(self.toolBar, 0, wxGROW, 0)
99    
100            EVT_TOOL(self, ID_LEGEND_TOP, self._OnMoveTop)
101          EVT_TOOL(self, ID_LEGEND_RAISE, self._OnMoveUp)          EVT_TOOL(self, ID_LEGEND_RAISE, self._OnMoveUp)
102          EVT_TOOL(self, ID_LEGEND_LOWER, self._OnMoveDown)          EVT_TOOL(self, ID_LEGEND_LOWER, self._OnMoveDown)
103            EVT_TOOL(self, ID_LEGEND_BOTTOM, self._OnMoveBottom)
104          EVT_TOOL(self, ID_LEGEND_PROPS, self._OnProperties)          EVT_TOOL(self, ID_LEGEND_PROPS, self._OnProperties)
105          EVT_TOOL(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)          EVT_TOOL(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)
106          EVT_TOOL(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)          EVT_TOOL(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)
# Line 116  class LegendPanel(DockPanel): Line 135  class LegendPanel(DockPanel):
135    
136      def DoOnSelChanged(self, layer, group):      def DoOnSelChanged(self, layer, group):
137    
138          ok = isinstance(layer, Layer)          ok = isinstance(layer, BaseLayer)
139          self.__EnableButtons(ok)          self.__EnableButtons(ok)
140    
141          self.mainWindow.SelectLayer(layer)          self.mainWindow.SelectLayer(layer)
# Line 124  class LegendPanel(DockPanel): Line 143  class LegendPanel(DockPanel):
143      def DoOnProperties(self):      def DoOnProperties(self):
144          list = self.tree.GetSelectedHierarchy()          list = self.tree.GetSelectedHierarchy()
145    
146          ok = isinstance(list[0], Layer)          ok = isinstance(list[0], BaseLayer)
147          if ok:          if ok:
148              self.mainWindow.OpenLayerProperties(list[0], list[1])              self.mainWindow.OpenLayerProperties(list[0], list[1])
149    
# Line 134  class LegendPanel(DockPanel): Line 153  class LegendPanel(DockPanel):
153      def _OnProperties(self, event):      def _OnProperties(self, event):
154          self.DoOnProperties()          self.DoOnProperties()
155    
156        def _OnMoveTop(self, event):
157            self.tree.MoveCurrentItemTop()
158            
159      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
160          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
161    
162      def _OnMoveDown(self, event):      def _OnMoveDown(self, event):
163          self.tree.MoveCurrentItemDown()          self.tree.MoveCurrentItemDown()
164    
165        def _OnMoveBottom(self, event):
166            self.tree.MoveCurrentItemBottom()
167    
168      def _OnShowLayer(self, event):      def _OnShowLayer(self, event):
169          self.tree.DoOnShowLayer()          self.tree.DoOnShowLayer()
170          pass          pass
# Line 155  class LegendPanel(DockPanel): Line 180  class LegendPanel(DockPanel):
180          pass          pass
181    
182      def __EnableButtons(self, on):      def __EnableButtons(self, on):
183            self.toolBar.EnableTool(ID_LEGEND_TOP, on)
184          self.toolBar.EnableTool(ID_LEGEND_RAISE, on)          self.toolBar.EnableTool(ID_LEGEND_RAISE, on)
185          self.toolBar.EnableTool(ID_LEGEND_LOWER, on)          self.toolBar.EnableTool(ID_LEGEND_LOWER, on)
186            self.toolBar.EnableTool(ID_LEGEND_BOTTOM, on)
187          self.toolBar.EnableTool(ID_LEGEND_SHOWLAYER,  on)          self.toolBar.EnableTool(ID_LEGEND_SHOWLAYER,  on)
188          self.toolBar.EnableTool(ID_LEGEND_HIDELAYER,  on)          self.toolBar.EnableTool(ID_LEGEND_HIDELAYER,  on)
189          self.toolBar.EnableTool(ID_LEGEND_PROPS, on)          self.toolBar.EnableTool(ID_LEGEND_PROPS, on)
# Line 174  class LegendTree(wxTreeCtrl): Line 201  class LegendTree(wxTreeCtrl):
201          self.mainWindow = mainWindow          self.mainWindow = mainWindow
202          self.map = None          self.map = None
203          self.parent = parent          self.parent = parent
204          self.layer2id = {}          self.changing_selection = 0
205    
206            #
207            # The image list used by the wxTreeCtrl causes problems when
208            # we remove layers and/or change a classification because it
209            # changes the image indices if you remove images from the list.
210            # Rather than removing unused images we use this list to keep
211            # track of which indices are available in the image list
212            # (because of a previous removal) and then  replace those indices
213            # with new images rather than appending to the end of the image
214            # list (assuming there are any that are available).
215            #
216            self.availImgListIndices = []
217    
218          self.image_list = None          self.image_list = None
219          self.emptyImageIndex = 0          self.emptyImageIndex = 0
220    
221          self.previewer = ClassDataPreviewer()          self.previewer = ClassDataPreviewer()
222    
223            self.preventExpandCollapse = False
224    
225          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
226          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
227            EVT_TREE_ITEM_EXPANDING(self, ID_LEGEND_TREE, self.OnItemExpandCollapse)
228            EVT_TREE_ITEM_COLLAPSING(self, ID_LEGEND_TREE, self.OnItemExpandCollapse)
229    
230          EVT_CLOSE(self, self._OnClose)          EVT_CLOSE(self, self._OnClose)
231    
232          self.SetMap(map)          self.SetMap(map)
233    
234        def find_layer(self, layer):
235            """Return the tree item for the layer"""
236            root = self.GetRootItem()
237            id, cookie = self.GetFirstChild(root, 0)
238            while id.IsOk():
239                if self.GetPyData(id) is layer:
240                    return id
241                id, cookie = self.GetNextChild(root, cookie)
242            return None
243    
244      def _OnClose(self, event):      def _OnClose(self, event):
245          self.SetMap(None)          self.SetMap(None)
246    
# Line 197  class LegendTree(wxTreeCtrl): Line 250  class LegendTree(wxTreeCtrl):
250      def SetMap(self, map):      def SetMap(self, map):
251    
252          sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),          sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
253                      (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),                      (MAP_LAYERS_ADDED, self._OnMsgMapLayersAdded),
254                      (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]                      (MAP_LAYERS_REMOVED, self._OnMsgMapLayersRemoved)]
255    
256          if self.map is not None:          if self.map is not None:
257              for msg, func in sub_list: self.map.Unsubscribe(msg, func)              for msg, func in sub_list: self.map.Unsubscribe(msg, func)
# Line 209  class LegendTree(wxTreeCtrl): Line 262  class LegendTree(wxTreeCtrl):
262                      #self._OnMsgMapsChanged)                      #self._OnMsgMapsChanged)
263              #except ConnectorError:              #except ConnectorError:
264                  #pass                  #pass
265              self.__DeleteAllItems()              self.DeleteAllItems()
266                    
267          self.map = map          self.map = map
268    
# Line 221  class LegendTree(wxTreeCtrl): Line 274  class LegendTree(wxTreeCtrl):
274                  #self._OnMsgMapsChanged)                  #self._OnMsgMapsChanged)
275              self.__FillTree(self.map)              self.__FillTree(self.map)
276    
277        def MoveCurrentItemTop(self):
278            layer, group = self.GetSelectedHierarchy()
279    
280            if layer is not None:
281                self.map.MoveLayerToTop(layer)
282            else:
283                assert False, "Shouldn't be allowed."
284                pass
285    
286      def MoveCurrentItemUp(self):      def MoveCurrentItemUp(self):
287          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
288    
# Line 239  class LegendTree(wxTreeCtrl): Line 301  class LegendTree(wxTreeCtrl):
301              assert False, "Shouldn't be allowed."              assert False, "Shouldn't be allowed."
302              pass              pass
303    
304        def MoveCurrentItemBottom(self):
305            layer, group = self.GetSelectedHierarchy()
306    
307            if layer is not None:
308                self.map.MoveLayerToBottom(layer)
309            else:
310                assert False, "Shouldn't be allowed."
311                pass
312    
313      def OnCompareItems(self, item1, item2):      def OnCompareItems(self, item1, item2):
314    
315          data1 = self.GetPyData(item1)          data1 = self.GetPyData(item1)
316          data2 = self.GetPyData(item2)          data2 = self.GetPyData(item2)
317    
318          if isinstance(data1, Layer):          if isinstance(data1, BaseLayer):
319              layers = self.map.Layers()              layers = self.map.Layers()
320              return layers.index(data2) - layers.index(data1)              return layers.index(data2) - layers.index(data1)
321          else:          else:
322              return wxTreeCtrl.OnCompareItems(self, item1, item2)              return wxTreeCtrl.OnCompareItems(self, item1, item2)
323    
   
324      def DoOnShowLayer(self):      def DoOnShowLayer(self):
         #self.__ShowHideLayer(True)  
325          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
326          layer.SetVisible(True)          layer.SetVisible(True)
327    
328      def DoOnHideLayer(self):      def DoOnHideLayer(self):
         #self.__ShowHideLayer(False)  
329          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
330          layer.SetVisible(False)          layer.SetVisible(False)
331    
# Line 286  class LegendTree(wxTreeCtrl): Line 354  class LegendTree(wxTreeCtrl):
354          self.SetMap(self.mainWindow.Map())          self.SetMap(self.mainWindow.Map())
355                    
356      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
357            # If we change the selection from normalize_selection do nothing.
358            if self.changing_selection:
359                return
360    
361            self.normalize_selection()
362          self.__UpdateSelection()          self.__UpdateSelection()
363    
364        def normalize_selection(self):
365            """Select the layer containing currently selected item"""
366            # This is really a workaround for a bug in wx where deleting a
367            # subtree with DeleteChildren does not update the selection
368            # properly and can lead to segfaults later because the return
369            # value of GetSelection points to invalid data.
370            item = self.GetSelection()
371            while item.IsOk():
372                object = self.GetPyData(item)
373                if isinstance(object, BaseLayer):
374                    break
375                item = self.GetItemParent(item)
376            else:
377                # No layer was found in the chain of parents, so there's
378                # nothing we can do.
379                return
380    
381            self.changing_selection = 1
382            try:
383                self.SelectItem(item)
384            finally:
385                self.changing_selection = 0
386    
387    
388        def OnItemExpandCollapse(self, event):
389            if self.preventExpandCollapse:
390                event.Veto()
391                self.preventExpandCollapse = False
392    
393      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
394            self.preventExpandCollapse = True
395          self.parent.DoOnProperties()          self.parent.DoOnProperties()
396    
397      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
398          assert isinstance(layer, Layer)          assert isinstance(layer, BaseLayer)
399    
400          id = self.layer2id[layer]          id = self.find_layer(layer)
401          assert id.IsOk()          assert id is not None
402    
403          # XXX: yikes! this is so bad, we should be doing what is          self.__FillTreeLayer(id)
         #      commented out, but there is a problem with keeping  
         #      track of the images in the image list when we replace  
         #      a layer. it ends up causing a seg fault.  
         self.__FillTree(self.map)  
404          self.__UpdateSelection()          self.__UpdateSelection()
         #self.__FillTreeLayer(id)  
405    
406      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
407          self.Sort()          self.Sort()
# Line 313  class LegendTree(wxTreeCtrl): Line 411  class LegendTree(wxTreeCtrl):
411              self.EnsureVisible(id)              self.EnsureVisible(id)
412          self.__UpdateSelection()          self.__UpdateSelection()
413    
414      def _OnMsgMapLayersAddedRemoved(self, map):      def _OnMsgMapLayersAdded(self, map):
415            assert map is self.map
416    
417            # Build a dict with all layers known by the the tree as keys
418            layers = {}
419            root = self.GetRootItem()
420            id, cookie = self.GetFirstChild(root, 0)
421            while id.IsOk():
422                layers[self.GetPyData(id)] = 1
423                id, cookie = self.GetNextChild(root, cookie)
424    
425            # Add layers in the map but not in the dict
426            i = 0
427            for l in map.Layers():
428                if not l in layers:
429                    self.__AddLayer(i, l)
430    
431            self.__UpdateSelection()
432    
433        def _OnMsgMapLayersRemoved(self, map):
434          assert map is self.map          assert map is self.map
435    
436          self.__FillTree(self.map)          layers = map.Layers()
437    
438            root = self.GetRootItem()
439            id, cookie = self.GetFirstChild(root, 0)
440            while id.IsOk():
441                if self.GetPyData(id) not in layers:
442                    self.__RemoveLayer(id)
443                id, cookie = self.GetNextChild(root, cookie)
444    
445    
446          self.__UpdateSelection()          self.__UpdateSelection()
447    
448      def _OnMsgLayerVisibilityChanged(self, layer):      def _OnMsgLayerVisibilityChanged(self, layer):
449          assert isinstance(layer, Layer)          assert isinstance(layer, BaseLayer)
450    
451          self.__ShowHideLayer(layer)          self.__ShowHideLayer(layer)
452          self.__UpdateSelection()          self.__UpdateSelection()
453    
454      def _OnMsgLayerTitleChanged(self, layer):      def _OnMsgLayerTitleChanged(self, layer):
455    
456          id = self.layer2id[layer]          id = self.find_layer(layer)
457          if id.IsOk():          if id.IsOk():
458              self.SetItemText(id, layer.Title())              self.SetItemText(id, layer.Title())
459          self.__UpdateSelection()          self.__UpdateSelection()
# Line 340  class LegendTree(wxTreeCtrl): Line 466  class LegendTree(wxTreeCtrl):
466    
467          self.Freeze()          self.Freeze()
468    
469          self.__DeleteAllItems()          self.DeleteAllItems()
470    
471          if map.HasLayers():          if map.HasLayers():
472                root = self.GetRootItem()
             self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)  
                                                                                   
             bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)  
             dc = wxMemoryDC()  
             dc.SelectObject(bmp)  
             dc.SetBrush(wxBLACK_BRUSH)  
             dc.Clear()  
             dc.SelectObject(wxNullBitmap)  
                                                                                   
             self.emptyImageIndex = \  
                 self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))  
                                                                                   
             self.AssignImageList(self.image_list)  
   
             root = self.AddRoot("")  
   
473              for l in map.Layers():              for l in map.Layers():
474                  id = self.PrependItem(root, l.Title())                  self.__AddLayer(0, l)
                 l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)  
                 l.Subscribe(LAYER_VISIBILITY_CHANGED,  
                             self._OnMsgLayerVisibilityChanged)  
                 l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)  
                 self.SetPyData(id, l)  
                 self.__SetVisibilityStyle(l.Visible(), id)  
   
                 self.layer2id[l] = id  
   
                 self.__FillTreeLayer(id)  
                 self.Expand(id)  
475    
476          self.Thaw()          self.Thaw()
477    
# Line 383  class LegendTree(wxTreeCtrl): Line 482  class LegendTree(wxTreeCtrl):
482    
483          self.DeleteChildren(pid)          self.DeleteChildren(pid)
484    
485          clazz = layer.GetClassification()          if layer.HasClassification():
486    
487                clazz = layer.GetClassification()
488    
489                shapeType = layer.ShapeType()
490    
491          shapeType = layer.ShapeType()              show = layer.Visible()
492                for g in clazz:
493                    if g.IsVisible():
494                        id = self.AppendItem(pid, g.GetDisplayText())
495                        self.SetPyData(id, g)
496                        self.__SetVisibilityStyle(show, id)
497    
498                        bmp = self.__BuildGroupImage(g, shapeType)
499    
500                        if bmp is None:
501                            self.SetItemImage(id, -1)
502                            self.SetItemSelectedImage(id, -1)
503                        else:
504                            if self.availImgListIndices:
505                                i = self.availImgListIndices.pop(0)
506                                self.image_list.Replace(i, bmp)
507                            else:
508                                i = self.image_list.Add(bmp)
509    
510          show = layer.Visible()                          self.SetItemImage(id, i)
511          for g in clazz:                          self.SetItemSelectedImage(id, i)
             if g.IsVisible():  
                 id = self.AppendItem(pid, g.GetDisplayText())  
                 self.SetPyData(id, g)  
                 self.__SetVisibilityStyle(show, id)  
   
                 bmp = self.__BuildGroupImage(g, shapeType)  
   
                 if bmp is None:  
                     self.SetItemImage(id, self.emptyImageIndex)  
                 else:  
                     i = self.image_list.Add(bmp)  
                     self.SetItemImage(id, i)  
512    
513          self.Thaw()          self.Thaw()
514    
# Line 416  class LegendTree(wxTreeCtrl): Line 524  class LegendTree(wxTreeCtrl):
524    
525          return bmp          return bmp
526    
527      def __DeleteAllItems(self):      def DeleteAllItems(self):
528    
529          while len(self.layer2id) > 0:          pid = self.GetRootItem()
             layer, id = self.layer2id.popitem()  
             layer.Unsubscribe(LAYER_CHANGED,  
                               self._OnMsgLayerChanged)  
             layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,  
                               self._OnMsgLayerVisibilityChanged)  
             layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)  
530    
531          self.DeleteAllItems()          id, cookie = self.GetFirstChild(pid, 123)
532            while id.IsOk():
533                self.__RemoveLayer(id)
534                id, cookie = self.GetNextChild(pid, cookie)
535    
536            wxTreeCtrl.DeleteAllItems(self)
537    
538        def __AddLayer(self, before, l):
539            root = self.GetRootItem()
540            id = self.InsertItemBefore(root, before,
541                                l.Title(),
542                                self.mapImageIndex,
543                                self.mapImageIndex)
544    
545            self.SetPyData(id, l)
546            self.__SetVisibilityStyle(l.Visible(), id)
547    
548            self.__FillTreeLayer(id)
549            self.Expand(id)
550    
551            l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
552            l.Subscribe(LAYER_VISIBILITY_CHANGED,
553                        self._OnMsgLayerVisibilityChanged)
554            l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
555    
556        def __RemoveLayer(self, id):
557            self.DeleteChildren(id)
558    
559            layer = self.GetPyData(id)
560            layer.Unsubscribe(LAYER_CHANGED,
561                              self._OnMsgLayerChanged)
562            layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
563                              self._OnMsgLayerVisibilityChanged)
564            layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
565    
566            self.Delete(id)
567    
568        def DeleteChildren(self, pid):
569            id, cookie = self.GetFirstChild(pid, 123)
570            while id.IsOk():
571                self.availImgListIndices.append(self.GetItemImage(id))
572                id, cookie = self.GetNextChild(pid, cookie)
573            wxTreeCtrl.DeleteChildren(self, pid)
574    
575        def GetRootItem(self):
576            root = wxTreeCtrl.GetRootItem(self)
577    
578            if not root.IsOk():
579                self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
580    
581                bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
582                dc = wxMemoryDC()
583                dc.SelectObject(bmp)
584                dc.SetBrush(wxBLACK_BRUSH)
585                dc.Clear()
586                dc.SelectObject(wxNullBitmap)
587    
588                self.emptyImageIndex = \
589                    self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
590    
591                bmp = resource.GetBitmapResource("legend_icon_layer",
592                                                  wxBITMAP_TYPE_XPM)
593                self.mapImageIndex = \
594                    self.image_list.Add(bmp)
595    
596                self.AssignImageList(self.image_list)
597                self.availImgListIndices = []
598    
599                root = self.AddRoot("")
600    
601            return root
602    
603      def __SetVisibilityStyle(self, visible, id):      def __SetVisibilityStyle(self, visible, id):
604          font = self.GetItemFont(id)          font = self.GetItemFont(id)
# Line 435  class LegendTree(wxTreeCtrl): Line 607  class LegendTree(wxTreeCtrl):
607              font.SetStyle(wxNORMAL)              font.SetStyle(wxNORMAL)
608              color = wxBLACK              color = wxBLACK
609          else:          else:
610              font.SetStyle(wxITALIC)              #font.SetStyle(wxITALIC)
611                font.SetStyle(wxNORMAL)
612              color = wxLIGHT_GREY              color = wxLIGHT_GREY
613    
614          self.SetItemTextColour(id, color)          self.SetItemTextColour(id, color)
615          self.SetItemFont(id, font)          self.SetItemFont(id, font)
616                    
617      def __ShowHideLayer(self, layer):      def __ShowHideLayer(self, layer):
618          parent = self.layer2id[layer]          parent = self.find_layer(layer)
619          assert parent.IsOk()          assert parent.IsOk()
620    
621          visible = layer.Visible()          visible = layer.Visible()
# Line 461  class ScaleBarBitmap(wxBoxSizer): Line 634  class ScaleBarBitmap(wxBoxSizer):
634          # While the width is fixed, get the height _now_.          # While the width is fixed, get the height _now_.
635          dc = wxMemoryDC()          dc = wxMemoryDC()
636          textwidth, textheight = dc.GetTextExtent("%d"%0)          textwidth, textheight = dc.GetTextExtent("%d"%0)
637          self.width = 200          self.width = 210
638          self.height = textheight + 3*2 + 8          self.height = textheight + 3*2 + 8
639    
640          wxBoxSizer.__init__(self, wxVERTICAL)          wxBoxSizer.__init__(self, wxVERTICAL)
# Line 472  class ScaleBarBitmap(wxBoxSizer): Line 645  class ScaleBarBitmap(wxBoxSizer):
645          self.mainWindow = mainWindow          self.mainWindow = mainWindow
646          self.parent = parent          self.parent = parent
647          self.canvas = None          self.canvas = None
         self.scalebar = ScaleBar(map)  
648          self.SetCanvas(self.mainWindow.canvas)          self.SetCanvas(self.mainWindow.canvas)
649    
650      def SetCanvas(self, canvas):      def SetCanvas(self, canvas):
# Line 482  class ScaleBarBitmap(wxBoxSizer): Line 654  class ScaleBarBitmap(wxBoxSizer):
654              for msg, func in sub_list: self.canvas.Unsubscribe(msg, func)              for msg, func in sub_list: self.canvas.Unsubscribe(msg, func)
655                    
656          self.canvas = canvas          self.canvas = canvas
657            self.scalebar = ScaleBar(canvas.map)
658    
659          if self.canvas is not None:          if self.canvas is not None:
660              for msg, func in sub_list: self.canvas.Subscribe(msg, func)              for msg, func in sub_list: self.canvas.Subscribe(msg, func)
# Line 496  class ScaleBarBitmap(wxBoxSizer): Line 669  class ScaleBarBitmap(wxBoxSizer):
669          dc.SelectObject(bmp)          dc.SelectObject(bmp)
670          dc.Clear()          dc.Clear()
671    
672          self.scalebar.DrawScalebar(scale, dc)          if self.canvas.map is not None \
673                and self.canvas.map.projection is not None:
674                self.scalebar.DrawScaleBar(scale, dc, (0,0), dc.GetSizeTuple())
675    
676          self.scalebarBitmap.SetBitmap(bmp)          self.scalebarBitmap.SetBitmap(bmp)
677    

Legend:
Removed from v.854  
changed lines
  Added in v.1231

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26