/[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 1063 by frank, Tue May 27 14:08:28 2003 UTC revision 1102 by jonathan, Fri May 30 06:29:05 2003 UTC
# Line 203  class LegendTree(wxTreeCtrl): Line 203  class LegendTree(wxTreeCtrl):
203          self.parent = parent          self.parent = parent
204          self.layer2id = {}          self.layer2id = {}
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    
# Line 224  class LegendTree(wxTreeCtrl): Line 236  class LegendTree(wxTreeCtrl):
236      def SetMap(self, map):      def SetMap(self, map):
237    
238          sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),          sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
239                      (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),                      (MAP_LAYERS_ADDED, self._OnMsgMapLayersAdded),
240                      (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]                      (MAP_LAYERS_REMOVED, self._OnMsgMapLayersRemoved)]
241    
242          if self.map is not None:          if self.map is not None:
243              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 248  class LegendTree(wxTreeCtrl):
248                      #self._OnMsgMapsChanged)                      #self._OnMsgMapsChanged)
249              #except ConnectorError:              #except ConnectorError:
250                  #pass                  #pass
251              self.__DeleteAllItems()              self.DeleteAllItems()
252                    
253          self.map = map          self.map = map
254    
# Line 252  class LegendTree(wxTreeCtrl): Line 264  class LegendTree(wxTreeCtrl):
264          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
265    
266          if layer is not None:          if layer is not None:
267              self.map.TopLayer(layer)              self.map.MoveLayerToTop(layer)
268          else:          else:
269              assert False, "Shouldn't be allowed."              assert False, "Shouldn't be allowed."
270              pass              pass
# Line 279  class LegendTree(wxTreeCtrl): Line 291  class LegendTree(wxTreeCtrl):
291          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
292    
293          if layer is not None:          if layer is not None:
294              self.map.BottomLayer(layer)              self.map.MoveLayerToBottom(layer)
295          else:          else:
296              assert False, "Shouldn't be allowed."              assert False, "Shouldn't be allowed."
297              pass              pass
# Line 296  class LegendTree(wxTreeCtrl): Line 308  class LegendTree(wxTreeCtrl):
308              return wxTreeCtrl.OnCompareItems(self, item1, item2)              return wxTreeCtrl.OnCompareItems(self, item1, item2)
309    
310      def DoOnShowLayer(self):      def DoOnShowLayer(self):
         #self.__ShowHideLayer(True)  
311          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
312          layer.SetVisible(True)          layer.SetVisible(True)
313    
314      def DoOnHideLayer(self):      def DoOnHideLayer(self):
         #self.__ShowHideLayer(False)  
315          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
316          layer.SetVisible(False)          layer.SetVisible(False)
317    
# Line 341  class LegendTree(wxTreeCtrl): Line 351  class LegendTree(wxTreeCtrl):
351          id = self.layer2id[layer]          id = self.layer2id[layer]
352          assert id.IsOk()          assert id.IsOk()
353    
354          # 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)  
355          self.__UpdateSelection()          self.__UpdateSelection()
         #self.__FillTreeLayer(id)  
356    
357      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
358          self.Sort()          self.Sort()
# Line 357  class LegendTree(wxTreeCtrl): Line 362  class LegendTree(wxTreeCtrl):
362              self.EnsureVisible(id)              self.EnsureVisible(id)
363          self.__UpdateSelection()          self.__UpdateSelection()
364    
365      def _OnMsgMapLayersAddedRemoved(self, map):      def _OnMsgMapLayersAdded(self, map):
366          assert map is self.map          assert map is self.map
367    
368          self.__FillTree(self.map)          root = self.GetRootItem()
369    
370            i = 0
371            for l in map.Layers():
372                if not self.layer2id.has_key(l):
373                    self.__AddLayer(i, l)
374    
375            self.__UpdateSelection()
376    
377        def _OnMsgMapLayersRemoved(self, map):
378            assert map is self.map
379    
380            layer, group = self.GetSelectedHierarchy()
381    
382            if layer is None:
383                assert False, "Shouldn't be allowed."
384                return
385    
386            layers = map.Layers()
387    
388            for layer, id in self.layer2id.items():
389                if layer not in layers:
390                    if id.IsOk():
391                        self.__RemoveLayer(id)
392    
393          self.__UpdateSelection()          self.__UpdateSelection()
394    
395      def _OnMsgLayerVisibilityChanged(self, layer):      def _OnMsgLayerVisibilityChanged(self, layer):
# Line 384  class LegendTree(wxTreeCtrl): Line 413  class LegendTree(wxTreeCtrl):
413    
414          self.Freeze()          self.Freeze()
415    
416          self.__DeleteAllItems()          self.DeleteAllItems()
417    
418          if map.HasLayers():          if map.HasLayers():
419                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_layer",  
                                               wxBITMAP_TYPE_XPM)  
             self.mapImageIndex = \  
                 self.image_list.Add(bmp)  
   
             self.AssignImageList(self.image_list)  
   
             root = self.AddRoot("")  
   
