/[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 542 by jonathan, Thu Mar 20 09:43:16 2003 UTC revision 632 by jonathan, Wed Apr 9 10:10:53 2003 UTC
# Line 10  __version__ = "$Revision$" Line 10  __version__ = "$Revision$"
10  from Thuban import _  from Thuban import _
11    
12  from wxPython.wx import *  from wxPython.wx import *
 from dialogs import NonModalDialog  
13    
14  from Thuban.Model.layer import Layer  from Thuban.Model.layer import Layer
15  from Thuban.Model.map import Map  from Thuban.Model.map import Map
   
16  from Thuban.Model.messages import *  from Thuban.Model.messages import *
   
17  from Thuban.Model.classification import ClassGroup  from Thuban.Model.classification import ClassGroup
18    
19    from Thuban.UI.messages import *
20  from Thuban.UI.classifier import ClassDataPreviewer  from Thuban.UI.classifier import ClassDataPreviewer
21    from Thuban.UI.dock import DockPanel
22    
23    from Thuban.Lib.connector import ConnectorError
24    
25  ID_LEGEND_MOVEUP = 4001  ID_LEGEND_MOVEUP = 4001
26  ID_LEGEND_MOVEDOWN = 4002  ID_LEGEND_MOVEDOWN = 4002
# Line 31  ID_LEGEND_HIDELAYER = 4006 Line 32  ID_LEGEND_HIDELAYER = 4006
32  BMP_SIZE_W = 30  BMP_SIZE_W = 30
33  BMP_SIZE_H = 15  BMP_SIZE_H = 15
34    
35  class Legend(NonModalDialog):  class LegendPanel(DockPanel):
36    
37      def __init__(self, parent, name, map):      def __init__(self, parent, map, mainWindow):
38          NonModalDialog.__init__(self, parent, name,          DockPanel.__init__(self, parent, -1)
                                 _("Legend: %s") % map.Title())  
39    
40            self.mainWindow = mainWindow
41          self.parent = parent          self.parent = parent
42    
   
         panel = wxPanel(self, -1)  
   
         topBox = wxBoxSizer(wxVERTICAL)  
43          panelBox = wxBoxSizer(wxVERTICAL)          panelBox = wxBoxSizer(wxVERTICAL)
44    
45          buttonBox = wxGridSizer(2, 3, 0, 0)          buttonBox = wxGridSizer(2, 3, 0, 0)
# Line 69  class Legend(NonModalDialog): Line 66  class Legend(NonModalDialog):
66          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)
67          self.buttons.append(button)          self.buttons.append(button)
68    
   
69          EVT_BUTTON(self, ID_LEGEND_MOVEUP, self._OnMoveUp)          EVT_BUTTON(self, ID_LEGEND_MOVEUP, self._OnMoveUp)
70          EVT_BUTTON(self, ID_LEGEND_MOVEDOWN, self._OnMoveDown)          EVT_BUTTON(self, ID_LEGEND_MOVEDOWN, self._OnMoveDown)
71          EVT_BUTTON(self, ID_LEGEND_CLASSIFY, self._OnClassify)          EVT_BUTTON(self, ID_LEGEND_CLASSIFY, self._OnClassify)
# Line 78  class Legend(NonModalDialog): Line 74  class Legend(NonModalDialog):
74    
75          panelBox.Add(buttonBox, 0, 0, 4)          panelBox.Add(buttonBox, 0, 0, 4)
76    
77          self.tree = LegendTree(self, ID_LEGEND_TREE, map)          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
78    
79          panelBox.Add(self.tree, 1, wxGROW, 4)          panelBox.Add(self.tree, 1, wxGROW, 4)
80    
81          panel.SetAutoLayout(True)          panelBox.Fit(self)
         panel.SetSizer(panelBox)  
         panelBox.SetSizeHints(panel)  
82    
83          topBox.Add(panel, 1, wxGROW, 0)          self.SetAutoLayout(True)
84            self.SetSizer(panelBox)
85          panelBox.SetSizeHints(self)          panelBox.SetSizeHints(self)
86    
87          self.SetAutoLayout(True)          #panelBox.SetSizeHints(self.parent)
         self.SetSizer(topBox)  
