/[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 227 by bh, Thu Jul 18 16:27:11 2002 UTC revision 316 by bh, Thu Sep 12 18:46:01 2002 UTC
# Line 40  bitmapext = ".xpm" Line 40  bitmapext = ".xpm"
40    
41  class MainWindow(wxFrame):  class MainWindow(wxFrame):
42    
43      def __init__(self, parent, ID, application, interactor):      def __init__(self, parent, ID, title, application, interactor,
44          wxFrame.__init__(self, parent, ID, 'Thuban',                   initial_message = None, size = wxSize(-1, -1)):
45                           wxDefaultPosition, wxSize(400, 300))          wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, size)
46    
47          self.application = application          self.application = application
48          self.interactor = interactor          self.interactor = interactor
49    
50          self.CreateStatusBar()          self.CreateStatusBar()
51          self.SetStatusText("This is the wxPython-based "          if initial_message:
52                        "Graphical User Interface for exploring geographic data")              self.SetStatusText(initial_message)
53    
54          self.identify_view = None          self.identify_view = None
55    
# Line 112  class MainWindow(wxFrame): Line 112  class MainWindow(wxFrame):
112          return menu_bar          return menu_bar
113    
114      def build_menu(self, menudesc):      def build_menu(self, menudesc):
115          """Build and return a wxMenu from a menudescription"""          """Return a wxMenu built from the menu description menudesc"""
116          wxmenu = wxMenu()          wxmenu = wxMenu()
117          last = None          last = None
118          for item in menudesc.items:          for item in menudesc.items:
             # here the items must all be Menu instances themselves  
119              if item is None:              if item is None:
120                  # a separator. Only add one if the last item was not a                  # a separator. Only add one if the last item was not a
121                  # separator                  # separator
# Line 193  class MainWindow(wxFrame): Line 192  class MainWindow(wxFrame):
192              else:              else:
193                  print "Unknown command %s" % name                  print "Unknown command %s" % name
194    
195        def Context(self):
196            """Return the context object for a command invoked from this window
197            """
198            return Context(self.application, self.application.Session(), self)
199    
200      def invoke_command(self, event):      def invoke_command(self, event):
201          name = self.id_to_name.get(event.GetId())          name = self.id_to_name.get(event.GetId())
202          if name is not None:          if name is not None:
203              command = registry.Command(name)              command = registry.Command(name)
204              context = Context(self.application, self.application.Session(),              command.Execute(self.Context())
                               self)  
             command.Execute(context)  
