Example #1
0
    def __init__(self):
        ProjectBrowserView.__init__(self)

        self.paradigm_container = None
        self.contextual_creator = ParadigmCreator(self)
        self.contextual_creator.paradigm_clicked.connect(self.new_contextual_paradigm)

        self.paradigm = ParadigmCreator(self)
        self.paradigm.paradigm_clicked.connect(self.new_paradigm)
Example #2
0
    def __init__(self, parent=None):
        super(ParadigmContainer, self).__init__(parent=parent)

        self.setTabsClosable(True)

        self.applets = []

        self._open_tabs = {}
        self.paradigm = ParadigmCreator()
        self.paradigm.paradigm_clicked.connect(self.new_paradigm)
        self.welcome_actions = self.paradigm.actions()

        self._open_objects = {}

        self.connect(self, QtCore.SIGNAL('tabCloseRequested(int)'),
                     self.auto_close)
        self.connect(self, QtCore.SIGNAL('currentChanged(int)'),
                     self.safe_display_help)

        self.add_default_tab()
        self.fine_tune()
Example #3
0
    def __init__(self, parent=None):
        super(ParadigmContainer, self).__init__(parent=parent)

        self.setTabsClosable(True)

        self.applets = []

        self._open_tabs = {}
        self.paradigm = ParadigmCreator()
        self.paradigm.paradigm_clicked.connect(self.new_paradigm)
        self.welcome_actions = self.paradigm.actions()

        self._open_objects = {}

        self.connect(self, QtCore.SIGNAL('tabCloseRequested(int)'), self.auto_close)
        self.connect(self, QtCore.SIGNAL('currentChanged(int)'), self.safe_display_help)

        self.add_default_tab()
        self.fine_tune()
