/[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 542 by jonathan, Thu Mar 20 09:43:16 2003 UTC revision 1050 by frank, Tue May 27 09:31:13 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 9  __version__ = "$Revision$" Line 10  __version__ = "$Revision$"
10    
11  from Thuban import _  from Thuban import _
12    
13    import resource
14    
15  from wxPython.wx import *  from wxPython.wx import *
 from dialogs import NonModalDialog  
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
19    from Thuban.Model.classification import ClassGroup
20    
21  from Thuban.Model.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.Model.classification import ClassGroup  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
29    from Thuban.UI.scalebar import ScaleBar
30    
31  ID_LEGEND_MOVEUP = 4001  from Thuban.Lib.connector import ConnectorError
 ID_LEGEND_MOVEDOWN = 4002  
 ID_LEGEND_TREE = 4003  
 ID_LEGEND_CLASSIFY = 4004  
 ID_LEGEND_SHOWLAYER = 4005  
 ID_LEGEND_HIDELAYER = 4006  
32    
33  BMP_SIZE_W = 30  ID_LEGEND_TOP = 4001
34    ID_LEGEND_RAISE = 4002
35    ID_LEGEND_LOWER = 4003
36    ID_LEGEND_BOTTOM = 4004
37    ID_LEGEND_TREE = 4005
38    ID_LEGEND_PROPS = 4006
39    ID_LEGEND_SHOWLAYER = 4007
40    ID_LEGEND_HIDELAYER = 4008
41    
42    BMP_SIZE_W = 15
43  BMP_SIZE_H = 15  BMP_SIZE_H = 15
44    
45  class Legend(NonModalDialog):  TOP_BMP = "top_layer"
46    RAISE_BMP = "raise_layer"
47    LOWER_BMP = "lower_layer"
48    BOTTOM_BMP = "bottom_layer"
49    SHOW_BMP  = "show_layer"
50    HIDE_BMP  = "hide_layer"
51    PROPS_BMP = "layer_properties"
52    
     def __init__(self, parent, name, map):  
         NonModalDialog.__init__(self, parent, name,  
                                 _("Legend: %s") % map.Title())  
53    
54          self.parent = parent  class LegendPanel(DockPanel):
55    
56        def __init__(self, parent, map, mainWindow):
57            DockPanel.__init__(self, parent, -1)
58    
59          panel = wxPanel(self, -1)          self.mainWindow = mainWindow
60            self.parent = parent
61    
62            self.buttons = []
63    
         topBox = wxBoxSizer(wxVERTICAL)  
64          panelBox = wxBoxSizer(wxVERTICAL)          panelBox = wxBoxSizer(wxVERTICAL)
65    
66          buttonBox = wxGridSizer(2, 3, 0, 0)          self.toolBar = wxToolBar(self, -1)
67            self.toolBar.SetToolBitmapSize(wxSize(24, 24))
68    
69          self.buttons = []          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)
74            self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
75                shortHelpString=_("Raise Layer"))
76    
77            bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)
78            self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
79                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)
86            self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
87                shortHelpString=_("Show Layer"))
88    
89            bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)
90            self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
91                shortHelpString=_("Hide Layer"))
92    
93            bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)
94            self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
95                shortHelpString=_("Edit Layer Properties"))
96    
97            self.toolBar.Realize()
98            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)
102            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)
105            EVT_TOOL(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)
106            EVT_TOOL(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)
107    
108          button = wxButton(self, ID_LEGEND_MOVEUP, _("Move Up"))          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
109    
110          button = wxButton(self, ID_LEGEND_SHOWLAYER, _("Show Layer"))          panelBox.Add(self.tree, 1, wxGROW, 0)
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
111    
112          button = wxButton(self, ID_LEGEND_CLASSIFY, _("Classify"))          self.scalebarbitmap = ScaleBarBitmap(self, map, mainWindow)
113          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)          panelBox.Add(self.scalebarbitmap, 0, wxGROW, 0)
         self.buttons.append(button)  
114    
115          button = wxButton(self, ID_LEGEND_MOVEDOWN, _("Move Down"))          self.SetAutoLayout(True)
116          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)          self.SetSizer(panelBox)
117          self.buttons.append(button)          panelBox.SetSizeHints(self)
118    
         button = wxButton(self, ID_LEGEND_HIDELAYER, _("Hide Layer"))  
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
119    
120            self.panelBox = panelBox
121    
122          EVT_BUTTON(self, ID_LEGEND_MOVEUP, self._OnMoveUp)          self.__EnableButtons(False)
         EVT_BUTTON(self, ID_LEGEND_MOVEDOWN, self._OnMoveDown)  
         EVT_BUTTON(self, ID_LEGEND_CLASSIFY, self._OnClassify)  
         EVT_BUTTON(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)  
         EVT_BUTTON(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)  