205          else:          else:
206              print "Unknown command ID %d" % event.GetId()              print "Unknown command ID %d" % event.GetId()
207    
208      def update_command_ui(self, event):      def update_command_ui(self, event):
209          #print "update_command_ui", self.id_to_name[event.GetId()]          #print "update_command_ui", self.id_to_name[event.GetId()]
210          context = Context(self.application, self.application.Session(), self)          context = self.Context()
211          command = registry.Command(self.id_to_name[event.GetId()])          command = registry.Command(self.id_to_name[event.GetId()])
212          if command is not None:          if command is not None:
213              event.Enable(command.Sensitive(context))              event.Enable(command.Sensitive(context))
# Line 217  class MainWindow(wxFrame): Line 219  class MainWindow(wxFrame):
219          """Run a modal message box with the given text, title and flags          """Run a modal message box with the given text, title and flags
220          and return the result"""          and return the result"""
221          dlg = wxMessageDialog(self, text, title, flags)          dlg = wxMessageDialog(self, text, title, flags)
222            dlg.CenterOnParent()
223          result = dlg.ShowModal()          result = dlg.ShowModal()
224          dlg.Destroy()          dlg.Destroy()
225          return result          return result
# Line 306  class MainWindow(wxFrame): Line 309  class MainWindow(wxFrame):
309          if result == wxID_CANCEL:          if result == wxID_CANCEL:
310              event.Veto()              event.Veto()
311          else:          else:
312                # FIXME: it would be better to tie the unsubscription to
313                # wx's destroy event, but that isn't implemented for wxGTK
314                # yet.
315                self.canvas.Unsubscribe(VIEW_POSITION, self.view_position_changed)
316              self.Destroy()              self.Destroy()
317    
318      def SetMap(self, map):      def SetMap(self, map):
319          self.canvas.SetMap(map)          self.canvas.SetMap(map)
320    
321        def Map(self):
322            """Return the map displayed by this mainwindow"""
323            return self.canvas.Map()
324    
325      def ShowSessionTree(self):      def ShowSessionTree(self):
326          name = "session_tree"          name = "session_tree"
327          dialog = self.get_open_dialog(name)          dialog = self.get_open_dialog(name)
# Line 357  class MainWindow(wxFrame): Line 368  class MainWindow(wxFrame):
368          if layer is not None:          if layer is not None:
369              self.canvas.Map().RemoveLayer(layer)              self.canvas.Map().RemoveLayer(layer)
370    
371        def CanRemoveLayer(self):
372            """Return true if the currently selected layer can be deleted.
373    
374            If no layer is selected return false.
375    
376            The return value of this method determines whether the remove
377            layer command is sensitive in menu.
378            """
379            layer = self.current_layer()
380            if layer is not None:
381                return self.canvas.Map().CanRemoveLayer(layer)
382            return 0
383    
384      def RaiseLayer(self):      def RaiseLayer(self):
385          layer = self.current_layer()          layer = self.current_layer()
386          if layer is not None:          if layer is not None:
# Line 435  class MainWindow(wxFrame): Line 459  class MainWindow(wxFrame):
459              name = "table_view" + str(id(table))              name = "table_view" + str(id(table))
460              dialog = self.get_open_dialog(name)              dialog = self.get_open_dialog(name)
461              if dialog is None:              if dialog is None:
462                  dialog = tableview.TableFrame(self, self.interactor, name,                  dialog = tableview.LayerTableFrame(self, self.interactor, name,
463                                                "Table: %s" % layer.Title(),                                                     "Table: %s" % layer.Title(),
464                                                layer, table)                                                     layer, table)
465                  self.add_dialog(name, dialog)                  self.add_dialog(name, dialog)
466                  dialog.Show(true)                  dialog.Show(true)
467              else:              else:
# Line 511  def _method_command(name, title, method, Line 535  def _method_command(name, title, method,
535                           helptext = helptext, icon = icon,                           helptext = helptext, icon = icon,
536                           sensitive = sensitive))                           sensitive = sensitive))
537    
538  def _tool_command(name, title, method, toolname, helptext = "",  def make_check_current_tool(toolname):
539                    icon = ""):      """Return a function that tests if the currently active tool is toolname
540      """Add a tool command"""  
541        The returned function can be called with the context and returns
542        true iff the currently active tool's name is toolname. It's directly
543        usable as the 'checked' callback of a command.
544        """
545      def check_current_tool(context, name=toolname):      def check_current_tool(context, name=toolname):
546          return context.mainwindow.canvas.CurrentTool() == name          return context.mainwindow.canvas.CurrentTool() == name
547        return check_current_tool
548    
549    def _tool_command(name, title, method, toolname, helptext = "",
550                      icon = "", sensitive = None):
551        """Add a tool command"""
552      registry.Add(Command(name, title, call_method, args=(method,),      registry.Add(Command(name, title, call_method, args=(method,),
553                           helptext = helptext, icon = icon,                           helptext = helptext, icon = icon,
554                           checked = check_current_tool))                           checked = make_check_current_tool(toolname),
555                             sensitive = sensitive))
556    
557  def _has_selected_layer(context):  def _has_selected_layer(context):
558      """Return true if a layer is selected in the context"""      """Return true if a layer is selected in the context"""
559      return context.mainwindow.has_selected_layer()      return context.mainwindow.has_selected_layer()
560    
561    def _can_remove_layer(context):
562        return context.mainwindow.CanRemoveLayer()
563    
564    def _has_tree_window_shown(context):
565        """Return true if the tree window is shown"""
566        return context.mainwindow.get_open_dialog("session_tree") is None
567    
568    def _has_visible_map(context):
569        """Return true iff theres a visible map in the mainwindow.
570    
571        A visible map is a map with at least one visible layer."""
572        map = context.mainwindow.Map()
573        if map is not None:
574            for layer in map.Layers():
575                if layer.Visible():
576                    return 1
577        return 0
578    
579    
580  # File menu  # File menu
581  _method_command("new_session", "&New Session", "NewSession")  _method_command("new_session", "&New Session", "NewSession")
582  _method_command("open_session", "&Open Session", "OpenSession")  _method_command("open_session", "&Open Session", "OpenSession")
583  _method_command("save_session", "&Save Session", "SaveSession")  _method_command("save_session", "&Save Session", "SaveSession")
584  _method_command("save_session_as", "Save Session &As", "SaveSessionAs")  _method_command("save_session_as", "Save Session &As", "SaveSessionAs")
585  _method_command("show_session_tree", "Show Session &Tree", "ShowSessionTree")  _method_command("show_session_tree", "Show Session &Tree", "ShowSessionTree",
586  _method_command("exit", "&Exit", "Exit")                  sensitive = _has_tree_window_shown)
587    _method_command("exit", "E&xit", "Exit")
588    
589  # Help menu  # Help menu
590  _method_command("help_about", "&About", "About")  _method_command("help_about", "&About", "About")
# Line 540  _method_command("help_about", "&About", Line 594  _method_command("help_about", "&About",
594  _method_command("map_projection", "Pro&jection", "Projection")  _method_command("map_projection", "Pro&jection", "Projection")
595    
596  _tool_command("map_zoom_in_tool", "&Zoom in", "ZoomInTool", "ZoomInTool",  _tool_command("map_zoom_in_tool", "&Zoom in", "ZoomInTool", "ZoomInTool",
597                helptext = "Switch to map-mode 'zoom-in'", icon = "zoom_in")                helptext = "Switch to map-mode 'zoom-in'", icon = "zoom_in",
598                  sensitive = _has_visible_map)
599  _tool_command("map_zoom_out_tool", "Zoom &out", "ZoomOutTool", "ZoomOutTool",  _tool_command("map_zoom_out_tool", "Zoom &out", "ZoomOutTool", "ZoomOutTool",
600                helptext = "Switch to map-mode 'zoom-out'", icon = "zoom_out")                helptext = "Switch to map-mode 'zoom-out'", icon = "zoom_out",
601                  sensitive = _has_visible_map)
602  _tool_command("map_pan_tool", "&Pan", "PanTool", "PanTool",  _tool_command("map_pan_tool", "&Pan", "PanTool", "PanTool",
603                helptext = "Switch to map-mode 'pan'", icon = "pan")                helptext = "Switch to map-mode 'pan'", icon = "pan",
604                  sensitive = _has_visible_map)
605  _tool_command("map_identify_tool", "&Identify", "IdentifyTool", "IdentifyTool",  _tool_command("map_identify_tool", "&Identify", "IdentifyTool", "IdentifyTool",
606                helptext = "Switch to map-mode 'identify'", icon = "identify")                helptext = "Switch to map-mode 'identify'", icon = "identify",
607                  sensitive = _has_visible_map)
608  _tool_command("map_label_tool", "&Label", "LabelTool", "LabelTool",  _tool_command("map_label_tool", "&Label", "LabelTool", "LabelTool",
609                helptext = "Add/Remove labels", icon = "label")                helptext = "Add/Remove labels", icon = "label",
610                  sensitive = _has_visible_map)
611  _method_command("map_full_extent", "&Full extent", "FullExtent",  _method_command("map_full_extent", "&Full extent", "FullExtent",
612                 helptext = "Full Extent", icon = "fullextent")                 helptext = "Full Extent", icon = "fullextent",
613                  sensitive = _has_visible_map)
614  _method_command("map_print", "Prin&t", "PrintMap", helptext = "Print the map")  _method_command("map_print", "Prin&t", "PrintMap", helptext = "Print the map")
615    
616  # Layer menu  # Layer menu
# Line 558  _method_command("layer_add", "&Add Layer Line 618  _method_command("layer_add", "&Add Layer
618                  helptext = "Add a new layer to active map")                  helptext = "Add a new layer to active map")
619  _method_command("layer_remove", "&Remove Layer", "RemoveLayer",  _method_command("layer_remove", "&Remove Layer", "RemoveLayer",
620                  helptext = "Remove selected layer(s)",                  helptext = "Remove selected layer(s)",
621                  sensitive = _has_selected_layer)                  sensitive = _can_remove_layer)
622  _method_command("layer_fill_color", "&Fill Color", "LayerFillColor",  _method_command("layer_fill_color", "&Fill Color", "LayerFillColor",
623                  helptext = "Set the fill color of selected layer(s)",                  helptext = "Set the fill color of selected layer(s)",
624                  sensitive = _has_selected_layer)                  sensitive = _has_selected_layer)

Legend:
Removed from v.227  
changed lines
  Added in v.316

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26