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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 655 - (show 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 # 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 import resource
13
14 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 from Thuban.UI.messages import *
22 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_RAISE = 4001
28 ID_LEGEND_LOWER = 4002
29 ID_LEGEND_TREE = 4003
30 ID_LEGEND_PROPS = 4004
31 ID_LEGEND_SHOWLAYER = 4005
32 ID_LEGEND_HIDELAYER = 4006
33
34 BMP_SIZE_W = 30
35 BMP_SIZE_H = 15
36
37 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 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 self.buttons = []
53
54 panelBox = wxBoxSizer(wxVERTICAL)
55
56 self.toolBar = wxToolBar(self, -1)
57
58 bmp = resource.GetBitmapResource(RAISE_BMP, wxBITMAP_TYPE_XPM)
59 self.toolBar.AddTool(ID_LEGEND_RAISE, bmp,
60 shortHelpString=_("Raise Layer"))
61
62 bmp = resource.GetBitmapResource(LOWER_BMP, wxBITMAP_TYPE_XPM)
63 self.toolBar.AddTool(ID_LEGEND_LOWER, bmp,
64 shortHelpString=_("Lower Layer"))
65
66 bmp = resource.GetBitmapResource(SHOW_BMP, wxBITMAP_TYPE_XPM)
67 self.toolBar.AddTool(ID_LEGEND_SHOWLAYER, bmp,
68 shortHelpString=_("Show Layer"))
69
70 bmp = resource.GetBitmapResource(HIDE_BMP, wxBITMAP_TYPE_XPM)
71 self.toolBar.AddTool(ID_LEGEND_HIDELAYER, bmp,
72 shortHelpString=_("Hide Layer"))
73
74 bmp = resource.GetBitmapResource(PROPS_BMP, wxBITMAP_TYPE_XPM)
75 self.toolBar.AddTool(ID_LEGEND_PROPS, bmp,
76 shortHelpString=_("Edit Layer Properties"))
77
78 self.toolBar.Realize()
79 panelBox.Add(self.toolBar, 0, wxALL, 0)
80
81 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
87 self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
88
89 panelBox.Add(self.tree, 1, wxGROW, 4)
90
91 panelBox.Fit(self)
92
93 self.SetAutoLayout(True)
94 self.SetSizer(panelBox)
95 panelBox.SetSizeHints(self)
96
97 self.panelBox = panelBox
98
99 self.__EnableButtons(False)
100
101 EVT_CLOSE(self, self._OnClose)
102
103
104 def GetMap(self):
105 return self.tree.GetMap()
106
107 def SetMap(self, map):
108 self.tree.SetMap(map)
109
110 def DoOnSelChanged(self, layer, group):
111
112 ok = isinstance(layer, Layer)
113 self.__EnableButtons(ok)
114
115 self.mainWindow.SelectLayer(layer)
116
117 def DoOnProperties(self):
118 list = self.tree.GetSelectedHierarchy()
119
120 ok = isinstance(list[0], Layer)
121 if ok:
122 self.mainWindow.OpenLayerProperties(list[0], list[1])
123
124 def Destroy(self):
125 self.__Close()
126
127 def _OnProperties(self, event):
128 self.DoOnProperties()
129
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 #def Close(self, force = False):
141 #DockPanel.Close(self, force)
142
143 def _OnClose(self, event):
144 self.__Close()
145
146 def _OnHideLayer(self, event):
147 self.tree.DoOnHideLayer()
148 pass
149
150 def __EnableButtons(self, on):
151 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
157 def __Close(self):
158 self.tree.Close()
159
160 class LegendTree(wxTreeCtrl):
161
162 def __init__(self, parent, id, map, mainWindow):
163 wxTreeCtrl.__init__(self, parent, id,
164 style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
165 size = (200, 200))
166
167 self.mainWindow = mainWindow
168 self.map = None
169 self.parent = parent
170 self.layer2id = {}
171
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 EVT_CLOSE(self, self._OnClose)
181
182 self.SetMap(map)
183
184 def _OnClose(self, event):
185 self.SetMap(None)
186
187 def GetMap(self):
188 return self.map
189
190 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 #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 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 #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
212 #self._OnMsgMapsChanged)
213 #self.mainWindow.application.Subscribe(SESSION_REPLACED,
214 #self._OnMsgMapsChanged)
215 self.__FillTree(self.map)
216
217
218 def MoveCurrentItemUp(self):
219 cur_id = self.GetSelection()
220 assert cur_id.IsOk()
221
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 assert False, "Shouldn't be here."
237 pass
238
239 def MoveCurrentItemDown(self):
240 cur_id = self.GetSelection()
241 assert cur_id.IsOk()
242
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 assert False, "Shouldn't be here."
251 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 #self.__ShowHideLayer(True)
268 layer, group = self.GetSelectedHierarchy()
269 layer.SetVisible(True)
270
271 def DoOnHideLayer(self):
272 #self.__ShowHideLayer(False)
273 layer, group = self.GetSelectedHierarchy()
274 layer.SetVisible(False)
275
276 def Sort(self):
277 self.SortChildren(self.GetRootItem())
278
279 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 def _OnMsgMapsChanged(self):
297 #print self.map is self.mainWindow.Map()
298 self.SetMap(self.mainWindow.Map())
299
300 def _OnSelChanged(self, event):
301 self.__UpdateSelection()
302
303 def _OnItemActivated(self, event):
304 self.parent.DoOnProperties()
305
306 def _OnMsgLayerChanged(self, layer):
307 assert isinstance(layer, Layer)
308
309 id = self.layer2id[layer]
310 assert id.IsOk()
311
312 # 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 self.__UpdateSelection()
318 #self.__FillTreeLayer(id)
319
320 def _OnMsgMapStackingChanged(self, *args):
321 self.Sort()
322 id = self.GetSelection()
323
324 if id.IsOk():
325 self.EnsureVisible(id)
326 self.__UpdateSelection()
327
328 def _OnMsgMapLayersAddedRemoved(self, map):
329 assert map is self.map
330
331 self.__FillTree(self.map)
332 self.__UpdateSelection()
333
334 def _OnMsgLayerVisibilityChanged(self, layer):
335 assert isinstance(layer, Layer)
336
337 self.__ShowHideLayer(layer)
338 self.__UpdateSelection()
339
340 def _OnMsgLayerTitleChanged(self, layer):
341
342 id = self.layer2id[layer]
343 if id.IsOk():
344 self.SetItemText(id, layer.Title())
345 self.__UpdateSelection()
346
347 def __UpdateSelection(self):
348 layer, group = self.GetSelectedHierarchy()
349 self.parent.DoOnSelChanged(layer, group)
350
351 def __FillTree(self, map):
352
353 assert isinstance(map, Map)
354
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 l.Subscribe(LAYER_VISIBILITY_CHANGED,
381 self._OnMsgLayerVisibilityChanged)
382 l.Subscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
383 self.SetPyData(id, l)
384 self.__SetVisibilityStyle(l.Visible(), id)
385
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 show = layer.Visible()
405 for g in clazz:
406 if g.IsVisible():
407 id = self.AppendItem(pid, g.GetDisplayText())
408 self.SetPyData(id, g)
409 self.__SetVisibilityStyle(show, id)
410
411 bmp = self.__BuildGroupImage(g, shapeType)
412
413 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
419 self.Thaw()
420
421 def __BuildGroupImage(self, group, shapeType):
422 assert isinstance(group, ClassGroup)
423
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 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 layer.Unsubscribe(TITLE_CHANGED, self._OnMsgLayerTitleChanged)
443
444 self.DeleteAllItems()
445
446 def __SetVisibilityStyle(self, visible, id):
447 font = self.GetItemFont(id)
448
449 if visible:
450 font.SetStyle(wxNORMAL)
451 color = wxBLACK
452 else:
453 font.SetStyle(wxITALIC)
454 color = wxLIGHT_GREY
455
456 self.SetItemTextColour(id, color)
457 self.SetItemFont(id, font)
458
459 def __ShowHideLayer(self, layer):
460 parent = self.layer2id[layer]
461 assert parent.IsOk()
462
463 visible = layer.Visible()
464
465 self.__SetVisibilityStyle(visible, parent)
466
467 id, cookie = self.GetFirstChild(parent, 123)
468
469 while id.IsOk():
470 self.__SetVisibilityStyle(visible, id)
471 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