X-Git-Url: http://git.tremily.us/?p=hooke.git;a=blobdiff_plain;f=hooke%2Fui%2Fgui%2F__init__.py;h=a49fe27e498b4abc37a78a225cdd7f6d7cd8a30e;hp=fd502c0bde33dfe8cd475d1c36c98a8102bba3da;hb=f9520619c9b5f7fd37d5566e8575776d48343a7c;hpb=d78bdc0e1d7796a1ec950350984fc984b130450c diff --git a/hooke/ui/gui/__init__.py b/hooke/ui/gui/__init__.py index fd502c0..a49fe27 100644 --- a/hooke/ui/gui/__init__.py +++ b/hooke/ui/gui/__init__.py @@ -1,7 +1,4 @@ -# Copyright (C) 2008-2010 Fabrizio Benedetti -# Massimo Sandal -# Rolf Schmidt -# W. Trevor King +# Copyright (C) 2010-2011 W. Trevor King # # This file is part of Hooke. # @@ -71,7 +68,9 @@ class HookeFrame (wx.Frame): self._perspectives = {} # {name: perspective_str} self._c = {} - self.SetIcon(wx.Icon(self.gui.config['icon image'], wx.BITMAP_TYPE_ICO)) + self.SetIcon(wx.Icon( + os.path.expanduser(self.gui.config['icon image']), + wx.BITMAP_TYPE_ICO)) # setup frame manager self._c['manager'] = aui.AuiManager() @@ -165,7 +164,7 @@ class HookeFrame (wx.Frame): commands=self.commands, selected=self.gui.config['selected command'], callbacks={ - 'execute': self.execute_command, + 'execute': self.explicit_execute_command, 'select_plugin': self.select_plugin, 'select_command': self.select_command, # 'selection_changed': self.panelProperties.select(self, method, command), #SelectedTreeItem = selected_item, @@ -196,7 +195,6 @@ class HookeFrame (wx.Frame): size=wx.Size(150, 90), style=wx.TE_READONLY|wx.NO_BORDER|wx.TE_MULTILINE), 'bottom'), -# ('results', panel.results.Results(self), 'bottom'), ]: self._add_panel(p, style) self.execute_command( # setup already loaded playlists @@ -244,16 +242,10 @@ class HookeFrame (wx.Frame): self.Bind(wx.EVT_SIZE, self._on_size) self.Bind(wx.EVT_CLOSE, self._on_close) self.Bind(aui.EVT_AUI_PANE_CLOSE, self._on_pane_close) - self.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self._on_notebook_page_close) return # TODO: cleanup treeCtrl = self._c['folders'].GetTreeCtrl() treeCtrl.Bind(wx.EVT_LEFT_DCLICK, self._on_dir_ctrl_left_double_click) - - #property editor - self.panelProperties.pg.Bind(wxpg.EVT_PG_CHANGED, self.OnPropGridChanged) - #results panel - self.panelResults.results_list.OnCheckItem = self.OnResultsCheck def _on_about(self, *args): dialog = wx.MessageDialog( @@ -266,6 +258,9 @@ class HookeFrame (wx.Frame): dialog.ShowModal() dialog.Destroy() + def _on_size(self, event): + event.Skip() + def _on_close(self, *args): self.log.info('closing GUI framework') # apply changes @@ -277,6 +272,9 @@ class HookeFrame (wx.Frame): del self._c['manager'] self.Destroy() + def _on_erase_background(self, event): + event.Skip() + # Panel utility functions @@ -300,8 +298,14 @@ class HookeFrame (wx.Frame): raise Exception('Multiple commands named "%s"' % name) return cs[0] + def explicit_execute_command(self, _class=None, method=None, + command=None, args=None): + return self.execute_command( + _class=_class, method=method, command=command, args=args, + explicit_user_call=True) + def execute_command(self, _class=None, method=None, - command=None, args=None): + command=None, args=None, explicit_user_call=False): if args == None: args = {} if ('property editor' in self._c @@ -337,7 +341,11 @@ class HookeFrame (wx.Frame): if len(args[arg.name]) == 0: args[arg.name] = arg.default cm = CommandMessage(command.name, args) - self.gui._submit_command(cm, self.inqueue) + self.gui._submit_command( + cm, self.inqueue, explicit_user_call=explicit_user_call) + # TODO: skip responses for commands that were captured by the + # command stack. We'd need to poll on each request, remember + # capture state, or add a flag to the response... return self._handle_response(command_message=cm) def _handle_response(self, command_message): @@ -511,214 +519,12 @@ class HookeFrame (wx.Frame): self.execute_command( command=self._command_by_name('get playlist')) - def _postprocess_zero_block_surface_contact_point( - self, command, args={}, results=[]): + def _update_curve(self, command, args={}, results=[]): """Update the curve, since the available columns may have changed. """ if isinstance(results[-1], Success): self.execute_command( command=self._command_by_name('get curve')) - - def _postprocess_add_block_force_array( - self, command, args={}, results=[]): - """Update the curve, since the available columns may have changed. - """ - if isinstance(results[-1], Success): - self.execute_command( - command=self._command_by_name('get curve')) - - - - # TODO: cruft - - def _GetActiveFileIndex(self): - lib.playlist.Playlist = self.GetActivePlaylist() - #get the selected item from the tree - selected_item = self._c['playlist']._c['tree'].GetSelection() - #test if a playlist or a curve was double-clicked - if self._c['playlist']._c['tree'].ItemHasChildren(selected_item): - return -1 - else: - count = 0 - selected_item = self._c['playlist']._c['tree'].GetPrevSibling(selected_item) - while selected_item.IsOk(): - count += 1 - selected_item = self._c['playlist']._c['tree'].GetPrevSibling(selected_item) - return count - - def _GetPlaylistTab(self, name): - for index, page in enumerate(self._c['notebook']._tabs._pages): - if page.caption == name: - return index - return -1 - - def select_plugin(self, _class=None, method=None, plugin=None): - pass - - def AddPlaylistFromFiles(self, files=[], name='Untitled'): - if files: - playlist = lib.playlist.Playlist(self, self.drivers) - for item in files: - playlist.add_curve(item) - if playlist.count > 0: - playlist.name = self._GetUniquePlaylistName(name) - playlist.reset() - self.AddTayliss(playlist) - - def AppliesPlotmanipulator(self, name): - ''' - Returns True if the plotmanipulator 'name' is applied, False otherwise - name does not contain 'plotmanip_', just the name of the plotmanipulator (e.g. 'flatten') - ''' - return self.GetBoolFromConfig('core', 'plotmanipulators', name) - - def ApplyPlotmanipulators(self, plot, plot_file): - ''' - Apply all active plotmanipulators. - ''' - if plot is not None and plot_file is not None: - manipulated_plot = copy.deepcopy(plot) - for plotmanipulator in self.plotmanipulators: - if self.GetBoolFromConfig('core', 'plotmanipulators', plotmanipulator.name): - manipulated_plot = plotmanipulator.method(manipulated_plot, plot_file) - return manipulated_plot - - def GetActiveFigure(self): - playlist_name = self.GetActivePlaylistName() - figure = self.playlists[playlist_name].figure - if figure is not None: - return figure - return None - - def GetActiveFile(self): - playlist = self.GetActivePlaylist() - if playlist is not None: - return playlist.get_active_file() - return None - - def GetActivePlot(self): - playlist = self.GetActivePlaylist() - if playlist is not None: - return playlist.get_active_file().plot - return None - - def GetDisplayedPlot(self): - plot = copy.deepcopy(self.displayed_plot) - #plot.curves = [] - #plot.curves = copy.deepcopy(plot.curves) - return plot - - def GetDisplayedPlotCorrected(self): - plot = copy.deepcopy(self.displayed_plot) - plot.curves = [] - plot.curves = copy.deepcopy(plot.corrected_curves) - return plot - - def GetDisplayedPlotRaw(self): - plot = copy.deepcopy(self.displayed_plot) - plot.curves = [] - plot.curves = copy.deepcopy(plot.raw_curves) - return plot - - def GetDockArt(self): - return self._c['manager'].GetArtProvider() - - def GetPlotmanipulator(self, name): - ''' - Returns a plot manipulator function from its name - ''' - for plotmanipulator in self.plotmanipulators: - if plotmanipulator.name == name: - return plotmanipulator - return None - - def HasPlotmanipulator(self, name): - ''' - returns True if the plotmanipulator 'name' is loaded, False otherwise - ''' - for plotmanipulator in self.plotmanipulators: - if plotmanipulator.command == name: - return True - return False - - - def _on_dir_ctrl_left_double_click(self, event): - file_path = self.panelFolders.GetPath() - if os.path.isfile(file_path): - if file_path.endswith('.hkp'): - self.do_loadlist(file_path) - event.Skip() - - def _on_erase_background(self, event): - event.Skip() - - def _on_notebook_page_close(self, event): - ctrl = event.GetEventObject() - playlist_name = ctrl.GetPageText(ctrl._curpage) - self.DeleteFromPlaylists(playlist_name) - - def OnPropGridChanged (self, event): - prop = event.GetProperty() - if prop: - item_section = self.panelProperties.SelectedTreeItem - item_plugin = self._c['commands']._c['tree'].GetItemParent(item_section) - plugin = self._c['commands']._c['tree'].GetItemText(item_plugin) - config = self.gui.config[plugin] - property_section = self._c['commands']._c['tree'].GetItemText(item_section) - property_key = prop.GetName() - property_value = prop.GetDisplayedString() - - config[property_section][property_key]['value'] = property_value - - def OnResultsCheck(self, index, flag): - results = self.GetActivePlot().results - if results.has_key(self.results_str): - results[self.results_str].results[index].visible = flag - results[self.results_str].update() - self.UpdatePlot() - - - def _on_size(self, event): - event.Skip() - - def UpdatePlaylistsTreeSelection(self): - playlist = self.GetActivePlaylist() - if playlist is not None: - if playlist.index >= 0: - self._c['status bar'].set_playlist(playlist) - self.UpdateNote() - self.UpdatePlot() - - def _on_curve_select(self, playlist, curve): - #create the plot tab and add playlist to the dictionary - plotPanel = panel.plot.PlotPanel(self, ID_FirstPlot + len(self.playlists)) - notebook_tab = self._c['notebook'].AddPage(plotPanel, playlist.name, True) - #tab_index = self._c['notebook'].GetSelection() - playlist.figure = plotPanel.get_figure() - self.playlists[playlist.name] = playlist - #self.playlists[playlist.name] = [playlist, figure] - self._c['status bar'].set_playlist(playlist) - self.UpdateNote() - self.UpdatePlot() - - - def _on_playlist_left_doubleclick(self): - index = self._c['notebook'].GetSelection() - current_playlist = self._c['notebook'].GetPageText(index) - if current_playlist != playlist_name: - index = self._GetPlaylistTab(playlist_name) - self._c['notebook'].SetSelection(index) - self._c['status bar'].set_playlist(playlist) - self.UpdateNote() - self.UpdatePlot() - - def _on_playlist_delete(self, playlist): - notebook = self.Parent.plotNotebook - index = self.Parent._GetPlaylistTab(playlist.name) - notebook.SetSelection(index) - notebook.DeletePage(notebook.GetSelection()) - self.Parent.DeleteFromPlaylists(playlist_name) - # Command panel interface @@ -758,6 +564,20 @@ class HookeFrame (wx.Frame): self._set_config('selected command', command.name) + def select_plugin(self, _class=None, method=None, plugin=None): + pass + + + + # Folders panel interface + + def _on_dir_ctrl_left_double_click(self, event): + file_path = self.panelFolders.GetPath() + if os.path.isfile(file_path): + if file_path.endswith('.hkp'): + self.do_loadlist(file_path) + event.Skip() + # Note panel interface @@ -876,7 +696,7 @@ class HookeFrame (wx.Frame): self._perspectives = { 'Default': self._c['manager'].SavePerspective(), } - path = self.gui.config['perspective path'] + path = os.path.expanduser(self.gui.config['perspective path']) if os.path.isdir(path): files = sorted(os.listdir(path)) for fname in files: @@ -953,7 +773,7 @@ class HookeFrame (wx.Frame): if name == 'Default': name = 'New perspective' name = select_save_file( - directory=self.gui.config['perspective path'], + directory=os.path.expanduser(self.gui.config['perspective path']), name=name, extension=self.gui.config['perspective extension'], parent=self, @@ -962,7 +782,8 @@ class HookeFrame (wx.Frame): if name == None: return self._save_perspective( - perspective, self.gui.config['perspective path'], name=name, + perspective, + os.path.expanduser(self.gui.config['perspective path']), name=name, extension=self.gui.config['perspective extension']) def _on_delete_perspective(self, *args, **kwargs): @@ -983,13 +804,22 @@ class HookeFrame (wx.Frame): names = [options[i] for i in dialog.selected] dialog.Destroy() self._delete_perspectives( - self.gui.config['perspective path'], names=names, - extension=self.gui.config['perspective extension']) + os.path.expanduser(self.gui.config['perspective path']), + names=names, extension=self.gui.config['perspective extension']) def _on_select_perspective(self, _class, method, name): self._restore_perspective(name) +# setup per-command versions of HookeFrame._update_curve +for _command in ['convert_distance_to_force', + 'polymer_fit_peaks', + 'remove_cantilever_from_extension', + 'zero_surface_contact_point', + ]: + setattr(HookeFrame, '_postprocess_%s' % _command, HookeFrame._update_curve) +del _command + class HookeApp (wx.App): """A :class:`wx.App` wrapper around :class:`HookeFrame`. @@ -1036,7 +866,7 @@ class HookeApp (wx.App): def _setup_splash_screen(self): if self.gui.config['show splash screen'] == True: - path = self.gui.config['splash screen image'] + path = os.path.expanduser(self.gui.config['splash screen image']) if os.path.isfile(path): duration = self.gui.config['splash screen duration'] wx.SplashScreen(