/[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 658 - (show annotations)
Mon Apr 14 14:06:30 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: 13703 byte(s)
Call Create() at the end of __init__.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26