/[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 572 by jonathan, Fri Mar 28 17:06:50 2003 UTC revision 668 by jonathan, Mon Apr 14 17:12:57 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 22  from Thuban.UI.dock import DockPanel Line 24  from Thuban.UI.dock import DockPanel
24    
25  from Thuban.Lib.connector import ConnectorError  from Thuban.Lib.connector import ConnectorError
26    
27  ID_LEGEND_MOVEUP = 4001  ID_LEGEND_RAISE = 4001
28  ID_LEGEND_MOVEDOWN = 4002  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 40  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)
         buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)  
         self.buttons.append(button)  
   
         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)  
55    
56          panelBox.Add(buttonBox, 0, 0, 4)          self.toolBar = wxToolBar(self, -1)
57            self.toolBar.SetToolBitmapSize(wxSize(24, 24))
58    
59          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)          bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)
60            self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
61                shortHelpString=_("Raise Layer"))
62    
63            bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)
64            self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
65                shortHelpString=_("Lower Layer"))
66    
67            bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)
68            self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
69                shortHelpString=_("Show Layer"))
70    
71            bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)
72            self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
73                shortHelpString=_("Hide Layer"))
74    
75            bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)
76            self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
77                shortHelpString=_("Edit Layer Properties"))
78    
79            self.toolBar.Realize()
80            panelBox.Add(self.toolBar, 0, wxGROW, 0)
81    
82            EVT_TOOL(self, ID_LEGEND_RAISE, self._OnMoveUp)
83            EVT_TOOL(self, ID_LEGEND_LOWER, self._OnMoveDown)
84            EVT_TOOL(self, ID_LEGEND_PROPS, self._OnProperties)
85            EVT_TOOL(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)
86            EVT_TOOL(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)
87    
88          panelBox.Add(self.tree, 1, wxGROW, 4)          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
89    
90          panelBox.Fit(self)          panelBox.Add(self.tree, 1, wxGROW, 0)
91    
92          self.SetAutoLayout(True)          self.SetAutoLayout(True)
93          self.SetSizer(panelBox)          self.SetSizer(panelBox)
94          panelBox.SetSizeHints(self)          panelBox.SetSizeHints(self)
95    
         #panelBox.SetSizeHints(self.parent)  
96    
97          self.panelBox = panelBox          self.panelBox = panelBox
98    
99            self.__EnableButtons(False)
100    
101            self.Create()
102    
103          EVT_CLOSE(self, self._OnClose)          EVT_CLOSE(self, self._OnClose)
104    
105    
# Line 102  class LegendPanel(DockPanel): Line 114  class LegendPanel(DockPanel):
114          ok = isinstance(layer, Layer)          ok = isinstance(layer, Layer)
115          self.__EnableButtons(ok)          self.__EnableButtons(ok)
116    
117          if ok:          self.mainWindow.SelectLayer(layer)
             self.mainWindow.SelectLayer(layer)  
118    
119      def DoOnClassify(self):      def DoOnProperties(self):
120          list = self.tree.GetSelectedHierarchy()          list = self.tree.GetSelectedHierarchy()
121    
122          ok = isinstance(list[0], Layer)          ok = isinstance(list[0], Layer)
123          if ok:          if ok:
124              self.mainWindow.OpenClassifier(list[0], list[1])              self.mainWindow.OpenLayerProperties(list[0], list[1])
125    
126      def _OnClassify(self, event):      def Destroy(self):
127          self.DoOnClassify()          self.__Close()
128    
129        def _OnProperties(self, event):
130            self.DoOnProperties()
131    
132      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
133          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
# Line 125  class LegendPanel(DockPanel): Line 139  class LegendPanel(DockPanel):
139          self.tree.DoOnShowLayer()          self.tree.DoOnShowLayer()
140          pass          pass
141    
142        #def Close(self, force = False):
143            #DockPanel.Close(self, force)
144            
145      def _OnClose(self, event):      def _OnClose(self, event):
146          self.tree.Close()          self.__Close()
147    
148      def _OnHideLayer(self, event):      def _OnHideLayer(self, event):
149          self.tree.DoOnHideLayer()          self.tree.DoOnHideLayer()
150          pass          pass
151    
152      def __EnableButtons(self, on):      def __EnableButtons(self, on):
153          for b in self.buttons:          self.toolBar.EnableTool(ID_LEGEND_RAISE, on)
154              b.Enable(on)          self.toolBar.EnableTool(ID_LEGEND_LOWER, on)
155            self.toolBar.EnableTool(ID_LEGEND_SHOWLAYER,  on)
156            self.toolBar.EnableTool(ID_LEGEND_HIDELAYER,  on)
157            self.toolBar.EnableTool(ID_LEGEND_PROPS, on)
158    
159        def __Close(self):
160            self.tree.Close()
161    
162  class LegendTree(wxTreeCtrl):  class LegendTree(wxTreeCtrl):
163    
# Line 161  class LegendTree(wxTreeCtrl): Line 184  class LegendTree(wxTreeCtrl):
184          self.SetMap(map)          self.SetMap(map)
185    
186      def _OnClose(self, event):      def _OnClose(self, event):
         print "LegendTree destroyed"  
