/[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 111 by jan, Sun Apr 21 17:29:50 2002 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            if session.filename == None:
56                self.AppendItem(root, "Filename:")
57            else:
58                self.AppendItem(root, "Filename: %s" % session.filename)
59            if session.WasModified():
60                self.AppendItem(root, "Modified: yes")
61            else:
62                self.AppendItem(root, "Modified: no")
63    
64          for map in session.Maps():          for map in session.Maps():
65              mapitem = self.tree.AppendItem(root, "Map: %s" % map.title)              mapitem = self.AppendItem(root, "Map: %s" % map.title)
66              self.tree.SetPyData(mapitem, map)              self.SetPyData(mapitem, map)
67                self.AppendItem(mapitem, ("Extent (lat-lon): (%g, %g, %g, %g)"
68                                          % map.BoundingBox()))
69              if map.projection and len(map.projection.params) > 0:              if map.projection and len(map.projection.params) > 0:
70                  projectionitem = self.tree.AppendItem(mapitem, "Projection")                  self.AppendItem(mapitem,
71                                    ("Extent (projected): (%g, %g, %g, %g)"
72                                     % map.ProjectedBoundingBox()))
73                    projectionitem = self.AppendItem(mapitem, "Projection")
74                  for param in map.projection.params:                  for param in map.projection.params:
75                      parameteritem = self.tree.AppendItem(projectionitem,                      parameteritem = self.AppendItem(projectionitem, str(param))
76                                                           str(param))                  self.Expand(projectionitem)
                 self.tree.Expand(projectionitem)  
77    
78              layers = map.Layers()              layers = map.Layers()
79              for layer_index in range(len(layers) - 1, -1, -1):              for layer_index in range(len(layers) - 1, -1, -1):
80                  layer = layers[layer_index]                  layer = layers[layer_index]
81                  idata = wxTreeItemData()                  idata = wxTreeItemData()
82                  idata.SetData(layer)                  idata.SetData(layer)
83                  layeritem = self.tree.AppendItem(mapitem,                  layeritem = self.AppendItem(mapitem,
84                                                   "Layer '%s'" % layer.Title(),                                              "Layer '%s'" % layer.Title(),
85                                                   data = idata)                                              data = idata)
86                    self.layer_to_item[id(layer)] = layeritem
87                  if layer is self.app.interactor.selected_layer:                  if layer is self.app.interactor.selected_layer:
88                      self.tree.SelectItem(layeritem)                      self.SelectItem(layeritem)
89                  if isinstance(layer, Layer):                  if isinstance(layer, Layer):
90                      if layer.Visible():                      if layer.Visible():
91                          text = "Shown"                          text = "Shown"
92                      else:                      else:
93                          text = "Hidden"                          text = "Hidden"
94                      self.tree.AppendItem(layeritem, text)                      self.AppendItem(layeritem, text)
95                      self.tree.AppendItem(layeritem,                      self.AppendItem(layeritem, "Shapes: %d" %layer.NumShapes())
96                                           "Shapes: %d" % layer.NumShapes())                      self.AppendItem(layeritem,
97                      self.tree.AppendItem(layeritem,                                      ("Extent (lat-lon): (%g, %g, %g, %g)"
98                                           ("Extents: (%g, %g, %g, %g)"                                       % layer.LatLongBoundingBox()))
99                                            % layer.LatLongBoundingBox()))                      self.AppendItem(layeritem,
100                      self.tree.AppendItem(layeritem,                                      "Shapetype: %s"
101                                           "Shapetype: %s" %                                      % shapetype_names[layer.ShapeType()])
102                                           shapetype_names[layer.ShapeType()])                      self.AppendItem(layeritem,
103                      self.tree.AppendItem(layeritem,                                      "Fill: " + color_string(layer.fill))
104                                           "Fill: " + color_string(layer.fill))                      self.AppendItem(layeritem,
105                      self.tree.AppendItem(layeritem,                                      "Outline: " + color_string(layer.stroke))
106                                        "Outline: " + color_string(layer.stroke))                  self.Expand(layeritem)
107                  self.tree.Expand(layeritem)              self.Expand(mapitem)
108              self.tree.Expand(mapitem)          self.Expand(root)
         self.tree.Expand(root)  
109    
110      def session_changed(self, *args):      def session_changed(self, *args):
111          for channel in (MAPS_CHANGED,          for channel in (MAPS_CHANGED,
# Line 97  class myTreeCtrlPanel(wxPanel): Line 116  class myTreeCtrlPanel(wxPanel):
116              self.app.session.Subscribe(channel, self.update_tree)              self.app.session.Subscribe(channel, self.update_tree)
117          self.update_tree()          self.update_tree()
118    
     def OnSize(self, event):  
         w,h = self.GetClientSizeTuple()  
         self.tree.SetDimensions(0, 0, w, h)  
   
119      def normalize_selection(self):      def normalize_selection(self):
120          """Select the layer or map containing currently selected item"""          """Select the layer or map containing currently selected item"""
121          tree = self.tree          item = self.GetSelection()
         item = self.tree.GetSelection()  
122          while item.IsOk():          while item.IsOk():
123              object = tree.GetPyData(item)              object = self.GetPyData(item)
124              if isinstance(object, Layer) or isinstance(object, Map):              if isinstance(object, Layer) or isinstance(object, Map):
125                  break                  break
126              item = tree.GetItemParent(item)              item = self.GetItemParent(item)
127    
128          self.tree.SelectItem(item)          self.changing_selection = 1
129            try:
130                self.SelectItem(item)
131            finally:
132                self.changing_selection = 0
133    
134      def SelectedLayer(self):      def SelectedLayer(self):
135          """Return the layer object currently selected in the tree.          """Return the layer object currently selected in the tree.
136          Return None if no layer is selected"""          Return None if no layer is selected"""
137          tree = self.tree          layer = self.GetPyData(self.GetSelection())
         layer = tree.GetPyData(tree.GetSelection())  
138          if isinstance(layer, Layer):          if isinstance(layer, Layer):
139              return layer              return layer
140          return None          return None
141    
142      def OnSelChanged(self, event):      def OnSelChanged(self, event):
143            if self.changing_selection:
144                # we're changing the selection ourselves (probably through
145                # self.normalize_selection(). ignore the event.
146                return
147          self.normalize_selection()          self.normalize_selection()
148          layer = self.SelectedLayer()          # SelectedLayer returns None if no layer is selected. Since
149          if layer is not None:          # passing None to interactor.SelectLayer deselects the layer we
150              self.app.interactor.SelectLayer(layer)          # can simply pass the result of SelectedLayer on in all cases
151            self.app.interactor.SelectLayer(self.SelectedLayer())
152    
153      def layer_selected(self, layer):      def layer_selected(self, layer):
154          pass          item = self.layer_to_item.get(id(layer))
155            if item is not None and item != self.GetSelection():
156                self.SelectItem(item)
157    
158    
159    class SessionTreeView(NonModalDialog):
160    
161        """Non modal dialog showing the session as a tree"""
162    
163        def __init__(self, parent, app, name):
164            NonModalDialog.__init__(self, parent, app.interactor, name, "Session")
165            self.tree = SessionTreeCtrl(self, -1, app)
166    
167        def OnClose(self, event):
168            #self.interactor.Unsubscribe(SELECTED_SHAPE, self.select_shape)
169            NonModalDialog.OnClose(self, event)
170    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26