/[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 605 by jonathan, Fri Apr 4 12:16:13 2003 UTC revision 882 by jonathan, Fri May 9 16:34:28 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
17  from Thuban.Model.map import Map  from Thuban.Model.map import Map
 from Thuban.Model.messages import *  
18  from Thuban.Model.classification import ClassGroup  from Thuban.Model.classification import ClassGroup
19    
20  from Thuban.UI.messages import *  from Thuban.Model.messages import \
21        MAP_STACKING_CHANGED, MAP_LAYERS_ADDED, MAP_LAYERS_REMOVED, LAYER_CHANGED,\
22        LAYER_VISIBILITY_CHANGED, TITLE_CHANGED
23    
24    from Thuban.UI.messages import SCALE_CHANGED
25    
26  from Thuban.UI.classifier import ClassDataPreviewer  from Thuban.UI.classifier import ClassDataPreviewer
27  from Thuban.UI.dock import DockPanel  from Thuban.UI.dock import DockPanel
28    from Thuban.UI.scalebar import ScaleBar
29    
30  from Thuban.Lib.connector import ConnectorError  from Thuban.Lib.connector import ConnectorError
31    
32  ID_LEGEND_MOVEUP = 4001  ID_LEGEND_RAISE = 4001
33  ID_LEGEND_MOVEDOWN = 4002  ID_LEGEND_LOWER = 4002
34  ID_LEGEND_TREE = 4003  ID_LEGEND_TREE = 4003
35  ID_LEGEND_CLASSIFY = 4004  ID_LEGEND_PROPS = 4004
36  ID_LEGEND_SHOWLAYER = 4005  ID_LEGEND_SHOWLAYER = 4005
37  ID_LEGEND_HIDELAYER = 4006  ID_LEGEND_HIDELAYER = 4006
38    
39  BMP_SIZE_W = 30  BMP_SIZE_W = 30
40  BMP_SIZE_H = 15  BMP_SIZE_H = 15
41    
42    RAISE_BMP = "raise_layer"
43    LOWER_BMP = "lower_layer"
44    SHOW_BMP  = "show_layer"
45    HIDE_BMP  = "hide_layer"
46    PROPS_BMP = "layer_properties"
47    
48    
49  class LegendPanel(DockPanel):  class LegendPanel(DockPanel):
50    
51      def __init__(self, parent, map, mainWindow):      def __init__(self, parent, map, mainWindow):
# Line 40  class LegendPanel(DockPanel): Line 54  class LegendPanel(DockPanel):
54          self.mainWindow = mainWindow          self.mainWindow = mainWindow
55          self.parent = parent          self.parent = parent
56    
         panelBox = wxBoxSizer(wxVERTICAL)  
   
         buttonBox = wxGridSizer(2, 3, 0, 0)  
   
57          self.buttons = []          self.buttons = []
58    
59          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)  
60    
61          panelBox.Add(buttonBox, 0, 0, 4)          self.toolBar = wxToolBar(self, -1)
62            self.toolBar.SetToolBitmapSize(wxSize(24, 24))
63    
64            bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)
65            self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
66                shortHelpString=_("Raise Layer"))
67    
68            bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)
69            self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
70                shortHelpString=_("Lower Layer"))
71    
72            bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)
73            self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
74                shortHelpString=_("Show Layer"))
75    
76            bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)
77            self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
78                shortHelpString=_("Hide Layer"))
79    
80            bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)
81            self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
82                shortHelpString=_("Edit Layer Properties"))
83    
84            self.toolBar.Realize()
85            panelBox.Add(self.toolBar, 0, wxGROW, 0)
86    
87            EVT_TOOL(self, ID_LEGEND_RAISE, self._OnMoveUp)
88            EVT_TOOL(self, ID_LEGEND_LOWER, self._OnMoveDown)
89            EVT_TOOL(self, ID_LEGEND_PROPS, self._OnProperties)
90            EVT_TOOL(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)
91            EVT_TOOL(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)
92    
93          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
94    
95          panelBox.Add(self.tree, 1, wxGROW, 4)          panelBox.Add(self.tree, 1, wxGROW, 0)
96    
97          panelBox.Fit(self)          self.scalebarbitmap = ScaleBarBitmap(self, map, mainWindow)
98            panelBox.Add(self.scalebarbitmap, 0, wxGROW, 0)
99    
100          self.SetAutoLayout(True)          self.SetAutoLayout(True)
101          self.SetSizer(panelBox)          self.SetSizer(panelBox)
102          panelBox.SetSizeHints(self)          panelBox.SetSizeHints(self)
103    
         #panelBox.SetSizeHints(self.parent)  