187          self.SetMap(None)          self.SetMap(None)
188    
189      def GetMap(self):      def GetMap(self):
# Line 197  class LegendTree(wxTreeCtrl): Line 219  class LegendTree(wxTreeCtrl):
219                            
220      def MoveCurrentItemUp(self):      def MoveCurrentItemUp(self):
221          cur_id = self.GetSelection()          cur_id = self.GetSelection()
222          assert(cur_id.IsOk())          assert cur_id.IsOk()
223    
224          cur_data = self.GetPyData(cur_id)          cur_data = self.GetPyData(cur_id)
225    
# Line 213  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      def MoveCurrentItemDown(self):      def MoveCurrentItemDown(self):
242          cur_id = self.GetSelection()          cur_id = self.GetSelection()
243          assert(cur_id.IsOk())          assert cur_id.IsOk()
244    
245          cur_data = self.GetPyData(cur_id)          cur_data = self.GetPyData(cur_id)
246    
# Line 227  class LegendTree(wxTreeCtrl): Line 249  class LegendTree(wxTreeCtrl):
249          elif isinstance(cur_data, ClassGroup):          elif isinstance(cur_data, ClassGroup):
250              pass              pass
251          else:          else:
252              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be here."
253              pass              pass
254    
255    
# Line 253  class LegendTree(wxTreeCtrl): Line 275  class LegendTree(wxTreeCtrl):
275          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
276          layer.SetVisible(False)          layer.SetVisible(False)
277    
 #   def DoOnClassify(self):  
 #       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")  
   
278      def Sort(self):      def Sort(self):
279          self.SortChildren(self.GetRootItem())          self.SortChildren(self.GetRootItem())
280    
281        def GetSelectedHierarchy(self):
282            id = self.GetSelection()
283    
284            if not id.IsOk():
285                return (None, None)
286    
287            layer = self.GetPyData(id)
288            group = None
289    
290            if isinstance(layer, ClassGroup):
291                id = self.GetItemParent(id)
292                assert id.IsOk()
293                group = layer
294                layer = self.GetPyData(id)
295    
296            return (layer, group)
297    
298      def _OnMsgMapsChanged(self):      def _OnMsgMapsChanged(self):
299          print "ADfsadfsadfsadfsa"          #print self.map is self.mainWindow.Map()
         print self.map is self.mainWindow.Map()  
300          self.SetMap(self.mainWindow.Map())          self.SetMap(self.mainWindow.Map())
301                    
302      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
303            self.__UpdateSelection()
         layer, group = self.GetSelectedHierarchy()  
         self.parent.DoOnSelChanged(layer, group)  
304    
305      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
306          self.parent.DoOnClassify()          self.parent.DoOnProperties()
307    
308      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
309          assert(isinstance(layer, Layer))          assert isinstance(layer, Layer)
310    
311          id = self.layer2id[layer]          id = self.layer2id[layer]
312            assert id.IsOk()
313    
314          self.__FillTreeLayer(id)          # XXX: yikes! this is so bad, we should be doing what is
315            #      commented out, but there is a problem with keeping
316            #      track of the images in the image list when we replace
317            #      a layer. it ends up causing a seg fault.
318            self.__FillTree(self.map)
319            self.__UpdateSelection()
320            #self.__FillTreeLayer(id)
321    
322      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
323          self.Sort()          self.Sort()
# Line 296  class LegendTree(wxTreeCtrl): Line 325  class LegendTree(wxTreeCtrl):
325    
326          if id.IsOk():          if id.IsOk():
327              self.EnsureVisible(id)              self.EnsureVisible(id)
328            self.__UpdateSelection()
329    
330      def _OnMsgMapLayersAddedRemoved(self, map):      def _OnMsgMapLayersAddedRemoved(self, map):
331          assert(map is self.map)          assert map is self.map
332    
333          self.__FillTree(self.map)          self.__FillTree(self.map)
334            self.__UpdateSelection()
335    
336      def _OnMsgLayerVisibilityChanged(self, layer):      def _OnMsgLayerVisibilityChanged(self, layer):
337          assert(isinstance(layer, Layer))          assert isinstance(layer, Layer)
338    
339          self.__ShowHideLayer(layer)          self.__ShowHideLayer(layer)
340            self.__UpdateSelection()
341    
342      def GetSelectedHierarchy(self):      def _OnMsgLayerTitleChanged(self, layer):
         id = self.GetSelection()  
         assert(id.IsOk())  
   
         layer = self.GetPyData(id)  
         group = None  
   
         if isinstance(layer, ClassGroup):  
             id = self.GetItemParent(id)  
             assert(id.IsOk())  
             group = layer  
             layer = self.GetPyData(id)  
