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

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

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

revision 6 by bh, Tue Aug 28 15:41:52 2001 UTC revision 61 by bh, Thu Sep 13 17:58:49 2001 UTC
# Line 15  from Thuban.Model.messages import MAPS_C Line 15  from Thuban.Model.messages import MAPS_C
15       LAYERS_CHANGED, LAYER_LEGEND_CHANGED, LAYER_VISIBILITY_CHANGED       LAYERS_CHANGED, LAYER_LEGEND_CHANGED, LAYER_VISIBILITY_CHANGED
16  from Thuban.Model.layer import Layer, shapetype_names  from Thuban.Model.layer import Layer, shapetype_names
17  from Thuban.Model.map import Map  from Thuban.Model.map import Map
 import view  
18    
19    from dialogs import NonModalDialog
20  from messages import SESSION_CHANGED, SELECTED_LAYER  from messages import SESSION_CHANGED, SELECTED_LAYER
21    
22  def color_string(color):  def color_string(color):
# Line 24  def color_string(color): Line 24  def color_string(color):
24          return "None"          return "None"
25      return "(%.3f, %.3f, %.3f)" % (color.red, color.green, color.blue)      return "(%.3f, %.3f, %.3f)" % (color.red, color.green, color.blue)
26    
 class myTreeCtrlPanel(wxPanel):  
27    
28      def __init__(self, parent, app):  class SessionTreeCtrl(wxTreeCtrl):
29    
30        def __init__(self, parent, ID, app):
31          # Use the WANTS_CHARS style so the panel doesn't eat the Return key.          # Use the WANTS_CHARS style so the panel doesn't eat the Return key.
32          wxPanel.__init__(self, parent, -1, style=wxWANTS_CHARS)          wxTreeCtrl.__init__(self, parent, ID)
33    
34          self.app = app          self.app = app
35            # boolean to indicate that we manipulate the selection ourselves
36            # so that we can ignore the selection events generated
37            self.changing_selection = 0
38    
39          EVT_SIZE(self, self.OnSize)          # Dictionary mapping layer id's to tree items
40          self.tree = wxTreeCtrl(self, -1)          self.layer_to_item = {}
41    
42          self.app.Subscribe(SESSION_CHANGED, self.session_changed)          self.app.Subscribe(SESSION_CHANGED, self.session_changed)
43          self.app.interactor.Subscribe(SELECTED_LAYER, self.layer_selected)          self.app.interactor.Subscribe(SELECTED_LAYER, self.layer_selected)
44          # pretend the session has changed to build the initial tree          # pretend the session has changed to build the initial tree
45          self.session_changed()          self.session_changed()
46    
47          EVT_TREE_SEL_CHANGED(self, self.tree.GetId(), self.OnSelChanged)          EVT_TREE_SEL_CHANGED(self, self.GetId(), self.OnSelChanged)
48    
49      def update_tree(self, *args):      def update_tree(self, *args):
50          """Clear and rebuild the tree"""          """Clear and rebuild the tree"""
51          self.tree.DeleteAllItems()          self.DeleteAllItems()
52          session = self.app.session          session = self.app.session
53          root = self.tree.AddRoot("Session: %s" % session.title)          root = self.AddRoot("Session: %s" % session.title)
54            self.layer_to_item.clear()
55          for map in session.Maps():          for map in session.Maps():
56              mapitem = self.tree.AppendItem(root, "Map: %s" % map.title)              mapitem = self.AppendItem(root, "Map: %s" % map.title)
57              self.tree.SetPyData(mapitem, map)              self.SetPyData(mapitem, map)
58              if map.projection and len(map.projection.params) > 0:              if map.projection and len(map.projection.params) > 0:
59                  projectionitem = self.tree.AppendItem(mapitem, "Projection")                  projectionitem = self.AppendItem(mapitem, "Projection")
60                  for param in map.projection.params:                  for param in map.projection.params:
61                      parameteritem = self.tree.AppendItem(projectionitem,                      parameteritem = self.AppendItem(projectionitem, str(param))
62                                                           str(param))                  self.Expand(projectionitem)
                 self.tree.Expand(projectionitem)  