123    
124          panelBox.Add(buttonBox, 0, 0, 4)          self.Create()
125    
126          self.tree = LegendTree(self, ID_LEGEND_TREE, map)          EVT_CLOSE(self, self._OnClose)
127    
         panelBox.Add(self.tree, 1, wxGROW, 4)  
128    
129          panel.SetAutoLayout(True)      def GetMap(self):
130          panel.SetSizer(panelBox)          return self.tree.GetMap()
         panelBox.SetSizeHints(panel)  
131    
132          topBox.Add(panel, 1, wxGROW, 0)      def SetMap(self, map):
133          panelBox.SetSizeHints(self)          self.tree.SetMap(map)
134            self.scalebarbitmap.SetCanvas(self.mainWindow.canvas)
135    
136          self.SetAutoLayout(True)      def DoOnSelChanged(self, layer, group):
137          self.SetSizer(topBox)  
138            ok = isinstance(layer, BaseLayer)
139            self.__EnableButtons(ok)
140    
141            self.mainWindow.SelectLayer(layer)
142    
143        def DoOnProperties(self):
144            list = self.tree.GetSelectedHierarchy()
145    
146            ok = isinstance(list[0], BaseLayer)
147            if ok:
148                self.mainWindow.OpenLayerProperties(list[0], list[1])
149    
150      def DoOnSelChanged(self):      def Destroy(self):
151          self.__EnableButtons(self.tree.GetSelection().IsOk())          self.__Close()
152    
153      def _OnClassify(self, event):      def _OnProperties(self, event):
154          self.tree.DoOnClassify()          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
171    
172        #def Close(self, force = False):
173            #DockPanel.Close(self, force)
174            
175        def _OnClose(self, event):
176            self.__Close()
177    
178      def _OnHideLayer(self, event):      def _OnHideLayer(self, event):
179          self.tree.DoOnHideLayer()          self.tree.DoOnHideLayer()
180          pass          pass
181    
   
182      def __EnableButtons(self, on):      def __EnableButtons(self, on):
183          for b in self.buttons:          self.toolBar.EnableTool(ID_LEGEND_TOP, on)
184              b.Enable(on)          self.toolBar.EnableTool(ID_LEGEND_RAISE, on)
185            self.toolBar.EnableTool(ID_LEGEND_LOWER, on)
186            self.toolBar.EnableTool(ID_LEGEND_BOTTOM, on)
187            self.toolBar.EnableTool(ID_LEGEND_SHOWLAYER,  on)
188            self.toolBar.EnableTool(ID_LEGEND_HIDELAYER,  on)
189            self.toolBar.EnableTool(ID_LEGEND_PROPS, on)
190    
191        def __Close(self):
192            self.tree.Close()
193    
194  class LegendTree(wxTreeCtrl):  class LegendTree(wxTreeCtrl):
195    
196      def __init__(self, parent, id, map):      def __init__(self, parent, id, map, mainWindow):
197          wxTreeCtrl.__init__(self, parent, id,          wxTreeCtrl.__init__(self, parent, id,
198                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
199                              size = (200, 200))                              size = (200, 200))
200    
201            self.mainWindow = mainWindow
202            self.map = None
203          self.parent = parent          self.parent = parent
204          self.map = map          self.layer2id = {}
         self.layer2id = None  
   
205    
206          self.image_list = None          self.image_list = None
207          self.emptyImageIndex = 0          self.emptyImageIndex = 0
208    
209          self.previewer = ClassDataPreviewer()          self.previewer = ClassDataPreviewer()
210    
   
211          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
212          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
213    
214          map.Subscribe(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged)          EVT_CLOSE(self, self._OnClose)
         map.Subscribe(MAP_LAYERS_CHANGED, self._OnMsgMapLayersChanged)  
215    
216          self.__FillTree(map)          self.SetMap(map)
217    
218      def MoveCurrentItemUp(self):      def _OnClose(self, event):
219          cur_id = self.GetSelection()          self.SetMap(None)
         assert(cur_id.IsOk())  
