/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/legend.py
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/Thuban/UI/legend.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 655 - (hide annotations)
Fri Apr 11 15:50:13 2003 UTC (21 years, 11 months ago) by jonathan
Original Path: trunk/thuban/Thuban/UI/legend.py
File MIME type: text/x-python
File size: 13582 byte(s)
Enable/disable the legend buttons when the legend changes. Fixes RTbug #1793.

1 jonathan 542 # Copyright (c) 2001, 2002, 2003 by Intevation GmbH
2     # Authors:
3     # Jonathan Coles <[email protected]>
4     #
5     # This program is free software under the GPL (>=v2)
6     # Read the file COPYING coming with Thuban for details.
7    
8     __version__ = "$Revision$"
9    
10     from Thuban import _
11    
12 jonathan 652 import resource
13    
14 jonathan 542 from wxPython.wx import *
15    
16     from Thuban.Model.layer import Layer
17     from Thuban.Model.map import Map
18     from Thuban.Model.messages import *
19     from Thuban.Model.classification import ClassGroup
20    
21 jonathan 572 from Thuban.UI.messages import *
22 jonathan 542 from Thuban.UI.classifier import ClassDataPreviewer
23 jonathan 562 from Thuban.UI.dock import DockPanel
24 jonathan 542
25 jonathan 572 from Thuban.Lib.connector import ConnectorError
26    
27 jonathan 652 ID_LEGEND_RAISE = 4001
28     ID_LEGEND_LOWER = 4002
29 jonathan 542 ID_LEGEND_TREE = 4003
30 jonathan 639 ID_LEGEND_PROPS = 4004
31 jonathan 542 ID_LEGEND_SHOWLAYER = 4005
32     ID_LEGEND_HIDELAYER = 4006
33    
34     BMP_SIZE_W = 30
35     BMP_SIZE_H = 15
36    
37 jonathan 652 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    
43    
44 jonathan 562 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 jonathan 652 self.buttons = []
53    
54 jonathan 542 panelBox = wxBoxSizer(wxVERTICAL)
55    
56 jonathan 652 self.toolBar = wxToolBar(self, -1)
57 jonathan 542
58 jonathan 652 bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)
59     self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
60     shortHelpString=_("Raise Layer"))
61 jonathan 542
62 jonathan 652 bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)
63     self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
64     shortHelpString=_("Lower Layer"))
65 jonathan 542
66 jonathan 652 bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)
67     self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
68     shortHelpString=_("Show Layer"))
69 jonathan 542
70 jonathan 652 bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)
71     self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
72     shortHelpString=_("Hide Layer"))
73 jonathan 542
74 jonathan 652 bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)
75     self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
76     shortHelpString=_("Edit Layer Properties"))
77 jonathan 542
78 jonathan 652 self.toolBar.Realize()
79     panelBox.Add(self.toolBar, 0, wxALL, 0)
80 jonathan 542
81 jonathan 652 EVT_TOOL(self, ID_LEGEND_RAISE, self._OnMoveUp)
82     EVT_TOOL(self, ID_LEGEND_LOWER, self._OnMoveDown)
83     EVT_TOOL(self, ID_LEGEND_PROPS, self._OnProperties)
84     EVT_TOOL(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)
85     EVT_TOOL(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)
86 jonathan 542
87 jonathan 562 self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
88 jonathan 542
89     panelBox.Add(self.tree, 1, wxGROW, 4)
90    
91 jonathan 572 panelBox.Fit(self)
92    
93 jonathan 562 self.SetAutoLayout(True)
94     self.SetSizer(panelBox)
95 jonathan 542 panelBox.SetSizeHints(self)
96    
97 jonathan 562 self.panelBox = panelBox
98 jonathan 542
99 jonathan 652 self.__EnableButtons(False)
100    
101 jonathan 572 EVT_CLOSE(self, self._OnClose)
102    
103    
104 jonathan 562 def GetMap(self):
105     return self.tree.GetMap()
106    
107     def SetMap(self, map):
108     self.tree.SetMap(map)
109    
110 jonathan 572 def DoOnSelChanged(self, layer, group):
111 jonathan 542
112 jonathan 572 ok = isinstance(layer, Layer)
113     self.__EnableButtons(ok)
114    
115 jonathan 655 self.mainWindow.SelectLayer(layer)
116 jonathan 568
117 jonathan 639 def DoOnProperties(self):
118 jonathan 572 list = self.tree.GetSelectedHierarchy()
119    
120     ok = isinstance(list[0], Layer)
121     if ok:
122 jonathan 639 self.mainWindow.OpenLayerProperties(list[0], list[1])
123 jonathan 572
124 jonathan 578 def Destroy(self):
125     self.__Close()
126    
127 jonathan 639 def _OnProperties(self, event):
128     self.DoOnProperties()
129 jonathan 542
130     def _OnMoveUp(self, event):
131     self.tree.MoveCurrentItemUp()
132    
133     def _OnMoveDown(self, event):
134     self.tree.MoveCurrentItemDown()
135    
136     def _OnShowLayer(self, event):
137     self.tree.DoOnShowLayer()
138     pass
139    
140 jonathan 578 #def Close(self, force = False):
141     #DockPanel.Close(self, force)
142    
143 jonathan 572 def _OnClose(self, event):
144 jonathan 578 self.__Close()
145 jonathan 572
146 jonathan 542 def _OnHideLayer(self, event):
147     self.tree.DoOnHideLayer()
148     pass
149    
150     def __EnableButtons(self, on):
151 jonathan 652 self.toolBar.EnableTool(ID_LEGEND_RAISE, on)
152     self.toolBar.EnableTool(ID_LEGEND_LOWER, on)
153     self.toolBar.EnableTool(ID_LEGEND_SHOWLAYER, on)
154     self.toolBar.EnableTool(ID_LEGEND_HIDELAYER, on)
155     self.toolBar.EnableTool(ID_LEGEND_PROPS, on)
156 jonathan 542
157 jonathan 578 def __Close(self):
158     self.tree.Close()
159    
160 jonathan 542 class LegendTree(wxTreeCtrl):
161    
162 jonathan 562 def __init__(self, parent, id, map, mainWindow):
163 jonathan 542 wxTreeCtrl.__init__(self, parent, id,
164     style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
165     size = (200, 200))
166    
167 jonathan 572 self.mainWindow = mainWindow
168 jonathan 562 self.map = None
169 jonathan 542 self.parent = parent
170 jonathan 572 self.layer2id = {}
171 jonathan 542
172     self.image_list = None
173     self.emptyImageIndex = 0
174    
175     self.previewer = ClassDataPreviewer()
176    
177     EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
178     EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
179    
180 jonathan 572 EVT_CLOSE(self, self._OnClose)
181    
182 jonathan 562 self.SetMap(map)
183 jonathan 542
184 jonathan 572 def _OnClose(self, event):
185     self.SetMap(None)
186    
187 jonathan 562 def GetMap(self):
188     return self.map
189 jonathan 542
190 jonathan 562 def SetMap(self, map):
191    
192     sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
193     (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),
194     (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]
195    
196     if self.map is not None:
197     for msg, func in sub_list: self.map.Unsubscribe(msg, func)
198 jonathan 572 #self.mainWindow.application.Unsubscribe(SESSION_REPLACED,
199     #self._OnMsgMapsChanged)
200     #try:
201     #self.mainWindow.application.session.Unsubscribe(MAPS_CHANGED,
202     #self._OnMsgMapsChanged)
203     #except ConnectorError:
204     #pass
205 jonathan 562 self.__DeleteAllItems()
206    
207     self.map = map
208    
209     if self.map is not None:
210     for msg, func in sub_list: self.map.Subscribe(msg, func)
211 jonathan 572 #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
212     #self._OnMsgMapsChanged)
213     #self.mainWindow.application.Subscribe(SESSION_REPLACED,
214     #self._OnMsgMapsChanged)
215 jonathan 562 self.__FillTree(self.map)
216    
217    
218 jonathan 542 def MoveCurrentItemUp(self):
219     cur_id = self.GetSelection()
220 jonathan 605 assert cur_id.IsOk()
221 jonathan 542
222     cur_data = self.GetPyData(cur_id)
223    
224     #prev_id = self.GetPrevSibling(cur_id)
225    
226     #
227     # Get out if there's nowhere to go
228     #
229     #if prev_id == INVALID_TREE_ID: return
230    
231     if isinstance(cur_data, Layer):
232     self.map.RaiseLayer(cur_data)
233     elif isinstance(cur_data, ClassGroup):
234     pass
235     else:
236 jonathan 605 assert False, "Shouldn't be here."
237 jonathan 542 pass
238    
239     def MoveCurrentItemDown(self):
240     cur_id = self.GetSelection()
241 jonathan 605 assert cur_id.IsOk()
242 jonathan 542
243     cur_data = self.GetPyData(cur_id)
244    
245     if isinstance(cur_data, Layer):
246     self.map.LowerLayer(cur_data)
247     elif isinstance(cur_data, ClassGroup):
248     pass
249     else:
250 jonathan 605 assert False, "Shouldn't be here."
251 jonathan 542 pass
252    
253    
254     def OnCompareItems(self, item1, item2):
255    
256     data1 = self.GetPyData(item1)
257     data2 = self.GetPyData(item2)
258    
259     if isinstance(data1, Layer):
260     layers = self.map.Layers()
261     return layers.index(data2) - layers.index(data1)
262     else:
263     return wxTreeCtrl.OnCompareItems(self, item1, item2)
264    
265    
266     def DoOnShowLayer(self):
267 jonathan 572 #self.__ShowHideLayer(True)
268     layer, group = self.GetSelectedHierarchy()
269     layer.SetVisible(True)
270 jonathan 542
271     def DoOnHideLayer(self):
272 jonathan 572 #self.__ShowHideLayer(False)
273     layer, group = self.GetSelectedHierarchy()
274     layer.SetVisible(False)
275 jonathan 542
276     def Sort(self):
277     self.SortChildren(self.GetRootItem())
278    
279 jonathan 655 def GetSelectedHierarchy(self):
280     id = self.GetSelection()
281    
282     if not id.IsOk():
283     return (None, None)
284    
285     layer = self.GetPyData(id)
286     group = None
287    
288     if isinstance(layer, ClassGroup):
289     id = self.GetItemParent(id)
290     assert id.IsOk()
291     group = layer
292     layer = self.GetPyData(id)
293    
294     return (layer, group)
295    
296 jonathan 572 def _OnMsgMapsChanged(self):
297 jonathan 639 #print self.map is self.mainWindow.Map()
298 jonathan 572 self.SetMap(self.mainWindow.Map())
299    
300 jonathan 542 def _OnSelChanged(self, event):
301 jonathan 655 self.__UpdateSelection()
302 jonathan 542
303     def _OnItemActivated(self, event):
304 jonathan 639 self.parent.DoOnProperties()
305 jonathan 542
306     def _OnMsgLayerChanged(self, layer):
307 jonathan 605 assert isinstance(layer, Layer)
308 jonathan 542
309     id = self.layer2id[layer]
310 jonathan 605 assert id.IsOk()
311 jonathan 542
312 jonathan 578 # XXX: yikes! this is so bad, we should be doing what is
313     # commented out, but there is a problem with keeping
314     # track of the images in the image list when we replace
315     # a layer. it ends up causing a seg fault.
316     self.__FillTree(self.map)
317 jonathan 655 self.__UpdateSelection()
318 jonathan 578 #self.__FillTreeLayer(id)
319 jonathan 542
320     def _OnMsgMapStackingChanged(self, *args):
321     self.Sort()
322 jonathan 562 id = self.GetSelection()
323 jonathan 542
324 jonathan 562 if id.IsOk():
325     self.EnsureVisible(id)
326 jonathan 655 self.__UpdateSelection()
327 jonathan 562
328     def _OnMsgMapLayersAddedRemoved(self, map):
329 jonathan 605 assert map is self.map
330 jonathan 542
331     self.__FillTree(self.map)
332 jonathan 655 self.__UpdateSelection()
333 jonathan 542
334 jonathan 572 def _OnMsgLayerVisibilityChanged(self, layer):
335 jonathan 605 assert isinstance(layer, Layer)
336 jonathan 572
337     self.__ShowHideLayer(layer)
338 jonathan 655 self.__UpdateSelection()
339 jonathan 572
340 jonathan 652 def _OnMsgLayerTitleChanged(self, layer):
341    
342     id = self.layer2id[layer]
343     if id.IsOk():
344     self.SetItemText(id, layer.Title())
345 jonathan 655 self.__UpdateSelection()
346 jonathan 652
347 jonathan 655 def __UpdateSelection(self):
348     layer, group = self.GetSelectedHierarchy()
349     self.parent.DoOnSelChanged(layer, group)
350    
351 jonathan 542 def __FillTree(self, map):
352    
353 jonathan 605 assert isinstance(map, Map)
354 jonathan 542
355     self.Freeze()
356    
357     self.__DeleteAllItems()
358    
359     if map.HasLayers():
360    
361     self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
362    
363     bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
364     dc = wxMemoryDC()
365     dc.SelectObject(bmp)
366     dc.SetBrush(wxBLACK_BRUSH)
367     dc.Clear()
368     dc.SelectObject(wxNullBitmap)
369    
370     self.emptyImageIndex = \
371     self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
372    
373     self.AssignImageList(self.image_list)
374    
375     root = self.AddRoot("")
376    
377     for l in map.Layers():
378     id = self.PrependItem(root, l.Title())
379     l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
380 jonathan 572 l.Subscribe(LAYER_VISIBILITY_CHANGED,
381     self._OnMsgLayerVisibilityChanged)
382 jonathan 652 l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
383 jonathan 542 self.SetPyData(id, l)
384 jonathan 632 self.__SetVisibilityStyle(l.Visible(), id)
385 jonathan 542
386     self.layer2id[l] = id
387    
388     self.__FillTreeLayer(id)
389     self.Expand(id)
390    
391     self.Thaw()
392    
393     def __FillTreeLayer(self, pid):
394     layer = self.GetPyData(pid)
395    
396     self.Freeze()
397    
398     self.DeleteChildren(pid)
399    
400     clazz = layer.GetClassification()
401    
402     shapeType = layer.ShapeType()
403    
404 jonathan 632 show = layer.Visible()
405 jonathan 542 for g in clazz:
406 jonathan 639 if g.IsVisible():
407     id = self.AppendItem(pid, g.GetDisplayText())
408     self.SetPyData(id, g)
409     self.__SetVisibilityStyle(show, id)
410 jonathan 542
411 jonathan 639 bmp = self.__BuildGroupImage(g, shapeType)
412 jonathan 542
413 jonathan 639 if bmp is None:
414     self.SetItemImage(id, self.emptyImageIndex)
415     else:
416     i = self.image_list.Add(bmp)
417     self.SetItemImage(id, i)
418 jonathan 542
419     self.Thaw()
420    
421     def __BuildGroupImage(self, group, shapeType):
422 jonathan 605 assert isinstance(group, ClassGroup)
423 jonathan 542
424     bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
425     #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
426     dc = wxMemoryDC()
427     dc.SelectObject(bmp)
428     dc.Clear()
429    
430     self.previewer.Draw(dc, None, group.GetProperties(), shapeType)
431    
432     return bmp
433    
434     def __DeleteAllItems(self):
435    
436 jonathan 572 while len(self.layer2id) > 0:
437     layer, id = self.layer2id.popitem()
438     layer.Unsubscribe(LAYER_CHANGED,
439     self._OnMsgLayerChanged)
440     layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
441     self._OnMsgLayerVisibilityChanged)
442 jonathan 652 layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
443 jonathan 542
444 jonathan 578 self.DeleteAllItems()
445    
446 jonathan 632 def __SetVisibilityStyle(self, visible, id):
447 jonathan 572 font = self.GetItemFont(id)
448 jonathan 542
449 jonathan 632 if visible:
450 jonathan 572 font.SetStyle(wxNORMAL)
451     color = wxBLACK
452     else:
453     font.SetStyle(wxITALIC)
454     color = wxLIGHT_GREY
455 jonathan 542
456 jonathan 572 self.SetItemTextColour(id, color)
457     self.SetItemFont(id, font)
458    
459     def __ShowHideLayer(self, layer):
460     parent = self.layer2id[layer]
461 jonathan 605 assert parent.IsOk()
462 jonathan 542
463 jonathan 632 visible = layer.Visible()
464 jonathan 542
465 jonathan 632 self.__SetVisibilityStyle(visible, parent)
466 jonathan 542
467 jonathan 572 id, cookie = self.GetFirstChild(parent, 123)
468 jonathan 542
469 jonathan 572 while id.IsOk():
470 jonathan 632 self.__SetVisibilityStyle(visible, id)
471 jonathan 572 id, cookie = self.GetNextChild(parent, cookie)
472    

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26