Source code for capsul.qt_gui.widgets.settings_editor

# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import print_function

import sys
from capsul.engine import CapsulEngine
from soma.qt_gui.qt_backend import Qt
from soma.qt_gui.qvtabbar import QVTabBar, QVTabWidget
from functools import partial


[docs] class SettingsEditor(Qt.QDialog):
[docs] def __init__(self, engine, parent=None): super(SettingsEditor, self).__init__(parent) self.engine = engine layout = Qt.QVBoxLayout() self.setLayout(layout) env_layout = Qt.QHBoxLayout() layout.addLayout(env_layout) env_layout.addWidget(Qt.QLabel('Environment:')) self.environment_combo = Qt.QComboBox() self.environment_combo.setEditable(True) self.environment_combo.setInsertPolicy( Qt.QComboBox.InsertAlphabetically) self.environment_combo.addItems(engine.settings.get_all_environments()) self.environment_combo.setCurrentText('global') env_layout.addWidget(self.environment_combo) self.environment = 'global' #htab_layout = Qt.QHBoxLayout() self.tab_wid = QVTabWidget() # Qt.QTabWidget() #self.tab_wid.setTabPosition(Qt.QTabWidget.West) layout.addWidget(self.tab_wid) self.module_tabs = {} buttons_layout = Qt.QHBoxLayout() layout.addLayout(buttons_layout) buttons_layout.addStretch(1) ok = Qt.QPushButton('OK') ok.setDefault(False) ok.setAutoDefault(False) buttons_layout.addWidget(ok) cancel = Qt.QPushButton('Cancel') cancel.setDefault(False) cancel.setAutoDefault(False) buttons_layout.addWidget(cancel) ok.clicked.connect(self.accept) cancel.clicked.connect(self.reject) #ok.setDefault(True) self.environment_combo.activated.connect(self.change_environment) self.update_gui()
#self.tab_wid.currentChanged.connect(self.mod_tab_changed)
[docs] def update_gui(self): self.tab_wid.clear() self.module_tabs = {} environment = self.environment mod_map = dict([(module_name.split('.')[-1], module_name) for module_name in self.engine._loaded_modules]) for short_module_name in sorted(mod_map.keys()): module_name = mod_map[short_module_name] module = sys.modules.get(module_name) if module: edition_func = getattr(module, 'edition_widget', None) if edition_func: tab1 = QVTabWidget() tab1.setTabsClosable(True) tab1.tabCloseRequested.connect(partial(self.tab_closed, short_module_name)) #self.module_tabs[module] = tab1 self.tab_wid.addTab(tab1, short_module_name) #self.tab_wid.addTab(tab, short_module_name) config_ids = [] with self.engine.settings as session: for config in session.configs(module_name, environment): config_ids.append(config._id) if not config_ids: config_ids = [short_module_name] for config_id in config_ids: tab = edition_func(self.engine, environment, config_id) tab1.addTab(tab, config_id) self.module_tabs.setdefault( module_name, {})[config_id] = tab tab1.addTab(Qt.QWidget(), '+') tab1.tabBar().tabButton( tab1.count() -1, Qt.QTabBar.RightSide).hide() #tab1.update_buttons() tab1.currentChanged.connect(partial(self.tab_changed, short_module_name))
[docs] def change_environment(self, index): self.validate() self.environment = self.environment_combo.currentText() self.update_gui()
[docs] def validate(self): for module_name, tab1 in self.module_tabs.items(): for config_id, tab in tab1.items(): try: tab.accept() except Exception as e: print(e, file=sys.stderr)
[docs] def accept(self): self.validate() super(SettingsEditor, self).accept()
[docs] def tab_closed(self, module, index): # print('close:', module, index) mod_index = [i for i in range(self.tab_wid.count()) if self.tab_wid.tabText(i) == module][0] mod_widget = self.tab_wid.widget(mod_index) if mod_widget.count() == 2 or index == mod_widget.count() - 1: return # don't allow to remove the last config config_id = mod_widget.tabText(index) environment = self.environment self._modifying = True mod_widget.removeTab(index) with self.engine.settings as session: session.remove_config(module, environment, config_id) self._modifying = False mod_widget.setCurrentIndex(index - 1)
#def mod_tab_changed(self, index): #self.tab_wid.widget(index).update_buttons()
[docs] def tab_changed(self, module_name, index): if getattr(self, '_modifying', False): return self._modifying = True try: mod_index = [i for i in range(self.tab_wid.count()) if self.tab_wid.tabText(i) == module_name][0] mod_widget = self.tab_wid.widget(mod_index) former_index = getattr(mod_widget, 'former_current', 0) if index != mod_widget.count() - 1: mod_widget.former_current = index return dial = Qt.QDialog() dial.setWindowTitle('New config ID for module %s' % module_name) layout = Qt.QVBoxLayout() le = Qt.QLineEdit() tlay = Qt.QHBoxLayout() layout.addLayout(tlay) tlay.addWidget(Qt.QLabel('config id:')) tlay.addWidget(le) dial.setLayout(layout) blay = Qt.QHBoxLayout() layout.addLayout(blay) ok = Qt.QPushButton('OK') blay.addWidget(ok) cancel = Qt.QPushButton('Cancel') blay.addWidget(cancel) ok.clicked.connect(dial.accept) cancel.clicked.connect(dial.reject) res = dial.exec_() if res != Qt.QDialog.Accepted: mod_widget.setCurrentIndex(former_index) return config_id = le.text() if config_id == '': mod_widget.setCurrentIndex(former_index) return environment = self.environment with self.engine.settings as session: config = session.config(module_name, environment, 'config_id=="%s"' % config_id) if config: Qt.QMessageBox.critical( self, 'invalid new config ID', 'config %s already exists' % config_id, Qt.QMessageBox.Ok) mod_widget.setCurrentIndex(former_index) return with self.engine.settings as session: config = session.new_config(module_name, environment, {'config_id': config_id}) mod_tab = self.tab_wid.currentIndex() self.validate() self.update_gui() self.tab_wid.setCurrentIndex(mod_tab) mod_index = [i for i in range(self.tab_wid.count()) if self.tab_wid.tabText(i) == module_name][0] mod_widget = self.tab_wid.widget(mod_index) mod_widget.setCurrentIndex(index) mod_widget.former_current = index finally: self._modifying = False