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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 18 by bh, Mon Sep 3 16:25:09 2001 UTC revision 102 by jan, Fri Apr 19 14:22:25 2002 UTC
# Line 17  import sys, os Line 17  import sys, os
17  from wxPython.wx import *  from wxPython.wx import *
18    
19  import Thuban  import Thuban
20  from Thuban.Model.session import Session  from Thuban.Model.session import Session, create_empty_session
21  from Thuban.Model.map import Map  from Thuban.Model.map import Map
22  from Thuban.Model.layer import Layer  from Thuban.Model.layer import Layer
23  from Thuban.Model.color import Color  from Thuban.Model.color import Color
# Line 30  import tableview, identifyview Line 30  import tableview, identifyview
30    
31  import main  import main
32  from command import registry, Command  from command import registry, Command
33    from messages import SELECTED_SHAPE
34    
35    
36  # the directory where the toolbar icons are stored  # the directory where the toolbar icons are stored
# Line 39  bitmapext = ".xpm" Line 40  bitmapext = ".xpm"
40    
41  class MainWindow(wxFrame):  class MainWindow(wxFrame):
42    
43      def __init__(self, parent, ID):      def __init__(self, parent, ID, interactor):
44          wxFrame.__init__(self, parent, ID, 'Thuban',          wxFrame.__init__(self, parent, ID, 'Thuban',
45                           wxDefaultPosition, wxSize(400, 300))                           wxDefaultPosition, wxSize(400, 300))
46    
47            self.interactor = interactor
48    
49          self.CreateStatusBar()          self.CreateStatusBar()
50          self.SetStatusText("This is the wxPython-based "          self.SetStatusText("This is the wxPython-based "
51                        "Graphical User Interface for exploring geographic data")                        "Graphical User Interface for exploring geographic data")
# Line 62  class MainWindow(wxFrame): Line 65  class MainWindow(wxFrame):
65    
66          menu = wxMenu()          menu = wxMenu()
67          menuBar.Append(menu, "&Map");          menuBar.Append(menu, "&Map");
68          for name in ["map_projection",          for name in ["layer_add", "layer_remove",
69                         None,
70                         "map_projection",
71                       None,                       None,
72                       "map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",                       "map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",
73                       "map_identify_tool", "map_label_tool",                       "map_identify_tool", "map_label_tool",
# Line 74  class MainWindow(wxFrame): Line 79  class MainWindow(wxFrame):
79    
80          menu = wxMenu()          menu = wxMenu()
81          menuBar.Append(menu, "&Layer");          menuBar.Append(menu, "&Layer");
82          for name in ["layer_add", "layer_remove",          for name in ["layer_fill_color", "layer_transparent_fill",
                      None,  
                      "layer_fill_color", "layer_transparent_fill",  
83                       "layer_ourline_color", "layer_no_outline",                       "layer_ourline_color", "layer_no_outline",
84                       None,                       None,
85                       "layer_raise", "layer_lower",                       "layer_raise", "layer_lower",
# Line 94  class MainWindow(wxFrame): Line 97  class MainWindow(wxFrame):
97    
98          # toolbar          # toolbar
99          toolbar = self.CreateToolBar(wxTB_3DBUTTONS)          toolbar = self.CreateToolBar(wxTB_3DBUTTONS)
100    
101            # set the size of the tools' bitmaps. Not needed on wxGTK, but
102            # on Windows. We probably shouldn't hardwire the bitmap size
103            # here
104            toolbar.SetToolBitmapSize(wxSize(24, 24))
105    
106          for name in ["map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",          for name in ["map_zoom_in_tool", "map_zoom_out_tool", "map_pan_tool",
107                       "map_identify_tool", "map_label_tool"]:                       "map_identify_tool", "map_label_tool"]:
108              self.add_toolbar_command(toolbar, name)              self.add_toolbar_command(toolbar, name)
# Line 101  class MainWindow(wxFrame): Line 110  class MainWindow(wxFrame):
110          toolbar.Realize()          toolbar.Realize()
111    
112          # Create the map canvas          # Create the map canvas
113          canvas = view.MapCanvas(self, -1)          canvas = view.MapCanvas(self, -1, interactor)
114          self.canvas = canvas          self.canvas = canvas
115    
116            self.init_dialogs()
117    
118            interactor.Subscribe(SELECTED_SHAPE, self.identify_view_on_demand)
119    
120          EVT_CLOSE(self, self.OnClose)          EVT_CLOSE(self, self.OnClose)
121    
122      def init_ids(self):      def init_ids(self):
# Line 181  class MainWindow(wxFrame): Line 194  class MainWindow(wxFrame):
194              if command.IsCheckCommand():              if command.IsCheckCommand():
195                  event.Check(command.Checked(self))                  event.Check(command.Checked(self))
196    
197        def RunMessageBox(self, title, text, flags = wxOK | wxICON_INFORMATION):
198            """Run a modla message box with the given text, title and flags
199            and return the result"""
200            dlg = wxMessageDialog(self, text, title, flags)
201            result = dlg.ShowModal()
202            dlg.Destroy()
203            return result
204    
205        def init_dialogs(self):
206            """Initialize the dialog handling"""
207            # The mainwindow maintains a dict mapping names to open
208            # non-modal dialogs. The dialogs are put into this dict when
209            # they're created and removed when they're closed
210            self.dialogs = {}
211    
212        def add_dialog(self, name, dialog):
213            if self.dialogs.has_key(name):
214                raise RuntimeError("The Dialog named %s is already open" % name)
215            self.dialogs[name] = dialog
216    
217        def dialog_open(self, name):
218            return self.dialogs.has_key(name)
219    
220        def remove_dialog(self, name):
221            del self.dialogs[name]
222    
223        def get_open_dialog(self, name):
224            return self.dialogs.get(name)
225    
226        def save_modified_session(self, can_veto = 1):
227            """If the current session has been modified, ask the user
228            whether to save it and do so if requested. Return the outcome of
229            the dialog (either wxID_OK, wxID_CANCEL or wxID_NO). If the
230            dialog wasn't run return wxID_NO.
231    
232            If the can_veto parameter is true (default) the dialog includes
233            a cancel button, otherwise not.
234            """
235            if main.app.session.WasModified():
236                flags = wxYES_NO | wxICON_QUESTION
237                if can_veto:
238                    flags = flags | wxCANCEL
239                result = self.RunMessageBox("Exit",
240                                            ("The session has been modified."
241                                             " Do you want to save it?"),
242                                            flags)
243                if result == wxID_YES:
244                    self.SaveSession()
245            else:
246                result = wxID_NO
247            return result
248    
249      def NewSession(self):      def NewSession(self):
250          session = Session("")          self.save_modified_session()
251          session.AddMap(Map(""))          main.app.SetSession(create_empty_session())
         main.app.SetSession(session)  
252    
253      def OpenSession(self):      def OpenSession(self):
254            self.save_modified_session()
255          dlg = wxFileDialog(self, "Select a session file", ".", "",          dlg = wxFileDialog(self, "Select a session file", ".", "",
256                             "*.session", wxOPEN)                             "*.session", wxOPEN)
257          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
# Line 194  class MainWindow(wxFrame): Line 259  class MainWindow(wxFrame):
259          dlg.Destroy()          dlg.Destroy()
260    
261      def SaveSession(self):      def SaveSession(self):
262            if main.app.session.filename == None:
263                self.SaveSessionAs()
264          main.app.SaveSession()          main.app.SaveSession()
265    
266      def SaveSessionAs(self):      def SaveSessionAs(self):
# Line 208  class MainWindow(wxFrame): Line 275  class MainWindow(wxFrame):
275          self.Close(false)          self.Close(false)
276    
277      def OnClose(self, event):      def OnClose(self, event):
278          veto = 0          result = self.save_modified_session(can_veto = event.CanVeto())
279          if main.app.session.WasModified():          if result == wxID_CANCEL:
             flags = wxYES_NO | wxICON_QUESTION  
             if event.CanVeto():  
                 flags = flags | wxCANCEL  
             dlg = wxMessageDialog(self,  
                                   ("The session has been modified."  
                                    " Do you want to save it?"),  
                                   "Exit", flags)  
             result = dlg.ShowModal()  
             dlg.Destroy()  
             if result == wxID_YES:  
                 self.SaveSession()  
             elif result == wxID_CANCEL:  
                 veto = 1  
   
         if veto:  
280              event.Veto()              event.Veto()
281          else:          else:
282              self.Destroy()              self.Destroy()
# Line 232  class MainWindow(wxFrame): Line 284  class MainWindow(wxFrame):
284      def SetMap(self, map):      def SetMap(self, map):
285          self.canvas.SetMap(map)          self.canvas.SetMap(map)
286    
287        def ShowSessionTree(self):
288            name = "session_tree"
289            dialog = self.get_open_dialog(name)
290            if dialog is None:
291                dialog = tree.SessionTreeView(self, main.app, name)
292                self.add_dialog(name, dialog)
293                dialog.Show(true)
294            else:
295                # FIXME: bring dialog to front here
296                pass
297    
298      def About(self):      def About(self):
299          dlg = wxMessageDialog(self,          self.RunMessageBox("About",
300                                ("Thuban is a program for\n"                             ("Thuban is a program for\n"
301                                 "exploring geographic data.\n"                              "exploring geographic data.\n"
302                                 "Copyright (C) 2001 Intevation GmbH.\n"                              "Copyright (C) 2001 Intevation GmbH.\n"
303                                 "Thuban is licensed under the GPL"),                              "Thuban is licensed under the GPL"),
304                                "About", wxOK | wxICON_INFORMATION)                             wxOK | wxICON_INFORMATION)
         dlg.ShowModal()  
         dlg.Destroy()  
305    
306      def AddLayer(self):      def AddLayer(self):
307          dlg = wxFileDialog(self, "Select a session file", ".", "", "*.*",          dlg = wxFileDialog(self, "Select a session file", ".", "", "*.*",
# Line 251  class MainWindow(wxFrame): Line 312  class MainWindow(wxFrame):
312              layer = Layer(title, filename)              layer = Layer(title, filename)
313              map = self.canvas.Map()              map = self.canvas.Map()
314              has_layers = map.HasLayers()              has_layers = map.HasLayers()
315              map.AddLayer(layer)              try:
316              if not has_layers:                  map.AddLayer(layer)
317                  # if we're adding a layer to an empty map, for the new              except IOError:
318                  # map to the window                  # the layer couldn't be opened
319                  self.canvas.FitMapToWindow()                  self.RunMessageBox("Add Layer",
320                                       "Can't open the file '%s'." % filename)
321                else:
322                    if not has_layers:
323                        # if we're adding a layer to an empty map, for the
324                        # new map to the window
325                        self.canvas.FitMapToWindow()
326          dlg.Destroy()          dlg.Destroy()
327    
328      def RemoveLayer(self):      def RemoveLayer(self):
329          layer = self.current_layer()          layer = self.current_layer()
330          if layer is not None:          if layer is not None:
331              self.canvas.Map().RemoveLayer(layer)              self.canvas.Map().RemoveLayer(layer)
         else:  
             dlg = wxMessageDialog(self, "No layer is selected.\n",  
                                   "Remove layer", wxOK | wxICON_INFORMATION)  
             dlg.ShowModal()  
             dlg.Destroy()  
332    
333      def RaiseLayer(self):      def RaiseLayer(self):
334          layer = self.current_layer()          layer = self.current_layer()
# Line 283  class MainWindow(wxFrame): Line 345  class MainWindow(wxFrame):
345    
346          If no layer is selected, return None          If no layer is selected, return None
347          """          """
348          tree = main.app.tree.tree          return self.interactor.SelectedLayer()
         layer = tree.GetPyData(tree.GetSelection())  
         if isinstance(layer, Layer):  
             return layer  
         return None  
349    
350      def has_selected_layer(self):      def has_selected_layer(self):
351          """Return true if a layer is currently selected"""          """Return true if a layer is currently selected"""
352          tree = main.app.tree.tree          return self.interactor.HasSelectedLayer()
         layer = tree.GetPyData(tree.GetSelection())  
         return isinstance(layer, Layer)  
353    
354      def choose_color(self):      def choose_color(self):
355          """Run the color selection dialog and return the selected color.          """Run the color selection dialog and return the selected color.
# Line 348  class MainWindow(wxFrame): Line 404  class MainWindow(wxFrame):
404      def LayerShowTable(self):      def LayerShowTable(self):
405          layer = self.current_layer()          layer = self.current_layer()
406          if layer is not None:          if layer is not None:
407              tv = tableview.TableFrame(self, layer.table)              table = layer.table
408              tv.Show(true)              name = "table_view" + str(id(table))
409                dialog = self.get_open_dialog(name)
410                if dialog is None:
411                    dialog = tableview.TableFrame(self, self.interactor, name,
412                                                  "Table: %s" % layer.Title(),
413                                                  layer, table)
414                    self.add_dialog(name, dialog)
415                    dialog.Show(true)
416                else:
417                    # FIXME: bring dialog to front here
418                    pass
419    
420      def Projection(self):      def Projection(self):
421          map = self.canvas.Map()          map = self.canvas.Map()
# Line 377  class MainWindow(wxFrame): Line 443  class MainWindow(wxFrame):
443          self.canvas.PanTool()          self.canvas.PanTool()
444    
445      def IdentifyTool(self):      def IdentifyTool(self):
         if self.identify_view is None:  
             self.identify_view = identifyview.IdentifyView(self, main.app)  
             self.identify_view.Show(true)  
446          self.canvas.IdentifyTool()          self.canvas.IdentifyTool()
447            self.identify_view_on_demand(None, None)
448    
449      def LabelTool(self):      def LabelTool(self):
450          self.canvas.LabelTool()          self.canvas.LabelTool()
# Line 391  class MainWindow(wxFrame): Line 455  class MainWindow(wxFrame):
455      def PrintMap(self):      def PrintMap(self):
456          self.canvas.Print()          self.canvas.Print()
457    
458        def identify_view_on_demand(self, layer, shape):
459            name = "identify_view"
460            if self.canvas.CurrentTool() == "IdentifyTool":
461                if not self.dialog_open(name):
462                    dialog = identifyview.IdentifyView(self, self.interactor, name)
463                    self.add_dialog(name, dialog)
464                    dialog.Show(true)
465                else:
466                    # FIXME: bring dialog to front?
467                    pass
468    
469  #  #
470  # Define all the commands available in the main window  # Define all the commands available in the main window
# Line 447  _method_command("map_full_extent", "&Ful Line 521  _method_command("map_full_extent", "&Ful
521  _method_command("map_print", "Prin&t", "PrintMap", helptext = "Print the map")  _method_command("map_print", "Prin&t", "PrintMap", helptext = "Print the map")
522    
523  # Layer menu  # Layer menu
524  _method_command("layer_add", "&Add", "AddLayer",  _method_command("layer_add", "&Add Layer", "AddLayer",
525                  helptext = "Add a new layer to active map")                  helptext = "Add a new layer to active map")
526  _method_command("layer_remove", "&Remove", "RemoveLayer",  _method_command("layer_remove", "&Remove Layer", "RemoveLayer",
527                  helptext = "Remove selected layer(s)",                  helptext = "Remove selected layer(s)",
528                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)
529  _method_command("layer_fill_color", "&Fill Color", "LayerFillColor",  _method_command("layer_fill_color", "&Fill Color", "LayerFillColor",

Legend:
Removed from v.18  
changed lines
  Added in v.102

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26