/[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 542 by jonathan, Thu Mar 20 09:43:16 2003 UTC revision 658 by jonathan, Mon Apr 14 14:06:30 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 *
 from dialogs import NonModalDialog  
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.messages import *  from Thuban.Model.messages import *
   
19  from Thuban.Model.classification import ClassGroup  from Thuban.Model.classification import ClassGroup
20    
21    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
24    
25    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  class Legend(NonModalDialog):  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    
     def __init__(self, parent, name, map):  
         NonModalDialog.__init__(self, parent, name,  
                                 _("Legend: %s") % map.Title())  
43    
44          self.parent = parent  class LegendPanel(DockPanel):
45    
46        def __init__(self, parent, map, mainWindow):
47            DockPanel.__init__(self, parent, -1)
48    
49            self.mainWindow = mainWindow
50            self.parent = parent
51    
52          panel = wxPanel(self, -1)          self.buttons = []
53    
         topBox = wxBoxSizer(wxVERTICAL)  
54          panelBox = wxBoxSizer(wxVERTICAL)          panelBox = wxBoxSizer(wxVERTICAL)
55    
56          buttonBox = wxGridSizer(2, 3, 0, 0)          self.toolBar = wxToolBar(self, -1)
57            self.toolBar.SetToolBitmapSize(wxSize(24, 24))
58    
59          self.buttons = []          bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)
60            self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
61                shortHelpString=_("Raise Layer"))
62    
63          button = wxButton(self, ID_LEGEND_MOVEUP, _("Move Up"))          bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)
64          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)          self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
65          self.buttons.append(button)              shortHelpString=_("Lower Layer"))
66    
67          button = wxButton(self, ID_LEGEND_SHOWLAYER, _("Show Layer"))          bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)
68          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)          self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
69          self.buttons.append(button)              shortHelpString=_("Show Layer"))
70    
71          button = wxButton(self, ID_LEGEND_CLASSIFY, _("Classify"))          bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)
72          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)          self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
73          self.buttons.append(button)              shortHelpString=_("Hide Layer"))
74    
75          button = wxButton(self, ID_LEGEND_MOVEDOWN, _("Move Down"))          bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)
76          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)          self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
77          self.buttons.append(button)              shortHelpString=_("Edit Layer Properties"))
78    
79          button = wxButton(self, ID_LEGEND_HIDELAYER, _("Hide Layer"))          self.toolBar.Realize()
80          buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)          panelBox.Add(self.toolBar, 0, wxALL, 0)
         self.buttons.append(button)  
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          EVT_BUTTON(self, ID_LEGEND_MOVEUP, self._OnMoveUp)          self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
         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)  
89    
90          panelBox.Add(buttonBox, 0, 0, 4)          panelBox.Add(self.tree, 1, wxGROW, 0)
91    
92          self.tree = LegendTree(self, ID_LEGEND_TREE, map)          #panelBox.Fit(self)
93    
94          panelBox.Add(self.tree, 1, wxGROW, 4)          self.SetAutoLayout(True)
95            self.SetSizer(panelBox)
96            panelBox.SetSizeHints(self)
97    
98          panel.SetAutoLayout(True)          print "legend: ", self.GetSize()
         panel.SetSizer(panelBox)  
         panelBox.SetSizeHints(panel)  
99    
100          topBox.Add(panel, 1, wxGROW, 0)          self.panelBox = panelBox
101          panelBox.SetSizeHints(self)  
102            self.__EnableButtons(False)
103    
104            self.Create()
105    
106            EVT_CLOSE(self, self._OnClose)
107    
         self.SetAutoLayout(True)  
         self.SetSizer(topBox)  
108    
109        def GetMap(self):
110            return self.tree.GetMap()
111    
112      def DoOnSelChanged(self):      def SetMap(self, map):
113          self.__EnableButtons(self.tree.GetSelection().IsOk())          self.tree.SetMap(map)
114    
115      def _OnClassify(self, event):      def DoOnSelChanged(self, layer, group):
116          self.tree.DoOnClassify()  
117            ok = isinstance(layer, Layer)
118            self.__EnableButtons(ok)
119    
120            self.mainWindow.SelectLayer(layer)
121    
122        def DoOnProperties(self):
123            list = self.tree.GetSelectedHierarchy()
124    
125            ok = isinstance(list[0], Layer)
126            if ok:
127                self.mainWindow.OpenLayerProperties(list[0], list[1])
128    
129        def Destroy(self):
130            self.__Close()
131    
132        def _OnProperties(self, event):
133            self.DoOnProperties()
134    
135      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
136          self.tree.MoveCurrentItemUp()          self.tree.MoveCurrentItemUp()
# Line 109  class Legend(NonModalDialog): Line 142  class Legend(NonModalDialog):
142          self.tree.DoOnShowLayer()          self.tree.DoOnShowLayer()
143          pass          pass
144    
145        #def Close(self, force = False):
146            #DockPanel.Close(self, force)
147            
148        def _OnClose(self, event):
149            self.__Close()
150    
151      def _OnHideLayer(self, event):      def _OnHideLayer(self, event):
152          self.tree.DoOnHideLayer()          self.tree.DoOnHideLayer()
153          pass          pass
154    
   
