/[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 795 - (show annotations)
Wed Apr 30 17:01:06 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: 13128 byte(s)
(LegendTree.MoveCurrentItemUp,
        LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
        groups are selected, move the layer up/down. Fixes RTbug #1833.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26