/[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 665 - (show annotations)
Mon Apr 14 16:35:19 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: 13662 byte(s)
remove print statement

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26