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

Contents of /branches/WIP-pyshapelib-bramz/Thuban/UI/application.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 535 - (show annotations)
Fri Mar 14 20:42:18 2003 UTC (22 years ago) by bh
Original Path: trunk/thuban/Thuban/UI/application.py
File MIME type: text/x-python
File size: 6885 byte(s)
Implement multiple selected shapes

* Thuban/UI/selection.py: New module with a class to represent the
selection.

* Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
these unused messages

* Thuban/UI/application.py (ThubanApplication.OnInit)
(ThubanApplication.OnExit, ThubanApplication.SetSession): The
interactor is gone now.
(ThubanApplication.CreateMainWindow): There is no interactor
anymore so we pass None as the interactor argument for now for
compatibility.

* Thuban/UI/view.py (MapCanvas.delegated_messages)
(MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
Unsubscribe, delegate messages according to the delegated_messages
class variable.
(MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
attributes from instance variables as described with the
delegated_methods class variable.
(MapCanvas.__init__): New instance variable selection holding the
current selection
(MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
pass them on to the renderer
(MapCanvas.SetMap): Clear the selection when a different map is
selected.
(MapCanvas.shape_selected): Simple force a complete redraw. The
selection class now takes care of only issueing SHAPES_SELECTED
messages when the set of selected shapes actually does change.
(MapCanvas.SelectShapeAt): The selection is now managed in
self.selection

* Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
(MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
Unsubscribe, delegate messages according to the delegated_messages
class variable.
(MainWindow.delegated_methods, MainWindow.__getattr__): Get some
attributes from instance variables as described with the
delegated_methods class variable.
(MainWindow.__init__): The interactor as ivar is gone. The
parameter is still there for compatibility. The selection messages
now come from the canvas.
(MainWindow.current_layer, MainWindow.has_selected_layer):
Delegate to the the canvas.
(MainWindow.LayerShowTable, MainWindow.Classify)
(MainWindow.identify_view_on_demand): The dialogs don't need the
interactor parameter anymore.

* Thuban/UI/tableview.py (TableFrame.__init__)
(LayerTableFrame.__init__, LayerTableFrame.OnClose)
(LayerTableFrame.row_selected): The interactor is gone. It's job
from the dialog's point of view is now done by the mainwindow,
i.e. the parent. Subscribe to SHAPES_SELECTED instead
of SELECTED_SHAPE

* Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
is gone. It's job from the dialog's point of view is now done by
the mainwindow, i.e. the parent.

* Thuban/UI/classifier.py (Classifier.__init__): The interactor is
gone. It's job from the dialog's point of view is now done by the
mainwindow, i.e. the parent.

* Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
gone. It's job from the dialog's point of view is now done by the
mainwindow, i.e. the parent.
(SessionTreeCtrl.__init__): New parameter mainwindow which is
stored as self.mainwindow. The mainwindow is need so that the tree
can still subscribe to the selection messages.
(SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
(SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
selection is now accessible through the mainwindow. Subscribe to
SHAPES_SELECTED instead of SELECTED_SHAPE

* Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
SHAPES_SELECTED message now.
(IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
so deal with multiple shapes
(IdentifyView.__init__, IdentifyView.OnClose): The interactor is
gone. It's job from the dialog's point of view is now done by the
mainwindow, i.e. the parent.

* Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
selected_shape parameter and ivar to selected_shapes. It's now a
list of shape ids.
(MapRenderer.draw_label_layer): Deal with multiple selected
shapes. Rearrange the code a bit so that the setup and shape type
distinctions are only executed once.

1 # Copyright (C) 2001, 2002, 2003 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 Thuban's application object.
11 """
12
13 __version__ = "$Revision$"
14
15 import sys, os
16 import traceback
17
18 from wxPython.wx import *
19
20 from Thuban.Lib.connector import Publisher
21
22 from Thuban import _
23 from Thuban.Model.session import create_empty_session
24 from Thuban.Model.save import save_session
25 from Thuban.Model.load import load_session
26 from Thuban.Model.messages import MAPS_CHANGED
27
28 import view
29 import tree
30 import mainwindow
31
32 from messages import SESSION_REPLACED
33
34
35
36 class ThubanApplication(wxApp, Publisher):
37
38 """
39 Thuban's application class.
40
41 All wxWindows programs have to have an instance of an application
42 class derived from wxApp. In Thuban the application class holds
43 references to the main window and the session.
44 """
45
46 def OnInit(self):
47 self.splash = self.splash_screen()
48 if self.splash is not None:
49 self.splash.Show()
50 self.read_startup_files()
51 self.top = self.CreateMainWindow()
52 self.SetTopWindow(self.top)
53 if self.splash is None:
54 self.ShowMainWindow()
55 self.session = None
56 self.create_session()
57 return True
58
59 def OnExit(self):
60 """Clean up code.
61
62 Extend this in derived classes if needed.
63 """
64 self.session.Destroy()
65 Publisher.Destroy(self)
66
67 def MainLoop(self):
68 """Call the inherited MainLoop method and then call OnExit.
69
70 In wxPython OnExit isn't called automatically, unfortunately, so
71 we do it here.
72 """
73 wxApp.MainLoop(self)
74 self.OnExit()
75
76 def read_startup_files(self):
77 """Read the startup files."""
78 # for now the startup file is ~/.thuban/thubanstart.py
79 dir =os.path.expanduser("~/.thuban")
80 if os.path.isdir(dir):
81 sys.path.append(dir)
82 try:
83 import thubanstart
84 except ImportError:
85 tb = sys.exc_info()[2]
86 try:
87 if tb.tb_next is not None:
88 # The ImportError exception was raised from
89 # inside the thubanstart module.
90 sys.stderr.write(_("Cannot import the thubanstart"
91 "module\n"))
92 traceback.print_exc(None, sys.stderr)
93 else:
94 # There's no thubanstart module.
95 sys.stderr.write(_("No thubanstart module available\n"))
96 finally:
97 # make sure we delete the traceback object,
98 # otherwise there's be circular references involving
99 # the current stack frame
100 del tb
101 except:
102 sys.stderr.write(_("Cannot import the thubanstart module\n"))
103 traceback.print_exc(None, sys.stderr)
104 else:
105 # There's no .thuban directory
106 sys.stderr.write(_("No ~/.thuban directory\n"))
107
108 def splash_screen(self):
109 """Create and return a splash screen.
110
111 This method is called by OnInit to determine whether the
112 application should have a splashscreen. If the application
113 should display a splash screen override this method in a derived
114 class and have it create and return the wxSplashScreen instance.
115 The implementation of this method in the derived class should
116 also arranged for ShowMainWindow to be called.
117
118 The default implementation simply returns None so that no splash
119 screen is shown and ShowMainWindow will be called automatically.
120 """
121 return None
122
123 def ShowMainWindow(self):
124 """Show the main window
125
126 Normally this method is automatically called by OnInit to show
127 the main window. However, if the splash_screen method has
128 returned a splashscreen it is expected that the derived class
129 also arranges for ShowMainWindow to be called at the appropriate
130 time.
131 """
132 self.top.Show(True)
133
134 def CreateMainWindow(self):
135 """Create and return the main window for the application.
136
137 Override this in subclasses to instantiate the Thuban mainwindow
138 with different parameters or to use a different class for the
139 main window.
140 """
141 msg = (_("This is the wxPython-based Graphical User Interface"
142 " for exploring geographic data"))
143 return mainwindow.MainWindow(NULL, -1, "Thuban", self, None,
144 initial_message = msg)
145
146 def Session(self):
147 """Return the application's session object"""
148 return self.session
149
150 def SetSession(self, session):
151 """Make session the new session.
152
153 Issue SESSION_REPLACED after self.session has become the new
154 session. After the session has been assigned call
155 self.subscribe_session() with the new session and
156 self.unsubscribe_session with the old one.
157 """
158 oldsession = self.session
159 self.session = session
160 self.subscribe_session(self.session)
161 self.issue(SESSION_REPLACED)
162 self.maps_changed()
163 if oldsession is not None:
164 self.unsubscribe_session(oldsession)
165 oldsession.Destroy()
166
167 def subscribe_session(self, session):
168 """Subscribe to some of the sessions channels.
169
170 Extend this method in derived classes if you need additional
171 channels.
172 """
173 session.Subscribe(MAPS_CHANGED, self.maps_changed)
174
175 def unsubscribe_session(self, session):
176 """Unsubscribe from the sessions channels.
177
178 Extend this method in derived classes if you subscribed to
179 additional channels in subscribe_session().
180 """
181 session.Unsubscribe(MAPS_CHANGED, self.maps_changed)
182
183 def create_session(self):
184 """Create a default session.
185
186 Override this method in derived classes to instantiate the
187 session differently or to use a different session class. Don't
188 subscribe to channels here yet. Do that in the
189 subscribe_session() method.
190 """
191 self.SetSession(create_empty_session())
192
193 def OpenSession(self, filename):
194 session = load_session(filename)
195 session.SetFilename(filename)
196 session.UnsetModified()
197 self.SetSession(session)
198
199 def SaveSession(self):
200 save_session(self.session, self.session.filename)
201
202 def maps_changed(self, *args):
203 if self.session.HasMaps():
204 self.top.SetMap(self.session.Maps()[0])
205 else:
206 self.top.SetMap(None)

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26