/[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 639 by jonathan, Thu Apr 10 14:35:39 2003 UTC revision 858 by frank, Thu May 8 10:30:17 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
18    from Thuban.Model.scalebar import ScaleBar
19  from Thuban.Model.messages import *  from Thuban.Model.messages import *
20  from Thuban.Model.classification import ClassGroup  from Thuban.Model.classification import ClassGroup
21    
# Line 22  from Thuban.UI.dock import DockPanel Line 25  from Thuban.UI.dock import DockPanel
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_PROPS = 4004  ID_LEGEND_PROPS = 4004
32  ID_LEGEND_SHOWLAYER = 4005  ID_LEGEND_SHOWLAYER = 4005
# Line 32  ID_LEGEND_HIDELAYER = 4006 Line 35  ID_LEGEND_HIDELAYER = 4006
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_PROPS, _("Properties"))  
         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_PROPS, self._OnProperties)  
         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 DoOnProperties(self):      def DoOnProperties(self):
125          list = self.tree.GetSelectedHierarchy()          list = self.tree.GetSelectedHierarchy()
# 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 264  class LegendTree(wxTreeCtrl): Line 264  class LegendTree(wxTreeCtrl):
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 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.DoOnProperties()          self.parent.DoOnProperties()
# Line 287  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 295  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  
329    
330          if isinstance(layer, ClassGroup):          id = self.layer2id[layer]
331              id = self.GetItemParent(id)          if id.IsOk():
332              assert id.IsOk()              self.SetItemText(id, layer.Title())
333              group = layer          self.__UpdateSelection()
             layer = self.GetPyData(id)  
   
         return (layer, group)  
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 352  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                  self.__SetVisibilityStyle(l.Visible(), id)                  self.__SetVisibilityStyle(l.Visible(), id)
371    
# Line 391  class LegendTree(wxTreeCtrl): Line 405  class LegendTree(wxTreeCtrl):
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 411  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    
# Line 441  class LegendTree(wxTreeCtrl): Line 455  class LegendTree(wxTreeCtrl):
455              self.__SetVisibilityStyle(visible, 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.639  
changed lines
  Added in v.858

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26