source: sasview/guiframe/gui_manager.py @ f69bc394

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since f69bc394 was dd66fbd, checked in by Gervaise Alina <gervyh@…>, 16 years ago

status bar changed—-removed error from data remove

  • Property mode set to 100644
File size: 29.7 KB
RevLine 
[41d466f]1"""
2This software was developed by the University of Tennessee as part of the
3Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
4project funded by the US National Science Foundation.
5
6See the license text in license.txt
7
8copyright 2008, University of Tennessee
[7681bac]9
10How-to build an application using guiframe:
11
12 1- Write a main application script along the lines of dummyapp.py
13 2- Write a config script along the lines of config.py, and name it local_config.py
14 3- Write your plug-ins and place them in a directory called "perspectives".
15     - Look at local_perspectives/plotting for an example of a plug-in.
16     - A plug-in should define a class called Plugin. See abstract class below.
17
[41d466f]18"""
19import wx
20import wx.aui
21import os, sys
22try:
23    # Try to find a local config
24    import imp
25    path = os.getcwd()
[cbb2e40]26    if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \
27      (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))):
28            fObj, path, descr = imp.find_module('local_config', [path])
29            config = imp.load_module('local_config', fObj, path, descr) 
[278cc25]30    else:
[cbb2e40]31        # Try simply importing local_config
32        import local_config as config
[41d466f]33except:
34    # Didn't find local config, load the default
35    import config
[cbb2e40]36   
[0d9dae8]37from sans.guicomm.events import EVT_STATUS,Model2DPanelEvent
[0bd2cd8]38from sans.guicomm.events import EVT_NEW_PLOT,EVT_SLICER_PARS_UPDATE
[ca88b2e]39import history
[adfcab3]40import warnings
41warnings.simplefilter("ignore")
42
[fc2b91a]43import logging
[adfcab3]44
[7681bac]45class Plugin:
46    """
47        This class defines the interface for a Plugin class
48        that can be used by the gui_manager.
49       
50        Plug-ins should be placed in a sub-directory called "perspectives".
51        For example, a plug-in called Foo should be place in "perspectives/Foo".
52        That directory contains at least two files:
53            perspectives/Foo/__init.py contains two lines:
54           
55                PLUGIN_ID = "Foo plug-in 1.0"
56                from Foo import *
57               
58            perspectives/Foo/Foo.py contains the definition of the Plugin
59            class for the Foo plug-in. The interface of that Plugin class
60            should follow the interface of the class you are looking at.
61    """
62   
63    def __init__(self):
64        """
65            Abstract class for gui_manager Plugins.
66        """
67        ## Plug-in name. It will appear on the application menu.
68        self.sub_menu = "Plugin"       
69       
70        ## Reference to the parent window. Filled by get_panels() below.
71        self.parent = None
72       
73        ## List of panels that you would like to open in AUI windows
74        #  for your plug-in. This defines your plug-in "perspective"
75        self.perspective = []
76       
77        raise RuntimeError, "gui_manager.Plugin is an abstract class"
78       
79    def populate_menu(self, id, parent):
80        """
81            Create and return the list of application menu
82            items for the plug-in.
83           
84            @param id: deprecated. Un-used.
85            @param parent: parent window
86            @return: plug-in menu
87        """
88        import wx
89        # Create a menu
90        plug_menu = wx.Menu()
91
92        # Always get event IDs from wx
93        id = wx.NewId()
94       
95        # Fill your menu
96        plug_menu.Append(id, '&Do something')
97        wx.EVT_MENU(owner, id, self._on_do_something)
98   
99        # Returns the menu and a name for it.
100        return [(id, plug_menu, "name of the application menu")]
101   
102   
103    def get_panels(self, parent):
104        """
105            Create and return the list of wx.Panels for your plug-in.
106            Define the plug-in perspective.
107           
108            Panels should inherit from DefaultPanel defined below,
109            or should present the same interface. They must define
110            "window_caption" and "window_name".
111           
112            @param parent: parent window
113            @return: list of panels
114        """
115        ## Save a reference to the parent
116        self.parent = parent
117       
118        # Define a panel
119        mypanel = DefaultPanel(self.parent, -1)
120       
121        # If needed, add its name to the perspective list
122        self.perspective.append(self.control_panel.window_name)
123
124        # Return the list of panels
125        return [mypanel]
126   
127    def get_context_menu(self, graph=None):
128        """
129            This method is optional.
130       
131            When the context menu of a plot is rendered, the
132            get_context_menu method will be called to give you a
133            chance to add a menu item to the context menu.
134           
135            A ref to a Graph object is passed so that you can
136            investigate the plot content and decide whether you
137            need to add items to the context menu. 
138           
139            This method returns a list of menu items.
140            Each item is itself a list defining the text to
141            appear in the menu, a tool-tip help text, and a
142            call-back method.
143           
144            @param graph: the Graph object to which we attach the context menu
145            @return: a list of menu items with call-back function
146        """
147        return [["Menu text", 
148                 "Tool-tip help text", 
149                 self._on_context_do_something]]     
150   
151    def get_perspective(self):
152        """
153            Get the list of panel names for this perspective
154        """
155        return self.perspective
156   
157    def on_perspective(self, event):
158        """
159            Call back function for the perspective menu item.
160            We notify the parent window that the perspective
161            has changed.
162            @param event: menu event
163        """
164        self.parent.set_perspective(self.perspective)
165   
166    def post_init(self):
167        """
168            Post initialization call back to close the loose ends
169        """
170        pass
171
172
[41d466f]173class ViewerFrame(wx.Frame):
174    """
175        Main application frame
176    """
[16bf519]177    def __init__(self, parent, id, title, window_height=700, window_width=900):
178    #def __init__(self, parent, id, title, window_height=800, window_width=800):
[41d466f]179        """
180            Initialize the Frame object
181        """
182        from local_perspectives.plotting import plotting
[16bf519]183        #wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size=(800, 700))
184        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size=(900, 600))
[d0802c3]185       
186        # Preferred window size
187        self._window_height = window_height
188        self._window_width  = window_width
[41d466f]189       
[fc2b91a]190        # Logging info
191        logging.basicConfig(level=logging.DEBUG,
192                    format='%(asctime)s %(levelname)s %(message)s',
193                    filename='sans_app.log',
194                    filemode='w')       
195       
[41d466f]196        path = os.path.dirname(__file__)
[278cc25]197        ico_file = os.path.join(path,'images/ball.ico')
198        if os.path.isfile(ico_file):
199            self.SetIcon(wx.Icon(ico_file, wx.BITMAP_TYPE_ICO))
[cbb2e40]200        else:
201            ico_file = os.path.join(os.getcwd(),'images/ball.ico')
202            if os.path.isfile(ico_file):
203                self.SetIcon(wx.Icon(ico_file, wx.BITMAP_TYPE_ICO))
[41d466f]204       
205        ## Application manager
206        self.app_manager = None
207       
208        ## Find plug-ins
209        # Modify this so that we can specify the directory to look into
210        self.plugins = self._find_plugins()
211        self.plugins.append(plotting.Plugin())
212
213        ## List of panels
214        self.panels = {}
215
216        ## Next available ID for wx gui events
[2310d69]217        #TODO:  No longer used - remove all calls to this
[41d466f]218        self.next_id = 20000
219
[2310d69]220        # Default locations
221        self._default_save_location = os.getcwd()       
222
[41d466f]223        ## Default welcome panel
224        self.defaultPanel    = DefaultPanel(self, -1, style=wx.RAISED_BORDER)
[ca88b2e]225       
226        # History panel
227        self.histPanel     = history.HistoryPanel(self, style=wx.RAISED_BORDER)
[278cc25]228        # self.build_gui()
229       
230        # Register the close event so it calls our own method
231        wx.EVT_CLOSE(self, self._onClose)
232        # Register to status events
233        self.Bind(EVT_STATUS, self._on_status_event)
[0bd2cd8]234        self.Bind(EVT_SLICER_PARS_UPDATE, self._onEVT_SLICER_PANEL)
235       
236       
237    def _onEVT_SLICER_PANEL(self, event):
238        """
239            receive and event telling to update a panel with a name starting with
240            event.panel_name. this method update slicer panel for a given interactor.
241            @param event: contains type of slicer , paramaters for updating the panel
242            and panel_name to find the slicer 's panel concerned.
243        """
244        for item in self.panels:
245            if self.panels[item].window_caption.startswith(event.panel_name): 
246                self.panels[item].set_slicer(event.type, event.params)
247                self._mgr.Update()
248                break
249       
[278cc25]250    def build_gui(self):
[41d466f]251        # Set up the layout
252        self._setup_layout()
253       
254        # Set up the menu
255        self._setup_menus()
256       
257        self.Fit()
[75b40ce]258       
259        #self._check_update(None)
[41d466f]260             
261    def _setup_layout(self):
262        """
263            Set up the layout
264        """
265        # Status bar
[dd66fbd]266        from statusbar import MyStatusBar
267        self.sb = MyStatusBar(self,wx.ID_ANY)
268        self.SetStatusBar(self.sb)
[d468daa]269
[41d466f]270        # Add panel
271        self._mgr = wx.aui.AuiManager(self)
272       
273        # Load panels
274        self._load_panels()
275       
276        self._mgr.Update()
[278cc25]277
278    def add_perspective(self, plugin):
279        """
280            Add a perspective if it doesn't already
281            exist.
282        """
283        is_loaded = False
284        for item in self.plugins:
[fd68aa9]285             if plugin.__class__==item.__class__:
[278cc25]286                 print "Plugin %s already loaded" % plugin.__class__.__name__
287                 is_loaded = True
288                 
289        if not is_loaded:
290            self.plugins.append(plugin)
[41d466f]291     
292    def _find_plugins(self, dir="perspectives"):
293        """
294            Find available perspective plug-ins
295            @param dir: directory in which to look for plug-ins
296            @return: list of plug-ins
297        """
298        import imp
299        print "Looking for plug-ins in %s" % dir
300        # List of plug-in objects
[278cc25]301       
302        #path_exe = os.getcwd()
303        #path_plugs = os.path.join(path_exe, dir)
304        f = open("load.log",'w') 
305        f.write(os.getcwd()+'\n\n')
306        #f.write(str(os.listdir(dir))+'\n')
307       
308       
[41d466f]309        plugins = []
310        # Go through files in panels directory
311        try:
312            list = os.listdir(dir)
313            for item in list:
314                toks = os.path.splitext(os.path.basename(item))
315                name = None
316                if not toks[0] == '__init__':
317                   
318                    if toks[1]=='.py' or toks[1]=='':
319                        name = toks[0]
320               
321                    path = [os.path.abspath(dir)]
322                    file = None
323                    try:
324                        if toks[1]=='':
[278cc25]325                            f.write("trying to import \n")
[41d466f]326                            mod_path = '.'.join([dir, name])
[278cc25]327                            f.write("mod_path= %s\n" % mod_path)
[41d466f]328                            module = __import__(mod_path, globals(), locals(), [name])
[278cc25]329                            f.write(str(module)+'\n')
[41d466f]330                        else:
331                            (file, path, info) = imp.find_module(name, path)
332                            module = imp.load_module( name, file, item, info )
333                        if hasattr(module, "PLUGIN_ID"):
334                            try:
335                                plugins.append(module.Plugin())
336                                print "Found plug-in: %s" % module.PLUGIN_ID
337                            except:
338                                config.printEVT("Error accessing PluginPanel in %s\n  %s" % (name, sys.exc_value))
339                       
340                    except:
341                        print sys.exc_value
[278cc25]342                        f.write(str(sys.exc_value)+'\n')
[41d466f]343                    finally:
344                        if not file==None:
345                            file.close()
346        except:
347            # Should raise and catch at a higher level and display error on status bar
348            pass   
[278cc25]349        f.write(str(plugins)+'\n')
350        f.close()
[41d466f]351        return plugins
352   
353       
354     
355    def _load_panels(self):
356        """
357            Load all panels in the panels directory
358        """
359       
360        # Look for plug-in panels
361        panels = []       
362        for item in self.plugins:
363            if hasattr(item, "get_panels"):
364                ps = item.get_panels(self)
365                panels.extend(ps)
366
367        # Show a default panel with some help information
368        # It also sets the size of the application windows
369        self.panels["default"] = self.defaultPanel
[ca88b2e]370         # History panel
371        self.panels["historyPanel"] = self.histPanel 
372       
[41d466f]373        self._mgr.AddPane(self.defaultPanel, wx.aui.AuiPaneInfo().
374                              Name("default").
375                              CenterPane().
[d0802c3]376                              # This is where we set the size of the application window
377                              BestSize(wx.Size(self._window_width, self._window_height)).
378                              MinSize(wx.Size(self._window_width, self._window_height)).
[41d466f]379                              Show())
[ca88b2e]380        self._mgr.AddPane(self.histPanel, wx.aui.AuiPaneInfo().
381                          Name("historyPanel").Caption("History").
382                          #Float().
383                          Bottom().
384                          Dock().
385                          TopDockable().
386                          BottomDockable().
387                          LeftDockable().
388                          RightDockable().
389                          MinimizeButton().
390                          Hide().
391                          #Show().
392                          BestSize(wx.Size(500,600)).
393                          MinSize(wx.Size(200,150)))
[41d466f]394
395        # Add the panels to the AUI manager
396        for panel_class in panels:
397            p = panel_class
398            id = wx.NewId()
399           
400            # Check whether we need to put this panel
401            # in the center pane
402            if hasattr(p, "CENTER_PANE"):
403                if p.CENTER_PANE:
404                    self.panels[str(id)] = p
405                    self._mgr.AddPane(p, wx.aui.AuiPaneInfo().
406                                          Name(p.window_name).Caption(p.window_caption).
407                                          CenterPane().
[16bf519]408                                          BestSize(wx.Size(600,600)).
409                                          MinSize(wx.Size(400,400)).
410                                          #BestSize(wx.Size(500,500)).
411                                          #MinSize(wx.Size(200,200)).
[41d466f]412                                          Hide())
413               
414            else:
415                self.panels[str(id)] = p
416                self._mgr.AddPane(p, wx.aui.AuiPaneInfo().
417                                  Name(p.window_name).Caption(p.window_caption).
418                                  #Floatable().
419                                  #Float().
420                                  Right().
421                                  Dock().
422                                  TopDockable().
423                                  BottomDockable().
424                                  LeftDockable().
425                                  RightDockable().
426                                  MinimizeButton().
427                                  Hide().
428                                  #Show().
[16bf519]429                                  BestSize(wx.Size(600,600)).
430                                  MinSize(wx.Size(500,500)))
431                                  #BestSize(wx.Size(400,400)).
432                                  #MinSize(wx.Size(300,300)))
[d0802c3]433
[41d466f]434               
435       
[2310d69]436    def get_context_menu(self, graph=None):
[41d466f]437        """
438            Get the context menu items made available
439            by the different plug-ins.
440            This function is used by the plotting module
441        """
442        menu_list = []
443        for item in self.plugins:
444            if hasattr(item, "get_context_menu"):
[2310d69]445                menu_list.extend(item.get_context_menu(graph))
[41d466f]446           
447        return menu_list
448       
449    def popup_panel(self, p):
450        """
451            Add a panel object to the AUI manager
452            @param p: panel object to add to the AUI manager
453            @return: ID of the event associated with the new panel [int]
454        """
455       
456        ID = wx.NewId()
457        self.panels[str(ID)] = p
458       
459        count = 0
460        for item in self.panels:
[383189f9]461            if self.panels[item].window_name.startswith(p.window_name): 
[41d466f]462                count += 1
[16bf519]463       
[41d466f]464        windowname = p.window_name
465        caption = p.window_caption
[16bf519]466       
[41d466f]467        if count>0:
468            windowname += str(count+1)
469            caption += (' '+str(count))
[16bf519]470         
[41d466f]471        p.window_name = windowname
472        p.window_caption = caption
473           
474        self._mgr.AddPane(p, wx.aui.AuiPaneInfo().
475                          Name(windowname).Caption(caption).
476                          Floatable().
477                          #Float().
478                          Right().
479                          Dock().
480                          TopDockable().
481                          BottomDockable().
482                          LeftDockable().
483                          RightDockable().
484                          MinimizeButton().
485                          #Hide().
486                          #Show().
[16bf519]487                          BestSize(wx.Size(600,600)).
488                          MinSize(wx.Size(500,500)))
489                          #BestSize(wx.Size(400,400)).
490                          #MinSize(wx.Size(350,350)))
[d0802c3]491        pane = self._mgr.GetPane(windowname)
492        self._mgr.MaximizePane(pane)
493        self._mgr.RestoreMaximizedPane()
494       
[41d466f]495       
496        # Register for showing/hiding the panel
[0d9dae8]497       
[41d466f]498        wx.EVT_MENU(self, ID, self._on_view)
499       
500        self._mgr.Update()
501        return ID
502       
503    def _setup_menus(self):
504        """
505            Set up the application menus
506        """
507        # Menu
508        menubar = wx.MenuBar()
509       
510        # File menu
511        filemenu = wx.Menu()
[fc2b91a]512       
513        id = wx.NewId()
514        filemenu.Append(id, '&Open', 'Open a file')
515        wx.EVT_MENU(self, id, self._on_open)
516       
[97f0c39b]517        #id = wx.NewId()
518        #filemenu.Append(id, '&History', 'Register previous States')
519        #wx.EVT_MENU(self, id, self._onHistoryPanel)
[ca88b2e]520       
521        id = wx.NewId()
[fc2b91a]522        filemenu.Append(id,'&Quit', 'Exit') 
523        wx.EVT_MENU(self, id, self.Close)
[41d466f]524       
[adfcab3]525        # Add sub menus
526        menubar.Append(filemenu,  '&File')
527       
[41d466f]528        # Plot menu
529        # Attach a menu item for each panel in our
530        # panel list that also appears in a plug-in.
531        # TODO: clean this up. We should just identify
532        # plug-in panels and add them all.
533       
[adfcab3]534        # Only add the panel menu if there is more than one panel
535        n_panels = 0
[41d466f]536        for plug in self.plugins:
537            pers = plug.get_perspective()
538            if len(pers)>0:
[adfcab3]539                n_panels += 1
[0d9dae8]540       
[adfcab3]541        if n_panels>1:
542            viewmenu = wx.Menu()
543            for plug in self.plugins:
544                plugmenu = wx.Menu()
545                pers = plug.get_perspective()
546                if len(pers)>0:
547                    for item in self.panels:
548                        if item == 'default':
549                            continue
550                        panel = self.panels[item]
551                        if panel.window_name in pers:
552                            plugmenu.Append(int(item), panel.window_caption, "Show %s window" % panel.window_caption)
[0d9dae8]553                           
554                           
555                           
[adfcab3]556                            wx.EVT_MENU(self, int(item), self._on_view)
557                   
558                    viewmenu.AppendMenu(wx.NewId(), plug.sub_menu, plugmenu, plug.sub_menu)
[41d466f]559               
[adfcab3]560            menubar.Append(viewmenu, '&Panel')
561
[41d466f]562        # Perspective
563        # Attach a menu item for each defined perspective.
[adfcab3]564        # Only add the perspective menu if there are more than one perspectves
565        n_perspectives = 0
[41d466f]566        for plug in self.plugins:
567            if len(plug.get_perspective()) > 0:
[adfcab3]568                n_perspectives += 1
569       
570        if n_perspectives>1:
571            p_menu = wx.Menu()
572            for plug in self.plugins:
573                if len(plug.get_perspective()) > 0:
574                    id = wx.NewId()
575                    p_menu.Append(id, plug.sub_menu, "Switch to %s perspective" % plug.sub_menu)
576                    wx.EVT_MENU(self, id, plug.on_perspective)
577            menubar.Append(p_menu,   '&Perspective')
[41d466f]578 
579        # Help menu
580        helpmenu = wx.Menu()
[fa452e4]581
582        # Look for help item in plug-ins
583        for item in self.plugins:
584            if hasattr(item, "help"):
585                id = wx.NewId()
586                helpmenu.Append(id,'&%s help' % item.sub_menu, '')
587                wx.EVT_MENU(self, id, item.help)
588       
[41d466f]589        if config._do_aboutbox:
590            id = wx.NewId()
591            helpmenu.Append(id,'&About', 'Software information')
592            wx.EVT_MENU(self, id, self._onAbout)
593        id = wx.NewId()
594        helpmenu.Append(id,'&Check for update', 'Check for the latest version of %s' % config.__appname__)
595        wx.EVT_MENU(self, id, self._check_update)
596       
597       
[adfcab3]598       
[41d466f]599       
600        # Look for plug-in menus
601        # Add available plug-in sub-menus.
602        for item in self.plugins:
603            if hasattr(item, "populate_menu"):
604                for (self.next_id, menu, name) in item.populate_menu(self.next_id, self):
605                    menubar.Append(menu, name)
[0d9dae8]606                   
[41d466f]607
608        menubar.Append(helpmenu, '&Help')
609         
610        self.SetMenuBar(menubar)
611       
[fc2b91a]612       
[41d466f]613       
614    def _on_status_event(self, evt):
615        """
616            Display status message
617        """
[dd66fbd]618        self.sb.clear_gauge( msg="")
619        mythread=None
620        mytype= None
621        if hasattr(evt, "curr_thread"):
622            mythread= evt.curr_thread
623        if hasattr(evt, "type"):
624            mytype= evt.type
625        self.sb.set_status( type=mytype,msg=str(evt.status),thread=mythread)
626       
[41d466f]627
628       
629    def _on_view(self, evt):
630        """
631            A panel was selected to be shown. If it's not already
632            shown, display it.
633            @param evt: menu event
634        """
635        self.show_panel(evt.GetId())
636
637    def show_panel(self, uid):
638        """
639            Shows the panel with the given id
640            @param uid: unique ID number of the panel to show
641        """
642        ID = str(uid)
643        config.printEVT("show_panel: %s" % ID)
644        if ID in self.panels.keys():
645            if not self._mgr.GetPane(self.panels[ID].window_name).IsShown():
646                self._mgr.GetPane(self.panels[ID].window_name).Show()
[383189f9]647                # Hide default panel
648                self._mgr.GetPane(self.panels["default"].window_name).Hide()
649               
650               
[41d466f]651            self._mgr.Update()
[ca88b2e]652    def _onHistoryPanel(self, event):
653        print "on history"
654        if not self._mgr.GetPane("historyPanel").IsShown():
655            self._mgr.GetPane("historyPanel").Show()
656        self._mgr.Update()
657        return
[41d466f]658       
[fc2b91a]659    def _on_open(self, event):
[4102709]660   
[fc2b91a]661        from data_loader import plot_data
662        path = self.choose_file()
663           
664        if path and os.path.isfile(path):
665            plot_data(self, path)
[4102709]666           
[fc2b91a]667       
668       
[41d466f]669    def _onClose(self, event):
670        import sys
671        wx.Exit()
672        sys.exit()
673                   
674    def Close(self, event=None):
675        """
676            Quit the application
677        """
678        import sys
679        wx.Frame.Close(self)
680        wx.Exit()
681        sys.exit()
682
683 
684    def _check_update(self, event=None): 
685        """
686            Check with the deployment server whether a new version
687            of the application is available
688        """
689        import urllib
690        try: 
691            h = urllib.urlopen(config.__update_URL__)
692            lines = h.readlines()
693            line = ''
694            if len(lines)>0:
695                line = lines[0]
696               
697                toks = line.lstrip().rstrip().split('.')
698                toks_current = config.__version__.split('.')
699                update_available = False
700                for i in range(len(toks)):
[75b40ce]701                    if len(toks[i].strip())>0:
702                        if int(toks[i].strip())>int(toks_current[i]):
703                            update_available = True
[41d466f]704                if update_available:
705                    #print "Version %s is available" % line.rstrip().lstrip()
706                    self.SetStatusText("Version %s is available! See the Help menu to download it." % line.rstrip().lstrip())
707                    if event != None:
708                        import webbrowser
709                        webbrowser.open(config.__download_page__)
710                else:
[75b40ce]711                    if event != None:
712                        self.SetStatusText("You have the latest version of %s" % config.__appname__)
[41d466f]713        except:
[75b40ce]714            if event != None:
715                self.SetStatusText("You have the latest version of %s" % config.__appname__)
[41d466f]716           
717           
718    def _onAbout(self, evt):
719        """
720            Pop up the about dialog
721            @param evt: menu event
722        """
723        if config._do_aboutbox:
724            import aboutbox 
725            dialog = aboutbox.DialogAbout(None, -1, "")
726            dialog.ShowModal()
727           
728    def set_manager(self, manager):
729        """
730            Sets the application manager for this frame
731            @param manager: frame manager
732        """
733        self.app_manager = manager
734       
735    def post_init(self):
736        """
737            This initialization method is called after the GUI
738            has been created and all plug-ins loaded. It calls
739            the post_init() method of each plug-in (if it exists)
740            so that final initialization can be done.
741        """
742        for item in self.plugins:
743            if hasattr(item, "post_init"):
744                item.post_init()
745       
746    def set_perspective(self, panels):
747        """
748            Sets the perspective of the GUI.
749            Opens all the panels in the list, and closes
750            all the others.
751           
752            @param panels: list of panels
753        """
754        for item in self.panels:
755            # Check whether this is a sticky panel
756            if hasattr(self.panels[item], "ALWAYS_ON"):
757                if self.panels[item].ALWAYS_ON:
758                    continue 
759           
760            if self.panels[item].window_name in panels:
761                if not self._mgr.GetPane(self.panels[item].window_name).IsShown():
762                    self._mgr.GetPane(self.panels[item].window_name).Show()
763            else:
764                if self._mgr.GetPane(self.panels[item].window_name).IsShown():
765                    self._mgr.GetPane(self.panels[item].window_name).Hide()
766                 
767        self._mgr.Update()
768       
769    def choose_file(self):
770        """
771            Functionality that belongs elsewhere
772            Should add a hook to specify the preferred file type/extension.
773        """
774        #TODO: clean this up
775        from data_loader import choose_data_file
[2310d69]776        path = choose_data_file(self, self._default_save_location)
777        if not path==None:
778            try:
779                self._default_save_location = os.path.dirname(path)
780            except:
781                pass
782        return path
783   
784    def load_ascii_1D(self, path):
785        from data_loader import load_ascii_1D
786        return load_ascii_1D(path)
[41d466f]787                 
788class DefaultPanel(wx.Panel):
789    """
790        Defines the API for a panels to work with
791        the GUI manager
792    """
793    ## Internal nickname for the window, used by the AUI manager
794    window_name = "default"
795    ## Name to appear on the window title bar
796    window_caption = "Welcome panel"
797    ## Flag to tell the AUI manager to put this panel in the center pane
798    CENTER_PANE = True
799
800 
801# Toy application to test this Frame
802class ViewApp(wx.App):
803    def OnInit(self):
804        #from gui_manager import ViewerFrame
805        self.frame = ViewerFrame(None, -1, config.__appname__)   
806        self.frame.Show(True)
807
808        if hasattr(self.frame, 'special'):
809            print "Special?", self.frame.special.__class__.__name__
810            self.frame.special.SetCurrent()
811        self.SetTopWindow(self.frame)
812        return True
813   
814    def set_manager(self, manager):
815        """
816            Sets a reference to the application manager
817            of the GUI manager (Frame)
818        """
819        self.frame.set_manager(manager)
820       
[278cc25]821    def build_gui(self):
822        """
823            Build the GUI
824        """
825        self.frame.build_gui()
826        self.frame.post_init()
827       
828    def add_perspective(self, perspective):
829        """
830            Manually add a perspective to the application GUI
831        """
832        self.frame.add_perspective(perspective)
833       
[41d466f]834
835if __name__ == "__main__": 
836    app = ViewApp(0)
837    app.MainLoop()             
Note: See TracBrowser for help on using the repository browser.