220    
221          cur_data = self.GetPyData(cur_id)      def GetMap(self):
222            return self.map
223    
224        def SetMap(self, map):
225    
226            sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
227                        (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),
228                        (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]
229    
230            if self.map is not None:
231                for msg, func in sub_list: self.map.Unsubscribe(msg, func)
232                #self.mainWindow.application.Unsubscribe(SESSION_REPLACED,
233                    #self._OnMsgMapsChanged)
234                #try:
235                    #self.mainWindow.application.session.Unsubscribe(MAPS_CHANGED,
236                        #self._OnMsgMapsChanged)
237                #except ConnectorError:
238                    #pass
239                self.__DeleteAllItems()
240            
241            self.map = map
242    
243          #prev_id = self.GetPrevSibling(cur_id)          if self.map is not None:
244                for msg, func in sub_list: self.map.Subscribe(msg, func)
245                #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
246                    #self._OnMsgMapsChanged)
247                #self.mainWindow.application.Subscribe(SESSION_REPLACED,
248                    #self._OnMsgMapsChanged)
249                self.__FillTree(self.map)
250    
251          #      def MoveCurrentItemTop(self):
252          # Get out if there's nowhere to go          layer, group = self.GetSelectedHierarchy()
         #  
         #if prev_id == INVALID_TREE_ID: return  
253    
254          if isinstance(cur_data, Layer):          if layer is not None:
255              self.map.RaiseLayer(cur_data)              self.map.TopLayer(layer)
256          elif isinstance(cur_data, ClassGroup):          else:
257                assert False, "Shouldn't be allowed."
258              pass              pass
259    
260        def MoveCurrentItemUp(self):
261            layer, group = self.GetSelectedHierarchy()
262    
263            if layer is not None:
264                self.map.RaiseLayer(layer)
265          else:          else:
266              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be allowed."
267              pass              pass
268    
269      def MoveCurrentItemDown(self):      def MoveCurrentItemDown(self):
270          cur_id = self.GetSelection()          layer, group = self.GetSelectedHierarchy()
         assert(cur_id.IsOk())  
   
         cur_data = self.GetPyData(cur_id)  
271    
272          if isinstance(cur_data, Layer):          if layer is not None:
273              self.map.LowerLayer(cur_data)              self.map.LowerLayer(layer)
         elif isinstance(cur_data, ClassGroup):  
             pass  
274          else:          else:
275              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be allowed."
276              pass              pass
277    
278        def MoveCurrentItemBottom(self):
279            layer, group = self.GetSelectedHierarchy()
280    
281            if layer is not None:
282                self.map.BottomLayer(layer)
283            else:
284                assert False, "Shouldn't be allowed."
285                pass
286    
287      def OnCompareItems(self, item1, item2):      def OnCompareItems(self, item1, item2):
288    
289          data1 = self.GetPyData(item1)          data1 = self.GetPyData(item1)
290          data2 = self.GetPyData(item2)          data2 = self.GetPyData(item2)
291    
292          if isinstance(data1, Layer):          if isinstance(data1, BaseLayer):
293              layers = self.map.Layers()              layers = self.map.Layers()
294              return layers.index(data2) - layers.index(data1)              return layers.index(data2) - layers.index(data1)
295          else:          else:
296              return wxTreeCtrl.OnCompareItems(self, item1, item2)              return wxTreeCtrl.OnCompareItems(self, item1, item2)
297    
   
298      def DoOnShowLayer(self):      def DoOnShowLayer(self):
299          self.__ShowHideLayer(True)          #self.__ShowHideLayer(True)
300            layer, group = self.GetSelectedHierarchy()
301            layer.SetVisible(True)
302    
303      def DoOnHideLayer(self):      def DoOnHideLayer(self):
304          self.__ShowHideLayer(False)          #self.__ShowHideLayer(False)
305            layer, group = self.GetSelectedHierarchy()
306            layer.SetVisible(False)
307    
308      def DoOnClassify(self):      def Sort(self):
309          id = self.GetSelection()          self.SortChildren(self.GetRootItem())
         assert(id.IsOk())  
310    
311          item = self.GetPyData(id)      def GetSelectedHierarchy(self):
312          if isinstance(item, ClassGroup):          id = self.GetSelection()
             id = self.GetItemParent(id)  
             assert(id.IsOk())  
             item = self.GetPyData(id)  
