/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/legend.py
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/Thuban/UI/legend.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 572 - (hide 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 jonathan 542 # 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 jonathan 572 from Thuban.UI.messages import *
20 jonathan 542 from Thuban.UI.classifier import ClassDataPreviewer
21 jonathan 562 from Thuban.UI.dock import DockPanel
22 jonathan 542
23 jonathan 572 from Thuban.Lib.connector import ConnectorError
24    
25 jonathan 542 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 jonathan 562 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 jonathan 542 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 jonathan 562 self.tree = LegendTree(self, ID_LEGEND_TREE, map, mainWindow)
78 jonathan 542
79     panelBox.Add(self.tree, 1, wxGROW, 4)
80    
81 jonathan 572 panelBox.Fit(self)
82    
83 jonathan 562 self.SetAutoLayout(True)
84     self.SetSizer(panelBox)
85 jonathan 542 panelBox.SetSizeHints(self)
86    
87 jonathan 562 #panelBox.SetSizeHints(self.parent)
88 jonathan 542
89 jonathan 562 self.panelBox = panelBox
90 jonathan 542
91 jonathan 572 EVT_CLOSE(self, self._OnClose)
92    
93    
94 jonathan 562 def GetMap(self):
95     return self.tree.GetMap()
96    
97     def SetMap(self, map):
98     self.tree.SetMap(map)
99    
100 jonathan 572 def DoOnSelChanged(self, layer, group):
101 jonathan 542
102 jonathan 572 ok = isinstance(layer, Layer)
103     self.__EnableButtons(ok)
104    
105     if ok:
106 jonathan 568 self.mainWindow.SelectLayer(layer)
107    
108 jonathan 572 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 jonathan 542 def _OnClassify(self, event):
116 jonathan 572 self.DoOnClassify()
117 jonathan 542
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 jonathan 572 def _OnClose(self, event):
129     self.tree.Close()
130    
131 jonathan 542 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 jonathan 562 def __init__(self, parent, id, map, mainWindow):
142 jonathan 542 wxTreeCtrl.__init__(self, parent, id,
143     style = wxTR_DEFAULT_STYLE | wxTR_HIDE_ROOT,
144     size = (200, 200))
145    
146 jonathan 572 self.mainWindow = mainWindow
147 jonathan 562 self.map = None
148 jonathan 542 self.parent = parent
149 jonathan 572 self.layer2id = {}
150 jonathan 542
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 jonathan 572 EVT_CLOSE(self, self._OnClose)
160    
161 jonathan 562 self.SetMap(map)
162 jonathan 542
163 jonathan 572 def _OnClose(self, event):
164     print "LegendTree destroyed"
165     self.SetMap(None)
166    
167 jonathan 562 def GetMap(self):
168     return self.map
169 jonathan 542
170 jonathan 562 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 jonathan 572 #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 jonathan 562 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 jonathan 572 #self.mainWindow.application.session.Subscribe(MAPS_CHANGED,
192     #self._OnMsgMapsChanged)
193     #self.mainWindow.application.Subscribe(SESSION_REPLACED,
194     #self._OnMsgMapsChanged)
195 jonathan 562 self.__FillTree(self.map)
196    
197    
198 jonathan 542 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 jonathan 572 #self.__ShowHideLayer(True)
248     layer, group = self.GetSelectedHierarchy()
249     layer.SetVisible(True)
250 jonathan 542
251     def DoOnHideLayer(self):
252 jonathan 572 #self.__ShowHideLayer(False)
253     layer, group = self.GetSelectedHierarchy()
254     layer.SetVisible(False)
255 jonathan 542
256 jonathan 572 # def DoOnClassify(self):
257     # id = self.GetSelection()
258     # assert(id.IsOk())
259 jonathan 542
260 jonathan 572 # item = self.GetPyData(id)
261     # if isinstance(item, ClassGroup):
262     # id = self.GetItemParent(id)
263     # assert(id.IsOk())
264     # item = self.GetPyData(id)
265 jonathan 542
266 jonathan 572 # # XXX: THIS IS SUCH AWFUL STYLE! YUCK!
267     # self.parent.mainWindow.OpenClassifier(item)
268     # #assert(False, "XXX: FIXME HERE")
269 jonathan 542
270     def Sort(self):
271     self.SortChildren(self.GetRootItem())
272    
273 jonathan 572 def _OnMsgMapsChanged(self):
274     print "ADfsadfsadfsadfsa"
275     print self.map is self.mainWindow.Map()
276     self.SetMap(self.mainWindow.Map())
277    
278 jonathan 542 def _OnSelChanged(self, event):
279    
280 jonathan 572 layer, group = self.GetSelectedHierarchy()
281 jonathan 568 self.parent.DoOnSelChanged(layer, group)
282    
283 jonathan 542 def _OnItemActivated(self, event):
284 jonathan 572 self.parent.DoOnClassify()
285 jonathan 542
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 jonathan 562 id = self.GetSelection()
296 jonathan 542
297 jonathan 562 if id.IsOk():
298     self.EnsureVisible(id)
299    
300     def _OnMsgMapLayersAddedRemoved(self, map):
301 jonathan 572 assert(map is self.map)
302 jonathan 542
303     self.__FillTree(self.map)
304    
305 jonathan 572 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 jonathan 542 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 jonathan 572 l.Subscribe(LAYER_VISIBILITY_CHANGED,
355     self._OnMsgLayerVisibilityChanged)
356 jonathan 542 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 jonathan 572 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 jonathan 542
420 jonathan 572 def __ShowHideHelper(self, show, id):
421     font = self.GetItemFont(id)
422 jonathan 542
423 jonathan 572 if show:
424     font.SetStyle(wxNORMAL)
425     color = wxBLACK
426     else:
427     font.SetStyle(wxITALIC)
428     color = wxLIGHT_GREY
429 jonathan 542
430 jonathan 572 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 jonathan 542
437 jonathan 572 show = layer.Visible()
438 jonathan 542
439    
440 jonathan 572 self.__ShowHideHelper(show, parent)
441 jonathan 542
442 jonathan 572 id, cookie = self.GetFirstChild(parent, 123)
443 jonathan 542
444 jonathan 572 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