/[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 568 - (show annotations)
Wed Mar 26 11:51:28 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: 10421 byte(s)
Removed unnecessary LegendDialog class.
(LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
        now part of DockableWindow.
(LegendPanel.DoOnSelChanged): Select the current layer in the map.
(LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
        with the selected layer and/or group.

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.classifier import ClassDataPreviewer
20 from Thuban.UI.dock import DockPanel
21
22 ID_LEGEND_MOVEUP = 4001
23 ID_LEGEND_MOVEDOWN = 4002
24 ID_LEGEND_TREE = 4003
25 ID_LEGEND_CLASSIFY = 4004
26 ID_LEGEND_SHOWLAYER = 4005
27 ID_LEGEND_HIDELAYER = 4006
28
29 BMP_SIZE_W = 30
30 BMP_SIZE_H = 15
31
32 class LegendPanel(DockPanel):
33
34 def __init__(self, parent, map, mainWindow):
35 DockPanel.__init__(self, parent, -1)
36
37 self.mainWindow = mainWindow
38 self.parent = parent
39
40 panelBox = wxBoxSizer(wxVERTICAL)
41
42 buttonBox = wxGridSizer(2, 3, 0, 0)
43
44 self.buttons = []
45
46 button = wxButton(self, ID_LEGEND_MOVEUP, _("Move Up"))
47 buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)
48 self.buttons.append(button)
49
50 button = wxButton(self, ID_LEGEND_SHOWLAYER, _("Show Layer"))
51 buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)
52 self.buttons.append(button)
53
54 button = wxButton(self, ID_LEGEND_CLASSIFY, _("Classify"))
55 buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)
56 self.buttons.append(button)
57
58 button = wxButton(self, ID_LEGEND_MOVEDOWN, _("Move Down"))
59 buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)
60 self.buttons.append(button)
61
62 button = wxButton(self, ID_LEGEND_HIDELAYER, _("Hide Layer"))
63 buttonBox.Add(button, 0, wxGROW | wxLEFT | wxRIGHT, 0)
64 self.buttons.append(button)
65
66 EVT_BUTTON(self, ID_LEGEND_MOVEUP, self._OnMoveUp)
67 EVT_BUTTON(self, ID_LEGEND_MOVEDOWN, self._OnMoveDown)
68 EVT_BUTTON(self, ID_LEGEND_CLASSIFY, self._OnClassify)
69 EVT_BUTTON(self, ID_LEGEND_SHOWLAYER, self._OnShowLayer)
70 EVT_BUTTON(self, ID_LEGEND_HIDELAYER, self._OnHideLayer)
71
72 panelBox.Add(buttonBox, 0, 0, 4)
73
74 self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
75
76 panelBox.Add(self.tree, 1, wxGROW, 4)
77
78 self.SetAutoLayout(True)
79 self.SetSizer(panelBox)
80 panelBox.SetSizeHints(self)
81
82 #panelBox.SetSizeHints(self.parent)
83
84 self.panelBox = panelBox
85
86 def GetMap(self):
87 return self.tree.GetMap()
88
89 def SetMap(self, map):
90 self.tree.SetMap(map)
91
92 def DoOnSelChanged(self, layer, group = None):
93 sel = self.tree.GetSelection()
94 self.__EnableButtons(sel.IsOk())
95
96 if sel.IsOk():
97 self.mainWindow.SelectLayer(layer)
98
99 def _OnClassify(self, event):
100 self.tree.DoOnClassify()
101
102 def _OnMoveUp(self, event):
103 self.tree.MoveCurrentItemUp()
104
105 def _OnMoveDown(self, event):
106 self.tree.MoveCurrentItemDown()
107
108 def _OnShowLayer(self, event):
109 self.tree.DoOnShowLayer()
110 pass
111
112 def _OnHideLayer(self, event):
113 self.tree.DoOnHideLayer()
114 pass
115
116 def __EnableButtons(self, on):
117 for b in self.buttons:
118 b.Enable(on)
119
120 class LegendTree(wxTreeCtrl):
121
122 def __init__(self, parent, id, map, mainWindow):
123 wxTreeCtrl.__init__(self, parent, id,
124 style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
125 size = (200, 200))
126
127 self.map = None
128 self.parent = parent
129 self.layer2id = None
130
131
132 self.image_list = None
133 self.emptyImageIndex = 0
134
135 self.previewer = ClassDataPreviewer()
136
137 EVT_TREE_ITEM_ACTIVATED(self, ID_LEGEND_TREE, self._OnItemActivated)
138 EVT_TREE_SEL_CHANGED(self, ID_LEGEND_TREE, self._OnSelChanged)
139
140 self.SetMap(map)
141
142 def GetMap(self):
143 return self.map
144
145 def SetMap(self, map):
146
147 sub_list = [(MAP_STACKING_CHANGED, self._OnMsgMapStackingChanged),
148 (MAP_LAYERS_ADDED, self._OnMsgMapLayersAddedRemoved),
149 (MAP_LAYERS_REMOVED, self._OnMsgMapLayersAddedRemoved)]
150
151 if self.map is not None:
152 for msg, func in sub_list: self.map.Unsubscribe(msg, func)
153 self.__DeleteAllItems()
154
155 self.map = map
156
157 if self.map is not None:
158 for msg, func in sub_list: self.map.Subscribe(msg, func)
159 self.__FillTree(self.map)
160
161
162 def MoveCurrentItemUp(self):
163 cur_id = self.GetSelection()
164 assert(cur_id.IsOk())
165
166 cur_data = self.GetPyData(cur_id)
167
168 #prev_id = self.GetPrevSibling(cur_id)
169
170 #
171 # Get out if there's nowhere to go
172 #
173 #if prev_id == INVALID_TREE_ID: return
174
175 if isinstance(cur_data, Layer):
176 self.map.RaiseLayer(cur_data)
177 elif isinstance(cur_data, ClassGroup):
178 pass
179 else:
180 assert(False, "Shouldn't be here.")
181 pass
182
183 def MoveCurrentItemDown(self):
184 cur_id = self.GetSelection()
185 assert(cur_id.IsOk())
186
187 cur_data = self.GetPyData(cur_id)
188
189 if isinstance(cur_data, Layer):
190 self.map.LowerLayer(cur_data)
191 elif isinstance(cur_data, ClassGroup):
192 pass
193 else:
194 assert(False, "Shouldn't be here.")
195 pass
196
197
198 def OnCompareItems(self, item1, item2):
199
200 data1 = self.GetPyData(item1)
201 data2 = self.GetPyData(item2)
202
203 if isinstance(data1, Layer):
204 layers = self.map.Layers()
205 return layers.index(data2) - layers.index(data1)
206 else:
207 return wxTreeCtrl.OnCompareItems(self, item1, item2)
208
209
210 def DoOnShowLayer(self):
211 self.__ShowHideLayer(True)
212
213 def DoOnHideLayer(self):
214 self.__ShowHideLayer(False)
215
216 def DoOnClassify(self):
217 id = self.GetSelection()
218 assert(id.IsOk())
219
220 item = self.GetPyData(id)
221 if isinstance(item, ClassGroup):
222 id = self.GetItemParent(id)
223 assert(id.IsOk())
224 item = self.GetPyData(id)
225
226 # XXX: THIS IS SUCH AWFUL STYLE! YUCK!
227 self.parent.mainWindow.OpenClassifier(item)
228 #assert(False, "XXX: FIXME HERE")
229
230 def Sort(self):
231 self.SortChildren(self.GetRootItem())
232
233 def _OnSelChanged(self, event):
234 id = self.GetSelection()
235 assert(id.IsOk())
236
237 group = None
238 layer = self.GetPyData(id)
239 if isinstance(layer, ClassGroup):
240 id = self.GetItemParent(id)
241 assert(id.IsOk())
242 group = layer
243 layer = self.GetPyData(id)
244
245 self.parent.DoOnSelChanged(layer, group)
246
247 def _OnItemActivated(self, event):
248 self.DoOnClassify()
249
250 def _OnMsgLayerChanged(self, layer):
251 assert(isinstance(layer, Layer))
252
253 id = self.layer2id[layer]
254
255 self.__FillTreeLayer(id)
256
257 def _OnMsgMapStackingChanged(self, *args):
258 self.Sort()
259 id = self.GetSelection()
260
261 if id.IsOk():
262 self.EnsureVisible(id)
263
264 def _OnMsgMapLayersAddedRemoved(self, map):
265 assert(id(map) == id(self.map))
266
267 self.__FillTree(self.map)
268
269 def __FillTree(self, map):
270
271 assert(isinstance(map, Map))
272
273 self.Freeze()
274
275 self.__DeleteAllItems()
276
277 if map.HasLayers():
278
279 self.image_list = wxImageList(BMP_SIZE_W, BMP_SIZE_H, False, 0)
280
281 bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
282 dc = wxMemoryDC()
283 dc.SelectObject(bmp)
284 dc.SetBrush(wxBLACK_BRUSH)
285 dc.Clear()
286 dc.SelectObject(wxNullBitmap)
287
288 self.emptyImageIndex = \
289 self.image_list.AddWithColourMask(bmp, wxColour(0, 0, 0))
290
291 self.AssignImageList(self.image_list)
292
293 root = self.AddRoot("")
294
295 for l in map.Layers():
296 id = self.PrependItem(root, l.Title())
297 l.Subscribe(LAYER_CHANGED, self._OnMsgLayerChanged)
298 self.SetPyData(id, l)
299 font = self.GetItemFont(id)
300 if not l.Visible():
301 font.SetStyle(wxITALIC)
302 self.SetItemFont(id, font)
303
304 self.layer2id[l] = id
305
306 self.__FillTreeLayer(id)
307 self.Expand(id)
308
309 self.Thaw()
310
311 def __FillTreeLayer(self, pid):
312 layer = self.GetPyData(pid)
313
314 self.Freeze()
315
316 self.DeleteChildren(pid)
317
318 clazz = layer.GetClassification()
319
320 shapeType = layer.ShapeType()
321
322 for g in clazz:
323 id = self.AppendItem(pid, g.GetDisplayText())
324 self.SetPyData(id, g)
325
326 bmp = self.__BuildGroupImage(g, shapeType)
327
328 if bmp is None:
329 self.SetItemImage(id, self.emptyImageIndex)
330 else:
331 i = self.image_list.Add(bmp)
332 self.SetItemImage(id, i)
333
334 #self.layer2id[g] = id
335
336 self.Thaw()
337
338 def __BuildGroupImage(self, group, shapeType):
339 assert(isinstance(group, ClassGroup))
340
341 bmp = wxEmptyBitmap(BMP_SIZE_W, BMP_SIZE_H)
342 #brush = wxBrush(Color2wxColour(item[1]), wxSOLID)
343 dc = wxMemoryDC()
344 dc.SelectObject(bmp)
345 dc.Clear()
346
347 self.previewer.Draw(dc, None, group.GetProperties(), shapeType)
348
349 return bmp
350
351 def __DeleteAllItems(self):
352 self.DeleteAllItems()
353 self.layer2id = {}
354
355
356 def __ShowHideLayer(self, show):
357 id = self.GetSelection()
358 assert(id.IsOk())
359
360 item = self.GetPyData(id)
361 if isinstance(item, ClassGroup):
362 id = self.GetItemParent(id)
363 assert(id.IsOk())
364 item = self.GetPyData(id)
365
366
367 if show != item.Visible():
368
369 item.SetVisible(show)
370
371 font = self.GetItemFont(id)
372 if show:
373 font.SetStyle(wxNORMAL)
374 self.SetItemFont(id, font)
375 else:
376 font.SetStyle(wxITALIC)
377 self.SetItemFont(id, font)
378
379
380

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26