155      def __EnableButtons(self, on):      def __EnableButtons(self, on):
156          for b in self.buttons:          self.toolBar.EnableTool(ID_LEGEND_RAISE, on)
157              b.Enable(on)          self.toolBar.EnableTool(ID_LEGEND_LOWER, on)
158            self.toolBar.EnableTool(ID_LEGEND_SHOWLAYER,  on)
159            self.toolBar.EnableTool(ID_LEGEND_HIDELAYER,  on)
160            self.toolBar.EnableTool(ID_LEGEND_PROPS, on)
161    
162        def __Close(self):
163            self.tree.Close()
164    
165  class LegendTree(wxTreeCtrl):  class LegendTree(wxTreeCtrl):
166    
167      def __init__(self, parent, id, map):      def __init__(self, parent, id, map, mainWindow):
168          wxTreeCtrl.__init__(self, parent, id,          wxTreeCtrl.__init__(self, parent, id,
169                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,                              style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
170                              size = (200, 200))                              size = (200, 200))
171    
172            self.mainWindow = mainWindow
173            self.map = None
174          self.parent = parent          self.parent = parent
175          self.map = map          self.layer2id = {}
         self.layer2id = None  
   
176    
177          self.image_list = None          self.image_list = None
178          self.emptyImageIndex = 0          self.emptyImageIndex = 0
179    
180          self.previewer = ClassDataPreviewer()          self.previewer = ClassDataPreviewer()
181    
   
182          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)          EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
183          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)          EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
184    
185          map.Subscribe(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged)          EVT_CLOSE(self, self._OnClose)
         map.Subscribe(MAP_LAYERS_CHANGED, self._OnMsgMapLayersChanged)  
186    
187          self.__FillTree(map)          self.SetMap(map)
188    
189        def _OnClose(self, event):
190            self.SetMap(None)
191    
192        def GetMap(self):
193            return self.map
194    
195        def SetMap(self, map):
196    
197            sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
198                        (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),
199                        (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]
200    
201            if self.map is not None:
202                for msg, func in sub_list: self.map.Unsubscribe(msg, func)
203                #self.mainWindow.application.Unsubscribe(SESSION_REPLACED,
204                    #self._OnMsgMapsChanged)
205                #try:
206                    #self.mainWindow.application.session.Unsubscribe(MAPS_CHANGED,
207                        #self._OnMsgMapsChanged)
208                #except ConnectorError:
209                    #pass
210                self.__DeleteAllItems()
211            
212            self.map = map
213    
214            if self.map is not None:
215                for msg, func in sub_list: self.map.Subscribe(msg, func)
216                #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
217                    #self._OnMsgMapsChanged)
218                #self.mainWindow.application.Subscribe(SESSION_REPLACED,
219                    #self._OnMsgMapsChanged)
220                self.__FillTree(self.map)
221    
222                
223      def MoveCurrentItemUp(self):      def MoveCurrentItemUp(self):
224          cur_id = self.GetSelection()          cur_id = self.GetSelection()
225          assert(cur_id.IsOk())          assert cur_id.IsOk()
226    
227          cur_data = self.GetPyData(cur_id)          cur_data = self.GetPyData(cur_id)
228    
# Line 162  class LegendTree(wxTreeCtrl): Line 238  class LegendTree(wxTreeCtrl):
238          elif isinstance(cur_data, ClassGroup):          elif isinstance(cur_data, ClassGroup):
239              pass              pass
240          else:          else:
241              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be here."
242              pass              pass
243    
244      def MoveCurrentItemDown(self):      def MoveCurrentItemDown(self):
245          cur_id = self.GetSelection()          cur_id = self.GetSelection()
246          assert(cur_id.IsOk())          assert cur_id.IsOk()
247    
248          cur_data = self.GetPyData(cur_id)          cur_data = self.GetPyData(cur_id)
249    
# Line 176  class LegendTree(wxTreeCtrl): Line 252  class LegendTree(wxTreeCtrl):
252          elif isinstance(cur_data, ClassGroup):          elif isinstance(cur_data, ClassGroup):
253              pass              pass
254          else:          else:
255              assert(False, "Shouldn't be here.")              assert False, "Shouldn't be here."
256              pass              pass
257    
258    
# Line 193  class LegendTree(wxTreeCtrl): Line 269  class LegendTree(wxTreeCtrl):
269    
270    
271      def DoOnShowLayer(self):      def DoOnShowLayer(self):
272          self.__ShowHideLayer(True)          #self.__ShowHideLayer(True)
273            layer, group = self.GetSelectedHierarchy()
274            layer.SetVisible(True)
275    
276      def DoOnHideLayer(self):      def DoOnHideLayer(self):
277          self.__ShowHideLayer(False)          #self.__ShowHideLayer(False)
278            layer, group = self.GetSelectedHierarchy()
279            layer.SetVisible(False)
280    
281      def DoOnClassify(self):      def Sort(self):
282          id = self.GetSelection()          self.SortChildren(self.GetRootItem())
         assert(id.IsOk())  
