/[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 639 - (show annotations)
Thu Apr 10 14:35:39 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: 12620 byte(s)
Classify button is now called "Properties".
Refactored the code to change variable names.
(LegendTree.__FillTreeLayer): Only list a group if it is visible.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26