88    
89            self.panelBox = panelBox
90    
91      def DoOnSelChanged(self):          EVT_CLOSE(self, self._OnClose)
92          self.__EnableButtons(self.tree.GetSelection().IsOk())  
93    
94        def GetMap(self):
95            return self.tree.GetMap()
96    
97        def SetMap(self, map):
98            self.tree.SetMap(map)
99    
100        def DoOnSelChanged(self, layer, group):
101    
102            ok = isinstance(layer, Layer)
103            self.__EnableButtons(ok)
104    
105            if ok:
106                self.mainWindow.SelectLayer(layer)
107    
108        def DoOnClassify(self):
109            list = self.tree.GetSelectedHierarchy()
110    
111            ok = isinstance(list[0], Layer)
112            if ok:
113                self.mainWindow.OpenClassifier(list[0], list[1])
114    
115        def Destroy(self):
116            self.__Close()
117    
118      def _OnClassify(self, event):      def _OnClassify(self, event):
119          self.tree.DoOnClassify()          self.DoOnClassify()
120    
121      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
122          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
# Line 109  class Legend(NonModalDialog): Line 128  class Legend(NonModalDialog):
128          self.tree.DoOnShowLayer()          self.tree.DoOnShowLayer()
129          pass          pass
130    
131        #def Close(self, force = False):
132            #DockPanel.Close(self, force)
133            
134        def _OnClose(self, event):
135            self.__Close()
136    
137      def _OnHideLayer(self, event):      def _OnHideLayer(self, event):
138          self.tree.DoOnHideLayer()          self.tree.DoOnHideLayer()
139          pass          pass
140    
   
141      def __EnableButtons(self, on):      def __EnableButtons(self, on):
142          for b in self.buttons:          for b in self.buttons:
143              b.Enable(on)              b.Enable(on)
144    
145        def __Close(self):
146            self.tree.Close()
147    
148  class LegendTree(wxTreeCtrl):  class LegendTree(wxTreeCtrl):
149    
150      def __init__(self, parent, id, map):      def __init__(self, parent, id, map, mainWindow):
151          wxTreeCtrl.__init__(self, parent, id,          wxTreeCtrl.__init__(self, parent, id,
152                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
153                              size = (200, 200))                              size = (200, 200))
154    
155            self.mainWindow = mainWindow
156            self.map = None
157          self.parent = parent          self.parent = parent
158          self.map = map          self.layer2id = {}
         self.layer2id = None  
   
159    
160          self.image_list = None          self.image_list = None
161          self.emptyImageIndex = 0          self.emptyImageIndex = 0
162    
163          self.previewer = ClassDataPreviewer()          self.previewer = ClassDataPreviewer()
164    
   
