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

Legend:
Removed from v.14  
changed lines
  Added in v.115

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26