/[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 568 by jonathan, Wed Mar 26 11:51:28 2003 UTC revision 655 by jonathan, Fri Apr 11 15:50:13 2003 UTC
# Line 9  __version__ = "$Revision$" Line 9  __version__ = "$Revision$"
9    
10  from Thuban import _  from Thuban import _
11    
12    import resource
13    
14  from wxPython.wx import *  from wxPython.wx import *
15    
16  from Thuban.Model.layer import Layer  from Thuban.Model.layer import Layer
# Line 16  from Thuban.Model.map import Map Line 18  from Thuban.Model.map import Map
18  from Thuban.Model.messages import *  from Thuban.Model.messages import *
19  from Thuban.Model.classification import ClassGroup  from Thuban.Model.classification import ClassGroup
20    
21    from Thuban.UI.messages import *
22  from Thuban.UI.classifier import ClassDataPreviewer  from Thuban.UI.classifier import ClassDataPreviewer
23  from Thuban.UI.dock import DockPanel  from Thuban.UI.dock import DockPanel
24    
25  ID_LEGEND_MOVEUP = 4001  from Thuban.Lib.connector import ConnectorError
26  ID_LEGEND_MOVEDOWN = 4002  
27    ID_LEGEND_RAISE = 4001
28    ID_LEGEND_LOWER = 4002
29  ID_LEGEND_TREE = 4003  ID_LEGEND_TREE = 4003
30  ID_LEGEND_CLASSIFY = 4004  ID_LEGEND_PROPS = 4004
31  ID_LEGEND_SHOWLAYER = 4005  ID_LEGEND_SHOWLAYER = 4005
32  ID_LEGEND_HIDELAYER = 4006  ID_LEGEND_HIDELAYER = 4006
33    
34  BMP_SIZE_W = 30  BMP_SIZE_W = 30
35  BMP_SIZE_H = 15  BMP_SIZE_H = 15
36    
37    RAISE_BMP = "raise_layer"
38    LOWER_BMP = "lower_layer"
39    SHOW_BMP  = "show_layer"
40    HIDE_BMP  = "hide_layer"
41    PROPS_BMP = "layer_properties"
42    
43    
44  class LegendPanel(DockPanel):  class LegendPanel(DockPanel):
45    
46      def __init__(self, parent, map, mainWindow):      def __init__(self, parent, map, mainWindow):
# Line 37  class LegendPanel(DockPanel): Line 49  class LegendPanel(DockPanel):
49          self.mainWindow = mainWindow          self.mainWindow = mainWindow
50          self.parent = parent          self.parent = parent
51    
         panelBox = wxBoxSizer(wxVERTICAL)  
   
         buttonBox = wxGridSizer(2, 3, 0, 0)  
   
52          self.buttons = []          self.buttons = []
53    
54          button = wxButton(self, ID_LEGEND_MOVEUP, _("Move Up"))          panelBox = wxBoxSizer(wxVERTICAL)
55          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
56          self.buttons.append(button)          self.toolBar = wxToolBar(self, -1)
   
         button = wxButton(self, ID_LEGEND_SHOWLAYER, _("Show Layer"))  
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
   
         button = wxButton(self, ID_LEGEND_CLASSIFY, _("Classify"))  
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
   
         button = wxButton(self, ID_LEGEND_MOVEDOWN, _("Move Down"))  
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
   
         button = wxButton(self, ID_LEGEND_HIDELAYER, _("Hide Layer"))  
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
   
         EVT_BUTTON(self, ID_LEGEND_MOVEUP, self._OnMoveUp)  
         EVT_BUTTON(self, ID_LEGEND_MOVEDOWN, self._OnMoveDown)  
         EVT_BUTTON(self, ID_LEGEND_CLASSIFY, self._OnClassify)  
         EVT_BUTTON(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)  
         EVT_BUTTON(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)  
57    
58          panelBox.Add(buttonBox, 0, 0, 4)          bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)
59            self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
60                shortHelpString=_("Raise Layer"))
61    
62            bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)
63            self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
64                shortHelpString=_("Lower Layer"))
65    
66            bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)
67            self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
68                shortHelpString=_("Show Layer"))
69    
70            bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)
71            self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
72                shortHelpString=_("Hide Layer"))
73    
74            bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)
75            self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
76                shortHelpString=_("Edit Layer Properties"))
77    
78            self.toolBar.Realize()
79            panelBox.Add(self.toolBar, 0, wxALL, 0)
80    
81            EVT_TOOL(self, ID_LEGEND_RAISE, self._OnMoveUp)
82            EVT_TOOL(self, ID_LEGEND_LOWER, self._OnMoveDown)
83            EVT_TOOL(self, ID_LEGEND_PROPS, self._OnProperties)
84            EVT_TOOL(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)
85            EVT_TOOL(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)
86    
87          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
88    
89          panelBox.Add(self.tree, 1, wxGROW, 4)          panelBox.Add(self.tree, 1, wxGROW, 4)
90    
91            panelBox.Fit(self)
92    
93          self.SetAutoLayout(True)          self.SetAutoLayout(True)
94          self.SetSizer(panelBox)          self.SetSizer(panelBox)
95          panelBox.SetSizeHints(self)          panelBox.SetSizeHints(self)
96    
         #panelBox.SetSizeHints(self.parent)  
   
