/[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 795 by jonathan, Wed Apr 30 17:01:06 2003 UTC revision 1119 by bh, Mon Jun 2 10:37:59 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.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 56  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 64  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 79  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 89  class LegendPanel(DockPanel): Line 109  class LegendPanel(DockPanel):
109    
110          panelBox.Add(self.tree, 1, wxGROW, 0)          panelBox.Add(self.tree, 1, wxGROW, 0)
111    
112            self.scalebarbitmap = ScaleBarBitmap(self, map, mainWindow)
113            panelBox.Add(self.scalebarbitmap, 0, wxGROW, 0)
114    
115          self.SetAutoLayout(True)          self.SetAutoLayout(True)
116          self.SetSizer(panelBox)          self.SetSizer(panelBox)
117          panelBox.SetSizeHints(self)          panelBox.SetSizeHints(self)
# Line 108  class LegendPanel(DockPanel): Line 131  class LegendPanel(DockPanel):
131    
132      def SetMap(self, map):      def SetMap(self, map):
133          self.tree.SetMap(map)          self.tree.SetMap(map)
134            self.scalebarbitmap.SetCanvas(self.mainWindow.canvas)
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 119  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 129  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 150  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 170  class LegendTree(wxTreeCtrl): Line 202  class LegendTree(wxTreeCtrl):
202          self.map = None          self.map = None
203          self.parent = parent          self.parent = parent
204          self.layer2id = {}          self.layer2id = {}
205            self.changing_selection = 0
206    
207            #
208            # The image list used by the wxTreeCtrl causes problems when
209            # we remove layers and/or change a classification because it
210            # changes the image indices if you remove images from the list.
211            # Rather than removing unused images we use this list to keep
212            # track of which indices are available in the image list
213            # (because of a previous removal) and then  replace those indices
214            # with new images rather than appending to the end of the image
215            # list (assuming there are any that are available).
216            #
217            self.availImgListIndices = []
218    
219          self.image_list = None          self.image_list = None
220          self.emptyImageIndex = 0          self.emptyImageIndex = 0
# Line 192  class LegendTree(wxTreeCtrl): Line 237  class LegendTree(wxTreeCtrl):
237      def SetMap(self, map):      def SetMap(self, map):
238    
239          sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),          sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
240                      (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),                      (MAP_LAYERS_ADDED, self._OnMsgMapLayersAdded),
241                      (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]                      (MAP_LAYERS_REMOVED, self._OnMsgMapLayersRemoved)]
242    
243          if self.map is not None:          if self.map is not None:
244              for msg, func in sub_list: self.map.Unsubscribe(msg, func)              for msg, func in sub_list: self.map.Unsubscribe(msg, func)
# Line 204  class LegendTree(wxTreeCtrl): Line 249  class LegendTree(wxTreeCtrl):
249                      #self._OnMsgMapsChanged)                      #self._OnMsgMapsChanged)
250              #except ConnectorError:              #except ConnectorError:
251                  #pass                  #pass
252              self.__DeleteAllItems()              self.DeleteAllItems()
253                    
254          self.map = map          self.map = map
255    
# Line 216  class LegendTree(wxTreeCtrl): Line 261  class LegendTree(wxTreeCtrl):
261                  #self._OnMsgMapsChanged)                  #self._OnMsgMapsChanged)
262              self.__FillTree(self.map)              self.__FillTree(self.map)
263    
264                    def MoveCurrentItemTop(self):
265            layer, group = self.GetSelectedHierarchy()
266    
267            if layer is not None:
268                self.map.MoveLayerToTop(layer)
269            else:
270                assert False, "Shouldn't be allowed."
271                pass
272    
273      def MoveCurrentItemUp(self):      def MoveCurrentItemUp(self):
274          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
275    
# Line 235  class LegendTree(wxTreeCtrl): Line 288  class LegendTree(wxTreeCtrl):
288              assert False, "Shouldn't be allowed."              assert False, "Shouldn't be allowed."
289              pass              pass
290    
291        def MoveCurrentItemBottom(self):
292            layer, group = self.GetSelectedHierarchy()
293    
294            if layer is not None:
295                self.map.MoveLayerToBottom(layer)
296            else:
297                assert False, "Shouldn't be allowed."
298                pass
299    
300      def OnCompareItems(self, item1, item2):      def OnCompareItems(self, item1, item2):
301    
302          data1 = self.GetPyData(item1)          data1 = self.GetPyData(item1)
303          data2 = self.GetPyData(item2)          data2 = self.GetPyData(item2)
304    
305          if isinstance(data1, Layer):          if isinstance(data1, BaseLayer):
306              layers = self.map.Layers()              layers = self.map.Layers()
307              return layers.index(data2) - layers.index(data1)              return layers.index(data2) - layers.index(data1)
308          else:          else:
309              return wxTreeCtrl.OnCompareItems(self, item1, item2)              return wxTreeCtrl.OnCompareItems(self, item1, item2)
310    
   