165          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
166          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
167    
168          map.Subscribe(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged)          EVT_CLOSE(self, self._OnClose)
169          map.Subscribe(MAP_LAYERS_CHANGED, self._OnMsgMapLayersChanged)  
170            self.SetMap(map)
171    
172        def _OnClose(self, event):
173            self.SetMap(None)
174    
175        def GetMap(self):
176            return self.map
177    
178        def SetMap(self, map):
179    
180            sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
181                        (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),
182                        (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]
183    
184            if self.map is not None:
185                for msg, func in sub_list: self.map.Unsubscribe(msg, func)
186                #self.mainWindow.application.Unsubscribe(SESSION_REPLACED,
187                    #self._OnMsgMapsChanged)
188                #try:
189                    #self.mainWindow.application.session.Unsubscribe(MAPS_CHANGED,
190                        #self._OnMsgMapsChanged)
191                #except ConnectorError:
192                    #pass
193                self.__DeleteAllItems()
194            
195            self.map = map
196    
197          self.__FillTree(map)          if self.map is not None:
198                for msg, func in sub_list: self.map.Subscribe(msg, func)
199                #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
200                    #self._OnMsgMapsChanged)
201                #self.mainWindow.application.Subscribe(SESSION_REPLACED,
202                    #self._OnMsgMapsChanged)
203                self.__FillTree(self.map)
204    
205                
206      def MoveCurrentItemUp(self):      def MoveCurrentItemUp(self):
207          cur_id = self.GetSelection()          cur_id = self.GetSelection()
208          assert(cur_id.IsOk())          assert cur_id.IsOk()
209    
210          cur_data = self.GetPyData(cur_id)          cur_data = self.GetPyData(cur_id)
211    
# Line 162  class LegendTree(wxTreeCtrl): Line 221  class LegendTree(wxTreeCtrl):
221          elif isinstance(cur_data, ClassGroup):          elif isinstance(cur_data, ClassGroup):
222              pass              pass
223          else:          else:
224              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be here."
225              pass              pass
226    
227      def MoveCurrentItemDown(self):      def MoveCurrentItemDown(self):
228          cur_id = self.GetSelection()          cur_id = self.GetSelection()
229          assert(cur_id.IsOk())          assert cur_id.IsOk()
230    
231          cur_data = self.GetPyData(cur_id)          cur_data = self.GetPyData(cur_id)
232    
# Line 176  class LegendTree(wxTreeCtrl): Line 235  class LegendTree(wxTreeCtrl):
235          elif isinstance(cur_data, ClassGroup):          elif isinstance(cur_data, ClassGroup):
236              pass              pass
237          else:          else:
238              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be here."
239              pass              pass
240    
241    
# Line 193  class LegendTree(wxTreeCtrl): Line 252  class LegendTree(wxTreeCtrl):
252    
253    
254      def DoOnShowLayer(self):      def DoOnShowLayer(self):
255          self.__ShowHideLayer(True)          #self.__ShowHideLayer(True)
256            layer, group = self.GetSelectedHierarchy()
257            layer.SetVisible(True)
258    
259      def DoOnHideLayer(self):      def DoOnHideLayer(self):
260          self.__ShowHideLayer(False)          #self.__ShowHideLayer(False)
261            layer, group = self.GetSelectedHierarchy()
262      def DoOnClassify(self):          layer.SetVisible(False)
263          id = self.GetSelection()  
264          assert(id.IsOk())  #   def DoOnClassify(self):
265    #       id = self.GetSelection()
266          item = self.GetPyData(id)  #       assert id.IsOk()
267          if isinstance(item, ClassGroup):  
268              id = self.GetItemParent(id)  #       item = self.GetPyData(id)
269              assert(id.IsOk())  #       if isinstance(item, ClassGroup):
270              item = self.GetPyData(id)  #           id = self.GetItemParent(id)
271    #           assert id.IsOk()
272          self.parent.parent.OpenClassifier(item)  #           item = self.GetPyData(id)
273    
274    #       # XXX: THIS IS SUCH AWFUL STYLE! YUCK!
275    #       self.parent.mainWindow.OpenClassifier(item)
276    #       #assert False, "XXX: FIXME HERE"
277    
278      def Sort(self):      def Sort(self):
279          self.SortChildren(self.GetRootItem())          self.SortChildren(self.GetRootItem())
280    
281        def _OnMsgMapsChanged(self):
282            print "ADfsadfsadfsadfsa"
283            print self.map is self.mainWindow.Map()
284            self.SetMap(self.mainWindow.Map())
285            
286      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
287          self.parent.DoOnSelChanged()  
288            layer, group = self.GetSelectedHierarchy()
289            self.parent.DoOnSelChanged(layer, group)
290    
291      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
292          self.DoOnClassify()          self.parent.DoOnClassify()
293    
294      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
295          assert(isinstance(layer, Layer))          assert isinstance(layer, Layer)
296    
297          id = self.layer2id[layer]          id = self.layer2id[layer]
298            assert id.IsOk()
299    
300          self.__FillTreeLayer(id)          # XXX: yikes! this is so bad, we should be doing what is
301            #      commented out, but there is a problem with keeping
302            #      track of the images in the image list when we replace
303            #      a layer. it ends up causing a seg fault.
304            self.__FillTree(self.map)
305            #self.__FillTreeLayer(id)
306    
307      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
308          self.Sort()          self.Sort()
309            id = self.GetSelection()
310    
311      def _OnMsgMapLayersChanged(self, map):          if id.IsOk():
312          assert(id(map) == id(self.map))              self.EnsureVisible(id)
313    
314        def _OnMsgMapLayersAddedRemoved(self, map):
315            assert map is self.map
316    
317          self.__FillTree(self.map)          self.__FillTree(self.map)
318    
319        def _OnMsgLayerVisibilityChanged(self, layer):
320            assert isinstance(layer, Layer)
321    
322            self.__ShowHideLayer(layer)
323    
324        def GetSelectedHierarchy(self):
325            id = self.GetSelection()
326            assert id.IsOk()
327    
328            layer = self.GetPyData(id)
329            group = None
330    
331            if isinstance(layer, ClassGroup):
332                id = self.GetItemParent(id)
333                assert id.IsOk()
334                group = layer
335                layer = self.GetPyData(id)
336    
337            return (layer, group)
338    
339      def __FillTree(self, map):      def __FillTree(self, map):
340    
341          assert(isinstance(map, Map))          assert isinstance(map, Map)
342    
343          self.Freeze()          self.Freeze()
344    
# Line 263  class LegendTree(wxTreeCtrl): Line 365  class LegendTree(wxTreeCtrl):
365              for l in map.Layers():              for l in map.Layers():
366                  id = self.PrependItem(root, l.Title())                  id = self.PrependItem(root, l.Title())
367                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
368                    l.Subscribe(LAYER_VISIBILITY_CHANGED,
369                                self._OnMsgLayerVisibilityChanged)
370                  self.SetPyData(id, l)                  self.SetPyData(id, l)
371                  font = self.GetItemFont(id)                  self.__SetVisibilityStyle(l.Visible(), id)
                 if not l.Visible():  
                     font.SetStyle(wxITALIC)  
                     self.SetItemFont(id, font)  