Example #4
0
class ParadigmContainer(QtGui.QTabWidget):

    """
    Widget to edit and run models.

    Contains paradigm applets (oalab.paradigm_applet)
    """
    identifier = "WidgetEditorContainer"
    name = "Editor Container"

    def __init__(self, parent=None):
        super(ParadigmContainer, self).__init__(parent=parent)

        self.setTabsClosable(True)

        self.applets = []

        self._open_tabs = {}
        self.paradigm = ParadigmCreator()
        self.paradigm.paradigm_clicked.connect(self.new_paradigm)
        self.welcome_actions = self.paradigm.actions()

        self._open_objects = {}

        self.connect(self, QtCore.SIGNAL('tabCloseRequested(int)'), self.auto_close)
        self.connect(self, QtCore.SIGNAL('currentChanged(int)'), self.safe_display_help)

        self.add_default_tab()
        self.fine_tune()

    def fine_tune(self):
        self.setDocumentMode(True)
        # self.setMinimumSize(100, 100)
        self.setAccessibleName("Container")
        self.setElideMode(QtCore.Qt.ElideLeft)

    def initialize(self):
        self.reset()

    def _on_text_changed(self, *args):
        tab = self.sender()
        idx = self.indexOf(tab)
        if idx >= 0:
            self._set_tab_red(idx)

    ###########################################################################
    # Convenience method
    ###########################################################################

    def _data_label(self, obj):
        if hasattr(obj, 'category'):
            return '%s/%s' % (obj.category, obj.filename)
        elif hasattr(obj, 'path'):
            return '%s/%s' % (obj.path.parent.name, obj.filename)
        else:
            return obj.filename

    def _tab(self, tab):
        if tab:
            return tab
        if tab is None:
            tab = self.currentWidget()
        if tab in self._open_tabs:
            return tab
        else:
            return None

    def _data(self, tab=None):
        return self._open_tabs[self._tab(tab)]

    ###########################################################################
    # Open/Close data
    ###########################################################################

    def open_file(self, filepath=None):
        if filepath in(None, True, False):
            filepath, filters = getopenfilename(self, u"Select file")
        if filepath is None:
            return
        filepath = path(filepath).normpath().abspath()

        # check if a data in container yet correspond to this path
        found = None
        for data in self._open_objects:
            if filepath == data.path.normpath().abspath():
                found = data
        # If not, create a new data
        if found:
            data = found
        else:
            data = DataFactory(filepath)
        self.open_data(data)
        return data

    def open_data(self, obj):
        # Check if object is yet open else create applet
        if obj in self._open_objects:
            tab = self._open_objects[obj]
            self.setCurrentWidget(tab)
        else:
            applet = self.paradigm.applet(obj, obj.default_name)

            if hasattr(applet, 'textChanged'):
                applet.textChanged.connect(self._on_text_changed)

            self.remove_tab("Welcome")
            idx = self.addTab(applet, self._data_label(obj))
            if obj.path:
                self.setTabToolTip(idx, obj.path)
            self.setCurrentIndex(idx)
            self._open_objects[obj] = applet
            self._open_tabs[applet] = obj

    def close(self, tab=None):
        if tab is None:
            tab = self.currentWidget()
        idx = self.indexOf(tab)
        self.removeTab(idx)
        if tab in self._open_tabs:
            obj = self._open_tabs[tab]
            del self._open_objects[obj]
            del self._open_tabs[tab]
            tab.close()

        if self.count() == 0:
            self.add_default_tab()

    def close_current(self):
        self.close()

    def close_data(self, obj):
        if obj in self._open_objects:
            tab = self._open_objects[obj]
            self.close(tab)

    def auto_close(self, n_tab):
        self.close(self.widget(n_tab))

    def close_all(self):
        n = self.count()
        for i in range(n):
            self.close_current()

    ###########################################################################
    # New
    ###########################################################################
    def new_paradigm(self, dtype):
        p, filters = getsavefilename(self, "New file")
        if p:
            if p.exists():
                p.remove()

            data = DataFactory(p, dtype=dtype)
            self.open_data(data)

    ###########################################################################
    # Apply
    ###########################################################################

    def apply(self, tab=None):
        tab = self._tab(tab)
        try:
            applet = tab.applet
        except AttributeError:
            return

        applet.apply()

    def apply_all(self):
        """
        Save all opened files
        """
        n = self.count()
        for i in range(n):
            self.apply(tab=self.widget(i))

    ###########################################################################
    # Save
    ###########################################################################

    def save(self, tab=None):
        tab = self._tab(tab)
        self.apply(tab)
        obj = self._data(tab)
        obj.save()
        self._set_tab_black(self.indexOf(tab))

    def save_current(self):
        self.save()

    def save_all(self):
        """
        Save all opened files
        """
        n = self.count()
        for i in range(n):
            self.save(tab=self.widget(i))

    ###########################################################################
    # Tab coloration
    ###########################################################################

    def _set_tab_red(self, index=None):
        if index is None:
            index = self.currentIndex()
        if index != -1:
            self.tabBar().setTabTextColor(index, QtCore.Qt.red)

    def _set_tab_black(self, index=None):
        if index is None:
            index = self.currentIndex()
        if index != -1:
            self.tabBar().setTabTextColor(index, QtCore.Qt.black)

    def set_all_tab_black(self):
        for index in range(self.count()):
            self._set_tab_black(index)

    ###########################################################################
    # Tab management
    ###########################################################################

    def remove_tab(self, tabname="Welcome"):
        """
        Remove the tab named "tabname"

        :param tabname: name of the tab to remove. Default: "Welcome"
        """
        for i in range(self.count()):
            if self.tabText(i) == tabname:
                self.removeTab(i)

    def reset(self):
        """
        Delete all tabs
        """
        self.close_all()

    def set_welcome_actions(self, actions=[]):
        self.welcome_actions = actions

    def add_welcome_tab(self, actions):
        self.remove_tab("Welcome")
        welcomePage = WelcomePage(actions=actions, parent=self.parent(), style=WelcomePage.STYLE_MEDIUM)
        self.addTab(welcomePage, "Welcome")

    def add_default_tab(self):
        self.add_welcome_tab(self.welcome_actions)

    def safe_display_help(self):
        """
        Call focus_change method on widget.applet safely (if it exists well).
        """
        widget = self.currentWidget()
        if widget is not None:
            if hasattr(widget, "display_help"):
                widget.display_help()

    ###########################################################################
    # Run models
    ###########################################################################

    def execute(self):
        self.currentWidget().applet.execute()
        logger.debug("Execute selected part " + self.currentWidget().applet.name)

    def run(self):
        self.currentWidget().applet.run()
        logger.debug("Run " + self.currentWidget().applet.name)

    def run_in_shell(self):
        self.currentWidget().applet.run(run_in_shell=True)
        logger.debug("Run " + self.currentWidget().applet.name)

    def animate(self):
        self.currentWidget().applet.animate()
        logger.debug("Animate " + self.currentWidget().applet.name)

    def step(self):
        self.currentWidget().applet.step()
        logger.debug("Step " + self.currentWidget().applet.name)

    def stop(self):
        self.currentWidget().applet.stop()
        logger.debug("Stop " + self.currentWidget().applet.name)

    def init(self):
        self.currentWidget().applet.init()
        logger.debug("Init " + self.currentWidget().applet.name)
