class ProjectManagerWidget(QtGui.QWidget, AbstractListener): def __init__(self): QtGui.QWidget.__init__(self) AbstractListener.__init__(self) layout = QtGui.QVBoxLayout(self) self.view = ProjectManagerView() self.model = self.view.model() layout.addWidget(self.view) layout.setContentsMargins(0, 0, 0, 0) self.pm = ProjectManager() self.menu_available_projects = QtGui.QMenu(u'Available Projects') self.actionNewProj = self.view.actionNewProj self.actionOpenProj = self.view.actionOpenProj group = "Project" self._actions = [[group, "Manage Project", self.view.actionNewProj, 0], [group, "Manage Project", self.view.actionOpenProj, 0], [group, "Manage Project", self.view.actionSaveProj, 0], # [group, "Manage Project", self.view.actionSaveProjAs, 1], [group, "Manage Project", self.view.actionCloseProj, 0], # [group, "Manage Project", self.view.actionEditMeta, 1], # ["Project", "Manage Project", self.actionRenameProject, 1], ] self._actions += self.view._actions # Menu used to display all available projects. # This menu is filled dynamically each time this menu is opened self.menu_available_projects = QtGui.QMenu(u'Available Projects') self.menu_available_projects.aboutToShow.connect(self._update_available_project_menu) self.action_available_project = {} # Dict used to know what project corresponds to triggered action self.pm.register_listener(self) def initialize(self): self.view.initialize() self.pm.load_default() self.set_project(self.pm.cproject) def closeEvent(self, event): self.writeSettings() event.accept() def actions(self): return self._actions def toolbar_actions(self): return [ ["Project", "Manage", self.view.actionNewProj, 0], ["Project", "Manage", self.view.actionOpenProj, 0], ["Project", "Manage", self.view.actionSaveProj, 0], ["Project", "Manage", self.view.actionCloseProj, 0], ["Project", "Manage", self.view.actionSaveProjAs, 1], ["Project", "Manage", self.view.actionEditMeta, 1], ] def menus(self): actions = [action[2] for action in self.toolbar_actions()] menu = QtGui.QMenu('File', self) menu.addActions(actions) menu.addSeparator() menu.addMenu(self.menu_available_projects) return [menu] def project(self): if self.pm: return self.pm.cproject def _update_available_project_menu(self): """ Discover all projects and generate an action for each one. Then connect this action to _on_open_project_triggered """ self.pm.discover() self.menu_available_projects.clear() self.action_available_project.clear() all_projects = {} # dict parent dir -> list of Project objects for project in self.pm.projects: all_projects.setdefault(project.projectdir, []).append(project) for projectdir, projects in all_projects.iteritems(): title = unicode(projectdir.name) if title == 'data': title = 'Examples' menu = QtGui.QMenu(title, self.menu_available_projects) for project in projects: icon_path = project.icon_path icon_name = icon_path if icon_path else ":/images/resources/openalealogo.png" action = QtGui.QAction(QtGui.QIcon(icon_name), project.name, self.menu_available_projects) action.triggered.connect(self._on_open_project_triggered) menu.addAction(action) self.action_available_project[action] = project self.menu_available_projects.addMenu(menu) return self.menu_available_projects def _on_open_project_triggered(self): project = self.action_available_project[self.sender()] self.pm.cproject = project def notify(self, sender, event=None): signal, data = event if signal == 'project_changed': project = self.pm.cproject self.view.set_project(project=project) elif signal == 'project_updated': self.view.refresh() def set_project(self, project): self.view.set_project(project) #################################################################### # Settings #################################################################### def writeSettings(self): """ Register current settings (geometry and window state) in a setting file """ if self.pm.cproject: from openalea.core.settings import Settings last_proj = self.pm.cproject.name config = Settings() config.set("ProjectManager", "Last Project", last_proj) config.write()
class Session(object): """ Session is a non graphical class that centralize managers for ... - application settings (:class:`~openalea.oalab.config.main.MainConfig`) - projects (:class:`~openalea.oalab.project.manager.ProjectManager`) - world (:class:`~openalea.oalab.world.world.World`) - interpreter (see :mod:`~openalea.vpltk.shell.shell`) """ __metaclass__ = Singleton instantiated = False def __init__(self): import traceback traceback.print_stack(file=sys.__stdout__) self._project = None self._is_proj = False self._debug = False self.gui = True self.tmpdir = path(get_openalea_tmp_dir()) self._config = MainConfig() self.extension = None self.applet = {} self.manager = {} self.package_manager = package_manager self.control_manager = ControlManager() self.project_manager = ProjectManager() self.plugin_manager = PluginManager() self.plugin_instance_manager = PluginInstanceManager() self.manager['control'] = self.control_manager self.manager['package'] = self.package_manager self.manager['project'] = self.project_manager self.manager['plugin'] = self.plugin_manager self.manager['plugin_instance'] = self.plugin_instance_manager self.world = World() self.interpreter = interpreter() # Hack if interpreter is an object from class TerminalInteractiveShell if not hasattr(self.interpreter, "shell"): self.interpreter.shell = self.interpreter if hasattr(self.interpreter.shell, "events"): self.interpreter.shell.events.register("post_execute", self.add_to_history) else: print("You need ipython >= 2.0 to use history.") # self.project_manager.set_shell(self.interpreter.shell) self.interpreter.locals['session'] = self self.old_syspath = sys.path self.load_default() self.__class__.instantiated = True @property def project(self): """ :return: current project if one is opened. Else return None. """ return self.project_manager.cproject def load_config_file(self, filename, path=None): self._config.load_config_file(filename=filename, path=path) def clear(self): self.world.clear() self.control_manager.clear() def load_default(self): self.project_manager.load_default() self.update_namespace() def update_namespace(self): """ Definition: Update namespace """ self.interpreter.locals['world'] = self.world self.interpreter.locals['get_control'] = self.control_manager.control self.interpreter.locals[ 'follow'] = self.control_manager.register_follower self.interpreter.locals[ 'unfollow'] = self.control_manager.unregister_follower if self.project: if self.project.path.exists(): os.chdir(self.project.path) sys.path.insert(0, str(self.project.path / 'lib')) else: os.chdir(self.tmpdir) sys.path.insert(0, str(self.tmpdir / 'lib')) self.interpreter.locals.update(self.project.ns) self.interpreter.locals['project'] = self.project self.interpreter.locals['Model'] = get_model self.interpreter.locals['data'] = self.project.path / 'data' else: # close sys.path = self.old_syspath def add_to_history(self, *args, **kwargs): """ Send the last sent of history to the components that display history """ from openalea.oalab.service.history import display_history records = self.interpreter.shell.history_manager.get_range() input_ = '' # loop all elements in iterator to get last one. # TODO: search method returning directly last input for session, line, input_ in records: pass display_history(input_) config = property(fget=lambda self: self._config.config) @property def debug_plugins(self): return self.plugin_manager.debug @property def debug(self): return self._debug @debug.setter def debug(self, enable): """ If True, add some objects useful for debug in shell namespace: - applet: dict containing weak references to all applets - manager: dict containing all managers """ self._debug = enable env = self.interpreter.locals if self._debug is True: env['manager'] = self.manager env['applet'] = self.applet else: for varname in ('applet', 'manager'): if varname in env: del env[varname]
class ProjectManagerWidget(QtGui.QWidget, AbstractListener): def __init__(self): QtGui.QWidget.__init__(self) AbstractListener.__init__(self) layout = QtGui.QVBoxLayout(self) self.view = ProjectManagerView() self.model = self.view.model() layout.addWidget(self.view) layout.setContentsMargins(0, 0, 0, 0) self.pm = ProjectManager() self.menu_available_projects = QtGui.QMenu(u'Available Projects') self.actionNewProj = self.view.actionNewProj self.actionOpenProj = self.view.actionOpenProj group = "Project" self._actions = [ [group, "Manage Project", self.view.actionNewProj, 0], [group, "Manage Project", self.view.actionOpenProj, 0], [group, "Manage Project", self.view.actionSaveProj, 0], # [group, "Manage Project", self.view.actionSaveProjAs, 1], [group, "Manage Project", self.view.actionCloseProj, 0], # [group, "Manage Project", self.view.actionEditMeta, 1], # ["Project", "Manage Project", self.actionRenameProject, 1], ] self._actions += self.view._actions # Menu used to display all available projects. # This menu is filled dynamically each time this menu is opened self.menu_available_projects = QtGui.QMenu(u'Available Projects') self.menu_available_projects.aboutToShow.connect( self._update_available_project_menu) self.action_available_project = { } # Dict used to know what project corresponds to triggered action self.pm.register_listener(self) def initialize(self): self.view.initialize() self.pm.load_default() self.set_project(self.pm.cproject) def closeEvent(self, event): self.writeSettings() event.accept() def actions(self): return self._actions def toolbar_actions(self): return [ ["Project", "Manage", self.view.actionNewProj, 0], ["Project", "Manage", self.view.actionOpenProj, 0], ["Project", "Manage", self.view.actionSaveProj, 0], ["Project", "Manage", self.view.actionCloseProj, 0], ["Project", "Manage", self.view.actionSaveProjAs, 1], ["Project", "Manage", self.view.actionEditMeta, 1], ] def menus(self): actions = [action[2] for action in self.toolbar_actions()] menu = QtGui.QMenu('File', self) menu.addActions(actions) menu.addSeparator() menu.addMenu(self.menu_available_projects) return [menu] def project(self): if self.pm: return self.pm.cproject def _update_available_project_menu(self): """ Discover all projects and generate an action for each one. Then connect this action to _on_open_project_triggered """ self.pm.discover() self.menu_available_projects.clear() self.action_available_project.clear() all_projects = {} # dict parent dir -> list of Project objects for project in self.pm.projects: all_projects.setdefault(project.projectdir, []).append(project) for projectdir, projects in all_projects.iteritems(): title = unicode(projectdir.name) if title == 'data': title = 'Examples' menu = QtGui.QMenu(title, self.menu_available_projects) for project in projects: icon_path = project.icon_path icon_name = icon_path if icon_path else ":/images/resources/openalealogo.png" action = QtGui.QAction(QtGui.QIcon(icon_name), project.name, self.menu_available_projects) action.triggered.connect(self._on_open_project_triggered) menu.addAction(action) self.action_available_project[action] = project self.menu_available_projects.addMenu(menu) return self.menu_available_projects def _on_open_project_triggered(self): project = self.action_available_project[self.sender()] self.pm.cproject = project def notify(self, sender, event=None): signal, data = event if signal == 'project_changed': project = self.pm.cproject self.view.set_project(project=project) elif signal == 'project_updated': self.view.refresh() def set_project(self, project): self.view.set_project(project) #################################################################### # Settings #################################################################### def writeSettings(self): """ Register current settings (geometry and window state) in a setting file """ if self.pm.cproject: from openalea.core.settings import Settings last_proj = self.pm.cproject.name config = Settings() config.set("ProjectManager", "Last Project", last_proj) config.write()
class Session(object): """ Session is a non graphical class that centralize managers for ... - application settings (:class:`~openalea.oalab.config.main.MainConfig`) - projects (:class:`~openalea.oalab.project.manager.ProjectManager`) - world (:class:`~openalea.oalab.world.world.World`) - interpreter (see :mod:`~openalea.vpltk.shell.shell`) """ __metaclass__ = Singleton instantiated = False def __init__(self): import traceback traceback.print_stack(file=sys.__stdout__) self._project = None self._is_proj = False self._debug = False self.gui = True self.tmpdir = path(get_openalea_tmp_dir()) self._config = MainConfig() self.extension = None self.applet = {} self.manager = {} self.package_manager = package_manager self.control_manager = ControlManager() self.project_manager = ProjectManager() self.plugin_manager = PluginManager() self.plugin_instance_manager = PluginInstanceManager() self.manager['control'] = self.control_manager self.manager['package'] = self.package_manager self.manager['project'] = self.project_manager self.manager['plugin'] = self.plugin_manager self.manager['plugin_instance'] = self.plugin_instance_manager self.world = World() self.interpreter = interpreter() # Hack if interpreter is an object from class TerminalInteractiveShell if not hasattr(self.interpreter, "shell"): self.interpreter.shell = self.interpreter if hasattr(self.interpreter.shell, "events"): self.interpreter.shell.events.register("post_execute", self.add_to_history) else: print("You need ipython >= 2.0 to use history.") # self.project_manager.set_shell(self.interpreter.shell) self.interpreter.locals['session'] = self self.old_syspath = sys.path self.load_default() self.__class__.instantiated = True @property def project(self): """ :return: current project if one is opened. Else return None. """ return self.project_manager.cproject def load_config_file(self, filename, path=None): self._config.load_config_file(filename=filename, path=path) def clear(self): self.world.clear() self.control_manager.clear() def load_default(self): self.project_manager.load_default() self.update_namespace() def update_namespace(self): """ Definition: Update namespace """ self.interpreter.locals['world'] = self.world self.interpreter.locals['get_control'] = self.control_manager.control self.interpreter.locals['follow'] = self.control_manager.register_follower self.interpreter.locals['unfollow'] = self.control_manager.unregister_follower if self.project: if self.project.path.exists(): os.chdir(self.project.path) sys.path.insert(0, str(self.project.path / 'lib')) else: os.chdir(self.tmpdir) sys.path.insert(0, str(self.tmpdir / 'lib')) self.interpreter.locals.update(self.project.ns) self.interpreter.locals['project'] = self.project self.interpreter.locals['Model'] = get_model self.interpreter.locals['data'] = self.project.path / 'data' else: # close sys.path = self.old_syspath def add_to_history(self, *args, **kwargs): """ Send the last sent of history to the components that display history """ from openalea.oalab.service.history import display_history records = self.interpreter.shell.history_manager.get_range() input_ = '' # loop all elements in iterator to get last one. # TODO: search method returning directly last input for session, line, input_ in records: pass display_history(input_) config = property(fget=lambda self: self._config.config) @property def debug_plugins(self): return self.plugin_manager.debug @property def debug(self): return self._debug @debug.setter def debug(self, enable): """ If True, add some objects useful for debug in shell namespace: - applet: dict containing weak references to all applets - manager: dict containing all managers """ self._debug = enable env = self.interpreter.locals if self._debug is True: env['manager'] = self.manager env['applet'] = self.applet else: for varname in ('applet', 'manager'): if varname in env: del env[varname]