/[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 605 - (show annotations)
Fri Apr 4 12:16: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: 12997 byte(s)
Fix assert calls.

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_CLASSIFY = 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_CLASSIFY, _("Classify"))
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_CLASSIFY, self._OnClassify)
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 DoOnClassify(self):
109 list = self.tree.GetSelectedHierarchy()
110
111 ok = isinstance(list[0], Layer)
112 if ok:
113 self.mainWindow.OpenClassifier(list[0], list[1])
114
115 def Destroy(self):
116 self.__Close()
117
118 def _OnClassify(self, event):
119 self.DoOnClassify()
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 DoOnClassify(self):
265 # id = self.GetSelection()
266 # assert id.IsOk()
267
268 # item = self.GetPyData(id)
269 # if isinstance(item, ClassGroup):
270 # id = self.GetItemParent(id)
271 # assert id.IsOk()
272 # item = self.GetPyData(id)
273
274 # # XXX: THIS IS SUCH AWFUL STYLE! YUCK!
275 # self.parent.mainWindow.OpenClassifier(item)
276 # #assert False, "XXX: FIXME HERE"
277
278 def Sort(self):
279 self.SortChildren(self.GetRootItem())
280
281 def _OnMsgMapsChanged(self):
282 print "ADfsadfsadfsadfsa"
283 print self.map is self.mainWindow.Map()
284 self.SetMap(self.mainWindow.Map())
285
286 def _OnSelChanged(self, event):
287
288 layer, group = self.GetSelectedHierarchy()
289 self.parent.DoOnSelChanged(layer, group)
290
291 def _OnItemActivated(self, event):
292 self.parent.DoOnClassify()
293
294 def _OnMsgLayerChanged(self, layer):
295 assert isinstance(layer, Layer)
296
297 id = self.layer2id[layer]
298 assert id.IsOk()
299
300 # XXX: yikes! this is so bad, we should be doing what is
301 # commented out, but there is a problem with keeping
302 # track of the images in the image list when we replace
303 # a layer. it ends up causing a seg fault.
304 self.__FillTree(self.map)
305 #self.__FillTreeLayer(id)
306
307 def _OnMsgMapStackingChanged(self, *args):
308 self.Sort()
309 id = self.GetSelection()
310
311 if id.IsOk():
312 self.EnsureVisible(id)
313
314 def _OnMsgMapLayersAddedRemoved(self, map):
315 assert map is self.map
316
317 self.__FillTree(self.map)
318
319 def _OnMsgLayerVisibilityChanged(self, layer):
320 assert isinstance(layer, Layer)
321
322 self.__ShowHideLayer(layer)
323
324 def GetSelectedHierarchy(self):
325 id = self.GetSelection()
326 assert id.IsOk()
327
328 layer = self.GetPyData(id)
329 group = None
330
331 if isinstance(layer, ClassGroup):
332 id = self.GetItemParent(id)
333 assert id.IsOk()
334 group = layer
335 layer = self.GetPyData(id)
336
337 return (layer, group)
338
339 def __FillTree(self, map):
340
341 assert isinstance(map, Map)
342
343 self.Freeze()
344
345 self.__DeleteAllItems()
346
347 if map.HasLayers():
348
349 self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
350
351 bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
352 dc = wxMemoryDC()
353 dc.SelectObject(bmp)
354 dc.SetBrush(wxBLACK_BRUSH)
355 dc.Clear()
356 dc.SelectObject(wxNullBitmap)
357
358 self.emptyImageIndex = \
359 self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
360
361 self.AssignImageList(self.image_list)
362
363 root = self.AddRoot("")
364
365 for l in map.Layers():
366 id = self.PrependItem(root, l.Title())
367 l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
368 l.Subscribe(LAYER_VISIBILITY_CHANGED,
369 self._OnMsgLayerVisibilityChanged)
370 self.SetPyData(id, l)
371 font = self.GetItemFont(id)
372 if not l.Visible():
373 font.SetStyle(wxITALIC)
374 self.SetItemFont(id, font)
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 for g in clazz:
395 id = self.AppendItem(pid, g.GetDisplayText())
396 self.SetPyData(id, g)
397
398 bmp = self.__BuildGroupImage(g, shapeType)
399
400 if bmp is None:
401 self.SetItemImage(id, self.emptyImageIndex)
402 else:
403 i = self.image_list.Add(bmp)
404 self.SetItemImage(id, i)
405
406 self.Thaw()
407
408 def __BuildGroupImage(self, group, shapeType):
409 assert isinstance(group, ClassGroup)
410
411 bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
412 #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
413 dc = wxMemoryDC()
414 dc.SelectObject(bmp)
415 dc.Clear()
416
417 self.previewer.Draw(dc, None, group.GetProperties(), shapeType)
418
419 return bmp
420
421 def __DeleteAllItems(self):
422
423 while len(self.layer2id) > 0:
424 layer, id = self.layer2id.popitem()
425 layer.Unsubscribe(LAYER_CHANGED,
426 self._OnMsgLayerChanged)
427 layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
428 self._OnMsgLayerVisibilityChanged)
429
430 self.DeleteAllItems()
431
432 def __ShowHideHelper(self, show, id):
433 font = self.GetItemFont(id)
434
435 if show:
436 font.SetStyle(wxNORMAL)
437 color = wxBLACK
438 else:
439 font.SetStyle(wxITALIC)
440 color = wxLIGHT_GREY
441
442 self.SetItemTextColour(id, color)
443 self.SetItemFont(id, font)
444
445 def __ShowHideLayer(self, layer):
446 parent = self.layer2id[layer]
447 assert parent.IsOk()
448
449 show = layer.Visible()
450
451
452 self.__ShowHideHelper(show, parent)
453
454 id, cookie = self.GetFirstChild(parent, 123)
455
456 while id.IsOk():
457 self.__ShowHideHelper(show, id)
458 id, cookie = self.GetNextChild(parent, cookie)
459

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26