283    
284          item = self.GetPyData(id)      def GetSelectedHierarchy(self):
285          if isinstance(item, ClassGroup):          id = self.GetSelection()
             id = self.GetItemParent(id)  
             assert(id.IsOk())  
             item = self.GetPyData(id)  
286    
287          self.parent.parent.OpenClassifier(item)          if not id.IsOk():
288                return (None, None)
289    
290      def Sort(self):          layer = self.GetPyData(id)
291          self.SortChildren(self.GetRootItem())          group = None
292    
293            if isinstance(layer, ClassGroup):
294                id = self.GetItemParent(id)
295                assert id.IsOk()
296                group = layer
297                layer = self.GetPyData(id)
298    
299            return (layer, group)
300    
301        def _OnMsgMapsChanged(self):
302            #print self.map is self.mainWindow.Map()
303            self.SetMap(self.mainWindow.Map())
304            
305      def _OnSelChanged(self, event):      def _OnSelChanged(self, event):
306          self.parent.DoOnSelChanged()          self.__UpdateSelection()
307    
308      def _OnItemActivated(self, event):      def _OnItemActivated(self, event):
309          self.DoOnClassify()          self.parent.DoOnProperties()
310    
311      def _OnMsgLayerChanged(self, layer):      def _OnMsgLayerChanged(self, layer):
312          assert(isinstance(layer, Layer))          assert isinstance(layer, Layer)
313    
314          id = self.layer2id[layer]          id = self.layer2id[layer]
315            assert id.IsOk()
316    
317          self.__FillTreeLayer(id)          # XXX: yikes! this is so bad, we should be doing what is
318            #      commented out, but there is a problem with keeping
319            #      track of the images in the image list when we replace
320            #      a layer. it ends up causing a seg fault.
321            self.__FillTree(self.map)
322            self.__UpdateSelection()
323            #self.__FillTreeLayer(id)
324    
325      def _OnMsgMapStackingChanged(self, *args):      def _OnMsgMapStackingChanged(self, *args):
326          self.Sort()          self.Sort()
327            id = self.GetSelection()
328    
329      def _OnMsgMapLayersChanged(self, map):          if id.IsOk():
330          assert(id(map) == id(self.map))              self.EnsureVisible(id)
331            self.__UpdateSelection()
332    
333        def _OnMsgMapLayersAddedRemoved(self, map):
334            assert map is self.map
335    
336          self.__FillTree(self.map)          self.__FillTree(self.map)
337            self.__UpdateSelection()
338    
339        def _OnMsgLayerVisibilityChanged(self, layer):
340            assert isinstance(layer, Layer)
341    
342            self.__ShowHideLayer(layer)
343            self.__UpdateSelection()
344    
345        def _OnMsgLayerTitleChanged(self, layer):
346    
347            id = self.layer2id[layer]
348            if id.IsOk():
349                self.SetItemText(id, layer.Title())
350            self.__UpdateSelection()
351    
352        def __UpdateSelection(self):
353            layer, group = self.GetSelectedHierarchy()
354            self.parent.DoOnSelChanged(layer, group)
355            
356      def __FillTree(self, map):      def __FillTree(self, map):
357    
358          assert(isinstance(map, Map))          assert isinstance(map, Map)
359    
360          self.Freeze()          self.Freeze()
361    
# Line 263  class LegendTree(wxTreeCtrl): Line 382  class LegendTree(wxTreeCtrl):
382              for l in map.Layers():              for l in map.Layers():
383                  id = self.PrependItem(root, l.Title())                  id = self.PrependItem(root, l.Title())
384                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)                  l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
385                    l.Subscribe(LAYER_VISIBILITY_CHANGED,
386                                self._OnMsgLayerVisibilityChanged)
387                    l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
388                  self.SetPyData(id, l)                  self.SetPyData(id, l)
389                  font = self.GetItemFont(id)                  self.__SetVisibilityStyle(l.Visible(), id)
                 if not l.Visible():  
                     font.SetStyle(wxITALIC)  
                     self.SetItemFont(id, font)  