311      def DoOnShowLayer(self):      def DoOnShowLayer(self):
         #self.__ShowHideLayer(True)  
312          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
313          layer.SetVisible(True)          layer.SetVisible(True)
314    
315      def DoOnHideLayer(self):      def DoOnHideLayer(self):
         #self.__ShowHideLayer(False)  
316          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
317          layer.SetVisible(False)          layer.SetVisible(False)
318    
# Line 282  class LegendTree(wxTreeCtrl): Line 341  class LegendTree(wxTreeCtrl):
341          self.SetMap(self.mainWindow.Map())          self.SetMap(self.mainWindow.Map())
342                    
343      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
344            # If we change the selection from normalize_selection do nothing.
345            if self.changing_selection:
346                return
347    
348            self.normalize_selection()
349          self.__UpdateSelection()          self.__UpdateSelection()
350    
351        def normalize_selection(self):
352            """Select the layer containing currently selected item"""
353            # This is really a workaround for a bug in wx where deleting a
354            # subtree with DeleteChildren does not update the selection
355            # properly and can lead to segfaults later because the return
356            # value of GetSelection points to invalid data.
357            item = self.GetSelection()
358            while item.IsOk():
359                object = self.GetPyData(item)
360                if isinstance(object, BaseLayer):
361                    break
362                item = self.GetItemParent(item)
363            else:
364                # No layer was found in the chain of parents, so there's
365                # nothing we can do.
366                return
367    
368            self.changing_selection = 1
369            try:
370                self.SelectItem(item)
371            finally:
372                self.changing_selection = 0
373    
374    
375      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
376          self.parent.DoOnProperties()          self.parent.DoOnProperties()
377    
378      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
379          assert isinstance(layer, Layer)          assert isinstance(layer, BaseLayer)
380    
381          id = self.layer2id[layer]          id = self.layer2id[layer]
382          assert id.IsOk()          assert id.IsOk()
383    
384          # 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)  
385          self.__UpdateSelection()          self.__UpdateSelection()
         #self.__FillTreeLayer(id)  
386    
387      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
388          self.Sort()          self.Sort()
# Line 309  class LegendTree(wxTreeCtrl): Line 392  class LegendTree(wxTreeCtrl):
392              self.EnsureVisible(id)              self.EnsureVisible(id)
393          self.__UpdateSelection()          self.__UpdateSelection()
394    
395      def _OnMsgMapLayersAddedRemoved(self, map):      def _OnMsgMapLayersAdded(self, map):
396          assert map is self.map          assert map is self.map
397    
398          self.__FillTree(self.map)          root = self.GetRootItem()
399    
400            i = 0
401            for l in map.Layers():
402                if not self.layer2id.has_key(l):
403                    self.__AddLayer(i, l)
404    
405            self.__UpdateSelection()
406    
407        def _OnMsgMapLayersRemoved(self, map):
408            assert map is self.map
409    
410            layers = map.Layers()
411    
412            for layer, id in self.layer2id.items():
413                if layer not in layers:
414                    if id.IsOk():
415                        self.__RemoveLayer(id)
416    
417          self.__UpdateSelection()          self.__UpdateSelection()
418    
419      def _OnMsgLayerVisibilityChanged(self, layer):      def _OnMsgLayerVisibilityChanged(self, layer):
420          assert isinstance(layer, Layer)          assert isinstance(layer, BaseLayer)
421    
422          self.__ShowHideLayer(layer)          self.__ShowHideLayer(layer)
423          self.__UpdateSelection()          self.__UpdateSelection()
# Line 336  class LegendTree(wxTreeCtrl): Line 437  class LegendTree(wxTreeCtrl):
437    
438          self.Freeze()          self.Freeze()
439    
440          self.__DeleteAllItems()          self.DeleteAllItems()
441    
442          if map.HasLayers():          if map.HasLayers():
443                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("")  
   
