/[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 1050 by frank, Tue May 27 09:31:13 2003 UTC revision 1115 by bh, Fri May 30 16:30:26 2003 UTC
# Line 202  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 224  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 236  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 252  class LegendTree(wxTreeCtrl): Line 265  class LegendTree(wxTreeCtrl):
265          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
266    
267          if layer is not None:          if layer is not None:
268              self.map.TopLayer(layer)              self.map.MoveLayerToTop(layer)
269          else:          else:
270              assert False, "Shouldn't be allowed."              assert False, "Shouldn't be allowed."
271              pass              pass
# Line 279  class LegendTree(wxTreeCtrl): Line 292  class LegendTree(wxTreeCtrl):
292          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
293    
294          if layer is not None:          if layer is not None:
295              self.map.BottomLayer(layer)              self.map.MoveLayerToBottom(layer)
296          else:          else:
297              assert False, "Shouldn't be allowed."              assert False, "Shouldn't be allowed."
298              pass              pass
# Line 296  class LegendTree(wxTreeCtrl): Line 309  class LegendTree(wxTreeCtrl):
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 330  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    
# Line 341  class LegendTree(wxTreeCtrl): Line 381  class LegendTree(wxTreeCtrl):
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 357  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
397    
398            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          assert map is self.map
409    
410          self.__FillTree(self.map)          layer, group = self.GetSelectedHierarchy()
411    
412            if layer is None:
413                assert False, "Shouldn't be allowed."
414                return
415    
416            layers = map.Layers()
417    
418            for layer, id in self.layer2id.items():
419                if layer not in layers:
420                    if id.IsOk():
421                        self.__RemoveLayer(id)
422    
423          self.__UpdateSelection()          self.__UpdateSelection()
424    
425      def _OnMsgLayerVisibilityChanged(self, layer):      def _OnMsgLayerVisibilityChanged(self, layer):
# Line 384  class LegendTree(wxTreeCtrl): Line 443  class LegendTree(wxTreeCtrl):
443    
444          self.Freeze()          self.Freeze()
445    
446          self.__DeleteAllItems()          self.DeleteAllItems()
447    
448          if map.HasLayers():          if map.HasLayers():
449                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))  
                                                                                   
             bmp = resource.GetBitmapResource("legend_icon_map",  
                                               wxBITMAP_TYPE_XPM)  
             self.mapImageIndex = \  
                 self.image_list.Add(bmp)  
   
             self.AssignImageList(self.image_list)  
   
             root = self.AddRoot("")  
   
450              for l in map.Layers():              for l in map.Layers():
451                  id = self.PrependItem(root, l.Title())                  self.__AddLayer(0, l)
                 self.SetItemImage(id, self.mapImageIndex)  
                 self.SetItemSelectedImage(id, self.mapImageIndex)  
   
                 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)  
452    
453          self.Thaw()          self.Thaw()
454    
# Line 454  class LegendTree(wxTreeCtrl): Line 478  class LegendTree(wxTreeCtrl):
478                          self.SetItemImage(id, -1)                          self.SetItemImage(id, -1)
479                          self.SetItemSelectedImage(id, -1)                          self.SetItemSelectedImage(id, -1)
480                      else:                      else:
481                          i = self.image_list.Add(bmp)                          if self.availImgListIndices:
482                                i = self.availImgListIndices.pop(0)
483                                self.image_list.Replace(i, bmp)
484                            else:
485                                i = self.image_list.Add(bmp)
486    
487                          self.SetItemImage(id, i)                          self.SetItemImage(id, i)
488                          self.SetItemSelectedImage(id, i)                          self.SetItemSelectedImage(id, i)
489    
# Line 472  class LegendTree(wxTreeCtrl): Line 501  class LegendTree(wxTreeCtrl):
501    
502          return bmp          return bmp
503    
504      def __DeleteAllItems(self):      def DeleteAllItems(self):
505    
506          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)  
507    
508          self.DeleteAllItems()          id, cookie = self.GetFirstChild(pid, 123)
509            while id.IsOk():
510                self.__RemoveLayer(id)
511                id, cookie = self.GetNextChild(pid, cookie)
512    
513            wxTreeCtrl.DeleteAllItems(self)
514    
515        def __AddLayer(self, before, l):
516            root = self.GetRootItem()
517            id = self.InsertItemBefore(root, before,
518                                l.Title(),
519                                self.mapImageIndex,
520                                self.mapImageIndex)
521    
522            self.SetPyData(id, l)
523            self.__SetVisibilityStyle(l.Visible(), id)
524    
525            self.layer2id[l] = id
526    
527            self.__FillTreeLayer(id)
528            self.Expand(id)
529    
530            l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
531            l.Subscribe(LAYER_VISIBILITY_CHANGED,
532                        self._OnMsgLayerVisibilityChanged)
533            l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
534    
535        def __RemoveLayer(self, id):
536            self.DeleteChildren(id)
537    
538            layer = self.GetPyData(id)
539            layer.Unsubscribe(LAYER_CHANGED,
540                              self._OnMsgLayerChanged)
541            layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
542                              self._OnMsgLayerVisibilityChanged)
543            layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
544    
545            self.Delete(id)
546            del self.layer2id[layer]
547    
548        def DeleteChildren(self, pid):
549            id, cookie = self.GetFirstChild(pid, 123)
550            while id.IsOk():
551                self.availImgListIndices.append(self.GetItemImage(id))
552                id, cookie = self.GetNextChild(pid, cookie)
553            wxTreeCtrl.DeleteChildren(self, pid)
554    
555        def GetRootItem(self):
556            root = wxTreeCtrl.GetRootItem(self)
557    
558            if not root.IsOk():
559                self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
560    
561                bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
562                dc = wxMemoryDC()
563                dc.SelectObject(bmp)
564                dc.SetBrush(wxBLACK_BRUSH)
565                dc.Clear()
566                dc.SelectObject(wxNullBitmap)
567    
568                self.emptyImageIndex = \
569                    self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
570    
571                bmp = resource.GetBitmapResource("legend_icon_layer",
572                                                  wxBITMAP_TYPE_XPM)
573                self.mapImageIndex = \
574                    self.image_list.Add(bmp)
575    
576                self.AssignImageList(self.image_list)
577                self.availImgListIndices = []
578    
579                root = self.AddRoot("")
580    
581            return root
582    
583      def __SetVisibilityStyle(self, visible, id):      def __SetVisibilityStyle(self, visible, id):
584          font = self.GetItemFont(id)          font = self.GetItemFont(id)

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26