104    
105          self.panelBox = panelBox          self.panelBox = panelBox
106    
107            self.__EnableButtons(False)
108    
109            self.Create()
110    
111          EVT_CLOSE(self, self._OnClose)          EVT_CLOSE(self, self._OnClose)
112    
113    
# Line 96  class LegendPanel(DockPanel): Line 116  class LegendPanel(DockPanel):
116    
117      def SetMap(self, map):      def SetMap(self, map):
118          self.tree.SetMap(map)          self.tree.SetMap(map)
119            self.scalebarbitmap.SetCanvas(self.mainWindow.canvas)
120    
121      def DoOnSelChanged(self, layer, group):      def DoOnSelChanged(self, layer, group):
122    
123          ok = isinstance(layer, Layer)          ok = isinstance(layer, Layer)
124          self.__EnableButtons(ok)          self.__EnableButtons(ok)
125    
126          if ok:          self.mainWindow.SelectLayer(layer)
             self.mainWindow.SelectLayer(layer)  
127    
128      def DoOnClassify(self):      def DoOnProperties(self):
129          list = self.tree.GetSelectedHierarchy()          list = self.tree.GetSelectedHierarchy()
130    
131          ok = isinstance(list[0], Layer)          ok = isinstance(list[0], Layer)
132          if ok:          if ok:
133              self.mainWindow.OpenClassifier(list[0], list[1])              self.mainWindow.OpenLayerProperties(list[0], list[1])
134    
135      def Destroy(self):      def Destroy(self):
136          self.__Close()          self.__Close()
137    
138      def _OnClassify(self, event):      def _OnProperties(self, event):
139          self.DoOnClassify()          self.DoOnProperties()
140    
141      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
142          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
# Line 139  class LegendPanel(DockPanel): Line 159  class LegendPanel(DockPanel):
159          pass          pass
160    
161      def __EnableButtons(self, on):      def __EnableButtons(self, on):
162          for b in self.buttons:          self.toolBar.EnableTool(ID_LEGEND_RAISE, on)
163              b.Enable(on)          self.toolBar.EnableTool(ID_LEGEND_LOWER, on)
164            self.toolBar.EnableTool(ID_LEGEND_SHOWLAYER,  on)
165            self.toolBar.EnableTool(ID_LEGEND_HIDELAYER,  on)
166            self.toolBar.EnableTool(ID_LEGEND_PROPS, on)
167    
168      def __Close(self):      def __Close(self):
169          self.tree.Close()          self.tree.Close()
# Line 202  class LegendTree(wxTreeCtrl): Line 225  class LegendTree(wxTreeCtrl):
225                  #self._OnMsgMapsChanged)                  #self._OnMsgMapsChanged)
226              self.__FillTree(self.map)              self.__FillTree(self.map)
227    
               
228      def MoveCurrentItemUp(self):      def MoveCurrentItemUp(self):
229          cur_id = self.GetSelection()          layer, group = self.GetSelectedHierarchy()
         assert cur_id.IsOk()  
   
         cur_data = self.GetPyData(cur_id)  
   
         #prev_id = self.GetPrevSibling(cur_id)  
   
         #  
         # Get out if there's nowhere to go  
         #  
         #if prev_id == INVALID_TREE_ID: return  
230    
231          if isinstance(cur_data, Layer):          if layer is not None:
232              self.map.RaiseLayer(cur_data)              self.map.RaiseLayer(layer)
         elif isinstance(cur_data, ClassGroup):  
             pass  
233          else:          else:
234              assert False, "Shouldn't be here."              assert False, "Shouldn't be allowed."
235              pass              pass
236    
237      def MoveCurrentItemDown(self):      def MoveCurrentItemDown(self):
238          cur_id = self.GetSelection()          layer, group = self.GetSelectedHierarchy()
         assert cur_id.IsOk()  
   
         cur_data = self.GetPyData(cur_id)  
239    
240          if isinstance(cur_data, Layer):          if layer is not None:
241              self.map.LowerLayer(cur_data)              self.map.LowerLayer(layer)
         elif isinstance(cur_data, ClassGroup):  
             pass  
242          else:          else:
243              assert False, "Shouldn't be here."              assert False, "Shouldn't be allowed."
244              pass              pass
245    
   
246      def OnCompareItems(self, item1, item2):      def OnCompareItems(self, item1, item2):
247    
248          data1 = self.GetPyData(item1)          data1 = self.GetPyData(item1)
# Line 250  class LegendTree(wxTreeCtrl): Line 254  class LegendTree(wxTreeCtrl):
254          else:          else:
255              return wxTreeCtrl.OnCompareItems(self, item1, item2)              return wxTreeCtrl.OnCompareItems(self, item1, item2)
256    
   
257      def DoOnShowLayer(self):      def DoOnShowLayer(self):
258          #self.__ShowHideLayer(True)          #self.__ShowHideLayer(True)
259          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
# Line 261  class LegendTree(wxTreeCtrl): Line 264  class LegendTree(wxTreeCtrl):
264          layer, group = self.GetSelectedHierarchy()          layer, group = self.GetSelectedHierarchy()
265          layer.SetVisible(False)          layer.SetVisible(False)
266    
 #   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"  
   