444              for l in map.Layers():              for l in map.Layers():
445                  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)  
446    
447          self.Thaw()          self.Thaw()
448    
# Line 379  class LegendTree(wxTreeCtrl): Line 453  class LegendTree(wxTreeCtrl):
453    
454          self.DeleteChildren(pid)          self.DeleteChildren(pid)
455    
456          clazz = layer.GetClassification()          if layer.HasClassification():
457    
458          shapeType = layer.ShapeType()              clazz = layer.GetClassification()
459    
460          show = layer.Visible()              shapeType = layer.ShapeType()
461          for g in clazz:  
462              if g.IsVisible():              show = layer.Visible()
463                  id = self.AppendItem(pid, g.GetDisplayText())              for g in clazz:
464                  self.SetPyData(id, g)                  if g.IsVisible():
465                  self.__SetVisibilityStyle(show, id)                      id = self.AppendItem(pid, g.GetDisplayText())
466                        self.SetPyData(id, g)
467                  bmp = self.__BuildGroupImage(g, shapeType)                      self.__SetVisibilityStyle(show, id)
468    
469                  if bmp is None:                      bmp = self.__BuildGroupImage(g, shapeType)
470                      self.SetItemImage(id, self.emptyImageIndex)  
471                  else:                      if bmp is None:
472                      i = self.image_list.Add(bmp)                          self.SetItemImage(id, -1)
473                      self.SetItemImage(id, i)                          self.SetItemSelectedImage(id, -1)
474                        else:
475                            if self.availImgListIndices:
476                                i = self.availImgListIndices.pop(0)
477                                self.image_list.Replace(i, bmp)
478                            else:
479                                i = self.image_list.Add(bmp)
480    
481                            self.SetItemImage(id, i)
482                            self.SetItemSelectedImage(id, i)
483    
484          self.Thaw()          self.Thaw()
485    
# Line 412  class LegendTree(wxTreeCtrl): Line 495  class LegendTree(wxTreeCtrl):
495    
496          return bmp          return bmp
497    
498      def __DeleteAllItems(self):      def DeleteAllItems(self):
499    
500          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)  
501    
502          self.DeleteAllItems()          id, cookie = self.GetFirstChild(pid, 123)
503            while id.IsOk():
504                self.__RemoveLayer(id)
505                id, cookie = self.GetNextChild(pid, cookie)
506    
507            wxTreeCtrl.DeleteAllItems(self)
508    
509        def __AddLayer(self, before, l):
510            root = self.GetRootItem()
511            id = self.InsertItemBefore(root, before,
512                                l.Title(),
513                                self.mapImageIndex,
514                                self.mapImageIndex)
515    
516            self.SetPyData(id, l)
517            self.__SetVisibilityStyle(l.Visible(), id)
518    
519            self.layer2id[l] = id
520    
521            self.__FillTreeLayer(id)
522            self.Expand(id)
523    
524            l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
525            l.Subscribe(LAYER_VISIBILITY_CHANGED,
526                        self._OnMsgLayerVisibilityChanged)
527            l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
528    
529        def __RemoveLayer(self, id):
530            self.DeleteChildren(id)
531    
532            layer = self.GetPyData(id)
533            layer.Unsubscribe(LAYER_CHANGED,
534                              self._OnMsgLayerChanged)
535            layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
536                              self._OnMsgLayerVisibilityChanged)
537            layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
538    
539            self.Delete(id)
540            del self.layer2id[layer]
541    
542        def DeleteChildren(self, pid):
543            id, cookie = self.GetFirstChild(pid, 123)
544            while id.IsOk():
545                self.availImgListIndices.append(self.GetItemImage(id))
546                id, cookie = self.GetNextChild(pid, cookie)
547            wxTreeCtrl.DeleteChildren(self, pid)
548    
549        def GetRootItem(self):
550            root = wxTreeCtrl.GetRootItem(self)
551    
552            if not root.IsOk():
553                self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
554    
555                bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
556                dc = wxMemoryDC()
557                dc.SelectObject(bmp)
558                dc.SetBrush(wxBLACK_BRUSH)
559                dc.Clear()
560                dc.SelectObject(wxNullBitmap)
561    
562                self.emptyImageIndex = \
563                    self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
564    
565                bmp = resource.GetBitmapResource("legend_icon_layer",
566                                                  wxBITMAP_TYPE_XPM)
567                self.mapImageIndex = \
568                    self.image_list.Add(bmp)
569    
570                self.AssignImageList(self.image_list)
571                self.availImgListIndices = []
572    
573                root = self.AddRoot("")
574    
575            return root
576    
577      def __SetVisibilityStyle(self, visible, id):      def __SetVisibilityStyle(self, visible, id):
578          font = self.GetItemFont(id)          font = self.GetItemFont(id)
# Line 431  class LegendTree(wxTreeCtrl): Line 581  class LegendTree(wxTreeCtrl):
581              font.SetStyle(wxNORMAL)              font.SetStyle(wxNORMAL)
582              color = wxBLACK              color = wxBLACK
583          else:          else:
584              font.SetStyle(wxITALIC)              #font.SetStyle(wxITALIC)
585                font.SetStyle(wxNORMAL)
586              color = wxLIGHT_GREY              color = wxLIGHT_GREY
587    
588          self.SetItemTextColour(id, color)          self.SetItemTextColour(id, color)
# Line 451  class LegendTree(wxTreeCtrl): Line 602  class LegendTree(wxTreeCtrl):
602              self.__SetVisibilityStyle(visible, id)              self.__SetVisibilityStyle(visible, id)
603              id, cookie = self.GetNextChild(parent, cookie)              id, cookie = self.GetNextChild(parent, cookie)
604                            
605    class ScaleBarBitmap(wxBoxSizer):
606    
607        def __init__(self, parent, map, mainWindow):
608            # While the width is fixed, get the height _now_.
609            dc = wxMemoryDC()
610            textwidth, textheight = dc.GetTextExtent("%d"%0)
611            self.width = 210
612            self.height = textheight + 3*2 + 8
613    
614            wxBoxSizer.__init__(self, wxVERTICAL)
615            bmp=wxEmptyBitmap(self.width, self.height)
616            self.scalebarBitmap = wxStaticBitmap(parent, -1, bmp)
617            self.Add(self.scalebarBitmap, 0, wxALIGN_CENTER|wxLEFT|wxTOP|wxRIGHT, 1)
618    
619            self.mainWindow = mainWindow
620            self.parent = parent
621            self.canvas = None
622            self.SetCanvas(self.mainWindow.canvas)
623    
624        def SetCanvas(self, canvas):
625            sub_list = [(SCALE_CHANGED, self._OnMsgScaleChanged)]
626    
627            if self.canvas is not None:
628                for msg, func in sub_list: self.canvas.Unsubscribe(msg, func)
629            
630            self.canvas = canvas
631            self.scalebar = ScaleBar(canvas.map)
632    
633            if self.canvas is not None:
634                for msg, func in sub_list: self.canvas.Subscribe(msg, func)
635                self.__SetScale(self.canvas.scale)
636    
637        def _OnMsgScaleChanged(self, scale):
638            self.__SetScale(scale)
639    
640        def __SetScale(self, scale):
641            bmp = wxEmptyBitmap(self.width, self.height)
642            dc = wxMemoryDC()
643            dc.SelectObject(bmp)
644            dc.Clear()
645    
646            self.scalebar.DrawScaleBar(scale, dc, (0,0), dc.GetSizeTuple())
647    
648            self.scalebarBitmap.SetBitmap(bmp)
649    

Legend:
Removed from v.795  
changed lines
  Added in v.1119

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26