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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (hide annotations)
Fri Aug 31 15:33:42 2001 UTC (23 years, 6 months ago) by bh
Original Path: trunk/thuban/Thuban/UI/mainwindow.py
File MIME type: text/x-python
File size: 16570 byte(s)
	* Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
	event.Check only if the command is actuall checkable.
	(MainWindow.__init__): Call the toolbar's Realize method to make
	sure that the items are actually shown

1 bh 6 # Copyright (C) 2001 by Intevation GmbH
2     # Authors:
3     # Jan-Oliver Wagner <[email protected]>
4     # Bernhard Herzog <[email protected]>
5     #
6     # This program is free software under the GPL (>=v2)
7     # Read the file COPYING coming with Thuban for details.
8    
9     """
10     The main window
11     """
12    
13     __version__ = "$Revision$"
14    
15     import sys, os
16    
17     from wxPython.wx import *
18    
19     import Thuban
20     from Thuban.Model.session import Session
21     from Thuban.Model.map import Map
22     from Thuban.Model.layer import Layer
23     from Thuban.Model.color import Color
24     from Thuban.Model.proj import Projection
25    
26     import view
27     import tree
28     import proj4dialog
29     import tableview, identifyview
30    
31     import main
32     from command import registry, Command
33    
34    
35     # the directory where the toolbar icons are stored
36     bitmapdir = os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Bitmaps")
37     bitmapext = ".xpm"
38    
39    
40     class MainWindow(wxFrame):
41    
42     def __init__(self, parent, ID):
43     wxFrame.__init__(self, parent, ID, 'Thuban',
44     wxDefaultPosition, wxSize(400, 300))
45    
46     self.CreateStatusBar()
47     self.SetStatusText("This is the wxPython-based "
48     "Graphical User Interface for exploring geographic data")
49    
50     self.identify_view = None
51    
52     self.init_ids()
53    
54     menuBar = wxMenuBar()
55    
56     menu = wxMenu()
57     menuBar.Append(menu, "&File");
58     for name in ["new_session", "open_session", None,
59     "save_session", "save_session_as", None,
60     "exit"]:
61     self.add_menu_command(menu, name)
62    
63     menu = wxMenu()
64     menuBar.Append(menu, "&Map");
65     for name in ["map_projection",
66     None,
67     "map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",
68     "map_identify_tool", "map_label_tool",
69     None,
70     "map_full_extent",
71     None,
72     "map_print"]:
73     self.add_menu_command(menu, name)
74    
75     menu = wxMenu()
76     menuBar.Append(menu, "&Layer");
77     for name in ["layer_add", "layer_remove",
78     None,
79     "layer_fill_color", "layer_transparent_fill",
80     "layer_ourline_color", "layer_no_outline",
81     None,
82     "layer_raise", "layer_lower",
83     None,
84     "layer_show", "layer_hide",
85     None,
86     "layer_show_table"]:
87     self.add_menu_command(menu, name)
88    
89     menu = wxMenu()
90     menuBar.Append(menu, "&Help");
91     self.add_menu_command(menu, "help_about")
92    
93     self.SetMenuBar(menuBar)
94    
95     # toolbar
96     toolbar = self.CreateToolBar(wxTB_3DBUTTONS)
97     for name in ["map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",
98     "map_identify_tool", "map_label_tool"]:
99     self.add_toolbar_command(toolbar, name)
100 bh 13 # call Realize to make sure that the tools appear.
101     toolbar.Realize()
102 bh 6
103     # Create the map canvas
104     canvas = view.MapCanvas(self, -1)
105     self.canvas = canvas
106    
107     EVT_CLOSE(self, self.OnClose)
108    
109     def init_ids(self):
110     """Initialize the ids"""
111     self.current_id = 6000
112     self.id_to_name = {}
113     self.name_to_id = {}
114    
115     def get_id(self, name):
116     """Return the wxWindows id for the command named name.
117    
118     Create a new one if there isn't one yet"""
119     ID = self.name_to_id.get(name)
120     if ID is None:
121     ID = self.current_id
122     self.current_id = self.current_id + 1
123     self.name_to_id[name] = ID
124     self.id_to_name[ID] = name
125     return ID
126    
127     def add_menu_command(self, menu, name):
128     """Add the command with name name to the menu menu.
129    
130     If name is None, add a separator.
131     """
132     if name is None:
133     menu.AppendSeparator()
134     else:
135     command = registry.Command(name)
136     if command is not None:
137     ID = self.get_id(name)
138     menu.Append(ID, command.Title(), command.HelpText(),
139     command.IsCheckCommand())
140     EVT_MENU(self, ID, self.invoke_command)
141     if command.IsDynamic():
142     EVT_UPDATE_UI(self, ID, self.update_command_ui)
143     else:
144     print "Unknown command %s" % name
145    
146     def add_toolbar_command(self, toolbar, name):
147     """Add the command with name name to the toolbar toolbar.
148    
149     If name is None, add a separator.
150     """
151     # Assume that all toolbar commands are also menu commmands so
152     # that we don't have to add the event handlers here
153     if name is None:
154     toolbar.AddSeparator()
155     else:
156     command = registry.Command(name)
157     if command is not None:
158     ID = self.get_id(name)
159     filename = os.path.join(bitmapdir, command.Icon()) + bitmapext
160     bitmap = wxBitmap(filename, wxBITMAP_TYPE_XPM)
161     toolbar.AddTool(ID, bitmap,
162     shortHelpString = command.HelpText(),
163     isToggle = command.IsCheckCommand())
164     else:
165     print "Unknown command %s" % name
166    
167     def invoke_command(self, event):
168     name = self.id_to_name.get(event.GetId())
169     if name is not None:
170     command = registry.Command(name)
171     command.Execute(self)
172     else:
173     print "Unknown command ID %d" % event.GetId()
174    
175     def update_command_ui(self, event):
176     #print "update_command_ui", self.id_to_name[event.GetId()]
177     command = registry.Command(self.id_to_name[event.GetId()])
178     if command is not None:
179     event.Enable(command.Sensitive(self))
180     event.SetText(command.DynText(self))
181 bh 13 if command.IsCheckCommand():
182     event.Check(command.Checked(self))
183 bh 6
184     def NewSession(self):
185     session = Session("")
186     session.AddMap(Map(""))
187     main.app.SetSession(session)
188    
189     def OpenSession(self):
190     dlg = wxFileDialog(self, "Select a session file", ".", "",
191     "*.session", wxOPEN)
192     if dlg.ShowModal() == wxID_OK:
193     main.app.OpenSession(dlg.GetPath())
194     dlg.Destroy()
195    
196     def SaveSession(self):
197     main.app.SaveSession()
198    
199     def SaveSessionAs(self):
200     dlg = wxFileDialog(self, "Enter a filename for session", ".", "",
201     "*.session", wxOPEN)
202     if dlg.ShowModal() == wxID_OK:
203     main.app.session.SetFilename(dlg.GetPath())
204     main.app.SaveSession()
205     dlg.Destroy()
206    
207     def Exit(self):
208     self.Close(false)
209    
210     def OnClose(self, event):
211     veto = 0
212     if main.app.session.WasModified():
213     flags = wxYES_NO | wxICON_QUESTION
214     if event.CanVeto():
215     flags = flags | wxCANCEL
216     dlg = wxMessageDialog(self,
217     ("The session has been modified."
218     " Do you want to save it?"),
219     "Exit", flags)
220     result = dlg.ShowModal()
221     dlg.Destroy()
222     if result == wxID_YES:
223     self.SaveSession()
224     elif result == wxID_CANCEL:
225     veto = 1
226    
227     if veto:
228     event.Veto()
229     else:
230     self.Destroy()
231    
232     def SetMap(self, map):
233     self.canvas.SetMap(map)
234    
235     def About(self):
236     dlg = wxMessageDialog(self,
237     ("Thuban is a program for\n"
238     "exploring geographic data.\n"
239     "Copyright (C) 2001 Intevation GmbH.\n"
240     "Thuban is licensed under the GPL"),
241     "About", wxOK | wxICON_INFORMATION)
242     dlg.ShowModal()
243     dlg.Destroy()
244    
245     def AddLayer(self):
246     dlg = wxFileDialog(self, "Select a session file", ".", "", "*.*",
247     wxOPEN)
248     if dlg.ShowModal() == wxID_OK:
249     filename = dlg.GetPath()
250     title = os.path.splitext(os.path.basename(filename))[0]
251     layer = Layer(title, filename)
252     self.canvas.Map().AddLayer(layer)
253     dlg.Destroy()
254    
255     def RemoveLayer(self):
256     layer = self.current_layer()
257     if layer is not None:
258     self.canvas.Map().RemoveLayer(layer)
259     else:
260     dlg = wxMessageDialog(self, "No layer is selected.\n",
261     "Remove layer", wxOK | wxICON_INFORMATION)
262     dlg.ShowModal()
263     dlg.Destroy()
264    
265     def RaiseLayer(self):
266     layer = self.current_layer()
267     if layer is not None:
268     self.canvas.Map().RaiseLayer(layer)
269    
270     def LowerLayer(self):
271     layer = self.current_layer()
272     if layer is not None:
273     self.canvas.Map().LowerLayer(layer)
274    
275     def current_layer(self):
276     """Return the currently selected layer.
277    
278     If no layer is selected, return None
279     """
280     tree = main.app.tree.tree
281     layer = tree.GetPyData(tree.GetSelection())
282     if isinstance(layer, Layer):
283     return layer
284     return None
285    
286     def has_selected_layer(self):
287     """Return true if a layer is currently selected"""
288     tree = main.app.tree.tree
289     layer = tree.GetPyData(tree.GetSelection())
290     return isinstance(layer, Layer)
291    
292     def choose_color(self):
293     """Run the color selection dialog and return the selected color.
294    
295     If the user cancels, return None.
296     """
297     dlg = wxColourDialog(self)
298     color = None
299     if dlg.ShowModal() == wxID_OK:
300     data = dlg.GetColourData()
301     wxc = data.GetColour()
302     color = Color(wxc.Red() / 255.0,
303     wxc.Green() / 255.0,
304     wxc.Blue() / 255.0)
305     dlg.Destroy()
306     return color
307    
308     def LayerFillColor(self):
309     layer = self.current_layer()
310     if layer is not None:
311     color = self.choose_color()
312     if color is not None:
313     layer.SetFill(color)
314    
315     def LayerTransparentFill(self):
316     layer = self.current_layer()
317     if layer is not None:
318     layer.SetFill(None)
319    
320     def LayerOutlineColor(self):
321     layer = self.current_layer()
322     if layer is not None:
323     color = self.choose_color()
324     if color is not None:
325     layer.SetStroke(color)
326    
327     def LayerNoOutline(self):
328     layer = self.current_layer()
329     if layer is not None:
330     layer.SetStroke(None)
331    
332     def HideLayer(self):
333     layer = self.current_layer()
334     if layer is not None:
335     layer.SetVisible(0)
336    
337     def ShowLayer(self):
338     layer = self.current_layer()
339     if layer is not None:
340     layer.SetVisible(1)
341    
342     def LayerShowTable(self):
343     layer = self.current_layer()
344     if layer is not None:
345     tv = tableview.TableFrame(self, layer.table)
346     tv.Show(true)
347    
348     def Projection(self):
349     map = self.canvas.Map()
350     proj = map.projection
351     if proj is None:
352     proj4Dlg = proj4dialog.Proj4Dialog(NULL, None)
353     else:
354     proj4Dlg = proj4dialog.Proj4Dialog(NULL, map.projection.params)
355     if proj4Dlg.ShowModal() == wxID_OK:
356     params = proj4Dlg.GetParams()
357     if params is not None:
358     proj = Projection(params)
359     else:
360     proj = None
361     map.SetProjection(proj)
362     proj4Dlg.Destroy()
363    
364     def ZoomInTool(self):
365     self.canvas.ZoomInTool()
366    
367     def ZoomOutTool(self):
368     self.canvas.ZoomOutTool()
369    
370     def PanTool(self):
371     self.canvas.PanTool()
372    
373     def IdentifyTool(self):
374     if self.identify_view is None:
375     self.identify_view = identifyview.IdentifyView(self, main.app)
376     self.identify_view.Show(true)
377     self.canvas.IdentifyTool()
378    
379     def LabelTool(self):
380     self.canvas.LabelTool()
381    
382     def FullExtent(self):
383     self.canvas.FitMapToWindow()
384    
385     def PrintMap(self):
386     self.canvas.Print()
387    
388    
389     #
390     # Define all the commands available in the main window
391     #
392    
393    
394     # Helper functions to define common command implementations
395     def call_method(context, methodname, *args):
396     """Call the context's method methodname with args *args"""
397     apply(getattr(context, methodname), args)
398    
399     def _method_command(name, title, method, helptext = "", sensitive = None):
400     """Add a command implemented by a method of the context object"""
401     registry.Add(Command(name, title, call_method, args=(method,),
402     helptext = helptext, sensitive = sensitive))
403     def _tool_command(name, title, method, toolname, helptext = "",
404     icon = ""):
405     """Add a tool command"""
406     def check_current_tool(context, name=toolname):
407     return context.canvas.CurrentTool() == name
408     registry.Add(Command(name, title, call_method, args=(method,),
409     helptext = helptext, icon = icon,
410     checked = check_current_tool))
411    
412     def _has_selected_layer(context):
413     """Return true if a layer is selected in the context"""
414     return context.has_selected_layer()
415    
416     # File menu
417     _method_command("new_session", "&New Session", "NewSession")
418     _method_command("open_session", "&Open Session", "OpenSession")
419     _method_command("save_session", "&Save Session", "SaveSession")
420     _method_command("save_session_as", "Save Session &As", "SaveSessionAs")
421     _method_command("exit", "&Exit", "Exit")
422    
423     # Help menu
424     _method_command("help_about", "&About", "About")
425    
426    
427     # Map menu
428     _method_command("map_projection", "Pro&jection", "Projection")
429    
430     _tool_command("map_zoom_in_tool", "&Zoom in", "ZoomInTool", "ZoomInTool",
431     helptext = "Switch to map-mode 'zoom-in'", icon = "zoom_in")
432     _tool_command("map_zoom_out_tool", "Zoom &out", "ZoomOutTool", "ZoomOutTool",
433     helptext = "Switch to map-mode 'zoom-out'", icon = "zoom_out")
434     _tool_command("map_pan_tool", "&Pan", "PanTool", "PanTool",
435     helptext = "Switch to map-mode 'pan'", icon = "pan")
436     _tool_command("map_identify_tool", "&Identify", "IdentifyTool", "IdentifyTool",
437     helptext = "Switch to map-mode 'identify'", icon = "identify")
438     _tool_command("map_label_tool", "&Label", "LabelTool", "LabelTool",
439     helptext = "Add/Remove labels", icon = "label")
440     _method_command("map_full_extent", "&Full extent", "FullExtent")
441     _method_command("map_print", "Prin&t", "PrintMap", helptext = "Print the map")
442    
443     # Layer menu
444     _method_command("layer_add", "&Add", "AddLayer",
445     helptext = "Add a new layer to active map")
446     _method_command("layer_remove", "&Remove", "RemoveLayer",
447     helptext = "Remove selected layer(s)",
448     sensitive = _has_selected_layer)
449     _method_command("layer_fill_color", "&Fill Color", "LayerFillColor",
450     helptext = "Set the fill color of selected layer(s)",
451     sensitive = _has_selected_layer)
452     _method_command("layer_transparent_fill", "&Transparent Fill",
453     "LayerTransparentFill",
454     helptext = "Do not fill the selected layer(s)",
455     sensitive = _has_selected_layer)
456     _method_command("layer_ourline_color", "&Outline Color", "LayerOutlineColor",
457     helptext = "Set the outline color of selected layer(s)",
458     sensitive = _has_selected_layer)
459     _method_command("layer_no_outline", "&No Outline", "LayerNoOutline",
460     helptext = "Do not draw the outline of the selected layer(s)",
461     sensitive = _has_selected_layer)
462     _method_command("layer_raise", "&Raise", "RaiseLayer",
463     helptext = "Raise selected layer(s)",
464     sensitive = _has_selected_layer)
465     _method_command("layer_lower", "&Lower", "LowerLayer",
466     helptext = "Lower selected layer(s)",
467     sensitive = _has_selected_layer)
468     _method_command("layer_show", "&Show", "ShowLayer",
469     helptext = "Make selected layer(s) visible",
470     sensitive = _has_selected_layer)
471     _method_command("layer_hide", "&Hide", "HideLayer",
472     helptext = "Make selected layer(s) unvisible",
473     sensitive = _has_selected_layer)
474     _method_command("layer_show_table", "Show Ta&ble", "LayerShowTable",
475     helptext = "Show the selected layer's table",
476     sensitive = _has_selected_layer)

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26