def __init__(self, items, title=None, expdat=None): super().__init__() self.additional_info = {} self._expdat = expdat if title: self.setWindowTitle(title) self.main_widget = QWidget(self) self.layout = QVBoxLayout(self) self.widgets = {} for idx, citem in enumerate(items): if citem['type'] == 'label': widget = QLabel(text=citem.get('label')) self.add(widget) elif citem['type'] == 'string': widget = QLineEdit(citem.get('default')) self.add(widget, label=citem.get('label'), name=citem.get('label')) elif citem['type'] == 'int': widget = QSpinBox() if 'max' in citem: widget.setMaximum(citem['max']) if 'default' in citem: widget.setValue(citem.get('default')) self.add(widget, label=citem.get('label'), name=citem.get('label')) elif citem['type'] == 'float': widget = QDoubleSpinBox() if 'max' in citem: widget.setMaximum(citem['max']) if 'default' in citem: widget.setValue(citem.get('default')) self.add(widget, label=citem.get('label'), name=citem.get('label')) elif citem['type'] == 'combo': widget = QComboBox() widget.addItems(citem.get('items')) self.add(widget, label=citem.get('label'), name=citem.get('label')) elif citem['type'] == 'field': if expdat is None: logger.warn('Experiment is empty for dialog %s' % title) return None widget = QComboBox() if citem.get('withnone', False): items = ['<none>'] + list( expdat.sample_metadata.columns.values) else: items = expdat.sample_metadata.columns.values widget.addItems(items) self.add(widget, label=citem.get('label'), name='field') elif citem['type'] == 'value': if expdat is None: logger.warn('Experiment is empty for dialog %s' % title) return None widget = QLineEdit() self.add(widget, label=citem.get('label'), name=citem.get('label'), addbutton=True) elif citem['type'] == 'value_multi_select': if expdat is None: logger.warn('Experiment is empty for dialog %s' % title) return None widget = QLineEdit() self.add(widget, label=citem.get('label'), name=citem.get('label'), add_select_button=citem, idx=idx) elif citem['type'] == 'filename': widget = QLineEdit() self.add(widget, label=citem.get('label'), name=citem.get('label'), addfilebutton=True) elif citem['type'] == 'bool': widget = QCheckBox() if 'default' in citem: widget.setChecked(citem.get('default')) self.add(widget, label=citem.get('label'), name=citem.get('label')) elif citem['type'] == 'select': widget = QLabel('<None>') citem['selected'] = [] self.add(widget, label=citem.get('label'), name=citem.get('label'), add_select_button=citem, idx=idx) buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) self.layout.addWidget(buttonBox)
class setting: """ A class used to store setting, and display a widget for the user to modify it. """ def __init__(self, name, type, label, widget=None, default=None, tooltip=None, min=None, max=None, vals=None, suffix=""): self.name = name self.type = type self.label = label self._widget = widget self.default = default self.min = min self.max = max self.vals = vals.split("|") if vals else [] self.suffix = suffix self.tooltip = tooltip def widget(self, parent=None): """ Returns the widget used, or creates it if not done yet. If parent is given, widget is inserted in parent's layout. """ if self._widget: return self._widget else: if "checkbox" in self.type: self._widget = QCheckBox(self.label) if self.default: self._widget.setChecked(True) if parent: parent.layout().addWidget(self._widget) elif "number" in self.type: l = QHBoxLayout() label = QLabel(self.label, parent) label.setWordWrap(True) l.addWidget(label, 8) self._widget = QSpinBox() self._widget.setValue(self.default if self.default else 0) if self.min: self._widget.setMinimum(self.min) if self.max: self._widget.setMaximum(self.max) if self.suffix: self._widget.setSuffix(self.suffix) l.addWidget(self._widget, 2) if parent: parent.layout().addLayout(l) elif "combo" in self.type: l = QHBoxLayout() label = QLabel(self.label, parent) label.setWordWrap(True) l.addWidget(label, 6) self._widget = QComboBox() self._widget.addItems(self.vals) if self.default: self._widget.setCurrentText(self.default) l.addWidget(self._widget, 2) if parent: parent.layout().addLayout(l) elif "text" in self.type: l = QHBoxLayout() label = QLabel(self.label, parent) label.setWordWrap(True) l.addWidget(label, 5) self._widget = QLineEdit() self._widget.setStyleSheet(style.lineEditSS()) if self.default: self._widget.setText(self.default) l.addWidget(self._widget, 3) if parent: parent.layout().addLayout(l) elif "label" in self.type: self._widget = QLabel(self.label, parent) self._widget.setWordWrap(True) if parent: parent.layout().addWidget(self._widget) if self.tooltip: self._widget.setToolTip(self.tooltip) return self._widget def value(self): """ Return the value contained in the widget. """ if not self._widget: return self.default else: if "checkbox" in self.type: return self._widget.isChecked() elif "number" in self.type: return self._widget.value() elif "combo" in self.type: return self._widget.currentText() elif "text" in self.type: return self._widget.text()