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 __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()
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)
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)
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)