def createWidgetsFiltres(self): """Создание виджета панели фильтрации. Тип виджета для фильтрации по значению поля определяется из анализа типа делегата установленного для соответсвующего столбца представления""" def clearLayout(layout): """Рекурсивная функция для очистки layout'а""" while layout.count(): item = layout.takeAt(0) if item.layout(): clearLayout(item.layout()) widget = item.widget() if widget is not None: widget.deleteLater() clearLayout(self.filterlayout) if isinstance(self.model(), ModelAbonents): innerModel = self.model() elif isinstance(self.model(), QSortFilterProxyModel): innerModel = self.model().sourceModel() #count = 0 for i in range(len(innerModel.namesColumn)): label = QLabel(innerModel.namesColumn[i]) delegateForColumn = self.table.itemDelegateForColumn(i) if isinstance(delegateForColumn, defaultDelegate ): # Для делегата по умолчанию выбирается QLineEdit itemFilter = QLineEdit() if isinstance(self.model(), QSortFilterProxyModel): itemFilter.textChanged.connect( self.model().changeParametrsFiltrering) elif isinstance(delegateForColumn, comboDelegate): itemFilter = QComboBox() itemFilter.addItems(delegateForColumn.content.values()) elif isinstance(delegateForColumn, comboBdDelegate): # Для delegateForColumn выбирается QComboBox, items которого заполняется из поля content делегата itemFilter = QComboBox() itemFilter.addItems(delegateForColumn.content.values()) if isinstance(self.model(), QSortFilterProxyModel): itemFilter.currentIndexChanged.connect( self.model().changeIndexFiltrering) else: continue itemFilter.setObjectName(str(i)) #innerModel.savedFields[i]) fieldlayout = QHBoxLayout() fieldlayout.addWidget(label, 1) fieldlayout.addWidget(itemFilter, 2) self.filterlayout.addLayout(fieldlayout) self.filterlayout.addStretch() self.hideFilterPanel(False)
def CreateForm(self): formGroupBox = QGroupBox("Form layout") layout = QFormLayout() self.LineEditArray = [] keys = list(self.FeildDict.keys()) for x in range(len(keys)): if self.FeildDict[keys[x]][0] == Feilds.Text: Box = QLineEdit(self) Box.textChanged.connect(self.NoteText) elif self.FeildDict[keys[x]][0] == Feilds.Date: Box = QDateEdit(self) Box.dateChanged.connect(self.NoteText) elif self.FeildDict[keys[x]][0] == Feilds.Integer: Box = QLineEdit(self) Box.setValidator(QIntValidator(0, 999999, self)) Box.textChanged.connect(self.NoteText) elif self.FeildDict[keys[x]][0] == Feilds.Real: Box = QLineEdit(self) Box.setValidator(QDoubleValidator(0.0, 999999.0, 2, self)) Box.textChanged.connect(self.NoteText) else: Box = QComboBox(self) RangeFeilds = self.FeildDict[keys[x]][2] Box.addItems(RangeFeilds) Box.activated.connect(self.NoteText) self.LineEditArray.append(Box) self.Responses.append("") for x in range(len(keys)): layout.addRow(QLabel(keys[x]), self.LineEditArray[x]) formGroupBox.setLayout(layout) return formGroupBox
def __edit_widget_init(self): if self.field_widget_type == 'QLineEdit': edit_widget = QLineEdit() edit_widget.setText(self.field_widget_context['default']) elif self.field_widget_type == 'QComboBox': edit_widget = QComboBox() edit_widget.addItems(self.field_widget_context['value_list']) edit_widget.setCurrentText(self.field_widget_context['default']) elif self.field_widget_type == 'QSpinBox': edit_widget = QSpinBox() edit_widget.setRange(self.field_widget_context['min_value'], self.field_widget_context['max_value']) edit_widget.setSingleStep(self.field_widget_context['single_step']) edit_widget.setValue(self.field_widget_context['default']) elif self.field_widget_type == 'QDoubleSpinBox': edit_widget = QDoubleSpinBox() edit_widget.setRange(self.field_widget_context['min_value'], self.field_widget_context['max_value']) edit_widget.setSingleStep(self.field_widget_context['single_step']) edit_widget.setValue(self.field_widget_context['default']) elif self.field_widget_type == 'QCheckBox': edit_widget = QCheckBox() edit_widget.setChecked(self.field_widget_context['default']) elif self.field_widget_type == 'QDateTimeEdit': edit_widget = QDateTimeEdit(QDateTime.currentDateTime()) edit_widget.setDisplayFormat('yyyy-MM-dd HH:mm:ss') edit_widget.setCalendarPopup(True) elif self.field_widget_type == 'QDateEdit': edit_widget = QDateEdit(QDate.currentDate()) edit_widget.setDisplayFormat('yyyy-MM-dd') edit_widget.setCalendarPopup(True) elif self.field_widget_type == 'QTimeEdit': edit_widget = QTimeEdit(QTime.currentTime()) edit_widget.setDisplayFormat('HH:mm:ss') else: print('could not handle type edit type: %s' % self.field_widget_type) edit_widget = QLineEdit() return edit_widget
class NotificationWidget(QWidget): """Widget for notification phone numbers""" def __init__(self, name, default, default_programs_dict, parent=None): """ Initialise layout. Arguments: name - Name of the widget default - Default value for the widget parent - Parent widget Returns: None """ super(NotificationWidget, self).__init__(parent) # Global content self.name = name self.default = default self.default_programs_dict = default_programs_dict if self.default == 'choose': self.edit = QComboBox(self) self.edit.currentTextChanged.connect(self.change_tooltip) else: self.edit = QLineEdit(self.default, self) self.edit.setReadOnly(True) self.check_box = QCheckBox(self.name, self) self.check_box.setToolTip('{0} : {1}'.format(self.check_box.isChecked(), self.name)) # Event self.check_box.stateChanged.connect(self._change_state) # Layout layout = QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.check_box) layout.addWidget(self.edit) self.edit.setEnabled(False) # Default if self.default == 'choose': pass else: self.edit.setText(default) self.edit.setToolTip(default) # Object name self.edit.setObjectName('noti_edit') self.check_box.setObjectName('noti_check') self.exceptions = [] @pyqtSlot(str) def change_tooltip(self, text): self.sender().setToolTip(text) @pyqtSlot() def _change_state(self): """ Change enable state of the edit Arguments: None Returns: None """ self.edit.setEnabled(self.check_box.isChecked()) self.check_box.setToolTip('{0} : {1}'.format(self.check_box.isChecked(), self.name)) def add_exceptions(self, name): """ Add a person to the exception list and dont send notification anymore. Arguments: name - Name of the person Returns: None """ self.exceptions.append(name) def update_combo(self, typ, users): """ Update the combo boxes. Arguments: users - User dictionary Returns: None """ if self.default == 'choose': prefix = self.default_programs_dict[typ] items = ['{0} {1}'.format(prefix, key) for key in users if '{0} {1}'.format(prefix, key) not in self.exceptions] self.edit.addItems(sorted(items)) def clear_combo(self): """ Remove all users from the combo box. Arguments: None Returns: None """ if self.default == 'choose': self.edit.clear() def get_settings(self): """ Get text of the currently selected combo item. Arguments: None Returns: Settings dictionary """ settings = {} if self.default == 'choose': settings[self.name] = '{0}\t{1}'.format( self.edit.currentText(), self.check_box.isChecked() ) else: settings[self.name] = '{0}\t{1}'.format( self.edit.text(), self.check_box.isChecked() ) return settings def set_settings(self, name, state): """ Set currently selected combo item in text. Arguments: name - Name of the person that should be currently selected. state - State of the person (True/False;Enables/Disables) Returns: None """ self.check_box.setChecked(bool(state == 'True')) if self.default == 'choose': index = self.edit.findText(name) self.edit.setCurrentIndex(index) else: self.edit.setText(name)
def createEditor(self, parent, option, index): combo = QLineEdit(parent) combo.addItems(','.join(self.data)) return combo
class MetaBoxDelegate(QStyledItemDelegate): def __init__(self, owner): super(MetaBoxDelegate, self).__init__(owner) self.booleanItems=["True", "False"] self.hintSize = None # def eventFilter(self, editor, event): # if (event.type() == QEvent.KeyPress and # event.key() == Qt.Key_Tab): # print( "Tab captured in editor") # self.commitData.emit(editor) # self.closeEditor.emit(editor, QAbstractItemDelegate.NoHint) # return True # return QStyledItemDelegate.eventFilter(self,editor,event) def createEditor(self, parent, option, index): # create the appropriate widget based on the datatype columnName = index.data(Qt.UserRole) self.hintSize = QSize(option.rect.width(), option.rect.height()) if columnName == "Node Template": self.editor = QComboBox(parent) self.editor.addItems(self.loadNodeTemplateDropdown()) elif columnName == "Relationship Template": self.editor = QComboBox(parent) self.editor.addItems(self.loadRelTemplateDropdown()) elif columnName in ["Blank Template", "Optional"]: self.editor = QComboBox(parent) self.editor.addItems(self.booleanItems) else: self.editor = QLineEdit(parent) return self.editor def setEditorData(self, editor, index): ''' this takes the string stored in the grid cell and populates the editor widget with that value. ''' value = index.data(Qt.DisplayRole) columnName = index.data(Qt.UserRole) if columnName in [ "Node Template", "Relationship Template"]: index = editor.findText(value) if index >= 0: editor.setCurrentIndex(index) elif columnName in ["Blank Template", "Optional"]: try: num = self.booleanItems.index(value) editor.setCurrentIndex(num) except: editor.setCurrentIndex(0) # default qlineedit elif isinstance(editor, QLineEdit): editor.setText(value) else: #shouldn't happen editor.setText(value) def setModelData(self, editor, model, index): ''' this takes the current value of the editor widget, converts it back to a string and stores it back in the item model ''' columnName = index.data(Qt.UserRole) if columnName in [ "Node Template", "Relationship Template"]: value=editor.currentText() model.setData(index, value, Qt.DisplayRole) # true/false properties elif columnName in ["Blank Template", "Optional"]: value = editor.currentText() model.setData(index, value, Qt.DisplayRole) # default editor is a qlineedit elif isinstance(editor, QLineEdit): value = editor.text() model.setData(index, value, Qt.DisplayRole) else: #shouldn't happen value = editor.text() model.setData(index, value, Qt.DisplayRole) def updateEditorGeometry(self, editor, option, index): editor.setGeometry(option.rect) def loadNodeTemplateDropdown(self, ): # load node template dropdown dropdownList = ["Anonymous Node"] dropdownList.extend(sorted(self.parent().parent.model.instanceList("Node Template"))) return dropdownList def loadRelTemplateDropdown(self, ): # load node template dropdown dropdownList = ["Anonymous Relationship"] dropdownList.extend(sorted(self.parent().parent.model.instanceList("Relationship Template"))) return dropdownList
class NeoEditDelegate(QStyledItemDelegate): def __init__(self, owner): super(NeoEditDelegate, self).__init__(owner) self.booleanItems = ["True", "False"] self.hintSize = None self.helper = Helper() def createEditor(self, parent, option, index): # create the appropriate widget based on the datatype dataType = index.data(Qt.UserRole + 1) self.hintSize = QSize(option.rect.width(), option.rect.height()) if dataType == DataType.INT.value: self.editor = QLineEdit(parent) self.editor.setValidator(QIntValidator()) elif dataType == DataType.FLOAT.value: self.editor = QLineEdit(parent) self.editor.setValidator(QDoubleValidator()) elif dataType == DataType.STRING.value: self.editor = QLineEdit(parent) elif dataType == DataType.BOOLEAN.value: self.editor = QComboBox(parent) self.editor.addItems(self.booleanItems) elif dataType == DataType.POINTWGS84.value: self.editor = FrmGPoint(parent) self.editor.setAutoFillBackground(True) self.hintSize = QSize(300, 40) elif dataType == DataType.POINTCARTESIAN.value: self.editor = FrmPoint(parent) self.editor.setAutoFillBackground(True) self.hintSize = QSize(300, 40) elif dataType == DataType.TIME.value: # self.editor = FrmTime(parent=parent, tz=True) self.editor = QLineEdit(parent) elif dataType == DataType.LOCALTIME.value: # self.editor = FrmTime(parent=parent, tz=False) self.editor = QLineEdit(parent) elif dataType == DataType.DATE.value: self.editor = QDateTimeEdit(parent) self.editor.setCalendarPopup(True) self.editor.setDisplayFormat("yyyy/MM/dd") elif dataType == DataType.DATETIME.value: # self.editor = QDateTimeEdit(parent) # self.editor.setCalendarPopup(False) # self.editor.setDisplayFormat("yyyy-MM-dd hh:mm:ss:zzz") self.editor = QLineEdit(parent) elif dataType == DataType.LOCALDATETIME.value: self.editor = QLineEdit(parent) elif dataType == DataType.DURATION.value: self.editor = QLineEdit(parent) else: self.editor = QLineEdit(parent) return self.editor def setEditorData(self, editor, index): ''' this takes the string stored in the grid cell and populates the editor widget with that value. ''' value = index.data(Qt.DisplayRole) dataType = index.data(Qt.UserRole + 1) if isinstance(editor, QLineEdit): if ((dataType == DataType.INT.value or dataType == DataType.FLOAT.value) and value == "Null"): editor.setText("") else: editor.setText(value) # boolean datatype uses a listbox elif isinstance(editor, QComboBox): try: num = self.booleanItems.index(value) editor.setCurrentIndex(num) except: editor.setCurrentIndex(0) elif isinstance(editor, FrmPoint): self.editor.setText(value) elif isinstance(editor, FrmGPoint): self.editor.setText(value) elif isinstance(editor, QDateTimeEdit): try: aDate = None if dataType == DataType.DATE.value: if value == "Null": aDate = QDate.currentDate() editor.setDate(aDate) else: aDate = QDate.fromString(value, format=Qt.ISODate) editor.setDate(aDate) except: pass def setModelData(self, editor, model, index): ''' this takes the current value of the editor widget, converts it back to a string and stores it back in the item model ''' dataType = index.data(Qt.UserRole + 1) # string, integer, and float use a qlineedit if isinstance(editor, QLineEdit): if dataType == DataType.DATETIME.value: value = editor.text() try: aNeoDateTime = DateTime.from_iso_format(value) saveStr = aNeoDateTime.iso_format() model.setData(index, saveStr, Qt.DisplayRole) except: self.helper.displayErrMsg( "Date Time", "Entered text [{}] is not a valid ISO date time.". format(value)) model.setData(index, value, Qt.DisplayRole) elif dataType == DataType.LOCALDATETIME.value: value = editor.text() try: aNeoDateTime = DateTime.from_iso_format(value) saveStr = aNeoDateTime.iso_format() model.setData(index, saveStr, Qt.DisplayRole) except: self.helper.displayErrMsg( "Date Time", "Entered text [{}] is not a valid ISO date time.". format(value)) model.setData(index, value, Qt.DisplayRole) elif dataType in [DataType.LOCALTIME.value, DataType.TIME.value]: value = editor.text() try: aNeoTime = Time.from_iso_format(value) saveStr = aNeoTime.iso_format() tz = "" if aNeoTime.tzinfo is not None: offset = aNeoTime.tzinfo.utcoffset(self) tz = "%+03d:%02d" % divmod( offset.total_seconds() // 60, 60) returnStr = "{}{}".format(saveStr, tz) model.setData(index, returnStr, Qt.DisplayRole) except: self.helper.displayErrMsg( "Time", "Entered text [{}] is not a valid ISO time.".format( value)) model.setData(index, value, Qt.DisplayRole) else: value = editor.text() model.setData(index, value, Qt.DisplayRole) # boolean datatype uses a listbox elif isinstance(editor, QComboBox): value = editor.currentText() model.setData(index, value, Qt.DisplayRole) elif isinstance(editor, FrmPoint): value = editor.getText() model.setData(index, value, Qt.DisplayRole) elif isinstance(editor, FrmGPoint): value = editor.getText() model.setData(index, value, Qt.DisplayRole) # elif isinstance(editor, FrmTime ): # value = editor.getText() # model.setData(index, value, Qt.DisplayRole) # elif isinstance(editor, FrmDateTime ): # value = editor.getText() # model.setData(index, value, Qt.DisplayRole) elif isinstance(editor, QDateTimeEdit): if dataType == DataType.DATE.value: value = editor.date().toString(Qt.ISODate) model.setData(index, value, Qt.DisplayRole) # if dataType == DataType.DATETIME.value: # value = editor.dateTime().toString("yyyy-MM-dd hh:mm:ss:zzz") ## print("editor datetime: {} editor string: {}".format(editor.dateTime(), value)) # model.setData(index, value, Qt.DisplayRole) def updateEditorGeometry(self, editor, option, index): dataType = index.data(Qt.UserRole + 1) if isinstance(editor, FrmPoint): editor.setGeometry( QRect(option.rect.left(), option.rect.top(), editor.frameGeometry().width(), editor.frameGeometry().height())) self.editor.parent().parent().setRowHeight( index.row(), editor.frameGeometry().height()) self.editor.parent().parent().setColumnWidth( index.column(), editor.frameGeometry().width()) elif isinstance(editor, FrmGPoint): editor.setGeometry( QRect(option.rect.left(), option.rect.top(), editor.frameGeometry().width(), editor.frameGeometry().height())) self.editor.parent().parent().setRowHeight( index.row(), editor.frameGeometry().height()) self.editor.parent().parent().setColumnWidth( index.column(), editor.frameGeometry().width()) elif isinstance(editor, QDateTimeEdit): if dataType == DataType.DATETIME.value: # for some reason, the qdatetimeedit doesn't know it's width so we hard code it editor.setGeometry( QRect(option.rect.left(), option.rect.top(), 180, editor.frameGeometry().height())) self.editor.parent().parent().setRowHeight( index.row(), editor.frameGeometry().height()) self.editor.parent().parent().setColumnWidth( index.column(), editor.frameGeometry().width()) else: editor.setGeometry( QRect(option.rect.left(), option.rect.top(), 100, editor.frameGeometry().height())) self.editor.parent().parent().setRowHeight( index.row(), editor.frameGeometry().height()) self.editor.parent().parent().setColumnWidth( index.column(), editor.frameGeometry().width()) else: editor.setGeometry(option.rect)
def showEvent(self, *args, **kwargs): startup_config = self.cfg self.clear_layout(self.formSimple) self.clear_layout(self.formAdvance) self.configuration_inputs.clear() self.setWindowTitle("Create Plugin " + self.plugin_name) position = 0 if 'uname' in startup_config.keys(): value = startup_config['uname']['value'] display_text = 'uname' if 'display_text' in startup_config['uname'].keys(): display_text = startup_config['uname']['display_text'] uname = self.gui_api.do_change_string_to_be_uname(self.plugin_name) uname = self.gui_api.change_uname_to_uniqe(uname) editable_field = QLineEdit(str(value)) editable_field.setText(uname) editable_field.setObjectName('uname' + "_line_edit") self.formSimple.addRow(str(display_text) , editable_field) self.configuration_inputs['uname'] = editable_field #line_edit.selectAll() #line_edit.setFocus() position += 1 if 'tab' in startup_config.keys(): value = startup_config['tab']['value'] display_text = 'Tab' if 'display_text' in startup_config['tab'].keys(): display_text = startup_config['tab']['display_text'] #uname = self.gui_api.do_change_string_to_be_uname(self.plugin_name) #uname = self.gui_api.change_uname_to_uniqe(uname) editable_field = QComboBox() tabs = list(self.TabManager.get_tabs_by_uname().keys()) if len(tabs) == 0: tabs = [GUI_DEFAULT_TAB] tabs.sort(key=str.lower) editable_field.addItems(tabs) editable_field.setObjectName('Tab' + "_comboBox") self.formSimple.addRow(str(display_text) , editable_field) self.configuration_inputs['tab'] = editable_field #line_edit.selectAll() #line_edit.setFocus() position += 1 startup_config_sorted = sorted(startup_config.items(), key=operator.itemgetter(0)) for attr in startup_config_sorted: attr = attr[0] if attr != 'uname' and attr !='tab': value = startup_config[attr]['value'] display_text = attr if 'display_text' in startup_config[attr].keys(): display_text = startup_config[attr]['display_text'] # ------------------------------- # Check for datatype # ------------------------------- editable_field = None if 'type' in startup_config[attr]: parameter_type = startup_config[attr]['type'] if parameter_type == 'bool': editable_field = QCheckBox() if value == '1': editable_field.setChecked(True) else: editable_field.setChecked(False) if parameter_type == 'file': editable_field = FileLineEdit() editable_field.setReadOnly(True) editable_field.setText(value) if parameter_type == 'color': editable_field = ColorLineEdit() editable_field.set_default_color(startup_config[attr]['value']) # #editable_field.setText(value) else: editable_field = QLineEdit() editable_field.setText(str(value)) editable_field.setObjectName(attr + "_line_edit") # ------------------------------- # Check for regex description # ------------------------------- if 'regex' in startup_config[attr]: regex = startup_config[attr]['regex'] rx = QRegExp(regex) validator = QRegExpValidator(rx, self) editable_field.setValidator(validator) # ------------------------------- # Divided in advanced or simple option # ------------------------------- if 'advanced' in startup_config[attr]: if startup_config[attr]['advanced'] == '1': self.formAdvance.addRow(str(display_text), editable_field) else: self.formSimple.addRow(str(display_text), editable_field) else: self.formSimple.addRow(str(display_text), editable_field) if 'tooltip' in startup_config[attr]: editable_field.setToolTip(startup_config[attr]['tooltip']) self.configuration_inputs[attr] = editable_field position+=1
def showEvent(self, *args, **kwargs): startup_config = self.cfg self.clear_layout(self.formSimple) self.clear_layout(self.formAdvance) self.configuration_inputs.clear() self.setWindowTitle("Create Plugin " + self.plugin_name) position = 0 if 'uname' in startup_config.keys(): value = startup_config['uname']['value'] display_text = 'uname' if 'display_text' in startup_config['uname'].keys(): display_text = startup_config['uname']['display_text'] uname = self.gui_api.do_change_string_to_be_uname(self.plugin_name) uname = self.gui_api.change_uname_to_uniqe(uname) editable_field = QLineEdit(str(value)) editable_field.setText(uname) editable_field.setObjectName('uname' + "_line_edit") self.formSimple.addRow(str(display_text), editable_field) self.configuration_inputs['uname'] = editable_field #line_edit.selectAll() #line_edit.setFocus() position += 1 if 'tab' in startup_config.keys(): value = startup_config['tab']['value'] display_text = 'Tab' if 'display_text' in startup_config['tab'].keys(): display_text = startup_config['tab']['display_text'] #uname = self.gui_api.do_change_string_to_be_uname(self.plugin_name) #uname = self.gui_api.change_uname_to_uniqe(uname) editable_field = QComboBox() tabs = list(self.TabManager.get_tabs_by_uname().keys()) if len(tabs) == 0: tabs = [GUI_DEFAULT_TAB] tabs.sort(key=str.lower) editable_field.addItems(tabs) editable_field.setObjectName('Tab' + "_comboBox") self.formSimple.addRow(str(display_text), editable_field) self.configuration_inputs['tab'] = editable_field #line_edit.selectAll() #line_edit.setFocus() position += 1 startup_config_sorted = sorted(startup_config.items(), key=operator.itemgetter(0)) for attr in startup_config_sorted: attr = attr[0] if attr != 'uname' and attr != 'tab': value = startup_config[attr]['value'] display_text = attr if 'display_text' in startup_config[attr].keys(): display_text = startup_config[attr]['display_text'] # ------------------------------- # Check for datatype # ------------------------------- editable_field = None if 'type' in startup_config[attr]: parameter_type = startup_config[attr]['type'] if parameter_type == 'bool': editable_field = QCheckBox() if value == '1': editable_field.setChecked(True) else: editable_field.setChecked(False) if parameter_type == 'file': editable_field = FileLineEdit() editable_field.setReadOnly(True) editable_field.setText(value) if parameter_type == 'color': editable_field = ColorLineEdit() editable_field.set_default_color( startup_config[attr]['value']) # #editable_field.setText(value) else: editable_field = QLineEdit() editable_field.setText(str(value)) editable_field.setObjectName(attr + "_line_edit") # ------------------------------- # Check for regex description # ------------------------------- if 'regex' in startup_config[attr]: regex = startup_config[attr]['regex'] rx = QRegExp(regex) validator = QRegExpValidator(rx, self) editable_field.setValidator(validator) # ------------------------------- # Divided in advanced or simple option # ------------------------------- if 'advanced' in startup_config[attr]: if startup_config[attr]['advanced'] == '1': self.formAdvance.addRow(str(display_text), editable_field) else: self.formSimple.addRow(str(display_text), editable_field) else: self.formSimple.addRow(str(display_text), editable_field) if 'tooltip' in startup_config[attr]: editable_field.setToolTip(startup_config[attr]['tooltip']) self.configuration_inputs[attr] = editable_field position += 1
class QueryRowWgt(QWidget): valueTypeChanged = pyqtSignal(object) ontoMng = OntoManager() treeData = ontoMng.trees dicData = ontoMng.dics tagNames = np.array(list(dicData.values())) del dicData del treeData def __init__(self, searchType, parent=None): super().__init__(parent) self.searchType = searchType self.valueType = QComboBox(self) self.valueType.addItem("") if self.searchType == "Annotation": self.valueType.addItems(annotationKeys) elif self.searchType == "Parameter": self.valueType.addItems(parameterKeys) else: raise ValueError() self.valueType.currentIndexChanged.connect(self.valueTypeChangedEmit) self.value = QLineEdit(self) self.value.setEnabled(False) self.layout = QHBoxLayout(self) self.layout.addWidget(self.valueType) self.layout.addWidget(self.value) def valueTypeChangedEmit(self): self.value.setEnabled(self.valueType.currentText() != "") child = self.layout.takeAt(1) child.widget().deleteLater() if self.valueType.currentText() == "Has parameter": self.value = QComboBox(self) self.value.addItems(["False", "True"]) elif self.valueType.currentText() == "Annotation type": self.value = QComboBox(self) self.value.addItems( ["text", "figure", "table", "equation", "position"]) elif self.valueType.currentText() == "Parameter name": self.value = ParamTypeCbo(self) elif self.valueType.currentText() in ["Tag name", "Required tag name"]: self.value = AutoCompleteEdit(self) self.value.setModel(QueryRowWgt.tagNames) elif self.valueType.currentText() == "Result type": self.value = QComboBox(self) self.value.addItems(["pointValue", "function", "numericalTrace"]) else: self.value = QLineEdit(self) self.layout.addWidget(self.value) self.valueTypeChanged.emit(self) def getQuery(self): if self.valueType.currentText() == "": return None if isinstance(self.value, QLineEdit): value = self.value.text() elif isinstance(self.value, QComboBox): value = self.value.currentText() else: raise TypeError return ConditionAtom(self.valueType.currentText(), value)
def showEvent(self, *args, **kwargs): """ This function is called before the dialog is displayed. :param args: :param kwargs: :return: """ startup_config = self.cfg for form in self.advancedForms: self.clear_layout(self.advancedForms[form]) self.configuration_inputs.clear() self.setWindowTitle("Create Plugin " + self.plugin_name) position = 0 if 'uname' in startup_config.keys(): value = startup_config['uname']['value'] display_text = 'Unique name' if 'display_text' in startup_config['uname'].keys(): display_text = startup_config['uname']['display_text'] uname = self.gui_api.do_change_string_to_be_uname(self.plugin_name) uname = self.gui_api.change_uname_to_uniqe(uname) editable_field = QLineEdit(str(value)) editable_field.setText(uname) editable_field.setObjectName('uname' + "_line_edit") editable_field.setToolTip('Name as identifier in PaPI. Must be UNIQUE') form_name = 'PaPI -mandatory' if form_name not in self.advancedForms: self.advancedForms[form_name] = QFormLayout() tab_widget = QWidget() self.tabWidget.addTab(tab_widget, form_name) vlayout = QVBoxLayout(tab_widget) vlayout.addLayout(self.advancedForms[form_name]) self.advancedForms[form_name].addRow(str(display_text), editable_field) self.configuration_inputs['uname'] = editable_field position += 1 startup_config_sorted = startup_config.items() if not isinstance(startup_config, collections.OrderedDict): startup_config_sorted = sorted(startup_config.items(), key=operator.itemgetter(0)) for attr in startup_config_sorted: attr = attr[0] if attr != 'uname': value = startup_config[attr]['value'] display_text = attr if 'display_text' in startup_config[attr].keys(): display_text = startup_config[attr]['display_text'] # ------------------------------- # Check for datatype # ------------------------------- editable_field = None if attr != 'tab': if 'type' in startup_config[attr]: parameter_type = startup_config[attr]['type'] if parameter_type == 'bool': editable_field = QCheckBox() if value == '1': editable_field.setChecked(True) else: editable_field.setChecked(False) if parameter_type == 'file': editable_field = FileLineEdit() editable_field.setReadOnly(True) editable_field.setText(value) if parameter_type == 'color': editable_field = ColorLineEdit() editable_field.set_default_color(startup_config[attr]['value']) # # editable_field.setText(value) else: editable_field = QLineEdit() editable_field.setText(str(value)) editable_field.setObjectName(attr + "_line_edit") # ------------------------------- # Check for regex description # ------------------------------- if 'regex' in startup_config[attr]: regex = startup_config[attr]['regex'] rx = QRegExp(regex) validator = QRegExpValidator(rx, self) editable_field.setValidator(validator) else: editable_field = QComboBox() tabs = list(self.tab_manager.get_tabs_by_uname().keys()) if len(tabs) == 0: tabs = [GUI_DEFAULT_TAB] tabs.sort(key=str.lower) editable_field.addItems(tabs) editable_field.setObjectName('Tab' + "_comboBox") # ------------------------------- # Divided in advanced or simple option # ------------------------------- if 'advanced' in startup_config[attr]: form_name = startup_config[attr]['advanced'] else: form_name = 'PaPI -mandatory' if form_name in ['0', 0]: form_name = 'PaPI -mandatory' if form_name == '1': form_name = 'Advanced' if form_name not in self.advancedForms: self.advancedForms[form_name] = QFormLayout() tab_widget = QWidget() self.tabWidget.addTab(tab_widget, form_name) vlayout = QVBoxLayout(tab_widget) vlayout.addLayout(self.advancedForms[form_name]) self.advancedForms[form_name].addRow(str(display_text), editable_field) if 'tooltip' in startup_config[attr]: editable_field.setToolTip(startup_config[attr]['tooltip']) self.configuration_inputs[attr] = editable_field position += 1
def __init__(self, title, controls, parent=None): """title => Dialog's title. controls is a list of 3-element-lists. The three 3-element lists consist of: description => Descriptive label for the control. control_type => One of TEXT, COMBO, CHECKBOX corresponding to a QLineEdit, QComboBox and QCheckBox being created respectively. default => Default arguments. Can be any string for TEXT, Must be a list of strings for COMBO as these will form the items selectable by the combo box. Can be either True or False for CheckBox. A dialog will be created with vertical layout. Like so: <label> <control> <label> <control> When the user has finished editing an 'editingFinished' signal will be emitted containing a list with the new value. The list will consist of the value for each control in the order given. For TEXT it'll a string. COMBO an integer corresponding to the selected index. True or False for CHECK. """ QDialog.__init__(self, parent) vbox = QVBoxLayout() self._controls = [] winsettings(title, self) self.setWindowTitle(translate("WebDB", 'Configure: %s') % title) for desc, ctype, default in controls: if ctype == TEXT: control = QLineEdit(default) vbox.addLayout(create_buddy(desc, control)) elif ctype == COMBO: control = QComboBox() control.addItems(default[0]) control.setCurrentIndex(default[1]) label = QLabel(desc) label.setBuddy(control) vbox.addWidget(label) vbox.addWidget(control) elif ctype == CHECKBOX: control = QCheckBox(desc) if default: control.setCheckState(Qt.CheckState.Checked) else: control.setCheckState(Qt.CheckState.Unchecked) vbox.addWidget(control) elif ctype == SPINBOX: control = QSpinBox() control.setMinimum(default[0]) control.setMaximum(default[1]) control.setValue(default[2]) vbox.addLayout(create_buddy(desc, control)) self._controls.append(control) okcancel = OKCancel() okcancel.ok.connect(self.okClicked) okcancel.cancel.connect(self.close) vbox.addLayout(okcancel) vbox.addStretch() self.setLayout(vbox)
def add_property_to_form(label: str, dtype: Union[Type, str], default_value=None, valid_values=None, tooltip=None, on_change=None, form=None, filters_view=None, run_on_press=None, single_step_size=None) -> Tuple[Union[QLabel, QLineEdit], Any]: """ Adds a property to the algorithm dialog. Handles adding basic data options to the UI. :param label: Label that describes the option :param dtype: Option data type (any of: file, int, float, bool, list) :param default_value: Optionally select the default value :param valid_values: Optionally provide the range or selection of valid values :param tooltip: Optional tooltip text to show on property :param on_change: Function to be called when the property changes :param form: Form layout to optionally add the new widgets to :param filters_view: The Filter window view - passed to connect Type.STACK to the stack change events :param run_on_press: Run this function on press, specialisation for button. :param single_step_size: Optionally provide a step size for a SpinBox widget. """ # By default assume the left hand side widget will be a label left_widget = QLabel(label) right_widget = None # sanitize default value if isinstance(default_value, str) and default_value.lower() == "none": default_value = None def set_spin_box(box, cast_func): """ Helper function to set default options on a spin box. """ if valid_values: box.setMinimum(valid_values[0]) box.setMaximum(valid_values[1]) else: box.setMinimum(0) box.setMaximum(10000) if default_value: box.setValue(cast_func(default_value)) if single_step_size is not None: box.setSingleStep(single_step_size) elif cast_func == float: # Override the default step size for QDoubleSpinBox box.setSingleStep(0.1) if dtype in ['str', Type.STR, 'tuple', Type.TUPLE, 'NoneType', Type.NONETYPE, 'list', Type.LIST]: # TODO for tuple with numbers add N combo boxes, N = number of tuple members right_widget = QLineEdit() right_widget.setToolTip(tooltip) right_widget.setText(default_value) if on_change is not None: right_widget.editingFinished.connect(lambda: on_change()) elif dtype == 'int' or dtype == Type.INT: right_widget = QSpinBox() right_widget.setKeyboardTracking(False) set_spin_box(right_widget, int) if on_change is not None: right_widget.valueChanged.connect(lambda: on_change_and_disable(right_widget, on_change)) elif dtype == 'float' or dtype == Type.FLOAT: right_widget = QDoubleSpinBox() set_spin_box(right_widget, float) right_widget.setKeyboardTracking(False) if on_change is not None: right_widget.valueChanged.connect(lambda: on_change_and_disable(right_widget, on_change)) elif dtype == 'bool' or dtype == Type.BOOL: right_widget = QCheckBox() if isinstance(default_value, bool): right_widget.setChecked(default_value) elif isinstance(default_value, str): right_widget.setChecked("True" == default_value) elif default_value is None: # have to pick something right_widget.setChecked(False) else: raise ValueError(f"Cannot convert value {default_value} to a Boolean.") if on_change is not None: right_widget.stateChanged[int].connect(lambda: on_change()) elif dtype == "choice" or dtype == Type.CHOICE: right_widget = QComboBox() right_widget.setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy.AdjustToContents) if valid_values: right_widget.addItems(valid_values) if on_change is not None: right_widget.currentIndexChanged[int].connect(lambda: on_change()) elif dtype == 'stack' or dtype == Type.STACK: from mantidimaging.gui.widgets.stack_selector import StackSelectorWidgetView right_widget = StackSelectorWidgetView(filters_view) if on_change is not None: right_widget.currentIndexChanged[int].connect(lambda: on_change()) elif dtype == 'button' or dtype == Type.BUTTON: left_widget = QPushButton(label) if run_on_press is not None: left_widget.clicked.connect(lambda: run_on_press()) elif dtype == 'label' or dtype == Type.LABEL: # do nothing for label, just use the left widget pass else: raise ValueError("Unknown data type") if tooltip: if left_widget: left_widget.setToolTip(tooltip) if right_widget: right_widget.setToolTip(tooltip) # right widget check avoids printing debug msg for labels only if tooltip is None and right_widget is not None: log = getLogger(__name__) log.debug("Missing tooltip for %s", label) if left_widget: left_widget.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) if right_widget: right_widget.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) # Add to form layout if form is not None: form.addRow(left_widget, right_widget) return left_widget, right_widget
def showEvent(self, *args, **kwargs): """ This function is called before the dialog is displayed. :param args: :param kwargs: :return: """ startup_config = self.cfg for form in self.advancedForms: self.clear_layout(self.advancedForms[form]) self.configuration_inputs.clear() self.setWindowTitle("Create Plugin " + self.plugin_name) position = 0 if 'uname' in startup_config.keys(): value = startup_config['uname']['value'] display_text = 'Unique name' if 'display_text' in startup_config['uname'].keys(): display_text = startup_config['uname']['display_text'] uname = self.gui_api.do_change_string_to_be_uname(self.plugin_name) uname = self.gui_api.change_uname_to_uniqe(uname) editable_field = QLineEdit(str(value)) editable_field.setText(uname) editable_field.setObjectName('uname' + "_line_edit") editable_field.setToolTip( 'Name as identifier in PaPI. Must be UNIQUE') form_name = 'PaPI -mandatory' if form_name not in self.advancedForms: self.advancedForms[form_name] = QFormLayout() tab_widget = QWidget() self.tabWidget.addTab(tab_widget, form_name) vlayout = QVBoxLayout(tab_widget) vlayout.addLayout(self.advancedForms[form_name]) self.advancedForms[form_name].addRow(str(display_text), editable_field) self.configuration_inputs['uname'] = editable_field position += 1 startup_config_sorted = startup_config.items() if not isinstance(startup_config, collections.OrderedDict): startup_config_sorted = sorted(startup_config.items(), key=operator.itemgetter(0)) for attr in startup_config_sorted: attr = attr[0] if attr != 'uname': value = startup_config[attr]['value'] display_text = attr if 'display_text' in startup_config[attr].keys(): display_text = startup_config[attr]['display_text'] # ------------------------------- # Check for datatype # ------------------------------- editable_field = None if attr != 'tab': if 'type' in startup_config[attr]: parameter_type = startup_config[attr]['type'] if parameter_type == 'bool': editable_field = QCheckBox() if value == '1': editable_field.setChecked(True) else: editable_field.setChecked(False) if parameter_type == 'file': editable_field = FileLineEdit() editable_field.setReadOnly(True) editable_field.setText(value) if parameter_type == 'color': editable_field = ColorLineEdit() editable_field.set_default_color( startup_config[attr]['value']) # # editable_field.setText(value) else: editable_field = QLineEdit() editable_field.setText(str(value)) editable_field.setObjectName(attr + "_line_edit") # ------------------------------- # Check for regex description # ------------------------------- if 'regex' in startup_config[attr]: regex = startup_config[attr]['regex'] rx = QRegExp(regex) validator = QRegExpValidator(rx, self) editable_field.setValidator(validator) else: editable_field = QComboBox() tabs = list(self.tab_manager.get_tabs_by_uname().keys()) if len(tabs) == 0: tabs = [GUI_DEFAULT_TAB] tabs.sort(key=str.lower) editable_field.addItems(tabs) editable_field.setObjectName('Tab' + "_comboBox") # ------------------------------- # Divided in advanced or simple option # ------------------------------- if 'advanced' in startup_config[attr]: form_name = startup_config[attr]['advanced'] else: form_name = 'PaPI -mandatory' if form_name in ['0', 0]: form_name = 'PaPI -mandatory' if form_name == '1': form_name = 'Advanced' if form_name not in self.advancedForms: self.advancedForms[form_name] = QFormLayout() tab_widget = QWidget() self.tabWidget.addTab(tab_widget, form_name) vlayout = QVBoxLayout(tab_widget) vlayout.addLayout(self.advancedForms[form_name]) self.advancedForms[form_name].addRow(str(display_text), editable_field) if 'tooltip' in startup_config[attr]: editable_field.setToolTip(startup_config[attr]['tooltip']) self.configuration_inputs[attr] = editable_field position += 1
class MaterialFrame: def __init__(self, parent, box_type='select'): super().__init__() self.parent = parent self.box_type = box_type self.material = MaterialProperties() self.material_name = '' self.boxGroup = QGroupBox('Material Settings', self.parent) self.gridLayout = QGridLayout(self.boxGroup) self.materialBoxGroup = QGroupBox('', self.boxGroup) self.miniLayout = QHBoxLayout(self.materialBoxGroup) self.label_mat_name = QLabel(self.materialBoxGroup) self.label_mat_name.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.material_name_widget = QComboBox() self.miniLayout.addWidget(self.label_mat_name) # self.miniLayout.addWidget(self.material_name_wid) self.materialBoxGroup.setLayout(self.miniLayout) self.label_Density = QLabel('Density (kg/m^3)', self.boxGroup) self.label_Density.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.entry_Density = QLineEdit(self.boxGroup) self.label_spHeat = QLabel('Specific Heat (J/kg.K)', self.boxGroup) self.label_spHeat.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.entry_spHeat = QLineEdit(self.boxGroup) self.label_Conductivity = QLabel('Thermal Conductivity (W/m.K)', self.boxGroup) self.label_Conductivity.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.entry_Conductivity = QLineEdit(self.boxGroup) self.label_meltPt = QLabel('Melting Temperature (K)', self.boxGroup) self.label_meltPt.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.entry_meltPt = QLineEdit(self.boxGroup) self.label_Emissivity = QLabel('Emissivity (0-1)', self.boxGroup) self.label_Emissivity.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.entry_Emissivity = QLineEdit(self.boxGroup) self.label_Reflect = QLabel('Reflectivity (0-1)', self.boxGroup) self.label_Reflect.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.entry_Reflect = QLineEdit(self.boxGroup) self.label_blank = QLabel(' ', self.boxGroup) self.label_blank.setFixedWidth(60) self.gridLayout.addWidget(self.materialBoxGroup, 0, 0, 1, 3) self.gridLayout.addWidget(self.label_Density, 1, 0) self.gridLayout.addWidget(self.entry_Density, 1, 1) self.gridLayout.addWidget(self.label_blank, 1, 2) self.gridLayout.addWidget(self.label_spHeat, 1, 3) self.gridLayout.addWidget(self.entry_spHeat, 1, 4) self.gridLayout.addWidget(self.label_Conductivity, 2, 0) self.gridLayout.addWidget(self.entry_Conductivity, 2, 1) self.gridLayout.addWidget(self.label_meltPt, 2, 3) self.gridLayout.addWidget(self.entry_meltPt, 2, 4) self.gridLayout.addWidget(self.label_Emissivity, 3, 0) self.gridLayout.addWidget(self.entry_Emissivity, 3, 1) self.gridLayout.addWidget(self.label_Reflect, 3, 3) self.gridLayout.addWidget(self.entry_Reflect, 3, 4) self.boxGroup.setLayout(self.gridLayout) if self.box_type == 'entry': self.new_material_entry() else: self.material_select_box() self.material_name_widget.activated[str].connect( self.on_material_select) def material_select_box(self): self.label_mat_name.setText('Select Material') self.material_name_widget = QComboBox(self.materialBoxGroup) self.miniLayout.addWidget(self.material_name_widget) self.update_material_combobox() def new_material_entry(self): self.label_mat_name.setText('Enter Material Name') self.material_name_widget = QLineEdit(self.materialBoxGroup) self.miniLayout.addWidget(self.material_name_widget) def update_material_combobox(self): self.material_name_widget.clear() self.material.get_material_list() self.material_name_widget.addItems(self.material.material_list) def on_material_select(self, text): self.material_name = text self.material.read_from_json(self.material_name) self.entry_Density.setText(str(self.material.density)) self.entry_spHeat.setText(str(self.material.specific_heat)) self.entry_Conductivity.setText(str(self.material.conductivity)) self.entry_meltPt.setText(str(self.material.melting_point)) self.entry_Emissivity.setText(str(self.material.emissivity)) self.entry_Reflect.setText(str(self.material.reflectivity)) print(self.material_name, self.entry_Density.text())