63    
64              layers = map.Layers()              layers = map.Layers()
65              for layer_index in range(len(layers) - 1, -1, -1):              for layer_index in range(len(layers) - 1, -1, -1):
66                  layer = layers[layer_index]                  layer = layers[layer_index]
67                  idata = wxTreeItemData()                  idata = wxTreeItemData()
68                  idata.SetData(layer)                  idata.SetData(layer)
69                  layeritem = self.tree.AppendItem(mapitem,                  layeritem = self.AppendItem(mapitem,
70                                                   "Layer '%s'" % layer.Title(),                                              "Layer '%s'" % layer.Title(),
71                                                   data = idata)                                              data = idata)
72                    self.layer_to_item[id(layer)] = layeritem
73                  if layer is self.app.interactor.selected_layer:                  if layer is self.app.interactor.selected_layer:
74                      self.tree.SelectItem(layeritem)                      self.SelectItem(layeritem)
75                  if isinstance(layer, Layer):                  if isinstance(layer, Layer):
76                      if layer.Visible():                      if layer.Visible():
77                          text = "Shown"                          text = "Shown"
78                      else:                      else:
79                          text = "Hidden"                          text = "Hidden"
80                      self.tree.AppendItem(layeritem, text)                      self.AppendItem(layeritem, text)
81                      self.tree.AppendItem(layeritem,                      self.AppendItem(layeritem, "Shapes: %d" %layer.NumShapes())
82                                           "Shapes: %d" % layer.NumShapes())                      self.AppendItem(layeritem, ("Extents: (%g, %g, %g, %g)"
83                      self.tree.AppendItem(layeritem,                                                  % layer.LatLongBoundingBox()))
84                                           ("Extents: (%g, %g, %g, %g)"                      self.AppendItem(layeritem,
85                                            % layer.LatLongBoundingBox()))                                      "Shapetype: %s"
86                      self.tree.AppendItem(layeritem,                                      % shapetype_names[layer.ShapeType()])
87                                           "Shapetype: %s" %                      self.AppendItem(layeritem,
88                                           shapetype_names[layer.ShapeType()])                                      "Fill: " + color_string(layer.fill))
89                      self.tree.AppendItem(layeritem,                      self.AppendItem(layeritem,
90                                           "Fill: " + color_string(layer.fill))                                      "Outline: " + color_string(layer.stroke))
91                      self.tree.AppendItem(layeritem,                  self.Expand(layeritem)
92                                        "Outline: " + color_string(layer.stroke))              self.Expand(mapitem)
93                  self.tree.Expand(layeritem)          self.Expand(root)
             self.tree.Expand(mapitem)  
         self.tree.Expand(root)  
94    
95      def session_changed(self, *args):      def session_changed(self, *args):
96          for channel in (MAPS_CHANGED,          for channel in (MAPS_CHANGED,
# Line 97  class myTreeCtrlPanel(wxPanel): Line 101  class myTreeCtrlPanel(wxPanel):
101              self.app.session.Subscribe(channel, self.update_tree)              self.app.session.Subscribe(channel, self.update_tree)
102          self.update_tree()          self.update_tree()
103    
     def OnSize(self, event):  
         w,h = self.GetClientSizeTuple()  
         self.tree.SetDimensions(0, 0, w, h)  
   
104      def normalize_selection(self):      def normalize_selection(self):
105          """Select the layer or map containing currently selected item"""          """Select the layer or map containing currently selected item"""
106          tree = self.tree          item = self.GetSelection()
         item = self.tree.GetSelection()  
107          while item.IsOk():          while item.IsOk():
108              object = tree.GetPyData(item)              object = self.GetPyData(item)
109              if isinstance(object, Layer) or isinstance(object, Map):              if isinstance(object, Layer) or isinstance(object, Map):
110                  break                  break
111              item = tree.GetItemParent(item)              item = self.GetItemParent(item)
112    
113          self.tree.SelectItem(item)          self.changing_selection = 1
114            try:
115                self.SelectItem(item)
116            finally:
117                self.changing_selection = 0
118    
119      def SelectedLayer(self):      def SelectedLayer(self):
120          """Return the layer object currently selected in the tree.          """Return the layer object currently selected in the tree.
121          Return None if no layer is selected"""          Return None if no layer is selected"""
122          tree = self.tree          layer = self.GetPyData(self.GetSelection())
         layer = tree.GetPyData(tree.GetSelection())  
123          if isinstance(layer, Layer):          if isinstance(layer, Layer):
124              return layer              return layer
125          return None          return None
126    
127      def OnSelChanged(self, event):      def OnSelChanged(self, event):
128            if self.changing_selection:
129                # we're changing the selection ourselves (probably through
130                # self.normalize_selection(). ignore the event.
131                return
132          self.normalize_selection()          self.normalize_selection()
133          layer = self.SelectedLayer()          # SelectedLayer returns None if no layer is selected. Since
134          if layer is not None:          # passing None to interactor.SelectLayer deselects the layer we
135              self.app.interactor.SelectLayer(layer)          # can simply pass the result of SelectedLayer on in all cases
136            self.app.interactor.SelectLayer(self.SelectedLayer())
137    
138      def layer_selected(self, layer):      def layer_selected(self, layer):
139          pass          item = self.layer_to_item.get(id(layer))
140            if item is not None and item != self.GetSelection():
141                self.SelectItem(item)
142    
143    
144    class SessionTreeView(NonModalDialog):
145    
146        """Non modal dialog showing the session as a tree"""
147    
148        def __init__(self, parent, app, name):
149            NonModalDialog.__init__(self, parent, app.interactor, name, "Session")
150            self.tree = SessionTreeCtrl(self, -1, app)
151    
152        def OnClose(self, event):
153            #self.interactor.Unsubscribe(SELECTED_SHAPE, self.select_shape)
154            NonModalDialog.OnClose(self, event)
155    

Legend:
Removed from v.6  
changed lines
  Added in v.61

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26