267      def Sort(self):      def Sort(self):
268          self.SortChildren(self.GetRootItem())          self.SortChildren(self.GetRootItem())
269    
270        def GetSelectedHierarchy(self):
271            id = self.GetSelection()
272    
273            if not id.IsOk():
274                return (None, None)
275    
276            layer = self.GetPyData(id)
277            group = None
278    
279            if isinstance(layer, ClassGroup):
280                id = self.GetItemParent(id)
281                assert id.IsOk()
282                group = layer
283                layer = self.GetPyData(id)
284    
285            return (layer, group)
286    
287      def _OnMsgMapsChanged(self):      def _OnMsgMapsChanged(self):
288          print "ADfsadfsadfsadfsa"          #print self.map is self.mainWindow.Map()
         print self.map is self.mainWindow.Map()  
289          self.SetMap(self.mainWindow.Map())          self.SetMap(self.mainWindow.Map())
290                    
291      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
292            self.__UpdateSelection()
         layer, group = self.GetSelectedHierarchy()  
         self.parent.DoOnSelChanged(layer, group)  
293    
294      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
295          self.parent.DoOnClassify()          self.parent.DoOnProperties()
296    
297      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
298          assert isinstance(layer, Layer)          assert isinstance(layer, Layer)
# Line 302  class LegendTree(wxTreeCtrl): Line 305  class LegendTree(wxTreeCtrl):
305          #      track of the images in the image list when we replace          #      track of the images in the image list when we replace
306          #      a layer. it ends up causing a seg fault.          #      a layer. it ends up causing a seg fault.
307          self.__FillTree(self.map)          self.__FillTree(self.map)
308            self.__UpdateSelection()
309          #self.__FillTreeLayer(id)          #self.__FillTreeLayer(id)
310    
311      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
# Line 310  class LegendTree(wxTreeCtrl): Line 314  class LegendTree(wxTreeCtrl):
314    
315          if id.IsOk():          if id.IsOk():
316              self.EnsureVisible(id)              self.EnsureVisible(id)
317            self.__UpdateSelection()
318    
319      def _OnMsgMapLayersAddedRemoved(self, map):      def _OnMsgMapLayersAddedRemoved(self, map):
320          assert map is self.map          assert map is self.map
321    
322          self.__FillTree(self.map)          self.__FillTree(self.map)
323            self.__UpdateSelection()
324    
325      def _OnMsgLayerVisibilityChanged(self, layer):      def _OnMsgLayerVisibilityChanged(self, layer):
326          assert isinstance(layer, Layer)          assert isinstance(layer, Layer)
327    
328          self.__ShowHideLayer(layer)          self.__ShowHideLayer(layer)
329            self.__UpdateSelection()
330    
331      def GetSelectedHierarchy(self):      def _OnMsgLayerTitleChanged(self, layer):
         id = self.GetSelection()  
         assert id.IsOk()  
332    
333          layer = self.GetPyData(id)          id = self.layer2id[layer]
334          group = None          if id.IsOk():
335                self.SetItemText(id, layer.Title())
336          if isinstance(layer, ClassGroup):          self.__UpdateSelection()
             id = self.GetItemParent(id)  
             assert id.IsOk()  
             group = layer  
             layer = self.GetPyData(id)  
   
         return (layer, group)  
337    
338        def __UpdateSelection(self):
339            layer, group = self.GetSelectedHierarchy()
340            self.parent.DoOnSelChanged(layer, group)
341            
342      def __FillTree(self, map):      def __FillTree(self, map):
343    
         assert isinstance(map, Map)  
   
344          self.Freeze()          self.Freeze()
345    
346          self.__DeleteAllItems()          self.__DeleteAllItems()
# Line 367  class LegendTree(wxTreeCtrl): Line 368  class LegendTree(wxTreeCtrl):
368                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
369                  l.Subscribe(LAYER_VISIBILITY_CHANGED,                  l.Subscribe(LAYER_VISIBILITY_CHANGED,
370                              self._OnMsgLayerVisibilityChanged)                              self._OnMsgLayerVisibilityChanged)
371                    l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
372                  self.SetPyData(id, l)                  self.SetPyData(id, l)
373                  font = self.GetItemFont(id)                  self.__SetVisibilityStyle(l.Visible(), id)
                 if not l.Visible():  
                     font.SetStyle(wxITALIC)  
                     self.SetItemFont(id, font)  