Example #5
0
class ParadigmContainer(QtGui.QTabWidget):
    """
    Widget to edit and run models.

    Contains paradigm applets (oalab.paradigm_applet)
    """
    identifier = "WidgetEditorContainer"
    name = "Editor Container"

    def __init__(self, parent=None):
        super(ParadigmContainer, self).__init__(parent=parent)

        self.setTabsClosable(True)

        self.applets = []

        self._open_tabs = {}
        self.paradigm = ParadigmCreator()
        self.paradigm.paradigm_clicked.connect(self.new_paradigm)
        self.welcome_actions = self.paradigm.actions()

        self._open_objects = {}

        self.connect(self, QtCore.SIGNAL('tabCloseRequested(int)'),
                     self.auto_close)
        self.connect(self, QtCore.SIGNAL('currentChanged(int)'),
                     self.safe_display_help)

        self.add_default_tab()
        self.fine_tune()

    def fine_tune(self):
        self.setDocumentMode(True)
        # self.setMinimumSize(100, 100)
        self.setAccessibleName("Container")
        self.setElideMode(QtCore.Qt.ElideLeft)

    def initialize(self):
        self.reset()

    def _on_text_changed(self, *args):
        tab = self.sender()
        idx = self.indexOf(tab)
        if idx >= 0:
            self._set_tab_red(idx)

    ###########################################################################
    # Convenience method
    ###########################################################################

    def _data_label(self, obj):
        if hasattr(obj, 'category'):
            return '%s/%s' % (obj.category, obj.filename)
        elif hasattr(obj, 'path'):
            return '%s/%s' % (obj.path.parent.name, obj.filename)
        else:
            return obj.filename

    def _tab(self, tab):
        if tab:
            return tab
        if tab is None:
            tab = self.currentWidget()
        if tab in self._open_tabs:
            return tab
        else:
            return None

    def _data(self, tab=None):
        return self._open_tabs[self._tab(tab)]

    ###########################################################################
    # Open/Close data
    ###########################################################################

    def open_file(self, filepath=None):
        if filepath in (None, True, False):
            filepath, filters = getopenfilename(self, u"Select file")
        if filepath is None:
            return
        filepath = path(filepath).normpath().abspath()

        # check if a data in container yet correspond to this path
        found = None
        for data in self._open_objects:
            if filepath == data.path.normpath().abspath():
                found = data
        # If not, create a new data
        if found:
            data = found
        else:
            data = DataFactory(filepath)
        self.open_data(data)
        return data

    def open_data(self, obj):
        # Check if object is yet open else create applet
        if obj in self._open_objects:
            tab = self._open_objects[obj]
            self.setCurrentWidget(tab)
        else:
            applet = self.paradigm.applet(obj, obj.default_name)

            if hasattr(applet, 'textChanged'):
                applet.textChanged.connect(self._on_text_changed)

            self.remove_tab("Welcome")
            idx = self.addTab(applet, self._data_label(obj))
            if obj.path:
                self.setTabToolTip(idx, obj.path)
            self.setCurrentIndex(idx)
            self._open_objects[obj] = applet
            self._open_tabs[applet] = obj

    def close(self, tab=None):
        if tab is None:
            tab = self.currentWidget()
        idx = self.indexOf(tab)
        self.removeTab(idx)
        if tab in self._open_tabs:
            obj = self._open_tabs[tab]
            del self._open_objects[obj]
            del self._open_tabs[tab]
            tab.close()

        if self.count() == 0:
            self.add_default_tab()

    def close_current(self):
        self.close()

    def close_data(self, obj):
        if obj in self._open_objects:
            tab = self._open_objects[obj]
            self.close(tab)

    def auto_close(self, n_tab):
        self.close(self.widget(n_tab))

    def close_all(self):
        n = self.count()
        for i in range(n):
            self.close_current()

    ###########################################################################
    # New
    ###########################################################################
    def new_paradigm(self, dtype):
        p, filters = getsavefilename(self, "New file")
        if p:
            if p.exists():
                p.remove()

            data = DataFactory(p, dtype=dtype)
            self.open_data(data)

    ###########################################################################
    # Apply
    ###########################################################################

    def apply(self, tab=None):
        tab = self._tab(tab)
        try:
            applet = tab.applet
        except AttributeError:
            return

        applet.apply()

    def apply_all(self):
        """
        Save all opened files
        """
        n = self.count()
        for i in range(n):
            self.apply(tab=self.widget(i))

    ###########################################################################
    # Save
    ###########################################################################

    def save(self, tab=None):
        tab = self._tab(tab)
        self.apply(tab)
        obj = self._data(tab)
        obj.save()
        self._set_tab_black(self.indexOf(tab))

    def save_current(self):
        self.save()

    def save_all(self):
        """
        Save all opened files
        """
        n = self.count()
        for i in range(n):
            self.save(tab=self.widget(i))

    ###########################################################################
    # Tab coloration
    ###########################################################################

    def _set_tab_red(self, index=None):
        if index is None:
            index = self.currentIndex()
        if index != -1:
            self.tabBar().setTabTextColor(index, QtCore.Qt.red)

    def _set_tab_black(self, index=None):
        if index is None:
            index = self.currentIndex()
        if index != -1:
            self.tabBar().setTabTextColor(index, QtCore.Qt.black)

    def set_all_tab_black(self):
        for index in range(self.count()):
            self._set_tab_black(index)

    ###########################################################################
    # Tab management
    ###########################################################################

    def remove_tab(self, tabname="Welcome"):
        """
        Remove the tab named "tabname"

        :param tabname: name of the tab to remove. Default: "Welcome"
        """
        for i in range(self.count()):
            if self.tabText(i) == tabname:
                self.removeTab(i)

    def reset(self):
        """
        Delete all tabs
        """
        self.close_all()

    def set_welcome_actions(self, actions=[]):
        self.welcome_actions = actions

    def add_welcome_tab(self, actions):
        self.remove_tab("Welcome")
        welcomePage = WelcomePage(actions=actions,
                                  parent=self.parent(),
                                  style=WelcomePage.STYLE_MEDIUM)
        self.addTab(welcomePage, "Welcome")

    def add_default_tab(self):
        self.add_welcome_tab(self.welcome_actions)

    def safe_display_help(self):
        """
        Call focus_change method on widget.applet safely (if it exists well).
        """
        widget = self.currentWidget()
        if widget is not None:
            if hasattr(widget, "display_help"):
                widget.display_help()

    ###########################################################################
    # Run models
    ###########################################################################

    def execute(self):
        self.currentWidget().applet.execute()
        logger.debug("Execute selected part " +
                     self.currentWidget().applet.name)

    def run(self):
        self.currentWidget().applet.run()
        logger.debug("Run " + self.currentWidget().applet.name)

    def run_in_shell(self):
        self.currentWidget().applet.run(run_in_shell=True)
        logger.debug("Run " + self.currentWidget().applet.name)

    def animate(self):
        self.currentWidget().applet.animate()
        logger.debug("Animate " + self.currentWidget().applet.name)

    def step(self):
        self.currentWidget().applet.step()
        logger.debug("Step " + self.currentWidget().applet.name)

    def stop(self):
        self.currentWidget().applet.stop()
        logger.debug("Stop " + self.currentWidget().applet.name)

    def init(self):
        self.currentWidget().applet.init()
        logger.debug("Init " + self.currentWidget().applet.name)