390    
391                  self.layer2id[l] = id                  self.layer2id[l] = id
392    
# Line 287  class LegendTree(wxTreeCtrl): Line 406  class LegendTree(wxTreeCtrl):
406    
407          shapeType = layer.ShapeType()          shapeType = layer.ShapeType()
408    
409            show = layer.Visible()
410          for g in clazz:          for g in clazz:
411              id = self.AppendItem(pid, g.GetDisplayText())              if g.IsVisible():
412              self.SetPyData(id, g)                  id = self.AppendItem(pid, g.GetDisplayText())
413                    self.SetPyData(id, g)
414              bmp = self.__BuildGroupImage(g, shapeType)                  self.__SetVisibilityStyle(show, id)
415    
416              if bmp is None:                  bmp = self.__BuildGroupImage(g, shapeType)
417                  self.SetItemImage(id, self.emptyImageIndex)  
418              else:                  if bmp is None:
419                  i = self.image_list.Add(bmp)                      self.SetItemImage(id, self.emptyImageIndex)
420                  self.SetItemImage(id, i)                  else:
421                        i = self.image_list.Add(bmp)
422              #self.layer2id[g] = id                      self.SetItemImage(id, i)
423    
424          self.Thaw()          self.Thaw()
425    
426      def __BuildGroupImage(self, group, shapeType):      def __BuildGroupImage(self, group, shapeType):
427          assert(isinstance(group, ClassGroup))          assert isinstance(group, ClassGroup)
428    
429          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)          bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
430          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)          #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
# Line 317  class LegendTree(wxTreeCtrl): Line 437  class LegendTree(wxTreeCtrl):
437          return bmp          return bmp
438    
439      def __DeleteAllItems(self):      def __DeleteAllItems(self):
         self.DeleteAllItems()  
         self.layer2id = {}  
440    
441            while len(self.layer2id) > 0:
442                layer, id = self.layer2id.popitem()
443                layer.Unsubscribe(LAYER_CHANGED,
444                                  self._OnMsgLayerChanged)
445                layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
446                                  self._OnMsgLayerVisibilityChanged)
447                layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
448    
449      def __ShowHideLayer(self, show):          self.DeleteAllItems()
         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)  
450    
451        def __SetVisibilityStyle(self, visible, id):
452            font = self.GetItemFont(id)
453    
454          if show != item.Visible():          if visible:
455                font.SetStyle(wxNORMAL)
456                color = wxBLACK
457            else:
458                font.SetStyle(wxITALIC)
459                color = wxLIGHT_GREY
460    
461              item.SetVisible(show)          self.SetItemTextColour(id, color)
462            self.SetItemFont(id, font)
463            
464        def __ShowHideLayer(self, layer):
465            parent = self.layer2id[layer]
466            assert parent.IsOk()
467    
468              font = self.GetItemFont(id)          visible = layer.Visible()
             if show:  
                 font.SetStyle(wxNORMAL)  
                 self.SetItemFont(id, font)  
             else:  
                 font.SetStyle(wxITALIC)  
                 self.SetItemFont(id, font)  
469    
470            self.__SetVisibilityStyle(visible, parent)
471    
472            id, cookie = self.GetFirstChild(parent, 123)
473    
474            while id.IsOk():
475                self.__SetVisibilityStyle(visible, id)
476                id, cookie = self.GetNextChild(parent, cookie)
477                

Legend:
Removed from v.542  
changed lines
  Added in v.658

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26