374    
375                  self.layer2id[l] = id                  self.layer2id[l] = id
376    
# Line 391  class LegendTree(wxTreeCtrl): Line 390  class LegendTree(wxTreeCtrl):
390    
391          shapeType = layer.ShapeType()          shapeType = layer.ShapeType()
392    
393            show = layer.Visible()
394          for g in clazz:          for g in clazz:
395              id = self.AppendItem(pid, g.GetDisplayText())              if g.IsVisible():
396              self.SetPyData(id, g)                  id = self.AppendItem(pid, g.GetDisplayText())
397                    self.SetPyData(id, g)
398              bmp = self.__BuildGroupImage(g, shapeType)                  self.__SetVisibilityStyle(show, id)
399    
400              if bmp is None:                  bmp = self.__BuildGroupImage(g, shapeType)
401                  self.SetItemImage(id, self.emptyImageIndex)  
402              else:                  if bmp is None:
403                  i = self.image_list.Add(bmp)                      self.SetItemImage(id, self.emptyImageIndex)
404                  self.SetItemImage(id, i)                  else:
405                        i = self.image_list.Add(bmp)
406                        self.SetItemImage(id, i)
407    
408          self.Thaw()          self.Thaw()
409    
410      def __BuildGroupImage(self, group, shapeType):      def __BuildGroupImage(self, group, shapeType):
         assert isinstance(group, ClassGroup)  
411    
412          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
413          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
# Line 426  class LegendTree(wxTreeCtrl): Line 427  class LegendTree(wxTreeCtrl):
427                                self._OnMsgLayerChanged)                                self._OnMsgLayerChanged)
428              layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,              layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
429                                self._OnMsgLayerVisibilityChanged)                                self._OnMsgLayerVisibilityChanged)
430                layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
431    
432          self.DeleteAllItems()          self.DeleteAllItems()
433    
434      def __ShowHideHelper(self, show, id):      def __SetVisibilityStyle(self, visible, id):
435          font = self.GetItemFont(id)          font = self.GetItemFont(id)
436    
437          if show:          if visible:
438              font.SetStyle(wxNORMAL)              font.SetStyle(wxNORMAL)
439              color = wxBLACK              color = wxBLACK
440          else:          else:
# Line 446  class LegendTree(wxTreeCtrl): Line 448  class LegendTree(wxTreeCtrl):
448          parent = self.layer2id[layer]          parent = self.layer2id[layer]
449          assert parent.IsOk()          assert parent.IsOk()
450    
451          show = layer.Visible()          visible = layer.Visible()
   
452    
453          self.__ShowHideHelper(show, parent)          self.__SetVisibilityStyle(visible, parent)
454    
455          id, cookie = self.GetFirstChild(parent, 123)          id, cookie = self.GetFirstChild(parent, 123)
456    
457          while id.IsOk():          while id.IsOk():
458              self.__ShowHideHelper(show, id)              self.__SetVisibilityStyle(visible, id)
459              id, cookie = self.GetNextChild(parent, cookie)              id, cookie = self.GetNextChild(parent, cookie)
460                            
461    class ScaleBarBitmap(wxBoxSizer):
462    
463        def __init__(self, parent, map, mainWindow):
464            # While the width is fixed, get the height _now_.
465            dc = wxMemoryDC()
466            textwidth, textheight = dc.GetTextExtent("%d"%0)
467            self.width = 200
468            self.height = textheight + 3*2 + 8
469    
470            wxBoxSizer.__init__(self, wxVERTICAL)
471            bmp=wxEmptyBitmap(self.width, self.height)
472            self.scalebarBitmap = wxStaticBitmap(parent, -1, bmp)
473            self.Add(self.scalebarBitmap, 0, wxALIGN_CENTER|wxLEFT|wxTOP|wxRIGHT, 1)
474    
475            self.mainWindow = mainWindow
476            self.parent = parent
477            self.canvas = None
478            self.SetCanvas(self.mainWindow.canvas)
479    
480        def SetCanvas(self, canvas):
481            sub_list = [(SCALE_CHANGED, self._OnMsgScaleChanged)]
482    
483            if self.canvas is not None:
484                for msg, func in sub_list: self.canvas.Unsubscribe(msg, func)
485            
486            self.canvas = canvas
487            self.scalebar = ScaleBar(canvas.map)
488    
489            if self.canvas is not None:
490                for msg, func in sub_list: self.canvas.Subscribe(msg, func)
491                self.__SetScale(self.canvas.scale)
492    
493        def _OnMsgScaleChanged(self, scale):
494            self.__SetScale(scale)
495    
496        def __SetScale(self, scale):
497            bmp = wxEmptyBitmap(self.width, self.height)
498            dc = wxMemoryDC()
499            dc.SelectObject(bmp)
500            dc.Clear()
501    
502            self.scalebar.DrawScalebar(scale, dc)
503    
504            self.scalebarBitmap.SetBitmap(bmp)
505    

Legend:
Removed from v.605  
changed lines
  Added in v.882

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26