Example #6
0
class ProjectEditorView(ProjectBrowserView):

    def __init__(self):
        ProjectBrowserView.__init__(self)

        self.paradigm_container = None
        self.contextual_creator = ParadigmCreator(self)
        self.contextual_creator.paradigm_clicked.connect(self.new_contextual_paradigm)

        self.paradigm = ParadigmCreator(self)
        self.paradigm.paradigm_clicked.connect(self.new_paradigm)

    def add_new_file_actions(self, menu, paradigms=None):
        if paradigms is None:
            menu.addActions(self.contextual_creator.actions())
        else:
            for paradigm in paradigms:
                menu.addAction(self.contextual_creator.action(paradigm))
        menu.addSeparator()

    def create_menu(self):

        menu = QtGui.QMenu(self)
        actions = ProjectBrowserView.create_menu(self).actions()
        if actions:
            menu.addActions(actions)
            menu.addSeparator()

        project, category, obj = self.selected_data()

        if category == 'category' and obj == 'model':
            self.add_new_file_actions(menu)

        elif category == 'category' and obj in ('startup', 'lib'):
            self.add_new_file_actions(menu, ['Python'])

        if category == 'model':
            self.add_new_file_actions(menu)

        return menu

    def _new_paradigm(self, project, category=None, dtype=None, name=None):
        klass = DataClass(MimeType(name=dtype))
        if name is None:
            # Builtin default name for some categories
            if category in ['startup', 'lib']:
                d = {'startup': 'start.py', 'lib': 'algo.py'}
                name = d[category]
            else:
                # If category defined, use it in name
                if category:
                    name = '%s_%s.%s' % (klass.default_name.lower(), category.lower(), klass.extension)
                else:
                    name = 'file.%s' % klass.extension

        # Change extension to fit dtype (case name is given with wrong extension)
        parts = name.split('.')
        parts[-1] = klass.extension
        default_name = '.'.join(parts)

        if category:
            categories = [category]
        else:
            categories = project.categories.keys()

        # Show dialog
        w = ParadigmInfoSelector(default_name, categories, [dtype],
                                 project=project)
        dialog = ModalDialog(w)
        w.validity_changed.connect(dialog.set_valid)
        dialog.set_valid(w.is_valid())
        if dialog.exec_():
            name = w.name()
            category = w.category()
            dtype = w.dtype()
            p = project.path / category / name
            if p.exists():
                project.add(category, path=p)
            else:
                project.add(category, filename=name, content="", dtype=dtype)
            self.item_added.emit(project, category, name)

    def new_contextual_paradigm(self, dtype):
        project, category, data = self.selected_data()
        name = None
        if category == 'category':
            category = data
        elif category in project.categories:
            name = data
        else:
            category = None

        self._new_paradigm(project, category, dtype, name)

    def new_paradigm(self, dtype):
        project = self.project()
        self._new_paradigm(project, dtype=dtype)