/[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 572 - (show annotations)
Fri Mar 28 17:06:50 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: 12591 byte(s)
Modifications to support selecting a
        specific group in the classification dialog. Changed how layers
        are drawn when the layer is visible/invisible.

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 _OnClassify(self, event):
116 self.DoOnClassify()
117
118 def _OnMoveUp(self, event):
119 self.tree.MoveCurrentItemUp()
120
121 def _OnMoveDown(self, event):
122 self.tree.MoveCurrentItemDown()
123
124 def _OnShowLayer(self, event):
125 self.tree.DoOnShowLayer()
126 pass
127
128 def _OnClose(self, event):
129 self.tree.Close()
130
131 def _OnHideLayer(self, event):
132 self.tree.DoOnHideLayer()
133 pass
134
135 def __EnableButtons(self, on):
136 for b in self.buttons:
137 b.Enable(on)
138
139 class LegendTree(wxTreeCtrl):
140
141 def __init__(self, parent, id, map, mainWindow):
142 wxTreeCtrl.__init__(self, parent, id,
143 style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
144 size = (200, 200))
145
146 self.mainWindow = mainWindow
147 self.map = None
148 self.parent = parent
149 self.layer2id = {}
150
151 self.image_list = None
152 self.emptyImageIndex = 0
153
154 self.previewer = ClassDataPreviewer()
155
156 EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
157 EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
158
159 EVT_CLOSE(self, self._OnClose)
160
161 self.SetMap(map)
162
163 def _OnClose(self, event):
164 print "LegendTree destroyed"
165 self.SetMap(None)
166
167 def GetMap(self):
168 return self.map
169
170 def SetMap(self, map):
171
172 sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
173 (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),
174 (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]
175
176 if self.map is not None:
177 for msg, func in sub_list: self.map.Unsubscribe(msg, func)
178 #self.mainWindow.application.Unsubscribe(SESSION_REPLACED,
179 #self._OnMsgMapsChanged)
180 #try:
181 #self.mainWindow.application.session.Unsubscribe(MAPS_CHANGED,
182 #self._OnMsgMapsChanged)
183 #except ConnectorError:
184 #pass
185 self.__DeleteAllItems()
186
187 self.map = map
188
189 if self.map is not None:
190 for msg, func in sub_list: self.map.Subscribe(msg, func)
191 #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
192 #self._OnMsgMapsChanged)
193 #self.mainWindow.application.Subscribe(SESSION_REPLACED,
194 #self._OnMsgMapsChanged)
195 self.__FillTree(self.map)
196
197
198 def MoveCurrentItemUp(self):
199 cur_id = self.GetSelection()
200 assert(cur_id.IsOk())
201
202 cur_data = self.GetPyData(cur_id)
203
204 #prev_id = self.GetPrevSibling(cur_id)
205
206 #
207 # Get out if there's nowhere to go
208 #
209 #if prev_id == INVALID_TREE_ID: return
210
211 if isinstance(cur_data, Layer):
212 self.map.RaiseLayer(cur_data)
213 elif isinstance(cur_data, ClassGroup):
214 pass
215 else:
216 assert(False, "Shouldn't be here.")
217 pass
218
219 def MoveCurrentItemDown(self):
220 cur_id = self.GetSelection()
221 assert(cur_id.IsOk())
222
223 cur_data = self.GetPyData(cur_id)
224
225 if isinstance(cur_data, Layer):
226 self.map.LowerLayer(cur_data)
227 elif isinstance(cur_data, ClassGroup):
228 pass
229 else:
230 assert(False, "Shouldn't be here.")
231 pass
232
233
234 def OnCompareItems(self, item1, item2):
235
236 data1 = self.GetPyData(item1)
237 data2 = self.GetPyData(item2)
238
239 if isinstance(data1, Layer):
240 layers = self.map.Layers()
241 return layers.index(data2) - layers.index(data1)
242 else:
243 return wxTreeCtrl.OnCompareItems(self, item1, item2)
244
245
246 def DoOnShowLayer(self):
247 #self.__ShowHideLayer(True)
248 layer, group = self.GetSelectedHierarchy()
249 layer.SetVisible(True)
250
251 def DoOnHideLayer(self):
252 #self.__ShowHideLayer(False)
253 layer, group = self.GetSelectedHierarchy()
254 layer.SetVisible(False)
255
256 # def DoOnClassify(self):
257 # id = self.GetSelection()
258 # assert(id.IsOk())
259
260 # item = self.GetPyData(id)
261 # if isinstance(item, ClassGroup):
262 # id = self.GetItemParent(id)
263 # assert(id.IsOk())
264 # item = self.GetPyData(id)
265
266 # # XXX: THIS IS SUCH AWFUL STYLE! YUCK!
267 # self.parent.mainWindow.OpenClassifier(item)
268 # #assert(False, "XXX: FIXME HERE")
269
270 def Sort(self):
271 self.SortChildren(self.GetRootItem())
272
273 def _OnMsgMapsChanged(self):
274 print "ADfsadfsadfsadfsa"
275 print self.map is self.mainWindow.Map()
276 self.SetMap(self.mainWindow.Map())
277
278 def _OnSelChanged(self, event):
279
280 layer, group = self.GetSelectedHierarchy()
281 self.parent.DoOnSelChanged(layer, group)
282
283 def _OnItemActivated(self, event):
284 self.parent.DoOnClassify()
285
286 def _OnMsgLayerChanged(self, layer):
287 assert(isinstance(layer, Layer))
288
289 id = self.layer2id[layer]
290
291 self.__FillTreeLayer(id)
292
293 def _OnMsgMapStackingChanged(self, *args):
294 self.Sort()
295 id = self.GetSelection()
296
297 if id.IsOk():
298 self.EnsureVisible(id)
299
300 def _OnMsgMapLayersAddedRemoved(self, map):
301 assert(map is self.map)
302
303 self.__FillTree(self.map)
304
305 def _OnMsgLayerVisibilityChanged(self, layer):
306 assert(isinstance(layer, Layer))
307
308 self.__ShowHideLayer(layer)
309
310 def GetSelectedHierarchy(self):
311 id = self.GetSelection()
312 assert(id.IsOk())
313
314 layer = self.GetPyData(id)
315 group = None
316
317 if isinstance(layer, ClassGroup):
318 id = self.GetItemParent(id)
319 assert(id.IsOk())
320 group = layer
321 layer = self.GetPyData(id)
322
323 return (layer, group)
324
325 def __FillTree(self, map):
326
327 assert(isinstance(map, Map))
328
329 self.Freeze()
330
331 self.__DeleteAllItems()
332
333 if map.HasLayers():
334
335 self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
336
337 bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
338 dc = wxMemoryDC()
339 dc.SelectObject(bmp)
340 dc.SetBrush(wxBLACK_BRUSH)
341 dc.Clear()
342 dc.SelectObject(wxNullBitmap)
343
344 self.emptyImageIndex = \
345 self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
346
347 self.AssignImageList(self.image_list)
348
349 root = self.AddRoot("")
350
351 for l in map.Layers():
352 id = self.PrependItem(root, l.Title())
353 l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
354 l.Subscribe(LAYER_VISIBILITY_CHANGED,
355 self._OnMsgLayerVisibilityChanged)
356 self.SetPyData(id, l)
357 font = self.GetItemFont(id)
358 if not l.Visible():
359 font.SetStyle(wxITALIC)
360 self.SetItemFont(id, font)
361
362 self.layer2id[l] = id
363
364 self.__FillTreeLayer(id)
365 self.Expand(id)
366
367 self.Thaw()
368
369 def __FillTreeLayer(self, pid):
370 layer = self.GetPyData(pid)
371
372 self.Freeze()
373
374 self.DeleteChildren(pid)
375
376 clazz = layer.GetClassification()
377
378 shapeType = layer.ShapeType()
379
380 for g in clazz:
381 id = self.AppendItem(pid, g.GetDisplayText())
382 self.SetPyData(id, g)
383
384 bmp = self.__BuildGroupImage(g, shapeType)
385
386 if bmp is None:
387 self.SetItemImage(id, self.emptyImageIndex)
388 else:
389 i = self.image_list.Add(bmp)
390 self.SetItemImage(id, i)
391
392 #self.layer2id[g] = id
393
394 self.Thaw()
395
396 def __BuildGroupImage(self, group, shapeType):
397 assert(isinstance(group, ClassGroup))
398
399 bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
400 #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
401 dc = wxMemoryDC()
402 dc.SelectObject(bmp)
403 dc.Clear()
404
405 self.previewer.Draw(dc, None, group.GetProperties(), shapeType)
406
407 return bmp
408
409 def __DeleteAllItems(self):
410 self.DeleteAllItems()
411
412 while len(self.layer2id) > 0:
413 layer, id = self.layer2id.popitem()
414 layer.Unsubscribe(LAYER_CHANGED,
415 self._OnMsgLayerChanged)
416 layer.Unsubscribe(LAYER_VISIBILITY_CHANGED,
417 self._OnMsgLayerVisibilityChanged)
418
419
420 def __ShowHideHelper(self, show, id):
421 font = self.GetItemFont(id)
422
423 if show:
424 font.SetStyle(wxNORMAL)
425 color = wxBLACK
426 else:
427 font.SetStyle(wxITALIC)
428 color = wxLIGHT_GREY
429
430 self.SetItemTextColour(id, color)
431 self.SetItemFont(id, font)
432
433 def __ShowHideLayer(self, layer):
434 parent = self.layer2id[layer]
435 assert(parent.IsOk())
436
437 show = layer.Visible()
438
439
440 self.__ShowHideHelper(show, parent)
441
442 id, cookie = self.GetFirstChild(parent, 123)
443
444 while id.IsOk():
445 self.__ShowHideHelper(show, id)
446 id, cookie = self.GetNextChild(parent, cookie)
447

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26