97          self.panelBox = panelBox          self.panelBox = panelBox
98    
99            self.__EnableButtons(False)
100    
101            EVT_CLOSE(self, self._OnClose)
102    
103    
104      def GetMap(self):      def GetMap(self):
105          return self.tree.GetMap()          return self.tree.GetMap()
106    
107      def SetMap(self, map):      def SetMap(self, map):
108          self.tree.SetMap(map)          self.tree.SetMap(map)
109    
110      def DoOnSelChanged(self, layer, group = None):      def DoOnSelChanged(self, layer, group):
111          sel = self.tree.GetSelection()  
112          self.__EnableButtons(sel.IsOk())          ok = isinstance(layer, Layer)
113            self.__EnableButtons(ok)
114    
115            self.mainWindow.SelectLayer(layer)
116    
117          if sel.IsOk():      def DoOnProperties(self):
118              self.mainWindow.SelectLayer(layer)          list = self.tree.GetSelectedHierarchy()
119    
120      def _OnClassify(self, event):          ok = isinstance(list[0], Layer)
121          self.tree.DoOnClassify()          if ok:
122                self.mainWindow.OpenLayerProperties(list[0], list[1])
123    
124        def Destroy(self):
125            self.__Close()
126    
127        def _OnProperties(self, event):
128            self.DoOnProperties()
129    
130      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
131          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
# Line 109  class LegendPanel(DockPanel): Line 137  class LegendPanel(DockPanel):
137          self.tree.DoOnShowLayer()          self.tree.DoOnShowLayer()
138          pass          pass
139    
140        #def Close(self, force = False):
141            #DockPanel.Close(self, force)
142            
143        def _OnClose(self, event):
144            self.__Close()
145    
146      def _OnHideLayer(self, event):      def _OnHideLayer(self, event):
147          self.tree.DoOnHideLayer()          self.tree.DoOnHideLayer()
148          pass          pass
149    
150      def __EnableButtons(self, on):      def __EnableButtons(self, on):
151          for b in self.buttons:          self.toolBar.EnableTool(ID_LEGEND_RAISE, on)
152              b.Enable(on)          self.toolBar.EnableTool(ID_LEGEND_LOWER, on)
153            self.toolBar.EnableTool(ID_LEGEND_SHOWLAYER,  on)
154            self.toolBar.EnableTool(ID_LEGEND_HIDELAYER,  on)
155            self.toolBar.EnableTool(ID_LEGEND_PROPS, on)
156    
157        def __Close(self):
158            self.tree.Close()
159    
160  class LegendTree(wxTreeCtrl):  class LegendTree(wxTreeCtrl):
161    
# Line 124  class LegendTree(wxTreeCtrl): Line 164  class LegendTree(wxTreeCtrl):
164                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
165                              size = (200, 200))                              size = (200, 200))
166    
167            self.mainWindow = mainWindow
168          self.map = None          self.map = None
169          self.parent = parent          self.parent = parent
170          self.layer2id = None          self.layer2id = {}
   
