+ def make_command_class(*bases):\r
+ #create metaclass with plugins and plotmanipulators\r
+ return type(HookeFrame)("HookeFramePlugged", bases + (HookeFrame,), {})\r
+ frame = make_command_class(*plugin_objects)(parent=None, id=wx.ID_ANY, title='Hooke', pos=windowPosition, size=windowSize)\r
+ frame.Show(True)\r
+ self.SetTopWindow(frame)\r
+\r
+ return True\r
+\r
+ def OnExit(self):\r
+ #TODO: write values to ini file if necessary\r
+ return True\r
+\r
+\r
+class HookeFrame(wx.Frame):\r
+\r
+ def __init__(self, parent, id=-1, title='', pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE|wx.SUNKEN_BORDER|wx.CLIP_CHILDREN):\r
+ #call parent constructor\r
+ wx.Frame.__init__(self, parent, id, title, pos, size, style)\r
+ self.config = config\r
+ self.CreateApplicationIcon()\r
+ #self.configs contains: {the name of the Commands file: corresponding ConfigObj}\r
+ self.configs = {}\r
+ ##self.playlists contains: {the name of the playlist: [playlist, tabIndex, plotID]}\r
+ #self.playlists = {}\r
+ #self.plugins contains: {the name of the plugin: [caption, function]}\r
+ self.plugins = {}\r
+ #self.plotmanipulators list contains: [the name of the plotmanip, function, name of the module]\r
+ self.plotmanipulators = []\r
+\r
+ #tell FrameManager to manage this frame\r
+ self._mgr = aui.AuiManager()\r
+ self._mgr.SetManagedWindow(self)\r
+ #set the gradient style\r
+ self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_NONE)\r
+ #set transparent drag\r
+ self._mgr.SetFlags(self._mgr.GetFlags() ^ aui.AUI_MGR_TRANSPARENT_DRAG)\r
+\r
+ # set up default notebook style\r
+ self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER\r
+ self._notebook_theme = 0\r
+\r
+ #holds the perspectives: {name, [index, perspectiveStr]}\r
+ self._perspectives = {}\r
+\r
+ # min size for the frame itself isn't completely done.\r
+ # see the end up FrameManager::Update() for the test\r
+ # code. For now, just hard code a frame minimum size\r
+ self.SetMinSize(wx.Size(400, 300))\r
+ #create panels here\r
+ self.panelAssistant = self.CreatePanelAssistant()\r
+ self.panelCommands = self.CreatePanelCommands()\r
+ self.panelFolders = self.CreatePanelFolders()\r
+ self.panelPlaylists = self.CreatePanelPlaylists()\r
+ self.panelProperties = self.CreatePanelProperties()\r
+ self.panelOutput = self.CreatePanelOutput()\r
+ self.panelResults = self.CreatePanelResults()\r
+ self.plotNotebook = self.CreateNotebook()\r
+ #self.textCtrlCommandLine=self.CreateCommandLine()\r
+\r
+ # add panes\r
+ self._mgr.AddPane(self.panelFolders, aui.AuiPaneInfo().Name('Folders').Caption('Folders').Left().CloseButton(True).MaximizeButton(False))\r
+ self._mgr.AddPane(self.panelPlaylists, aui.AuiPaneInfo().Name('Playlists').Caption('Playlists').Left().CloseButton(True).MaximizeButton(False))\r
+ self._mgr.AddPane(self.plotNotebook, aui.AuiPaneInfo().Name('Plots').CenterPane().PaneBorder(False))\r
+ self._mgr.AddPane(self.panelCommands, aui.AuiPaneInfo().Name('Commands').Caption('Settings and commands').Right().CloseButton(True).MaximizeButton(False))\r
+ self._mgr.AddPane(self.panelProperties, aui.AuiPaneInfo().Name('Properties').Caption('Properties').Right().CloseButton(True).MaximizeButton(False))\r
+ self._mgr.AddPane(self.panelAssistant, aui.AuiPaneInfo().Name('Assistant').Caption('Assistant').Right().CloseButton(True).MaximizeButton(False))\r
+ self._mgr.AddPane(self.panelOutput, aui.AuiPaneInfo().Name('Output').Caption('Output').Bottom().CloseButton(True).MaximizeButton(False))\r
+ self._mgr.AddPane(self.panelResults, aui.AuiPaneInfo().Name('Results').Caption('Results').Bottom().CloseButton(True).MaximizeButton(False))\r
+ #self._mgr.AddPane(self.textCtrlCommandLine, aui.AuiPaneInfo().Name('CommandLine').CaptionVisible(False).Fixed().Bottom().Layer(2).CloseButton(False).MaximizeButton(False))\r
+ #self._mgr.AddPane(panelBottom, aui.AuiPaneInfo().Name("panelCommandLine").Bottom().Position(1).CloseButton(False).MaximizeButton(False))\r
+\r
+ # add the toolbars to the manager\r
+ self.toolbar=self.CreateToolBar()\r
+ self.toolbarNavigation=self.CreateToolBarNavigation()\r
+ self._mgr.AddPane(self.toolbar, aui.AuiPaneInfo().Name('toolbar').Caption('Toolbar').ToolbarPane().Top().Layer(1).Row(1).LeftDockable(False).RightDockable(False))\r
+ self._mgr.AddPane(self.toolbarNavigation, aui.AuiPaneInfo().Name('toolbarNavigation').Caption('Navigation').ToolbarPane().Top().Layer(1).Row(1).LeftDockable(False).RightDockable(False))\r
+ # "commit" all changes made to FrameManager\r
+ self._mgr.Update()\r
+ #create the menubar after the panes so that the default perspective\r
+ #is created with all panes open\r
+ self.CreateMenuBar()\r
+ self.statusbar = self.CreateStatusBar()\r
+ self._BindEvents()\r
+ #TODO: select item on startup (whatever item)\r
+ #self.listCtrlCommands.Select(0)\r
+ #self.OnListboxSelect(None)\r
+ name = self.config['perspectives']['active']\r
+ menu_item = self.GetPerspectiveMenuItem(name)\r
+ self.OnRestorePerspective(menu_item)\r
+ self.playlists = self.panelPlaylists.Playlists\r
+ #define the list of active drivers\r
+ self.drivers = []\r
+ for driver in self.config['drivers']:\r
+ if self.config['drivers'][driver]:\r
+ #get the corresponding filename and path\r
+ filename = ''.join([driver, '.py'])\r
+ path = lh.get_file_path(filename, ['drivers'])\r
+ #the driver is active for driver[1] == 1\r
+ if os.path.isfile(path):\r
+ #driver files are located in the 'drivers' subfolder\r
+ driver_name = ''.join(['drivers.', driver])\r
+ module = __import__(driver_name)\r
+ class_file = getattr(drivers, driver)\r
+ for command in dir(class_file):\r
+ if command.endswith('Driver'):\r
+ self.drivers.append(getattr(class_file, command))\r
+ #import all active plugins and plotmanips\r
+ #the plotmanip_functions contains: {the name of the plotmanip: [method, class_object]}\r
+ plotmanip_functions = {}\r
+ #add 'general.ini' to self.configs (this is not a plugin and thus must be imported seperately)\r
+ ini_path = lh.get_file_path('general.ini', ['plugins'])\r
+ plugin_config = ConfigObj(ini_path)\r
+ #self.config.merge(plugin_config)\r
+ self.configs['general'] = plugin_config\r
+ #make sure we execute _plug_init() for every command line plugin we import\r
+ for plugin in self.config['plugins']:\r
+ if self.config['plugins'][plugin]:\r
+ filename = ''.join([plugin, '.py'])\r
+ path = lh.get_file_path(filename, ['plugins'])\r
+ if os.path.isfile(path):\r
+ #get the corresponding filename and path\r
+ plugin_name = ''.join(['plugins.', plugin])\r
+ try:\r
+ #import the module\r
+ module = __import__(plugin_name)\r
+ #prepare the ini file for inclusion\r
+ ini_path = path.replace('.py', '.ini')\r
+ #include ini file\r
+ plugin_config = ConfigObj(ini_path)\r
+ #self.config.merge(plugin_config)\r
+ self.configs[plugin] = plugin_config\r
+ #add to plugins\r
+ commands = eval('dir(module.' + plugin+ '.' + plugin + 'Commands)')\r
+ #keep only commands (ie names that start with 'do_')\r
+ commands = [command for command in commands if command.startswith('do_')]\r
+ if commands:\r
+ self.plugins[plugin] = commands\r
+ try:\r
+ #initialize the plugin\r
+ eval('module.' + plugin+ '.' + plugin + 'Commands._plug_init(self)')\r
+ except AttributeError:\r
+ pass\r
+ except ImportError:\r
+ pass\r
+ #initialize the commands tree\r
+ commands = dir(HookeFrame)\r
+ commands = [command for command in commands if command.startswith('do_')]\r
+ if commands:\r
+ self.plugins['general'] = commands\r
+ self.panelCommands.Initialize(self.plugins)\r
+ for command in dir(self):\r
+ if command.startswith('plotmanip_'):\r
+ plotmanip_functions[command] = [command, getattr(self, command)]\r
+ for name in self.config['plotmanipulators']['names']:\r
+ if self.config['plotmanipulators'].as_bool(name):\r
+ command_name = ''.join(['plotmanip_', name])\r
+ if command_name in plotmanip_functions:\r
+ self.plotmanipulators.append(plotmanip_functions[command_name])\r
+ #load default list, if possible\r
+ self.do_loadlist(self.config['general']['list'])\r
+\r
+ def _BindEvents(self):\r
+ self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)\r
+ self.Bind(wx.EVT_SIZE, self.OnSize)\r
+ self.Bind(wx.EVT_CLOSE, self.OnClose)\r
+ # Show How To Use The Closing Panes Event\r
+ self.Bind(aui.EVT_AUI_PANE_CLOSE, self.OnPaneClose)\r
+ self.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnNotebookPageClose)\r
+ #menu\r
+ self.Bind(wx.EVT_MENU, self.OnClose, id=wx.ID_EXIT)\r
+ self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)\r
+ #view\r
+ self.Bind(wx.EVT_MENU_RANGE, self.OnView, id=ID_ViewAssistant, id2=ID_ViewResults)\r
+ #perspectives\r
+ self.Bind(wx.EVT_MENU, self.OnDeletePerspective, id=ID_DeletePerspective)\r
+ self.Bind(wx.EVT_MENU, self.OnSavePerspective, id=ID_SavePerspective)\r
+ self.Bind(wx.EVT_MENU_RANGE, self.OnRestorePerspective, id=ID_FirstPerspective, id2=ID_FirstPerspective+1000)\r
+ #toolbar\r
+ self.Bind(wx.EVT_TOOL, self.OnExportImage, id=ID_ExportImage)\r
+ self.Bind(wx.EVT_TOOL, self.OnNext, id=ID_Next)\r
+ self.Bind(wx.EVT_TOOL, self.OnPrevious, id=ID_Previous)\r
+ #self.Bind(.EVT_AUITOOLBAR_TOOL_DROPDOWN, self.OnDropDownToolbarItem, id=ID_DropDownToolbarItem)\r
+ #dir control\r
+ treeCtrl = self.panelFolders.GetTreeCtrl()\r
+ #tree.Bind(wx.EVT_LEFT_UP, self.OnDirCtrl1LeftUp)\r
+ #tree.Bind(wx.EVT_LEFT_DOWN, self.OnGenericDirCtrl1LeftDown)\r
+ treeCtrl.Bind(wx.EVT_LEFT_DCLICK, self.OnDirCtrlLeftDclick)\r
+ #playlist tree\r
+ self.panelPlaylists.PlaylistsTree.Bind(wx.EVT_LEFT_DOWN, self.OnPlaylistsLeftDown)\r
+ self.panelPlaylists.PlaylistsTree.Bind(wx.EVT_LEFT_DCLICK, self.OnPlaylistsLeftDclick)\r
+ #commands tree\r
+ self.panelCommands.ExecuteButton.Bind(wx.EVT_BUTTON, self.OnExecute)\r
+ self.panelCommands.CommandsTree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeCtrlCommandsLeftDown)\r
+ #property editor\r
+ self.panelProperties.pg.Bind(wxpg.EVT_PG_CHANGED, self.OnPropGridChanged)\r
+ self.panelProperties.pg.Bind(wxpg.EVT_PG_SELECTED, self.OnPropGridSelect)\r
+ #results panel\r
+ self.panelResults.results_list.OnCheckItem = self.OnResultsCheck\r
+\r
+ def _GetActiveCurveIndex(self):\r
+ playlist = self.GetActivePlaylist()\r
+ #get the selected item from the tree\r
+ selected_item = self.panelPlaylists.PlaylistsTree.GetSelection()\r
+ #test if a playlist or a curve was double-clicked\r
+ if self.panelPlaylists.PlaylistsTree.ItemHasChildren(selected_item):\r
+ return -1\r
+ else:\r
+ count = 0\r
+ selected_item = self.panelPlaylists.PlaylistsTree.GetPrevSibling(selected_item)\r
+ while selected_item.IsOk():\r
+ count += 1\r
+ selected_item = self.panelPlaylists.PlaylistsTree.GetPrevSibling(selected_item)\r
+ return count\r
+\r
+ def _GetActivePlaylistName(self):\r
+ #get the selected item from the tree\r
+ selected_item = self.panelPlaylists.PlaylistsTree.GetSelection()\r
+ #test if a playlist or a curve was double-clicked\r
+ if self.panelPlaylists.PlaylistsTree.ItemHasChildren(selected_item):\r
+ playlist_item = selected_item\r
+ else:\r
+ #get the name of the playlist\r
+ playlist_item = self.panelPlaylists.PlaylistsTree.GetItemParent(selected_item)\r
+ #now we have a playlist\r
+ return self.panelPlaylists.PlaylistsTree.GetItemText(playlist_item)\r
+\r
+ def _GetPlaylistTab(self, name):\r
+ for index, page in enumerate(self.plotNotebook._tabs._pages):\r
+ if page.caption == name:\r
+ return index\r
+ return -1\r
+\r
+ def _GetUniquePlaylistName(self, name):\r
+ playlist_name = name\r
+ count = 1\r
+ while playlist_name in self.playlists:\r
+ playlist_name = ''.join([name, str(count)])\r
+ count += 1\r
+ return playlist_name\r
+\r
+ def _SavePerspectiveToFile(self, name, perspective):\r
+ filename = ''.join([name, '.txt'])\r
+ filename = lh.get_file_path(filename, ['perspectives'])\r
+ perspectivesFile = open(filename, 'w')\r
+ perspectivesFile.write(perspective)\r
+ perspectivesFile.close()\r
+\r
+ def AddPlaylist(self, playlist=None, name='Untitled'):\r
+ #TODO: change cursor or progressbar (maybe in statusbar)\r
+ #self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))\r
+ if playlist and playlist.count > 0:\r
+ playlist.name = self._GetUniquePlaylistName(name)\r
+ playlist.reset()\r
+ self.AddToPlaylists(playlist)\r
+\r
+ def AddPlaylistFromFiles(self, files=[], name='Untitled'):\r
+ #TODO: change cursor or progressbar (maybe in statusbar)\r
+ #self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))\r
+ if files:\r
+ playlist = Playlist.Playlist(self.drivers)\r
+ for item in files:\r
+ playlist.add_curve(item)\r
+ if playlist.count > 0:\r
+ playlist.name = self._GetUniquePlaylistName(name)\r
+ playlist.reset()\r
+ self.AddToPlaylists(playlist)\r
+\r
+ def AddToPlaylists(self, playlist):\r
+ if playlist.has_curves:\r
+ #setup the playlist in the Playlist tree\r
+ tree_root = self.panelPlaylists.PlaylistsTree.GetRootItem()\r
+ playlist_root = self.panelPlaylists.PlaylistsTree.AppendItem(tree_root, playlist.name, 0)\r
+ #add all curves to the Playlist tree\r
+ curves = {}\r
+ for index, curve in enumerate(playlist.curves):\r
+ ##remove the extension from the name of the curve\r
+ ##TODO: optional?\r
+ #item_text, extension = os.path.splitext(curve.name)\r
+ #curve_ID = self.panelPlaylists.PlaylistsTree.AppendItem(playlist_root, item_text, 1)\r
+ curve_ID = self.panelPlaylists.PlaylistsTree.AppendItem(playlist_root, curve.name, 1)\r
+ if index == playlist.index:\r
+ self.panelPlaylists.PlaylistsTree.SelectItem(curve_ID)\r
+ playlist.reset()\r
+ #create the plot tab and add playlist to the dictionary\r
+ plotPanel = wxmpl.PlotPanel(self, ID_FirstPlot + len(self.playlists))\r
+ notebook_tab = self.plotNotebook.AddPage(plotPanel, playlist.name, True)\r
+ tab_index = self.plotNotebook.GetSelection()\r
+ figure = plotPanel.get_figure()\r
+ self.playlists[playlist.name] = [playlist, figure]\r
+ self.panelPlaylists.PlaylistsTree.Expand(playlist_root)\r
+ self.statusbar.SetStatusText(playlist.get_status_string(), 0)\r
+ self.UpdatePlot()\r
+\r
+ def AppendToOutput(self, text):\r
+ self.panelOutput.AppendText(''.join([text, '\n']))\r
+\r
+ def CreateApplicationIcon(self):\r
+ iconFile = 'resources' + os.sep + 'microscope.ico'\r
+ icon = wx.Icon(iconFile, wx.BITMAP_TYPE_ICO)\r
+ self.SetIcon(icon)\r
+\r
+ def CreateCommandLine(self):\r
+ return wx.TextCtrl(self, -1, '', style=wx.NO_BORDER|wx.EXPAND)\r
+\r
+ def CreatePanelAssistant(self):\r
+ panel = wx.TextCtrl(self, -1, '', wx.Point(0, 0), wx.Size(150, 90), wx.NO_BORDER|wx.TE_MULTILINE)\r
+ panel.SetEditable(False)\r
+ return panel\r
+\r
+ def CreatePanelCommands(self):\r
+ return hookecommands.Commands(self)\r
+\r
+ def CreatePanelFolders(self):\r
+ #set file filters\r
+ filters = self.config['folders']['filters']\r
+ index = self.config['folders'].as_int('filterindex')\r
+ #set initial directory\r
+ folder = self.config['general']['workdir']\r
+ return wx.GenericDirCtrl(self, -1, dir=folder, size=(200, 250), style=wx.DIRCTRL_SHOW_FILTERS, filter=filters, defaultFilter=index)\r
+\r
+ def CreatePanelOutput(self):\r
+ return wx.TextCtrl(self, -1, '', wx.Point(0, 0), wx.Size(150, 90), wx.NO_BORDER|wx.TE_MULTILINE)\r
+\r
+ def CreatePanelPlaylists(self):\r
+ return hookeplaylist.Playlists(self)\r
+\r
+ def CreatePanelProperties(self):\r
+ return hookepropertyeditor.PropertyEditor(self)\r
+\r
+ def CreatePanelResults(self):\r
+ return hookeresults.Results(self)\r
+\r
+ def CreatePanelWelcome(self):\r
+ ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))\r
+ introStr = '<h1>Welcome to Hooke</h1>' + \\r
+ '<h3>Features</h3>' + \\r
+ '<ul>' + \\r
+ '<li>View, annotate, measure force curves</li>' + \\r
+ '<li>Worm-like chain fit of force peaks</li>' + \\r
+ '<li>Automatic convolution-based filtering of empty curves</li>' + \\r
+ '<li>Automatic fit and measurement of multiple force peaks</li>' + \\r
+ '<li>Handles force-clamp force experiments (experimental)</li>' + \\r
+ '<li>It is extensible by users by means of plugins and drivers</li>' + \\r
+ '</ul>' + \\r
+ '<p>See the <a href="/p/hooke/wiki/DocumentationIndex">DocumentationIndex</a> for more information</p>'\r
+ ctrl.SetPage(introStr)\r
+ return ctrl\r
+\r
+ def CreateMenuBar(self):\r
+ menu_bar = wx.MenuBar()\r
+ #file\r
+ file_menu = wx.Menu()\r
+ file_menu.Append(wx.ID_OPEN, '&Open playlist\tCtrl-O')\r
+ file_menu.Append(wx.ID_SAVE, 'Save playlist\tCtrl-S')\r
+ file_menu.AppendSeparator()\r
+ file_menu.Append(wx.ID_EXIT, 'Exit\tCtrl-Q')\r
+ #edit\r
+ edit_menu = wx.Menu()\r
+ edit_menu.Append(ID_ExportText, 'Export text...')\r
+ edit_menu.Append(ID_ExportImage, 'Export image...')\r
+ edit_menu.AppendSeparator();\r
+ edit_menu.Append(ID_Config, 'Preferences')\r
+ #view\r
+ view_menu = wx.Menu()\r
+ view_menu.AppendCheckItem(ID_ViewFolders, 'Folders\tF5')\r
+ view_menu.AppendCheckItem(ID_ViewPlaylists, 'Playlists\tF6')\r
+ view_menu.AppendCheckItem(ID_ViewCommands, 'Commands\tF7')\r
+ view_menu.AppendCheckItem(ID_ViewProperties, 'Properties\tF8')\r
+ view_menu.AppendCheckItem(ID_ViewAssistant, 'Assistant\tF9')\r
+ view_menu.AppendCheckItem(ID_ViewResults, 'Results\tF10')\r
+ view_menu.AppendCheckItem(ID_ViewOutput, 'Output\tF11')\r
+ #perspectives\r
+ self._perspectives_menu = self.CreatePerspectivesMenu()\r
+ #help\r
+ help_menu = wx.Menu()\r
+ help_menu.Append(wx.ID_ABOUT, 'About Hooke')\r
+ #put it all together\r
+ menu_bar.Append(file_menu, 'File')\r
+ menu_bar.Append(edit_menu, 'Edit')\r
+ menu_bar.Append(view_menu, 'View')\r
+ menu_bar.Append(self._perspectives_menu, "Perspectives")\r
+ menu_bar.Append(help_menu, 'Help')\r
+\r
+ self.SetMenuBar(menu_bar)\r
+\r
+ def CreateNotebook(self):\r
+ # create the notebook off-window to avoid flicker\r
+ client_size = self.GetClientSize()\r
+ ctrl = aui.AuiNotebook(self, -1, wx.Point(client_size.x, client_size.y), wx.Size(430, 200), self._notebook_style)\r
+ arts = [aui.AuiDefaultTabArt, aui.AuiSimpleTabArt, aui.VC71TabArt, aui.FF2TabArt, aui.VC8TabArt, aui.ChromeTabArt]\r
+ art = arts[self._notebook_theme]()\r
+ ctrl.SetArtProvider(art)\r
+ #uncomment if we find a nice icon\r
+ #page_bmp = wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, wx.Size(16, 16))\r
+ ctrl.AddPage(self.CreatePanelWelcome(), "Welcome", False)\r
+ return ctrl\r
+\r
+ def CreatePerspectivesMenu(self):\r
+ menu = wx.Menu()\r
+ menu.Append(ID_SavePerspective, "Save Perspective")\r
+ menu.Append(ID_DeletePerspective, "Delete Perspective")\r
+ menu.AppendSeparator()\r
+ #add perspectives to menubar and _perspectives\r
+ perspectivesDirectory = os.path.join(lh.hookeDir, 'perspectives')\r
+ if os.path.isdir(perspectivesDirectory):\r
+ perspectiveFileNames = os.listdir(perspectivesDirectory)\r
+ for perspectiveFilename in perspectiveFileNames:\r
+ filename = lh.get_file_path(perspectiveFilename, ['perspectives'])\r
+ if os.path.isfile(filename):\r
+ perspectiveFile = open(filename, 'rU')\r
+ perspective = perspectiveFile.readline()\r
+ perspectiveFile.close()\r
+ if perspective != '':\r
+ name, extension = os.path.splitext(perspectiveFilename)\r
+ if extension == '.txt':\r
+ menuItem = menu.AppendRadioItem(ID_FirstPerspective + len(self._perspectives), name)\r
+ self._perspectives[name] = [len(self._perspectives), perspective]\r
+ if self.config['perspectives']['active'] == name:\r
+ menuItem.Check()\r
+ #in case there are no perspectives\r
+ if not self._perspectives:\r
+ perspective = self._mgr.SavePerspective()\r
+ self.config['perspectives']['default'] = 'Default'\r
+ self._perspectives['Default'] = [0, perspective]\r
+ menuItem = menu.AppendRadioItem(ID_FirstPerspective, 'Default')\r
+ menuItem.Check()\r
+ self._SavePerspectiveToFile('Default', perspective)\r
+ return menu\r
+\r
+ def CreateStatusbar(self):\r
+ statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)\r
+ statusbar.SetStatusWidths([-2, -3])\r
+ statusbar.SetStatusText('Ready', 0)\r
+ welcomeString=u'Welcome to Hooke (version '+__version__+', '+__release_name__+')!'\r
+ statusbar.SetStatusText(welcomeString, 1)\r
+ return statusbar\r
+\r
+ def CreateToolBar(self):\r
+ toolbar = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.TB_FLAT | wx.TB_NODIVIDER)\r
+ toolbar.SetToolBitmapSize(wx.Size(16,16))\r
+ toolbar_bmp1 = wx.ArtProvider_GetBitmap(wx.ART_QUESTION, wx.ART_OTHER, wx.Size(16, 16))\r
+ toolbar_bmpOpen = wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, wx.Size(16, 16))\r
+ toolbar_bmpSave = wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE, wx.ART_OTHER, wx.Size(16, 16))\r
+ toolbar_bmpExportText = wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, wx.Size(16, 16))\r
+ toolbar_bmpExportImage = wx.ArtProvider_GetBitmap(wx.ART_MISSING_IMAGE, wx.ART_OTHER, wx.Size(16, 16))\r
+ toolbar.AddLabelTool(101, 'Open', toolbar_bmpOpen)\r
+ toolbar.AddLabelTool(102, 'Save', toolbar_bmpSave)\r
+ toolbar.AddSeparator()\r
+ toolbar.AddLabelTool(ID_ExportText, 'Export text...', toolbar_bmpExportText)\r
+ toolbar.AddLabelTool(ID_ExportImage, 'Export image...', toolbar_bmpExportImage)\r
+ toolbar.Realize()\r
+ return toolbar\r
+\r
+ def CreateToolBarNavigation(self):\r
+ toolbar = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.TB_FLAT | wx.TB_NODIVIDER)\r
+ toolbar.SetToolBitmapSize(wx.Size(16,16))\r
+ toolbar_bmpBack = wx.ArtProvider_GetBitmap(wx.ART_GO_BACK, wx.ART_OTHER, wx.Size(16, 16))\r
+ toolbar_bmpForward = wx.ArtProvider_GetBitmap(wx.ART_GO_FORWARD, wx.ART_OTHER, wx.Size(16, 16))\r
+ toolbar.AddLabelTool(ID_Previous, 'Previous', toolbar_bmpBack, shortHelp='Previous curve')\r
+ toolbar.AddLabelTool(ID_Next, 'Next', toolbar_bmpForward, shortHelp='Next curve')\r
+ toolbar.Realize()\r
+ return toolbar\r
+\r
+ def DeleteFromPlaylists(self, name):\r
+ if name in self.playlists:\r
+ del self.playlists[name]\r
+ tree_root = self.panelPlaylists.PlaylistsTree.GetRootItem()\r
+ item, cookie = self.panelPlaylists.PlaylistsTree.GetFirstChild(tree_root)\r
+ while item.IsOk():\r
+ playlist_name = self.panelPlaylists.PlaylistsTree.GetItemText(item)\r
+ if playlist_name == name:\r
+ try:\r
+ self.panelPlaylists.PlaylistsTree.Delete(item)\r
+ except:\r
+ pass\r
+ item = self.panelPlaylists.PlaylistsTree.GetNextSibling(item)\r
+ self.OnPlaylistsLeftDclick(None)\r
+\r
+ def DeletePlotPage(self, name):\r
+ index = self._GetPlaylistTab(name)\r
+ plot = self.playlists[name][1]\r
+ plot = None\r
+ self.plotNotebook.RemovePage(index)\r
+ self.DeleteFromPlaylists(name)\r
+\r
+ def GetActiveCurve(self):\r
+ playlist = self.GetActivePlaylist()\r
+ if playlist is not None:\r
+ return playlist.get_active_curve()\r
+ return None\r
+\r
+ def GetActivePlaylist(self):\r
+ playlist_name = self._GetActivePlaylistName()\r
+ if playlist_name in self.playlists:\r
+ return self.playlists[playlist_name][0]\r
+ return None\r
+\r
+ def GetActivePlot(self):\r
+ curve = self.GetActiveCurve()\r
+ if curve is not None:\r
+ return curve.plots[0]\r
+ return None\r
+\r
+ def GetDockArt(self):\r
+ return self._mgr.GetArtProvider()\r
+\r
+ def GetBoolFromConfig(self, *args):\r
+ if len(args) == 2:\r
+ plugin = args[0]\r
+ section = args[0]\r
+ key = args[1]\r
+ elif len(args) == 3:\r
+ plugin = args[0]\r
+ section = args[1]\r
+ key = args[2]\r
+ if self.configs.has_key(plugin):\r
+ config = self.configs[plugin]\r
+ return config[section][key].as_bool('value')\r
+ return None\r
+\r
+ def GetFloatFromConfig(self, *args):\r
+ if len(args) == 2:\r
+ plugin = args[0]\r
+ section = args[0]\r
+ key = args[1]\r
+ elif len(args) == 3:\r
+ plugin = args[0]\r
+ section = args[1]\r
+ key = args[2]\r
+ if self.configs.has_key(plugin):\r
+ config = self.configs[plugin]\r
+ return config[section][key].as_float('value')\r
+ return None\r
+\r
+ def GetIntFromConfig(self, *args):\r
+ if len(args) == 2:\r
+ plugin = args[0]\r
+ section = args[0]\r
+ key = args[1]\r
+ elif len(args) == 3:\r
+ plugin = args[0]\r
+ section = args[1]\r
+ key = args[2]\r
+ if self.configs.has_key(plugin):\r
+ config = self.configs[plugin]\r
+ return config[section][key].as_int('value')\r
+ return None\r
+\r
+ def GetStringFromConfig(self, *args):\r
+ if len(args) == 2:\r
+ plugin = args[0]\r
+ section = args[0]\r
+ key = args[1]\r
+ elif len(args) == 3:\r
+ plugin = args[0]\r
+ section = args[1]\r
+ key = args[2]\r
+ if self.configs.has_key(plugin):\r
+ config = self.configs[plugin]\r
+ return config[section][key]['value']\r
+ return None\r
+\r
+ def GetPerspectiveMenuItem(self, name):\r
+ index = self._perspectives[name][0]\r
+ perspective_Id = ID_FirstPerspective + index\r
+ menu_item = self.MenuBar.FindItemById(perspective_Id)\r
+ return menu_item\r
+\r
+ def HasPlotmanipulator(self, name):\r