313    
314          self.parent.parent.OpenClassifier(item)          if not id.IsOk():
315                return (None, None)
316    
317      def Sort(self):          layer = self.GetPyData(id)
318          self.SortChildren(self.GetRootItem())          group = None
319    
320            if isinstance(layer, ClassGroup):
321                id = self.GetItemParent(id)
322                assert id.IsOk()
323                group = layer
324                layer = self.GetPyData(id)
325    
326            return (layer, group)
327    
328        def _OnMsgMapsChanged(self):
329            #print self.map is self.mainWindow.Map()
330            self.SetMap(self.mainWindow.Map())
331            
332      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
333          self.parent.DoOnSelChanged()          self.__UpdateSelection()
334    
335      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
336          self.DoOnClassify()          self.parent.DoOnProperties()
337    
338      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
339          assert(isinstance(layer, Layer))          assert isinstance(layer, BaseLayer)
340    
341          id = self.layer2id[layer]          id = self.layer2id[layer]
342            assert id.IsOk()
343    
344          self.__FillTreeLayer(id)          # XXX: yikes! this is so bad, we should be doing what is
345            #      commented out, but there is a problem with keeping
346            #      track of the images in the image list when we replace
347            #      a layer. it ends up causing a seg fault.
348            self.__FillTree(self.map)
349            self.__UpdateSelection()
350            #self.__FillTreeLayer(id)
351    
352      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
353          self.Sort()          self.Sort()
354            id = self.GetSelection()
355    
356            if id.IsOk():
357                self.EnsureVisible(id)
358            self.__UpdateSelection()
359    
360      def _OnMsgMapLayersChanged(self, map):      def _OnMsgMapLayersAddedRemoved(self, map):
361          assert(id(map) == id(self.map))          assert map is self.map
362    
363          self.__FillTree(self.map)          self.__FillTree(self.map)
364            self.__UpdateSelection()
365    
366      def __FillTree(self, map):      def _OnMsgLayerVisibilityChanged(self, layer):
367            assert isinstance(layer, BaseLayer)
368    
369            self.__ShowHideLayer(layer)
370            self.__UpdateSelection()
371    
372        def _OnMsgLayerTitleChanged(self, layer):
373    
374          assert(isinstance(map, Map))          id = self.layer2id[layer]
375            if id.IsOk():
376                self.SetItemText(id, layer.Title())
377            self.__UpdateSelection()
378    
379        def __UpdateSelection(self):
380            layer, group = self.GetSelectedHierarchy()
381            self.parent.DoOnSelChanged(layer, group)
382            
383        def __FillTree(self, map):
384    
385          self.Freeze()          self.Freeze()
386    
# Line 256  class LegendTree(wxTreeCtrl): Line 400  class LegendTree(wxTreeCtrl):
400              self.emptyImageIndex = \              self.emptyImageIndex = \
401                  self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))                  self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
402                                                                                                                                                                    
403                bmp = resource.GetBitmapResource("legend_icon_map",
404                                                  wxBITMAP_TYPE_XPM)
405                self.mapImageIndex = \
406                    self.image_list.Add(bmp)
407    
408              self.AssignImageList(self.image_list)              self.AssignImageList(self.image_list)
409    
410              root = self.AddRoot("")              root = self.AddRoot("")
411    
412              for l in map.Layers():              for l in map.Layers():
413                  id = self.PrependItem(root, l.Title())                  id = self.PrependItem(root, l.Title())
414                    self.SetItemImage(id, self.mapImageIndex)
415                    self.SetItemSelectedImage(id, self.mapImageIndex)
416    
417                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
418                    l.Subscribe(LAYER_VISIBILITY_CHANGED,
419                                self._OnMsgLayerVisibilityChanged)
420                    l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
421                  self.SetPyData(id, l)                  self.SetPyData(id, l)
422                  font = self.GetItemFont(id)                  self.__SetVisibilityStyle(l.Visible(), id)
                 if not l.Visible():  
                     font.SetStyle(wxITALIC)  
                     self.SetItemFont(id, font)  
423    
424                  self.layer2id[l] = id                  self.layer2id[l] = id
425    
# Line 283  class LegendTree(wxTreeCtrl): Line 435  class LegendTree(wxTreeCtrl):
435    
436          self.DeleteChildren(pid)          self.DeleteChildren(pid)
437    
438          clazz = layer.GetClassification()          if layer.HasClassification():
   
         shapeType = layer.ShapeType()  
   
         for g in clazz:  
             id = self.AppendItem(pid, g.GetDisplayText())  
             self.SetPyData(id, g)  
439    
440              bmp = self.__BuildGroupImage(g, shapeType)              clazz = layer.GetClassification()
441    
442              if bmp is None:              shapeType = layer.ShapeType()
                 self.SetItemImage(id, self.emptyImageIndex)  
             else:  
                 i = self.image_list.Add(bmp)  
                 self.SetItemImage(id, i)  