171    
172          self.image_list = None          self.image_list = None
173          self.emptyImageIndex = 0          self.emptyImageIndex = 0
# Line 137  class LegendTree(wxTreeCtrl): Line 177  class LegendTree(wxTreeCtrl):
177          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
178          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
179    
180            EVT_CLOSE(self, self._OnClose)
181    
182          self.SetMap(map)          self.SetMap(map)
183    
184        def _OnClose(self, event):
185            self.SetMap(None)
186    
187      def GetMap(self):      def GetMap(self):
188          return self.map          return self.map
189    
# Line 150  class LegendTree(wxTreeCtrl): Line 195  class LegendTree(wxTreeCtrl):
195    
196          if self.map is not None:          if self.map is not None:
197              for msg, func in sub_list: self.map.Unsubscribe(msg, func)              for msg, func in sub_list: self.map.Unsubscribe(msg, func)
198                #self.mainWindow.application.Unsubscribe(SESSION_REPLACED,
199                    #self._OnMsgMapsChanged)
200                #try:
201                    #self.mainWindow.application.session.Unsubscribe(MAPS_CHANGED,
202                        #self._OnMsgMapsChanged)
203                #except ConnectorError:
204                    #pass
205              self.__DeleteAllItems()              self.__DeleteAllItems()
206                    
207          self.map = map          self.map = map
208    
209          if self.map is not None:          if self.map is not None:
210              for msg, func in sub_list: self.map.Subscribe(msg, func)              for msg, func in sub_list: self.map.Subscribe(msg, func)
211                #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
212                    #self._OnMsgMapsChanged)
213                #self.mainWindow.application.Subscribe(SESSION_REPLACED,
214                    #self._OnMsgMapsChanged)
215              self.__FillTree(self.map)              self.__FillTree(self.map)
216    
217                            
218      def MoveCurrentItemUp(self):      def MoveCurrentItemUp(self):
219          cur_id = self.GetSelection()          cur_id = self.GetSelection()
220          assert(cur_id.IsOk())          assert cur_id.IsOk()
221    
222          cur_data = self.GetPyData(cur_id)          cur_data = self.GetPyData(cur_id)
223    
# Line 177  class LegendTree(wxTreeCtrl): Line 233  class LegendTree(wxTreeCtrl):
233          elif isinstance(cur_data, ClassGroup):          elif isinstance(cur_data, ClassGroup):
234              pass              pass
235          else:          else:
236              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be here."
237              pass              pass
238    
239      def MoveCurrentItemDown(self):      def MoveCurrentItemDown(self):
240          cur_id = self.GetSelection()          cur_id = self.GetSelection()
241          assert(cur_id.IsOk())          assert cur_id.IsOk()
242    
243          cur_data = self.GetPyData(cur_id)          cur_data = self.GetPyData(cur_id)
244    
# Line 191  class LegendTree(wxTreeCtrl): Line 247  class LegendTree(wxTreeCtrl):
247          elif isinstance(cur_data, ClassGroup):          elif isinstance(cur_data, ClassGroup):
248              pass              pass
249          else:          else:
250              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be here."
251              pass              pass
252    
253    
# Line 208  class LegendTree(wxTreeCtrl): Line 264  class LegendTree(wxTreeCtrl):
264    
265    
266      def DoOnShowLayer(self):      def DoOnShowLayer(self):
267          self.__ShowHideLayer(True)          #self.__ShowHideLayer(True)
268            layer, group = self.GetSelectedHierarchy()
269            layer.SetVisible(True)
270    
271      def DoOnHideLayer(self):      def DoOnHideLayer(self):
272          self.__ShowHideLayer(False)          #self.__ShowHideLayer(False)
273            layer, group = self.GetSelectedHierarchy()
274      def DoOnClassify(self):          layer.SetVisible(False)
         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)  
   
         # XXX: THIS IS SUCH AWFUL STYLE! YUCK!  
         self.parent.mainWindow.OpenClassifier(item)  
         #assert(False, "XXX: FIXME HERE")  
