/[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 658 - (hide annotations)
Mon Apr 14 14:06:30 2003 UTC (21 years, 10 months ago) by jonathan
Original Path: trunk/thuban/Thuban/UI/legend.py
File MIME type: text/x-python
File size: 13703 byte(s)
Call Create() at the end of __init__.

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 658 self.toolBar.SetToolBitmapSize(wxSize(24, 24))
58 jonathan 542
59 jonathan 652 bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)
60     self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
61     shortHelpString=_("Raise Layer"))
62 jonathan 542
63 jonathan 652 bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)
64     self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
65     shortHelpString=_("Lower Layer"))
66 jonathan 542
67 jonathan 652 bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)
68     self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
69     shortHelpString=_("Show Layer"))
70 jonathan 542
71 jonathan 652 bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)
72     self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
73     shortHelpString=_("Hide Layer"))
74 jonathan 542
75 jonathan 652 bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)
76     self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
77     shortHelpString=_("Edit Layer Properties"))
78 jonathan 542
79 jonathan 652 self.toolBar.Realize()
80     panelBox.Add(self.toolBar, 0, wxALL, 0)
81 jonathan 542
82 jonathan 652 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 jonathan 542
88 jonathan 562 self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
89 jonathan 542
90 jonathan 658 panelBox.Add(self.tree, 1, wxGROW, 0)
91 jonathan 542
92 jonathan 658 #panelBox.Fit(self)
93 jonathan 572
94 jonathan 562 self.SetAutoLayout(True)
95     self.SetSizer(panelBox)
96 jonathan 542 panelBox.SetSizeHints(self)
97    
98 jonathan 658 print "legend: ", self.GetSize()
99    
100 jonathan 562 self.panelBox = panelBox
101 jonathan 542
102 jonathan 652 self.__EnableButtons(False)
103    
104 jonathan 658 self.Create()
105    
106 jonathan 572 EVT_CLOSE(self, self._OnClose)
107    
108    
109 jonathan 562 def GetMap(self):
110     return self.tree.GetMap()
111    
112     def SetMap(self, map):
113     self.tree.SetMap(map)
114    
115 jonathan 572 def DoOnSelChanged(self, layer, group):
116 jonathan 542
117 jonathan 572 ok = isinstance(layer, Layer)
118     self.__EnableButtons(ok)
119    
120 jonathan 655 self.mainWindow.SelectLayer(layer)
121 jonathan 568
122 jonathan 639 def DoOnProperties(self):
123 jonathan 572 list = self.tree.GetSelectedHierarchy()
124    
125     ok = isinstance(list[0], Layer)
126     if ok:
127 jonathan 639 self.mainWindow.OpenLayerProperties(list[0], list[1])
128 jonathan 572
129 jonathan 578 def Destroy(self):
130     self.__Close()
131    
132 jonathan 639 def _OnProperties(self, event):
133     self.DoOnProperties()
134 jonathan 542
135     def _OnMoveUp(self, event):
136     self.tree.MoveCurrentItemUp()
137    
138     def _OnMoveDown(self, event):
139     self.tree.MoveCurrentItemDown()
140    
141     def _OnShowLayer(self, event):
142     self.tree.DoOnShowLayer()
143     pass
144    
145 jonathan 578 #def Close(self, force = False):
146     #DockPanel.Close(self, force)
147    
148 jonathan 572 def _OnClose(self, event):
149 jonathan 578 self.__Close()
150 jonathan 572
151 jonathan 542 def _OnHideLayer(self, event):
152     self.tree.DoOnHideLayer()
153     pass
154    
155     def __EnableButtons(self, on):
156 jonathan 652 self.toolBar.EnableTool(ID_LEGEND_RAISE, on)
157     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 jonathan 542
162 jonathan 578 def __Close(self):
163     self.tree.Close()
164    
165 jonathan 542 class LegendTree(wxTreeCtrl):
166    
167 jonathan 562 def __init__(self, parent, id, map, mainWindow):
168 jonathan 542 wxTreeCtrl.__init__(self, parent, id,
169     style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
170     size = (200, 200))
171    
172 jonathan 572 self.mainWindow = mainWindow
173 jonathan 562 self.map = None
174 jonathan 542 self.parent = parent
175 jonathan 572 self.layer2id = {}
176 jonathan 542
177     self.image_list = None
178     self.emptyImageIndex = 0
179    
180     self.previewer = ClassDataPreviewer()
181    
182     EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
183     EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
184    
185 jonathan 572 EVT_CLOSE(self, self._OnClose)
186    
187 jonathan 562 self.SetMap(map)
188 jonathan 542
189 jonathan 572 def _OnClose(self, event):
190     self.SetMap(None)
191    
192 jonathan 562 def GetMap(self):
193     return self.map
194 jonathan 542
195 jonathan 562 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 jonathan 572 #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 jonathan 562 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 jonathan 572 #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
217     #self._OnMsgMapsChanged)
218     #self.mainWindow.application.Subscribe(SESSION_REPLACED,
219     #self._OnMsgMapsChanged)
220 jonathan 562 self.__FillTree(self.map)
221    
222    
223 jonathan 542 def MoveCurrentItemUp(self):
224     cur_id = self.GetSelection()
225 jonathan 605 assert cur_id.IsOk()
226 jonathan 542
227     cur_data = self.GetPyData(cur_id)
228    
229     #prev_id = self.GetPrevSibling(cur_id)
230    
231     #
232     # Get out if there's nowhere to go
233     #
234     #if prev_id == INVALID_TREE_ID: return
235    
236     if isinstance(cur_data, Layer):
237     self.map.RaiseLayer(cur_data)
238     elif isinstance(cur_data, ClassGroup):
239     pass
240     else:
241 jonathan 605 assert False, "Shouldn't be here."
242 jonathan 542 pass
243    
244     def MoveCurrentItemDown(self):
245     cur_id = self.GetSelection()
246 jonathan 605 assert cur_id.IsOk()
247 jonathan 542
248     cur_data = self.GetPyData(cur_id)
249    
250     if isinstance(cur_data, Layer):
251     self.map.LowerLayer(cur_data)
252     elif isinstance(cur_data, ClassGroup):
253     pass
254     else:
255 jonathan 605 assert False, "Shouldn't be here."
256 jonathan 542 pass
257    
258    
259     def OnCompareItems(self, item1, item2):
260    
261     data1 = self.GetPyData(item1)
262     data2 = self.GetPyData(item2)
263    
264     if isinstance(data1, Layer):
265     layers = self.map.Layers()
266     return layers.index(data2) - layers.index(data1)
267     else:
268     return wxTreeCtrl.OnCompareItems(self, item1, item2)
269    
270    
271     def DoOnShowLayer(self):
272 jonathan 572 #self.__ShowHideLayer(True)
273     layer, group = self.GetSelectedHierarchy()
274     layer.SetVisible(True)
275 jonathan 542
276     def DoOnHideLayer(self):
277 jonathan 572 #self.__ShowHideLayer(False)
278     layer, group = self.GetSelectedHierarchy()
279     layer.SetVisible(False)
280 jonathan 542
281     def Sort(self):
282     self.SortChildren(self.GetRootItem())
283    
284 jonathan 655 def GetSelectedHierarchy(self):
285     id = self.GetSelection()
286    
287     if not id.IsOk():
288     return (None, None)
289    
290     layer = self.GetPyData(id)
291     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 jonathan 572 def _OnMsgMapsChanged(self):
302 jonathan 639 #print self.map is self.mainWindow.Map()
303 jonathan 572 self.SetMap(self.mainWindow.Map())
304    
305 jonathan 542 def _OnSelChanged(self, event):
306 jonathan 655 self.__UpdateSelection()
307 jonathan 542
308     def _OnItemActivated(self, event):
309 jonathan 639 self.parent.DoOnProperties()
310 jonathan 542
311     def _OnMsgLayerChanged(self, layer):
312 jonathan 605 assert isinstance(layer, Layer)
313 jonathan 542
314     id = self.layer2id[layer]
315 jonathan 605 assert id.IsOk()
316 jonathan 542
317 jonathan 578 # 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 jonathan 655 self.__UpdateSelection()
323 jonathan 578 #self.__FillTreeLayer(id)
324 jonathan 542
325     def _OnMsgMapStackingChanged(self, *args):
326     self.Sort()
327 jonathan 562 id = self.GetSelection()
328 jonathan 542
329 jonathan 562 if id.IsOk():
330     self.EnsureVisible(id)
331 jonathan 655 self.__UpdateSelection()
332 jonathan 562
333     def _OnMsgMapLayersAddedRemoved(self, map):
334 jonathan 605 assert map is self.map
335 jonathan 542
336     self.__FillTree(self.map)
337 jonathan 655 self.__UpdateSelection()
338 jonathan 542
339 jonathan 572 def _OnMsgLayerVisibilityChanged(self, layer):
340 jonathan 605 assert isinstance(layer, Layer)
341 jonathan 572
342     self.__ShowHideLayer(layer)
343 jonathan 655 self.__UpdateSelection()
344 jonathan 572
345 jonathan 652 def _OnMsgLayerTitleChanged(self, layer):
346    
347     id = self.layer2id[layer]
348     if id.IsOk():
349     self.SetItemText(id, layer.Title())
350 jonathan 655 self.__UpdateSelection()
351 jonathan 652
352 jonathan 655 def __UpdateSelection(self):
353     layer, group = self.GetSelectedHierarchy()
354     self.parent.DoOnSelChanged(layer, group)
355    
356 jonathan 542 def __FillTree(self, map):
357    
358 jonathan 605 assert isinstance(map, Map)
359 jonathan 542
360     self.Freeze()
361    
362     self.__DeleteAllItems()
363    
364     if map.HasLayers():
365    
366     self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
367    
368     bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
369     dc = wxMemoryDC()
370     dc.SelectObject(bmp)
371     dc.SetBrush(wxBLACK_BRUSH)
372     dc.Clear()
373     dc.SelectObject(wxNullBitmap)
374    
375     self.emptyImageIndex = \
376     self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
377    
378     self.AssignImageList(self.image_list)
379    
380     root = self.AddRoot("")
381    
382     for l in map.Layers():
383     id = self.PrependItem(root, l.Title())
384     l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
385 jonathan 572 l.Subscribe(LAYER_VISIBILITY_CHANGED,
386     self._OnMsgLayerVisibilityChanged)
387 jonathan 652 l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
388 jonathan 542 self.SetPyData(id, l)
389 jonathan 632 self.__SetVisibilityStyle(l.Visible(), id)
390 jonathan 542
391     self.layer2id[l] = id
392    
393     self.__FillTreeLayer(id)
394     self.Expand(id)
395    
396     self.Thaw()
397    
398     def __FillTreeLayer(self, pid):
399     layer = self.GetPyData(pid)
400    
401     self.Freeze()
402    
403     self.DeleteChildren(pid)
404    
405     clazz = layer.GetClassification()
406    
407     shapeType = layer.ShapeType()
408    
409 jonathan 632 show = layer.Visible()
410 jonathan 542 for g in clazz:
411 jonathan 639 if g.IsVisible():
412     id = self.AppendItem(pid, g.GetDisplayText())
413     self.SetPyData(id, g)
414     self.__SetVisibilityStyle(show, id)
415 jonathan 542
416 jonathan 639 bmp = self.__BuildGroupImage(g, shapeType)
417 jonathan 542
418 jonathan 639 if bmp is None:
419     self.SetItemImage(id, self.emptyImageIndex)
420     else:
421     i = self.image_list.Add(bmp)
422     self.SetItemImage(id, i)
423 jonathan 542
424     self.Thaw()
425    
426     def __BuildGroupImage(self, group, shapeType):
427 jonathan 605 assert isinstance(group, ClassGroup)
428 jonathan 542
429     bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
430     #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
431     dc = wxMemoryDC()
432     dc.SelectObject(bmp)
433     dc.Clear()
434    
435     self.previewer.Draw(dc, None, group.GetProperties(), shapeType)
436    
437     return bmp
438    
439     def __DeleteAllItems(self):
440    
441 jonathan 572 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 jonathan 652 layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
448 jonathan 542
449 jonathan 578 self.DeleteAllItems()
450    
451 jonathan 632 def __SetVisibilityStyle(self, visible, id):
452 jonathan 572 font = self.GetItemFont(id)
453 jonathan 542
454 jonathan 632 if visible:
455 jonathan 572 font.SetStyle(wxNORMAL)
456     color = wxBLACK
457     else:
458     font.SetStyle(wxITALIC)
459     color = wxLIGHT_GREY
460 jonathan 542
461 jonathan 572 self.SetItemTextColour(id, color)
462     self.SetItemFont(id, font)
463    
464     def __ShowHideLayer(self, layer):
465     parent = self.layer2id[layer]
466 jonathan 605 assert parent.IsOk()
467 jonathan 542
468 jonathan 632 visible = layer.Visible()
469 jonathan 542
470 jonathan 632 self.__SetVisibilityStyle(visible, parent)
471 jonathan 542
472 jonathan 572 id, cookie = self.GetFirstChild(parent, 123)
473 jonathan 542
474 jonathan 572 while id.IsOk():
475 jonathan 632 self.__SetVisibilityStyle(visible, id)
476 jonathan 572 id, cookie = self.GetNextChild(parent, cookie)
477    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26