443    
444              #self.layer2id[g] = id              show = layer.Visible()
445                for g in clazz:
446                    if g.IsVisible():
447                        id = self.AppendItem(pid, g.GetDisplayText())
448                        self.SetPyData(id, g)
449                        self.__SetVisibilityStyle(show, id)
450    
451                        bmp = self.__BuildGroupImage(g, shapeType)
452    
453                        if bmp is None:
454                            self.SetItemImage(id, -1)
455                            self.SetItemSelectedImage(id, -1)
456                        else:
457                            i = self.image_list.Add(bmp)
458                            self.SetItemImage(id, i)
459                            self.SetItemSelectedImage(id, i)
460    
461          self.Thaw()          self.Thaw()
462    
463      def __BuildGroupImage(self, group, shapeType):      def __BuildGroupImage(self, group, shapeType):
         assert(isinstance(group, ClassGroup))  
464    
465          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
466          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
# Line 317  class LegendTree(wxTreeCtrl): Line 473  class LegendTree(wxTreeCtrl):
473          return bmp          return bmp
474    
475      def __DeleteAllItems(self):      def __DeleteAllItems(self):
476    
477            while len(self.layer2id) > 0:
478                layer, id = self.layer2id.popitem()
479                layer.Unsubscribe(LAYER_CHANGED,
480                                  self._OnMsgLayerChanged)
481                layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
482                                  self._OnMsgLayerVisibilityChanged)
483                layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
484    
485          self.DeleteAllItems()          self.DeleteAllItems()
         self.layer2id = {}  
486    
487        def __SetVisibilityStyle(self, visible, id):
488            font = self.GetItemFont(id)
489    
490      def __ShowHideLayer(self, show):          if visible:
491          id = self.GetSelection()              font.SetStyle(wxNORMAL)
492          assert(id.IsOk())              color = wxBLACK
493            else:
494                #font.SetStyle(wxITALIC)
495                font.SetStyle(wxNORMAL)
496                color = wxLIGHT_GREY
497    
498            self.SetItemTextColour(id, color)
499            self.SetItemFont(id, font)
500                    
501          item = self.GetPyData(id)      def __ShowHideLayer(self, layer):
502          if isinstance(item, ClassGroup):          parent = self.layer2id[layer]
503              id = self.GetItemParent(id)          assert parent.IsOk()
504              assert(id.IsOk())  
505              item = self.GetPyData(id)          visible = layer.Visible()
506    
507            self.__SetVisibilityStyle(visible, parent)
508    
509            id, cookie = self.GetFirstChild(parent, 123)
510    
511            while id.IsOk():
512                self.__SetVisibilityStyle(visible, id)
513                id, cookie = self.GetNextChild(parent, cookie)
514                
515    class ScaleBarBitmap(wxBoxSizer):
516    
517          if show != item.Visible():      def __init__(self, parent, map, mainWindow):
518            # While the width is fixed, get the height _now_.
519            dc = wxMemoryDC()
520            textwidth, textheight = dc.GetTextExtent("%d"%0)
521            self.width = 210
522            self.height = textheight + 3*2 + 8
523    
524            wxBoxSizer.__init__(self, wxVERTICAL)
525            bmp=wxEmptyBitmap(self.width, self.height)
526            self.scalebarBitmap = wxStaticBitmap(parent, -1, bmp)
527            self.Add(self.scalebarBitmap, 0, wxALIGN_CENTER|wxLEFT|wxTOP|wxRIGHT, 1)
528    
529            self.mainWindow = mainWindow
530            self.parent = parent
531            self.canvas = None
532            self.SetCanvas(self.mainWindow.canvas)
533    
534        def SetCanvas(self, canvas):
535            sub_list = [(SCALE_CHANGED, self._OnMsgScaleChanged)]
536    
537            if self.canvas is not None:
538                for msg, func in sub_list: self.canvas.Unsubscribe(msg, func)
539            
540            self.canvas = canvas
541            self.scalebar = ScaleBar(canvas.map)
542    
543            if self.canvas is not None:
544                for msg, func in sub_list: self.canvas.Subscribe(msg, func)
545                self.__SetScale(self.canvas.scale)
546    
547              item.SetVisible(show)      def _OnMsgScaleChanged(self, scale):
548            self.__SetScale(scale)
549    
550              font = self.GetItemFont(id)      def __SetScale(self, scale):
551              if show:          bmp = wxEmptyBitmap(self.width, self.height)
552                  font.SetStyle(wxNORMAL)          dc = wxMemoryDC()
553                  self.SetItemFont(id, font)          dc.SelectObject(bmp)
554              else:          dc.Clear()
                 font.SetStyle(wxITALIC)  
                 self.SetItemFont(id, font)  
555    
556            self.scalebar.DrawScaleBar(scale, dc, (0,0), dc.GetSizeTuple())
557    
558            self.scalebarBitmap.SetBitmap(bmp)
559    

Legend:
Removed from v.542  
changed lines
  Added in v.1050

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26