Exemplo n.º 1
0
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()
Exemplo n.º 2
0
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]
Exemplo n.º 3
0
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()
Exemplo n.º 4
0
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]