275    
276      def Sort(self):      def Sort(self):
277          self.SortChildren(self.GetRootItem())          self.SortChildren(self.GetRootItem())
278    
279      def _OnSelChanged(self, event):      def GetSelectedHierarchy(self):
280          id = self.GetSelection()          id = self.GetSelection()
         assert(id.IsOk())  
281    
282          group = None          if not id.IsOk():
283                return (None, None)
284    
285          layer = self.GetPyData(id)          layer = self.GetPyData(id)
286            group = None
287    
288          if isinstance(layer, ClassGroup):          if isinstance(layer, ClassGroup):
289              id = self.GetItemParent(id)              id = self.GetItemParent(id)
290              assert(id.IsOk())              assert id.IsOk()
291              group = layer              group = layer
292              layer = self.GetPyData(id)              layer = self.GetPyData(id)
293    
294          self.parent.DoOnSelChanged(layer, group)          return (layer, group)
295    
296        def _OnMsgMapsChanged(self):
297            #print self.map is self.mainWindow.Map()
298            self.SetMap(self.mainWindow.Map())
299            
300        def _OnSelChanged(self, event):
301            self.__UpdateSelection()
302    
303      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
304          self.DoOnClassify()          self.parent.DoOnProperties()
305    
306      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
307          assert(isinstance(layer, Layer))          assert isinstance(layer, Layer)
308    
309          id = self.layer2id[layer]          id = self.layer2id[layer]
310            assert id.IsOk()
311    
312          self.__FillTreeLayer(id)          # XXX: yikes! this is so bad, we should be doing what is
313            #      commented out, but there is a problem with keeping
314            #      track of the images in the image list when we replace
315            #      a layer. it ends up causing a seg fault.
316            self.__FillTree(self.map)
317            self.__UpdateSelection()
318            #self.__FillTreeLayer(id)
319    
320      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
321          self.Sort()          self.Sort()
# Line 260  class LegendTree(wxTreeCtrl): Line 323  class LegendTree(wxTreeCtrl):
323    
324          if id.IsOk():          if id.IsOk():
325              self.EnsureVisible(id)              self.EnsureVisible(id)
326            self.__UpdateSelection()
327    
328      def _OnMsgMapLayersAddedRemoved(self, map):      def _OnMsgMapLayersAddedRemoved(self, map):
329          assert(id(map) == id(self.map))          assert map is self.map
330    
331          self.__FillTree(self.map)          self.__FillTree(self.map)
332            self.__UpdateSelection()
333    
334        def _OnMsgLayerVisibilityChanged(self, layer):
335            assert isinstance(layer, Layer)
336    
337            self.__ShowHideLayer(layer)
338            self.__UpdateSelection()
339    
340        def _OnMsgLayerTitleChanged(self, layer):
341    
342            id = self.layer2id[layer]
343            if id.IsOk():
344                self.SetItemText(id, layer.Title())
345            self.__UpdateSelection()
346    
347        def __UpdateSelection(self):
348            layer, group = self.GetSelectedHierarchy()
349            self.parent.DoOnSelChanged(layer, group)
350            
351      def __FillTree(self, map):      def __FillTree(self, map):
352    
353          assert(isinstance(map, Map))          assert isinstance(map, Map)
354    
355          self.Freeze()          self.Freeze()
356    
# Line 295  class LegendTree(wxTreeCtrl): Line 377  class LegendTree(wxTreeCtrl):
377              for l in map.Layers():              for l in map.Layers():
378                  id = self.PrependItem(root, l.Title())                  id = self.PrependItem(root, l.Title())
379                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
380                    l.Subscribe(LAYER_VISIBILITY_CHANGED,
381                                self._OnMsgLayerVisibilityChanged)
382                    l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
383                  self.SetPyData(id, l)                  self.SetPyData(id, l)
384                  font = self.GetItemFont(id)                  self.__SetVisibilityStyle(l.Visible(), id)
                 if not l.Visible():  
                     font.SetStyle(wxITALIC)  
                     self.SetItemFont(id, font)  
