/[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 914 - (show annotations)
Fri May 16 16:25:41 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/Thuban/UI/legend.py
File MIME type: text/x-python
File size: 15001 byte(s)
(ScalebarBitmap.__SetScale): Update to extended scalebar.DrawScalebar header.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26