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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26