420              for l in map.Layers():              for l in map.Layers():
421                  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)  
422    
423          self.Thaw()          self.Thaw()
424    
# Line 454  class LegendTree(wxTreeCtrl): Line 448  class LegendTree(wxTreeCtrl):
448                          self.SetItemImage(id, -1)                          self.SetItemImage(id, -1)
449                          self.SetItemSelectedImage(id, -1)                          self.SetItemSelectedImage(id, -1)
450                      else:                      else:
451                          i = self.image_list.Add(bmp)                          if self.availImgListIndices:
452                                i = self.availImgListIndices.pop(0)
453                                self.image_list.Replace(i, bmp)
454                            else:
455                                i = self.image_list.Add(bmp)
456    
457                          self.SetItemImage(id, i)                          self.SetItemImage(id, i)
458                          self.SetItemSelectedImage(id, i)                          self.SetItemSelectedImage(id, i)
459    
# Line 472  class LegendTree(wxTreeCtrl): Line 471  class LegendTree(wxTreeCtrl):
471    
472          return bmp          return bmp
473    
474      def __DeleteAllItems(self):      def DeleteAllItems(self):
475    
476          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)  
477    
478          self.DeleteAllItems()          id, cookie = self.GetFirstChild(pid, 123)
479            while id.IsOk():
480                self.__RemoveLayer(id)
481                id, cookie = self.GetNextChild(pid, cookie)
482    
483            wxTreeCtrl.DeleteAllItems(self)
484    
485        def __AddLayer(self, before, l):
486            root = self.GetRootItem()
487            id = self.InsertItemBefore(root, before,
488                                l.Title(),
489                                self.mapImageIndex,
490                                self.mapImageIndex)
491    
492            self.SetPyData(id, l)
493            self.__SetVisibilityStyle(l.Visible(), id)
494    
495            self.layer2id[l] = id
496    
497            self.__FillTreeLayer(id)
498            self.Expand(id)
499    
500            l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
501            l.Subscribe(LAYER_VISIBILITY_CHANGED,
502                        self._OnMsgLayerVisibilityChanged)
503            l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
504    
505        def __RemoveLayer(self, id):
506            self.DeleteChildren(id)
507    
508            layer = self.GetPyData(id)
509            layer.Unsubscribe(LAYER_CHANGED,
510                              self._OnMsgLayerChanged)
511            layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
512                              self._OnMsgLayerVisibilityChanged)
513            layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
514    
515            self.Delete(id)
516            del self.layer2id[layer]
517    
518        def DeleteChildren(self, pid):
519            id, cookie = self.GetFirstChild(pid, 123)
520            while id.IsOk():
521                self.availImgListIndices.append(self.GetItemImage(id))
522                id, cookie = self.GetNextChild(pid, cookie)
523            wxTreeCtrl.DeleteChildren(self, pid)
524    
525        def GetRootItem(self):
526            root = wxTreeCtrl.GetRootItem(self)
527    
528            if not root.IsOk():
529                self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
530                                                                                    
531                bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
532                dc = wxMemoryDC()
533                dc.SelectObject(bmp)
534                dc.SetBrush(wxBLACK_BRUSH)
535                dc.Clear()
536                dc.SelectObject(wxNullBitmap)
537                                                                                    
538                self.emptyImageIndex = \
539                    self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
540                                                                                    
541                bmp = resource.GetBitmapResource("legend_icon_layer",
542                                                  wxBITMAP_TYPE_XPM)
543                self.mapImageIndex = \
544                    self.image_list.Add(bmp)
545    
546                self.AssignImageList(self.image_list)
547    
548                root = self.AddRoot("")
549    
550            return root
551    
552      def __SetVisibilityStyle(self, visible, id):      def __SetVisibilityStyle(self, visible, id):
553          font = self.GetItemFont(id)          font = self.GetItemFont(id)

Legend:
Removed from v.1063  
changed lines
  Added in v.1102

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26