343    
344          return (layer, group)          id = self.layer2id[layer]
345            if id.IsOk():
346                self.SetItemText(id, layer.Title())
347            self.__UpdateSelection()
348    
349        def __UpdateSelection(self):
350            layer, group = self.GetSelectedHierarchy()
351            self.parent.DoOnSelChanged(layer, group)
352            
353      def __FillTree(self, map):      def __FillTree(self, map):
354    
355          assert(isinstance(map, Map))          assert isinstance(map, Map)
356    
357          self.Freeze()          self.Freeze()
358    
# Line 353  class LegendTree(wxTreeCtrl): Line 381  class LegendTree(wxTreeCtrl):
381                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
382                  l.Subscribe(LAYER_VISIBILITY_CHANGED,                  l.Subscribe(LAYER_VISIBILITY_CHANGED,
383                              self._OnMsgLayerVisibilityChanged)                              self._OnMsgLayerVisibilityChanged)
384                    l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
385                  self.SetPyData(id, l)                  self.SetPyData(id, l)
386                  font = self.GetItemFont(id)                  self.__SetVisibilityStyle(l.Visible(), id)
                 if not l.Visible():  
                     font.SetStyle(wxITALIC)  
                     self.SetItemFont(id, font)  
387    
388                  self.layer2id[l] = id                  self.layer2id[l] = id
389    
# Line 377  class LegendTree(wxTreeCtrl): Line 403  class LegendTree(wxTreeCtrl):
403    
404          shapeType = layer.ShapeType()          shapeType = layer.ShapeType()
405    
406            show = layer.Visible()
407          for g in clazz:          for g in clazz:
408              id = self.AppendItem(pid, g.GetDisplayText())              if g.IsVisible():
409              self.SetPyData(id, g)                  id = self.AppendItem(pid, g.GetDisplayText())
410                    self.SetPyData(id, g)
411              bmp = self.__BuildGroupImage(g, shapeType)                  self.__SetVisibilityStyle(show, id)
412    
413              if bmp is None:                  bmp = self.__BuildGroupImage(g, shapeType)
414                  self.SetItemImage(id, self.emptyImageIndex)  
415              else:                  if bmp is None:
416                  i = self.image_list.Add(bmp)                      self.SetItemImage(id, self.emptyImageIndex)
417                  self.SetItemImage(id, i)                  else:
418                        i = self.image_list.Add(bmp)
419              #self.layer2id[g] = id                      self.SetItemImage(id, i)
420    
421          self.Thaw()          self.Thaw()
422    
423      def __BuildGroupImage(self, group, shapeType):      def __BuildGroupImage(self, group, shapeType):
424          assert(isinstance(group, ClassGroup))          assert isinstance(group, ClassGroup)
425    
426          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
427          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
# Line 407  class LegendTree(wxTreeCtrl): Line 434  class LegendTree(wxTreeCtrl):
434          return bmp          return bmp
435    
436      def __DeleteAllItems(self):      def __DeleteAllItems(self):
         self.DeleteAllItems()  
437    
438          while len(self.layer2id) > 0:          while len(self.layer2id) > 0:
439              layer, id = self.layer2id.popitem()              layer, id = self.layer2id.popitem()
# Line 415  class LegendTree(wxTreeCtrl): Line 441  class LegendTree(wxTreeCtrl):
441                                self._OnMsgLayerChanged)                                self._OnMsgLayerChanged)
442              layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,              layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
443                                self._OnMsgLayerVisibilityChanged)                                self._OnMsgLayerVisibilityChanged)
444                layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
445    
446      def __ShowHideHelper(self, show, id):          self.DeleteAllItems()
447    
448        def __SetVisibilityStyle(self, visible, id):
449          font = self.GetItemFont(id)          font = self.GetItemFont(id)
450    
451          if show:          if visible:
452              font.SetStyle(wxNORMAL)              font.SetStyle(wxNORMAL)
453              color = wxBLACK              color = wxBLACK
454          else:          else:
# Line 432  class LegendTree(wxTreeCtrl): Line 460  class LegendTree(wxTreeCtrl):
460                    
461      def __ShowHideLayer(self, layer):      def __ShowHideLayer(self, layer):
462          parent = self.layer2id[layer]          parent = self.layer2id[layer]
463          assert(parent.IsOk())          assert parent.IsOk()
   
         show = layer.Visible()  
464    
465            visible = layer.Visible()
466    
467          self.__ShowHideHelper(show, parent)          self.__SetVisibilityStyle(visible, parent)
468    
469          id, cookie = self.GetFirstChild(parent, 123)          id, cookie = self.GetFirstChild(parent, 123)
470    
471          while id.IsOk():          while id.IsOk():
472              self.__ShowHideHelper(show, id)              self.__SetVisibilityStyle(visible, id)
473              id, cookie = self.GetNextChild(parent, cookie)              id, cookie = self.GetNextChild(parent, cookie)
474                            

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26