/[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 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 _OnClassify(self, event):      def Destroy(self):
132          self.DoOnClassify()          self.__Close()
133    
134        def _OnProperties(self, event):
135            self.DoOnProperties()
136    
137      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
138          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
# Line 125  class LegendPanel(DockPanel): Line 144  class LegendPanel(DockPanel):
144          self.tree.DoOnShowLayer()          self.tree.DoOnShowLayer()
145          pass          pass
146    
147        #def Close(self, force = False):
148            #DockPanel.Close(self, force)
149            
150      def _OnClose(self, event):      def _OnClose(self, event):
151          self.tree.Close()          self.__Close()
152    
153      def _OnHideLayer(self, event):      def _OnHideLayer(self, event):
154          self.tree.DoOnHideLayer()          self.tree.DoOnHideLayer()
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):
165            self.tree.Close()
166    
167  class LegendTree(wxTreeCtrl):  class LegendTree(wxTreeCtrl):
168    
# Line 161  class LegendTree(wxTreeCtrl): Line 189  class LegendTree(wxTreeCtrl):
189          self.SetMap(map)          self.SetMap(map)
190    
191      def _OnClose(self, event):      def _OnClose(self, event):
         print "LegendTree destroyed"  
192          self.SetMap(None)          self.SetMap(None)
193    
194      def GetMap(self):      def GetMap(self):
# Line 194  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 253  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)
296    
297          id = self.layer2id[layer]          id = self.layer2id[layer]
298            assert id.IsOk()
299    
300          self.__FillTreeLayer(id)          # XXX: yikes! this is so bad, we should be doing what is
301            #      commented out, but there is a problem with keeping
302            #      track of the images in the image list when we replace
303            #      a layer. it ends up causing a seg fault.
304            self.__FillTree(self.map)
305            self.__UpdateSelection()
306            #self.__FillTreeLayer(id)
307    
308      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
309          self.Sort()          self.Sort()
# Line 296  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 353  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 377  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.layer2id[g] = id                      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 407  class LegendTree(wxTreeCtrl): Line 417  class LegendTree(wxTreeCtrl):
417          return bmp          return bmp
418    
419      def __DeleteAllItems(self):      def __DeleteAllItems(self):
         self.DeleteAllItems()  
420    
421          while len(self.layer2id) > 0:          while len(self.layer2id) > 0:
422              layer, id = self.layer2id.popitem()              layer, id = self.layer2id.popitem()
# Line 415  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()
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 432  class LegendTree(wxTreeCtrl): Line 443  class LegendTree(wxTreeCtrl):
443                    
444      def __ShowHideLayer(self, layer):      def __ShowHideLayer(self, layer):
445          parent = self.layer2id[layer]          parent = self.layer2id[layer]
446          assert(parent.IsOk())          assert parent.IsOk()
   
         show = layer.Visible()  
447    
448            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.572  
changed lines
  Added in v.864

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26