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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26