385    
386                  self.layer2id[l] = id                  self.layer2id[l] = id
387    
# Line 319  class LegendTree(wxTreeCtrl): Line 401  class LegendTree(wxTreeCtrl):
401    
402          shapeType = layer.ShapeType()          shapeType = layer.ShapeType()
403    
404            show = layer.Visible()
405          for g in clazz:          for g in clazz:
406              id = self.AppendItem(pid, g.GetDisplayText())              if g.IsVisible():
407              self.SetPyData(id, g)                  id = self.AppendItem(pid, g.GetDisplayText())
408                    self.SetPyData(id, g)
409              bmp = self.__BuildGroupImage(g, shapeType)                  self.__SetVisibilityStyle(show, id)
410    
411              if bmp is None:                  bmp = self.__BuildGroupImage(g, shapeType)
412                  self.SetItemImage(id, self.emptyImageIndex)  
413              else:                  if bmp is None:
414                  i = self.image_list.Add(bmp)                      self.SetItemImage(id, self.emptyImageIndex)
415                  self.SetItemImage(id, i)                  else:
416                        i = self.image_list.Add(bmp)
417              #self.layer2id[g] = id                      self.SetItemImage(id, i)
418    
419          self.Thaw()          self.Thaw()
420    
421      def __BuildGroupImage(self, group, shapeType):      def __BuildGroupImage(self, group, shapeType):
422          assert(isinstance(group, ClassGroup))          assert isinstance(group, ClassGroup)
423    
424          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
425          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
# Line 349  class LegendTree(wxTreeCtrl): Line 432  class LegendTree(wxTreeCtrl):
432          return bmp          return bmp
433    
434      def __DeleteAllItems(self):      def __DeleteAllItems(self):
         self.DeleteAllItems()  
         self.layer2id = {}  
435    
436            while len(self.layer2id) > 0:
437                layer, id = self.layer2id.popitem()
438                layer.Unsubscribe(LAYER_CHANGED,
439                                  self._OnMsgLayerChanged)
440                layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
441                                  self._OnMsgLayerVisibilityChanged)
442                layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
443    
444      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)  
445    
446        def __SetVisibilityStyle(self, visible, id):
447            font = self.GetItemFont(id)
448    
449          if show != item.Visible():          if visible:
450                font.SetStyle(wxNORMAL)
451                color = wxBLACK
452            else:
453                font.SetStyle(wxITALIC)
454                color = wxLIGHT_GREY
455    
456              item.SetVisible(show)          self.SetItemTextColour(id, color)
457            self.SetItemFont(id, font)
458            
459        def __ShowHideLayer(self, layer):
460            parent = self.layer2id[layer]
461            assert parent.IsOk()
462    
463              font = self.GetItemFont(id)          visible = layer.Visible()
             if show:  
                 font.SetStyle(wxNORMAL)  
                 self.SetItemFont(id, font)  
             else:  
                 font.SetStyle(wxITALIC)  
                 self.SetItemFont(id, font)  
464    
465            self.__SetVisibilityStyle(visible, parent)
466    
467            id, cookie = self.GetFirstChild(parent, 123)
468    
469            while id.IsOk():
470                self.__SetVisibilityStyle(visible, id)
471                id, cookie = self.GetNextChild(parent, cookie)
472                

Legend:
Removed from v.568  
changed lines
  Added in v.655

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26