372    
373                  self.layer2id[l] = id                  self.layer2id[l] = id
374    
# Line 287  class LegendTree(wxTreeCtrl): Line 388  class LegendTree(wxTreeCtrl):
388    
389          shapeType = layer.ShapeType()          shapeType = layer.ShapeType()
390    
391            show = layer.Visible()
392          for g in clazz:          for g in clazz:
393              id = self.AppendItem(pid, g.GetDisplayText())              id = self.AppendItem(pid, g.GetDisplayText())
394              self.SetPyData(id, g)              self.SetPyData(id, g)
395                self.__SetVisibilityStyle(show, id)
396    
397              bmp = self.__BuildGroupImage(g, shapeType)              bmp = self.__BuildGroupImage(g, shapeType)
398    
# Line 299  class LegendTree(wxTreeCtrl): Line 402  class LegendTree(wxTreeCtrl):
402                  i = self.image_list.Add(bmp)                  i = self.image_list.Add(bmp)
403                  self.SetItemImage(id, i)                  self.SetItemImage(id, i)
404    
             #self.layer2id[g] = id  
   
405          self.Thaw()          self.Thaw()
406    
407      def __BuildGroupImage(self, group, shapeType):      def __BuildGroupImage(self, group, shapeType):
408          assert(isinstance(group, ClassGroup))          assert isinstance(group, ClassGroup)
409    
410          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
411          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
# Line 317  class LegendTree(wxTreeCtrl): Line 418  class LegendTree(wxTreeCtrl):
418          return bmp          return bmp
419    
420      def __DeleteAllItems(self):      def __DeleteAllItems(self):
         self.DeleteAllItems()  
         self.layer2id = {}  
421    
422            while len(self.layer2id) > 0:
423                layer, id = self.layer2id.popitem()
424                layer.Unsubscribe(LAYER_CHANGED,
425                                  self._OnMsgLayerChanged)
426                layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
427                                  self._OnMsgLayerVisibilityChanged)
428    
429      def __ShowHideLayer(self, show):          self.DeleteAllItems()
         id = self.GetSelection()  
         assert(id.IsOk())  
           
         item = self.GetPyData(id)  
         if isinstance(item, ClassGroup):  
             id = self.GetItemParent(id)  
             assert(id.IsOk())  
             item = self.GetPyData(id)  
430    
431        def __SetVisibilityStyle(self, visible, id):
432            font = self.GetItemFont(id)
433    
434          if show != item.Visible():          if visible:
435                font.SetStyle(wxNORMAL)
436                color = wxBLACK
437            else:
438                font.SetStyle(wxITALIC)
439                color = wxLIGHT_GREY
440    
441              item.SetVisible(show)          self.SetItemTextColour(id, color)
442            self.SetItemFont(id, font)
443            
444        def __ShowHideLayer(self, layer):
445            parent = self.layer2id[layer]
446            assert parent.IsOk()
447    
448              font = self.GetItemFont(id)          visible = layer.Visible()
             if show:  
                 font.SetStyle(wxNORMAL)  
                 self.SetItemFont(id, font)  
             else:  
                 font.SetStyle(wxITALIC)  
                 self.SetItemFont(id, font)  
449    
450            self.__SetVisibilityStyle(visible, parent)
451    
452            id, cookie = self.GetFirstChild(parent, 123)
453    
454            while id.IsOk():
455                self.__SetVisibilityStyle(visible, id)
456                id, cookie = self.GetNextChild(parent, cookie)
457                

Legend:
Removed from v.542  
changed lines
  Added in v.632

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26