/[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 572 by jonathan, Fri Mar 28 17:06:50 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 _OnClassify(self, event):      def _OnClassify(self, event):
116          self.tree.DoOnClassify()          self.DoOnClassify()
117    
118      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
119          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
# Line 109  class Legend(NonModalDialog): Line 125  class Legend(NonModalDialog):
125          self.tree.DoOnShowLayer()          self.tree.DoOnShowLayer()
126          pass          pass
127    
128        def _OnClose(self, event):
129            self.tree.Close()
130    
131      def _OnHideLayer(self, event):      def _OnHideLayer(self, event):
132          self.tree.DoOnHideLayer()          self.tree.DoOnHideLayer()
133          pass          pass
134    
   
135      def __EnableButtons(self, on):      def __EnableButtons(self, on):
136          for b in self.buttons:          for b in self.buttons:
137              b.Enable(on)              b.Enable(on)
138    
139  class LegendTree(wxTreeCtrl):  class LegendTree(wxTreeCtrl):
140    
141      def __init__(self, parent, id, map):      def __init__(self, parent, id, map, mainWindow):
142          wxTreeCtrl.__init__(self, parent, id,          wxTreeCtrl.__init__(self, parent, id,
143                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
144                              size = (200, 200))                              size = (200, 200))
145    
146            self.mainWindow = mainWindow
147            self.map = None
148          self.parent = parent          self.parent = parent
149          self.map = map          self.layer2id = {}
         self.layer2id = None  
   
150    
151          self.image_list = None          self.image_list = None
152          self.emptyImageIndex = 0          self.emptyImageIndex = 0
153    
154          self.previewer = ClassDataPreviewer()          self.previewer = ClassDataPreviewer()
155    
   
156          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
157          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
158    
159          map.Subscribe(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged)          EVT_CLOSE(self, self._OnClose)
         map.Subscribe(MAP_LAYERS_CHANGED, self._OnMsgMapLayersChanged)  
160    
161          self.__FillTree(map)          self.SetMap(map)
162    
163        def _OnClose(self, event):
164            print "LegendTree destroyed"
165            self.SetMap(None)
166    
167        def GetMap(self):
168            return self.map
169    
170        def SetMap(self, map):
171    
172            sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
173                        (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),
174                        (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]
175    
176            if self.map is not None:
177                for msg, func in sub_list: self.map.Unsubscribe(msg, func)
178                #self.mainWindow.application.Unsubscribe(SESSION_REPLACED,
179                    #self._OnMsgMapsChanged)
180                #try:
181                    #self.mainWindow.application.session.Unsubscribe(MAPS_CHANGED,
182                        #self._OnMsgMapsChanged)
183                #except ConnectorError:
184                    #pass
185                self.__DeleteAllItems()
186            
187            self.map = map
188    
189            if self.map is not None:
190                for msg, func in sub_list: self.map.Subscribe(msg, func)
191                #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
192                    #self._OnMsgMapsChanged)
193                #self.mainWindow.application.Subscribe(SESSION_REPLACED,
194                    #self._OnMsgMapsChanged)
195                self.__FillTree(self.map)
196    
197                
198      def MoveCurrentItemUp(self):      def MoveCurrentItemUp(self):
199          cur_id = self.GetSelection()          cur_id = self.GetSelection()
200          assert(cur_id.IsOk())          assert(cur_id.IsOk())
# Line 193  class LegendTree(wxTreeCtrl): Line 244  class LegendTree(wxTreeCtrl):
244    
245    
246      def DoOnShowLayer(self):      def DoOnShowLayer(self):
247          self.__ShowHideLayer(True)          #self.__ShowHideLayer(True)
248            layer, group = self.GetSelectedHierarchy()
249            layer.SetVisible(True)
250    
251      def DoOnHideLayer(self):      def DoOnHideLayer(self):
252          self.__ShowHideLayer(False)          #self.__ShowHideLayer(False)
253            layer, group = self.GetSelectedHierarchy()
254      def DoOnClassify(self):          layer.SetVisible(False)
255          id = self.GetSelection()  
256          assert(id.IsOk())  #   def DoOnClassify(self):
257    #       id = self.GetSelection()
258          item = self.GetPyData(id)  #       assert(id.IsOk())
259          if isinstance(item, ClassGroup):  
260              id = self.GetItemParent(id)  #       item = self.GetPyData(id)
261              assert(id.IsOk())  #       if isinstance(item, ClassGroup):
262              item = self.GetPyData(id)  #           id = self.GetItemParent(id)
263    #           assert(id.IsOk())
264          self.parent.parent.OpenClassifier(item)  #           item = self.GetPyData(id)
265    
266    #       # XXX: THIS IS SUCH AWFUL STYLE! YUCK!
267    #       self.parent.mainWindow.OpenClassifier(item)
268    #       #assert(False, "XXX: FIXME HERE")
269    
270      def Sort(self):      def Sort(self):
271          self.SortChildren(self.GetRootItem())          self.SortChildren(self.GetRootItem())
272    
273        def _OnMsgMapsChanged(self):
274            print "ADfsadfsadfsadfsa"
275            print self.map is self.mainWindow.Map()
276            self.SetMap(self.mainWindow.Map())
277            
278      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
279          self.parent.DoOnSelChanged()  
280            layer, group = self.GetSelectedHierarchy()
281            self.parent.DoOnSelChanged(layer, group)
282    
283      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
284          self.DoOnClassify()          self.parent.DoOnClassify()
285    
286      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
287          assert(isinstance(layer, Layer))          assert(isinstance(layer, Layer))
# Line 228  class LegendTree(wxTreeCtrl): Line 292  class LegendTree(wxTreeCtrl):
292    
293      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
294          self.Sort()          self.Sort()
295            id = self.GetSelection()
296    
297            if id.IsOk():
298                self.EnsureVisible(id)
299    
300      def _OnMsgMapLayersChanged(self, map):      def _OnMsgMapLayersAddedRemoved(self, map):
301          assert(id(map) == id(self.map))          assert(map is self.map)
302    
303          self.__FillTree(self.map)          self.__FillTree(self.map)
304    
305        def _OnMsgLayerVisibilityChanged(self, layer):
306            assert(isinstance(layer, Layer))
307    
308            self.__ShowHideLayer(layer)
309    
310        def GetSelectedHierarchy(self):
311            id = self.GetSelection()
312            assert(id.IsOk())
313    
314            layer = self.GetPyData(id)
315            group = None
316    
317            if isinstance(layer, ClassGroup):
318                id = self.GetItemParent(id)
319                assert(id.IsOk())
320                group = layer
321                layer = self.GetPyData(id)
322    
323            return (layer, group)
324    
325      def __FillTree(self, map):      def __FillTree(self, map):
326    
327          assert(isinstance(map, Map))          assert(isinstance(map, Map))
# Line 263  class LegendTree(wxTreeCtrl): Line 351  class LegendTree(wxTreeCtrl):
351              for l in map.Layers():              for l in map.Layers():
352                  id = self.PrependItem(root, l.Title())                  id = self.PrependItem(root, l.Title())
353                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
354                    l.Subscribe(LAYER_VISIBILITY_CHANGED,
355                                self._OnMsgLayerVisibilityChanged)
356                  self.SetPyData(id, l)                  self.SetPyData(id, l)
357                  font = self.GetItemFont(id)                  font = self.GetItemFont(id)
358                  if not l.Visible():                  if not l.Visible():
# Line 318  class LegendTree(wxTreeCtrl): Line 408  class LegendTree(wxTreeCtrl):
408    
409      def __DeleteAllItems(self):      def __DeleteAllItems(self):
410          self.DeleteAllItems()          self.DeleteAllItems()
         self.layer2id = {}  
411    
412            while len(self.layer2id) > 0:
413                layer, id = self.layer2id.popitem()
414                layer.Unsubscribe(LAYER_CHANGED,
415                                  self._OnMsgLayerChanged)
416                layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
417                                  self._OnMsgLayerVisibilityChanged)
418    
419    
420        def __ShowHideHelper(self, show, id):
421            font = self.GetItemFont(id)
422    
423            if show:
424                font.SetStyle(wxNORMAL)
425                color = wxBLACK
426            else:
427                font.SetStyle(wxITALIC)
428                color = wxLIGHT_GREY
429    
430      def __ShowHideLayer(self, show):          self.SetItemTextColour(id, color)
431          id = self.GetSelection()          self.SetItemFont(id, font)
         assert(id.IsOk())  
432                    
433          item = self.GetPyData(id)      def __ShowHideLayer(self, layer):
434          if isinstance(item, ClassGroup):          parent = self.layer2id[layer]
435              id = self.GetItemParent(id)          assert(parent.IsOk())
             assert(id.IsOk())  
             item = self.GetPyData(id)  
436    
437            show = layer.Visible()
438    
         if show != item.Visible():  
   
             item.SetVisible(show)  
   
             font = self.GetItemFont(id)  
             if show:  
                 font.SetStyle(wxNORMAL)  
                 self.SetItemFont(id, font)  
             else:  
                 font.SetStyle(wxITALIC)  
                 self.SetItemFont(id, font)  
439    
440            self.__ShowHideHelper(show, parent)
441    
442            id, cookie = self.GetFirstChild(parent, 123)
443    
444            while id.IsOk():
445                self.__ShowHideHelper(show, id)
446                id, cookie = self.GetNextChild(parent, cookie)
447                

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26