def __init__(self, session): """ Initialize the Preferences dialog. :type session: Session """ super().__init__(session) settings = QtCore.QSettings() ############################################# # GENERAL TAB ################################# # WORKSPACE GROUP workspace = StringField(self, objectName='workspace_field') workspace.setMinimumWidth(400) workspace.setReadOnly(True) workspace.setText(settings.value('workspace/home', WORKSPACE, str)) self.addWidget(workspace) browse = QtWidgets.QPushButton(self, objectName='workspace_browse_button') browse.setText('Browse') connect(browse.clicked, self.browseWorkspace) self.addWidget(browse) boxLayout = QtWidgets.QHBoxLayout() boxLayout.addWidget(self.widget('workspace_field')) boxLayout.addWidget(self.widget('workspace_browse_button')) groupbox = QtWidgets.QGroupBox('Workspace', self, objectName='workspace_widget') groupbox.setLayout(boxLayout) self.addWidget(groupbox) ## EDITOR GROUP prefix = QtWidgets.QLabel(self, objectName='diagram_size_prefix') prefix.setText('Diagram size') self.addWidget(prefix) spinbox = SpinBox(self, objectName='diagram_size_field') spinbox.setRange(Diagram.MinSize, Diagram.MaxSize) spinbox.setSingleStep(100) spinbox.setToolTip('Default size of all the new created diagrams') spinbox.setValue(settings.value('diagram/size', 5000, int)) self.addWidget(spinbox) prefix = QtWidgets.QLabel(self, objectName='diagram_font_size_prefix') prefix.setText('Diagram font size (px)') self.addWidget(prefix) spinbox = SpinBox(self, objectName='diagram_font_size_field') spinbox.setRange(Diagram.MinFontSize, Diagram.MaxFontSize) spinbox.setSingleStep(1) spinbox.setToolTip('Default font size for diagram labels (px)') spinbox.setValue(settings.value('diagram/fontsize', QtWidgets.qApp.font().pixelSize(), int)) self.addWidget(spinbox) formlayout = QtWidgets.QFormLayout() formlayout.addRow(self.widget('diagram_size_prefix'), self.widget('diagram_size_field')) formlayout.addRow(self.widget('diagram_font_size_prefix'), self.widget('diagram_font_size_field')) groupbox = QtWidgets.QGroupBox('Editor', self, objectName='editor_widget') groupbox.setLayout(formlayout) self.addWidget(groupbox) ## UPDATE GROUP prefix = QtWidgets.QLabel(self, objectName='update_startup_prefix') prefix.setText('Check for updates on startup') self.addWidget(prefix) checkbox = CheckBox(self, objectName='update_startup_checkbox') checkbox.setChecked(settings.value('update/check_on_startup', True, bool)) checkbox.setToolTip('Whether or not application updates needs to be checked upon startup') self.addWidget(checkbox) prefix = QtWidgets.QLabel(self, objectName='update_channel_prefix') prefix.setText('Update channel') self.addWidget(prefix) combobox = ComboBox(objectName='update_channel_switch') combobox.setEditable(False) combobox.setFocusPolicy(QtCore.Qt.StrongFocus) combobox.setScrollEnabled(False) combobox.setToolTip('Update channel (current = %s)' % settings.value('update/channel', Channel.Stable.value, str)) combobox.addItems([x.value for x in Channel]) combobox.setCurrentText(settings.value('update/channel', Channel.Stable.value, str)) self.addWidget(combobox) formlayout = QtWidgets.QFormLayout() formlayout.addRow(self.widget('update_startup_prefix'), self.widget('update_startup_checkbox')) formlayout.addRow(self.widget('update_channel_prefix'), self.widget('update_channel_switch')) groupbox = QtWidgets.QGroupBox('Update', self, objectName='update_widget') groupbox.setLayout(formlayout) self.addWidget(groupbox) ## GENERAL TAB LAYOUT CONFIGURATION layout = QtWidgets.QVBoxLayout() layout.setAlignment(QtCore.Qt.AlignTop) layout.addWidget(self.widget('workspace_widget'), 0, QtCore.Qt.AlignTop) layout.addWidget(self.widget('editor_widget'), 0, QtCore.Qt.AlignTop) layout.addWidget(self.widget('update_widget'), 0, QtCore.Qt.AlignTop) widget = QtWidgets.QWidget() widget.setLayout(layout) widget.setObjectName('general_widget') self.addWidget(widget) ############################################# # EXPORT TAB ################################# self.checks = {x: CheckBox(x.value, self) for x in OWLAxiom} for axiom, checkbox in self.checks.items(): checkbox.setChecked(settings.value('export/axiom/{}'.format(axiom.value), True, bool)) ## NON-LOGICAL GROUP layout = QtWidgets.QGridLayout() layout.setColumnMinimumWidth(0, 230) layout.setColumnMinimumWidth(1, 230) layout.setColumnMinimumWidth(2, 230) layout.addWidget(self.checks[OWLAxiom.Annotation], 0, 0) layout.addWidget(self.checks[OWLAxiom.Declaration], 0, 1) layout.addWidget(QtWidgets.QWidget(self), 0, 2) widget = QtWidgets.QGroupBox('Non-Logical', self, objectName='axioms_non_logical') widget.setLayout(layout) self.addWidget(widget) ## INTENSIONAL GROUP layout = QtWidgets.QGridLayout() layout.setColumnMinimumWidth(0, 230) layout.setColumnMinimumWidth(1, 230) layout.setColumnMinimumWidth(2, 230) layout.addWidget(self.checks[OWLAxiom.AsymmetricObjectProperty], 0, 0) layout.addWidget(self.checks[OWLAxiom.DataPropertyDomain], 1, 0) layout.addWidget(self.checks[OWLAxiom.DataPropertyRange], 2, 0) layout.addWidget(self.checks[OWLAxiom.DisjointClasses], 3, 0) layout.addWidget(self.checks[OWLAxiom.DisjointDataProperties], 4, 0) layout.addWidget(self.checks[OWLAxiom.DisjointObjectProperties], 5, 0) layout.addWidget(self.checks[OWLAxiom.EquivalentClasses], 6, 0) layout.addWidget(self.checks[OWLAxiom.EquivalentDataProperties], 7, 0) layout.addWidget(self.checks[OWLAxiom.EquivalentObjectProperties], 0, 1) layout.addWidget(self.checks[OWLAxiom.FunctionalDataProperty], 1, 1) layout.addWidget(self.checks[OWLAxiom.FunctionalObjectProperty], 2, 1) layout.addWidget(self.checks[OWLAxiom.InverseFunctionalObjectProperty], 3, 1) layout.addWidget(self.checks[OWLAxiom.InverseObjectProperties], 4, 1) layout.addWidget(self.checks[OWLAxiom.IrreflexiveObjectProperty], 5, 1) layout.addWidget(self.checks[OWLAxiom.ObjectPropertyDomain], 6, 1) layout.addWidget(self.checks[OWLAxiom.ObjectPropertyRange], 7, 1) layout.addWidget(self.checks[OWLAxiom.ReflexiveObjectProperty], 0, 2) layout.addWidget(self.checks[OWLAxiom.SubClassOf], 1, 2) layout.addWidget(self.checks[OWLAxiom.SubDataPropertyOf], 2, 2) layout.addWidget(self.checks[OWLAxiom.SubObjectPropertyOf], 3, 2) layout.addWidget(self.checks[OWLAxiom.SymmetricObjectProperty], 4, 2) layout.addWidget(self.checks[OWLAxiom.TransitiveObjectProperty], 5, 2) widget = QtWidgets.QGroupBox('Intensional', self, objectName='axioms_intensional') widget.setLayout(layout) self.addWidget(widget) ## EXTENSIONAL GROUP layout = QtWidgets.QGridLayout() layout.setColumnMinimumWidth(0, 230) layout.setColumnMinimumWidth(1, 230) layout.setColumnMinimumWidth(2, 230) layout.addWidget(self.checks[OWLAxiom.ClassAssertion], 0, 0) layout.addWidget(self.checks[OWLAxiom.DataPropertyAssertion], 1, 0) layout.addWidget(self.checks[OWLAxiom.DifferentIndividuals], 2, 0) layout.addWidget(self.checks[OWLAxiom.NegativeDataPropertyAssertion], 0, 1) layout.addWidget(self.checks[OWLAxiom.NegativeObjectPropertyAssertion], 1, 1) layout.addWidget(self.checks[OWLAxiom.ObjectPropertyAssertion], 2, 1) layout.addWidget(self.checks[OWLAxiom.SameIndividual], 0, 2) widget = QtWidgets.QGroupBox('Extensional', self, objectName='axioms_extensional') widget.setLayout(layout) self.addWidget(widget) ## LOGICAL GROUP layout = QtWidgets.QVBoxLayout() layout.addWidget(self.widget('axioms_intensional')) layout.addWidget(self.widget('axioms_extensional')) widget = QtWidgets.QGroupBox('Logical', self, objectName='axioms_logical') widget.setLayout(layout) self.addWidget(widget) ## EXPORT TAB LAYOUT CONFIGURATION layout = QtWidgets.QVBoxLayout() layout.addWidget(self.widget('axioms_non_logical')) layout.addWidget(self.widget('axioms_logical')) groupbox = QtWidgets.QGroupBox('OWL 2 Axioms for which exporting is enabled', self) groupbox.setLayout(layout) layout = QtWidgets.QVBoxLayout() layout.setContentsMargins(10, 10, 10, 10) layout.addWidget(groupbox) widget = QtWidgets.QWidget(self, objectName='axioms_widget') widget.setLayout(layout) self.addWidget(widget) ############################################# # PLUGINS TAB ################################# table = QtWidgets.QTableWidget(len(self.session.plugins()), 5, self, objectName='plugins_table') table.setHorizontalHeaderLabels(['Name', 'Version', 'Author', 'Contact', 'Uninstall']) table.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) table.setFocusPolicy(QtCore.Qt.NoFocus) self.addWidget(table) header = table.horizontalHeader() header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(1, QtWidgets.QHeaderView.Fixed) header.setSectionResizeMode(2, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(4, QtWidgets.QHeaderView.Fixed) header.setSectionsClickable(False) header.setSectionsMovable(False) header = table.verticalHeader() header.setSectionResizeMode(QtWidgets.QHeaderView.Fixed) self.uninstall = dict() for row, plugin in enumerate(sorted(self.session.plugins(), key=lambda x: x.name())): item = QtWidgets.QTableWidgetItem(plugin.name()) item.setTextAlignment(QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) table.setItem(row, 0, item) item = QtWidgets.QTableWidgetItem('v{0}'.format(plugin.version())) item.setTextAlignment(QtCore.Qt.AlignCenter) item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) table.setItem(row, 1, item) item = QtWidgets.QTableWidgetItem(plugin.author()) item.setTextAlignment(QtCore.Qt.AlignCenter) item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) table.setItem(row, 2, item) item = QtWidgets.QTableWidgetItem(plugin.contact()) item.setTextAlignment(QtCore.Qt.AlignCenter) item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) table.setItem(row, 3, item) p_widget = QtWidgets.QWidget() p_checkbox = CheckBox() p_checkbox.setEnabled(not plugin.isBuiltIn()) p_layout = QtWidgets.QHBoxLayout(p_widget) p_layout.addWidget(p_checkbox) p_layout.setAlignment(QtCore.Qt.AlignCenter) p_layout.setContentsMargins(0, 0, 0, 0) table.setCellWidget(row, 4, p_widget) self.uninstall[plugin] = p_checkbox button = QtWidgets.QToolButton(self, objectName='plugins_install_button') button.setDefaultAction(self.session.action('install_plugin')) button.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) self.addWidget(button) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.widget('plugins_table'), 1) layout.addWidget(self.widget('plugins_install_button'), 0, QtCore.Qt.AlignRight) widget = QtWidgets.QWidget(objectName='plugins_widget') widget.setLayout(layout) self.addWidget(widget) ############################################# # CONFIRMATION BOX ################################# confirmation = QtWidgets.QDialogButtonBox(QtCore.Qt.Horizontal, self, objectName='confirmation_widget') confirmation.addButton(QtWidgets.QDialogButtonBox.Save) confirmation.addButton(QtWidgets.QDialogButtonBox.Cancel) confirmation.setContentsMargins(10, 0, 10, 10) self.addWidget(confirmation) ############################################# # MAIN WIDGET ################################# widget = QtWidgets.QTabWidget(self, objectName='main_widget') widget.addTab(self.widget('general_widget'), QtGui.QIcon(':/icons/24/ic_settings_black'), 'General') widget.addTab(self.widget('axioms_widget'), QtGui.QIcon(':/icons/24/ic_export_black'), 'Export') widget.addTab(self.widget('plugins_widget'), QtGui.QIcon(':/icons/24/ic_extension_black'), 'Plugins') self.addWidget(widget) layout = QtWidgets.QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.widget('main_widget')) layout.addWidget(self.widget('confirmation_widget'), 0, QtCore.Qt.AlignRight) self.setLayout(layout) self.setMinimumSize(740, 420) self.setWindowIcon(QtGui.QIcon(':/icons/128/ic_eddy')) self.setWindowTitle('Preferences') connect(confirmation.accepted, self.accept) connect(confirmation.rejected, self.reject)
def __init__(self, collection, parent=None): """ Initialize the project dialog. :type collection: T <= list | tuple :type parent: QWidget """ super().__init__(parent) self.collection = sorted(collection, key=itemgetter(K_ITEM, K_NAME)) ############################################# # CHECKBOX WIDGETS ################################# self.marks = {K_CURRENT: {}, K_IMPORTING: {}, K_FINAL: {}} for e in self.collection: ## CREATE CURRENT CHECKBOX mark = CheckBox(self) mark.setEnabled(False) mark.setChecked(e[K_CURRENT]) if e[K_ITEM] not in self.marks[K_CURRENT]: self.marks[K_CURRENT][e[K_ITEM]] = {} if e[K_NAME] not in self.marks[K_CURRENT][e[K_ITEM]]: self.marks[K_CURRENT][e[K_ITEM]][e[K_NAME]] = {} self.marks[K_CURRENT][e[K_ITEM]][e[K_NAME]][e[K_PROPERTY]] = mark ## CREATE IMPORTING CHECKBOX mark = CheckBox(self) mark.setEnabled(False) mark.setChecked(e[K_IMPORTING]) if e[K_ITEM] not in self.marks[K_IMPORTING]: self.marks[K_IMPORTING][e[K_ITEM]] = {} if e[K_NAME] not in self.marks[K_IMPORTING][e[K_ITEM]]: self.marks[K_IMPORTING][e[K_ITEM]][e[K_NAME]] = {} self.marks[K_IMPORTING][e[K_ITEM]][e[K_NAME]][e[K_PROPERTY]] = mark ## CREATE FINAL CHECKBOX mark = CheckBox(self) mark.setEnabled(True) mark.setTristate(True) mark.setCheckState(QtCore.Qt.PartiallyChecked) connect(mark.stateChanged, self.onMarkStateChanged) if e[K_ITEM] not in self.marks[K_FINAL]: self.marks[K_FINAL][e[K_ITEM]] = {} if e[K_NAME] not in self.marks[K_FINAL][e[K_ITEM]]: self.marks[K_FINAL][e[K_ITEM]][e[K_NAME]] = {} self.marks[K_FINAL][e[K_ITEM]][e[K_NAME]][e[K_PROPERTY]] = mark ############################################# # BUTTONS & PLACEHOLDERS ################################# # widget = QtWidgets.QLabel(self) # widget.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # widget.setFont(Font('Roboto', 14, bold=True, capitalization=Font.AllUppercase)) # widget.setObjectName('title_type') # widget.setText('Type') # self.addWidget(widget) # widget = QtWidgets.QLabel(self) # widget.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # widget.setFont(Font('Roboto', 14, bold=True, capitalization=Font.AllUppercase)) # widget.setObjectName('title_name') # widget.setText('Name') # self.addWidget(widget) # widget = QtWidgets.QLabel(self) # widget.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) # widget.setFont(Font('Roboto', 14, bold=True, capitalization=Font.AllUppercase)) # widget.setObjectName('title_property') # widget.setText('Property') # self.addWidget(widget) widget = QtWidgets.QLabel(self) widget.setAlignment(QtCore.Qt.AlignCenter) widget.setFont(Font('Roboto', 14, bold=True, capitalization=Font.AllUppercase)) widget.setObjectName('title_current') widget.setText('Current') self.addWidget(widget) widget = QtWidgets.QLabel(self) widget.setAlignment(QtCore.Qt.AlignCenter) widget.setFont(Font('Roboto', 14, bold=True, capitalization=Font.AllUppercase)) widget.setObjectName('title_final') widget.setText('Final') self.addWidget(widget) widget = QtWidgets.QLabel(self) widget.setAlignment(QtCore.Qt.AlignCenter) widget.setFont(Font('Roboto', 14, bold=True, capitalization=Font.AllUppercase)) widget.setObjectName('title_importing') widget.setText('Importing') self.addWidget(widget) # widget = QtWidgets.QLabel(self) # widget.setFixedSize(QtCore.QSize(24, 24)) # widget.setPixmap(QtGui.QIcon(':/icons/24/ic_compare_arrows_black').pixmap(24)) # widget.setObjectName('compare_arrows_current_icon') # self.addWidget(widget) # widget = QtWidgets.QLabel(self) # widget.setFixedSize(QtCore.QSize(24, 24)) # widget.setPixmap(QtGui.QIcon(':/icons/24/ic_compare_arrows_black').pixmap(24)) # widget.setObjectName('compare_arrows_importing_icon') # self.addWidget(widget) widget = PHCQPushButton(self) widget.setAutoDefault(False) widget.setDefault(False) widget.setProperty('class', 'flat blue') widget.setFixedWidth(32) widget.setIcon(QtGui.QIcon(':/icons/24/ic_keyboard_arrow_right_black')) widget.setIconSize(QtCore.QSize(24, 24)) widget.setObjectName('pick_current_button') widget.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding) connect(widget.clicked, self.doPickBooleanSet) self.addWidget(widget) widget = PHCQPushButton(self) widget.setAutoDefault(False) widget.setDefault(False) widget.setProperty('class', 'flat blue') widget.setFixedWidth(32) widget.setIcon(QtGui.QIcon(':/icons/24/ic_keyboard_arrow_left_black')) widget.setIconSize(QtCore.QSize(24, 24)) widget.setObjectName('pick_importing_button') widget.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding) connect(widget.clicked, self.doPickBooleanSet) self.addWidget(widget) ############################################# # CONFIRMATION AREA ################################# widget = QtWidgets.QDialogButtonBox(QtCore.Qt.Horizontal, self) widget.addButton(QtWidgets.QDialogButtonBox.Ok) widget.addButton(QtWidgets.QDialogButtonBox.Abort) widget.setContentsMargins(0, 4, 0, 0) widget.setFont(Font('Roboto', 12)) widget.setObjectName('confirmation_box') widget.button(QtWidgets.QDialogButtonBox.Ok).setEnabled(False) connect(widget.accepted, self.accept) connect(widget.rejected, self.reject) self.addWidget(widget) ############################################# # SETUP DIALOG LAYOUT ################################# gridWidget = QtWidgets.QWidget(self) gridLayout = QtWidgets.QGridLayout(gridWidget) gridLayout.setContentsMargins(0, 0, 0, 0) #gridLayout.addWidget(self.widget('title_type'), 0, 0) #gridLayout.addWidget(self.widget('title_name'), 0, 1) #gridLayout.addWidget(self.widget('title_property'), 0, 2) gridLayout.addWidget(self.widget('title_current'), 0, 3) gridLayout.addWidget(self.widget('title_final'), 0, 5) gridLayout.addWidget(self.widget('title_importing'), 0, 7) #gridLayout.addWidget(self.widget('compare_arrows_current_icon'), 0, 4, QtCore.Qt.AlignCenter) #gridLayout.addWidget(self.widget('compare_arrows_importing_icon'), 0, 6, QtCore.Qt.AlignCenter) for row, e in enumerate(self.collection, start=1): w_type = QtWidgets.QLabel(self) w_type.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) w_type.setFont(Font('Roboto', 12)) w_type.setText(e[K_ITEM].shortName.title()) w_name = QtWidgets.QLabel(self) w_name.setContentsMargins(40, 0, 40, 0) w_name.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) w_name.setFont(Font('Roboto', 12, italic=True)) w_name.setText(e[K_NAME]) w_prop = QtWidgets.QLabel(self) w_prop.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) w_prop.setFont(Font('Roboto', 14, bold=True, capitalization=Font.SmallCaps)) w_prop.setText(RE_CAMEL_SPACE.sub('\g<1> \g<2>', e[K_PROPERTY]).lower()) gridLayout.addWidget(w_type, row, 0) gridLayout.addWidget(w_name, row, 1) gridLayout.addWidget(w_prop, row, 2) gridLayout.addWidget(self.marks[K_CURRENT][e[K_ITEM]][e[K_NAME]][e[K_PROPERTY]], row, 3, QtCore.Qt.AlignCenter) gridLayout.addWidget(self.marks[K_FINAL][e[K_ITEM]][e[K_NAME]][e[K_PROPERTY]], row, 5, QtCore.Qt.AlignCenter) gridLayout.addWidget(self.marks[K_IMPORTING][e[K_ITEM]][e[K_NAME]][e[K_PROPERTY]], row, 7, QtCore.Qt.AlignCenter) gridLayout.addWidget(self.widget('pick_current_button'), 1, 4, len(self.collection), 1) gridLayout.addWidget(self.widget('pick_importing_button'), 1, 6, len(self.collection), 1) mainLayout = QtWidgets.QVBoxLayout() mainLayout.addWidget(gridWidget) mainLayout.addWidget(self.widget('confirmation_box')) mainLayout.setContentsMargins(10, 10, 10, 10) self.setLayout(mainLayout) self.setFixedSize(self.sizeHint()) self.setFont(Font('Roboto', 12)) self.setWindowIcon(QtGui.QIcon(':/icons/128/ic_eddy')) self.setWindowTitle("Resolve conflicts...")
class PredicateNodeProperty(NodeProperty): """ This class implements the property dialog for predicate nodes. Note that this dialog window is not used for value-domain nodes even though they are predicate nodes. """ def __init__(self, diagram, node, session): """ Initialize the node properties dialog. :type diagram: Diagram :type node: AbstractNode :type session: Session """ super().__init__(diagram, node, session) meta = diagram.project.meta(node.type(), node.text()) self.iriLabel = QtWidgets.QLabel(self) self.iriLabel.setText('IRI') self.iriField = StringField(self) self.iriField.setFixedWidth(300) self.iriField.setValue(self.diagram.project.get_iri_of_node(node)) """ self.iriversionLabel = QtWidgets.QLabel(self) self.iriversionLabel.setText('IRI version') self.iriversionField = StringField(self) self.iriversionField.setFixedWidth(300) self.iriversionField.setValue(self.node.IRI_version(diagram.project)) """ ############################################# # LABEL TAB ################################# self.textLabel = QtWidgets.QLabel(self) self.textLabel.setText('IRI Label') self.textField = StringField(self) self.textField.setFixedWidth(300) # if node.type() in {Item.AttributeNode, Item.ConceptNode, Item.RoleNode, Item.IndividualNode}: if (('AttributeNode' in str(type(node))) or ('ConceptNode' in str(type(node))) or ('IndividualNode' in str(type(node))) or ('RoleNode' in str(type(node)))): self.textField.setValue(self.node.remaining_characters) else: self.textField.setValue(self.node.text().replace('\n', '')) # if ((node.type() is Item.IndividualNode) and (node.identity() is Identity.Value)) or \ if (('IndividualNode' in str(type(node))) and (node.identity() is Identity.Value)) or \ (('IndividualNode' not in str(type(node))) and (node.special() is not None)): self.textField.setReadOnly(True) self.iriField.setReadOnly(True) self.refactorLabel = QtWidgets.QLabel(self) self.refactorLabel.setText('Refactor') self.refactorField = CheckBox(self) self.refactorField.setChecked(False) # if node.type() in {Item.AttributeNode, Item.ConceptNode, Item.RoleNode}: if (('AttributeNode' in str(type(node))) or ('ConceptNode' in str(type(node))) or ('RoleNode' in str(type(node)))): if node.special() is not None: self.refactorField.setEnabled(False) self.FulliriLabel = QtWidgets.QLabel(self) self.FulliriLabel.setText('Full IRI') self.FulliriField = StringField(self) self.FulliriField.setFixedWidth(300) full_iri = self.project.get_full_IRI(self.iriField.value(), None, self.textField.value().strip()) self.FulliriField.setValue(full_iri) # self.FulliriField.setValue(self.iriField.value()+'#'+self.textField.value().strip()) self.FulliriField.setReadOnly(True) self.labelWidget = QtWidgets.QWidget() self.labelLayout = QtWidgets.QFormLayout(self.labelWidget) self.labelLayout.addRow(self.iriLabel, self.iriField) self.labelLayout.addRow(self.textLabel, self.textField) self.labelLayout.addRow(self.FulliriLabel, self.FulliriField) self.labelLayout.addRow(self.refactorLabel, self.refactorField) self.mainWidget.addTab(self.labelWidget, 'IRI') self.metaDataChanged_ADD_OK_var = None self.metaDataChanged_REMOVE_OK_var = None self.metaDataChanged_IGNORE_var = None ############################################# # SLOTS ################################# @QtCore.pyqtSlot() def complete(self): """ Executed when the dialog is accepted. """ commands = [self.positionChanged()] iri_changed_result = self.IRIChanged() if iri_changed_result is not None: if (str(type(iri_changed_result)) is '<class \'str\'>') and ('Error in' in iri_changed_result): super().reject() return else: commands.extend(iri_changed_result) text_changed_result = self.textChanged() if text_changed_result is not None: commands.extend(text_changed_result) if any(commands): self.session.undostack.beginMacro('edit {0} properties'.format( self.node.name)) for command in commands: if command: self.session.undostack.push(command) self.session.undostack.endMacro() super().accept() ############################################# # AUXILIARY METHODS ################################# def textChanged(self): unprocessed_new_text = self.textField.value().strip() unprocessed_new_text = unprocessed_new_text if not isEmpty( unprocessed_new_text) else self.node.label.template exception_list = ['-', '_', '.', '~', '\n'] new_rc = '' flag = False for i, c in enumerate(unprocessed_new_text): if c == '': pass elif i < (len(unprocessed_new_text) - 1) and ( c == '\\' and unprocessed_new_text[i + 1] == 'n'): new_rc = new_rc + '\n' elif i > 0 and (c == 'n' and unprocessed_new_text[i - 1] == '\\'): pass elif (not c.isalnum()) and (c not in exception_list): new_rc = new_rc + '_' flag = True else: new_rc = new_rc + c # new_rc = new_rc.replace('\n','') if flag is True: self.session.statusBar().showMessage( 'Spaces in between alphanumeric characters and special characters were replaced by an underscore character.', 15000) return_list = [] if (unprocessed_new_text != self.node.remaining_characters): # print('unprocessed_new_text',unprocessed_new_text) # print('self.node.remaining_characters',self.node.remaining_characters) # print(NewlineFeedInsensitive(new_rc, self.node.remaining_characters).result()) return_list.append( CommandProjectDisconnectSpecificSignals(self.project)) if self.refactorField.isChecked(): for n in self.project.nodes(): if n.text() == self.node.text(): return_list.append( CommandNodeSetRemainingCharacters( n.remaining_characters, new_rc, n, self.project, refactor=True)) else: # refactor_var = NewlineFeedInsensitive(new_rc, self.node.remaining_characters).result() # return_list.append( # CommandNodeSetRemainingCharacters(self.node.remaining_characters, new_rc, self.node, self.project, refactor=refactor_var)) return_list.append( CommandNodeSetRemainingCharacters( self.node.remaining_characters, new_rc, self.node, self.project)) return_list.append( CommandProjectConnectSpecificSignals(self.project)) return return_list return None def IRIChanged(self): # Change the iri of the node. #:rtype: Command IRI_valid = self.project.check_validity_of_IRI(self.iriField.value()) if IRI_valid is False: self.session.statusBar().showMessage('Invalid IRI.', 15000) return None else: old_iri = self.project.get_iri_of_node(self.node) new_iri = self.iriField.value() # if (self.iriField.value() != self.project.get_iri_of_node(node)) or (self.iriversionField.value() != self.node.IRI_version(self.project)): if new_iri != old_iri: connect(self.project.sgnIRINodeEntryAdded, self.metaDataChanged_ADD_OK) connect(self.project.sgnIRINodeEntryRemoved, self.metaDataChanged_REMOVE_OK) connect(self.project.sgnIRINodeEntryIgnored, self.metaDataChanged_IGNORE) # check for conflict in prefixes # transaction = remove(old) + add(new) # perform transaction on duplicate dict. # if successful, original_dict = duplicate_dict # else duplicate_dict = original_dict Duplicate_dict_1 = self.project.copy_IRI_prefixes_nodes_dictionaries( self.project.IRI_prefixes_nodes_dict, dict()) Duplicate_dict_2 = self.project.copy_IRI_prefixes_nodes_dictionaries( self.project.IRI_prefixes_nodes_dict, dict()) list_of_nodes_to_process = [] if self.refactorField.isChecked(): for n in self.project.nodes(): if (('AttributeNode' in str(type(n))) or ('ConceptNode' in str(type(n))) or ('IndividualNode' in str(type(n))) or ('RoleNode' in str(type(n)))): if (self.project.get_iri_of_node(n) == old_iri ) and (n.remaining_characters == self.node.remaining_characters): list_of_nodes_to_process.append(n) else: list_of_nodes_to_process.append(self.node) commands = [] for nd in list_of_nodes_to_process: self.project.removeIRINodeEntry(Duplicate_dict_1, old_iri, nd) self.project.addIRINodeEntry(Duplicate_dict_1, new_iri, nd) if (self.metaDataChanged_REMOVE_OK_var is True) and ( self.metaDataChanged_ADD_OK_var is True): self.metaDataChanged_REMOVE_OK_var = False self.metaDataChanged_ADD_OK_var = False self.metaDataChanged_IGNORE_var = False else: LOGGER.warning( 'redo != undo but transaction was not executed correctly' ) self.metaDataChanged_REMOVE_OK_var = False self.metaDataChanged_ADD_OK_var = False self.metaDataChanged_IGNORE_var = False return str('Error in ' + str(nd)) if len(Duplicate_dict_1[new_iri][0]) == 0: ### if 'display_in_widget' in Duplicate_dict_1[new_iri][2]: new_label = ':' + self.node.remaining_characters else: new_label = self.project.get_full_IRI( new_iri, None, self.node.remaining_characters) else: new_label = str(Duplicate_dict_1[new_iri][0][ len(Duplicate_dict_1[new_iri][0]) - 1] + ':' + self.node.remaining_characters) commands.append( CommandProjectDisconnectSpecificSignals(self.project)) for nd in list_of_nodes_to_process: commands.append( CommandLabelChange(nd.diagram, nd, nd.text(), new_label)) for nd in list_of_nodes_to_process: commands.append( CommandLabelChange(nd.diagram, nd, nd.text(), new_label)) commands.append( CommandProjectConnectSpecificSignals(self.project)) return commands self.metaDataChanged_REMOVE_OK_var = False self.metaDataChanged_ADD_OK_var = False self.metaDataChanged_IGNORE_var = False return None @QtCore.pyqtSlot(str, str, str) def metaDataChanged_REMOVE_OK(self, iri, node, message): # print('metaDataChanged_REMOVE_OK -', iri, ',', node, ',', message) self.metaDataChanged_REMOVE_OK_var = True @QtCore.pyqtSlot(str, str, str) def metaDataChanged_ADD_OK(self, iri, node, message): # print('metaDataChanged_ADD_OK -', iri, ',', node, ',', message) self.metaDataChanged_ADD_OK_var = True @QtCore.pyqtSlot(str, str, str) def metaDataChanged_IGNORE(self, iri, node, message): # if node.id is None: # print('metaDataChanged_IGNORE >', iri, '-', 'None', '-', message) # else: # print('metaDataChanged_IGNORE >', iri, '-', node, '-', message) self.metaDataChanged_IGNORE_var = True
class PredicateNodeProperty(NodeProperty): """ This class implements the property dialog for predicate nodes. Note that this dialog window is not used for value-domain nodes even though they are predicate nodes. """ def __init__(self, diagram, node, session): """ Initialize the node properties dialog. :type diagram: Diagram :type node: AbstractNode :type session: Session """ super().__init__(diagram, node, session) meta = diagram.project.meta(node.type(), node.text()) self.urlLabel = QtWidgets.QLabel(self) self.urlLabel.setFont(Font('Roboto', 12)) self.urlLabel.setText('URL') self.urlField = StringField(self) self.urlField.setFixedWidth(300) self.urlField.setFont(Font('Roboto', 12)) self.urlField.setValue(meta.get(K_URL, '')) self.descriptionLabel = QtWidgets.QLabel(self) self.descriptionLabel.setFont(Font('Roboto', 12)) self.descriptionLabel.setText('Description') self.descriptionField = TextField(self) self.descriptionField.setFixedSize(300, 160) self.descriptionField.setFont(Font('Roboto', 12)) self.descriptionField.setValue(meta.get(K_DESCRIPTION, '')) self.generalLayout.addRow(self.urlLabel, self.urlField) self.generalLayout.addRow(self.descriptionLabel, self.descriptionField) ############################################# # LABEL TAB ################################# self.textLabel = QtWidgets.QLabel(self) self.textLabel.setFont(Font('Roboto', 12)) self.textLabel.setText('Text') self.textField = StringField(self) self.textField.setFixedWidth(300) self.textField.setFont(Font('Roboto', 12)) self.textField.setValue(self.node.text()) self.refactorLabel = QtWidgets.QLabel(self) self.refactorLabel.setFont(Font('Roboto', 12)) self.refactorLabel.setText('Refactor') self.refactorField = CheckBox(self) self.refactorField.setFont(Font('Roboto', 12)) self.refactorField.setChecked(False) if node.type() in { Item.AttributeNode, Item.ConceptNode, Item.RoleNode }: if node.special() is not None: self.refactorField.setEnabled(False) self.labelWidget = QtWidgets.QWidget() self.labelLayout = QtWidgets.QFormLayout(self.labelWidget) self.labelLayout.addRow(self.textLabel, self.textField) self.labelLayout.addRow(self.refactorLabel, self.refactorField) self.mainWidget.addTab(self.labelWidget, 'Label') ############################################# # SLOTS ################################# @QtCore.pyqtSlot() def complete(self): """ Executed when the dialog is accepted. """ commands = [self.positionChanged(), self.metaDataChanged()] commands.extend(self.textChanged()) if any(commands): self.session.undostack.beginMacro('edit {0} properties'.format( self.node.name)) for command in commands: if command: self.session.undostack.push(command) self.session.undostack.endMacro() super().accept() ############################################# # AUXILIARY METHODS ################################# def metaDataChanged(self): """ Change the url and description of the node. :rtype: QUndoCommand """ undo = self.diagram.project.meta(self.node.type(), self.node.text()) redo = undo.copy() redo[K_DESCRIPTION] = self.descriptionField.value() redo[K_URL] = self.urlField.value() if redo != undo: return CommandNodeSetMeta(self.diagram.project, self.node.type(), self.node.text(), undo, redo) return None def textChanged(self): """ Change the label of the node. :rtype: list """ data = self.textField.value().strip() data = data if not isEmpty(data) else self.node.label.template if self.node.text() != data: if self.refactorField.isChecked(): item = self.node.type() name = self.node.text() project = self.diagram.project return [ CommandLabelChange(n.diagram, n, n.text(), data) for n in project.predicates(item, name) ] return [ CommandLabelChange(self.diagram, self.node, self.node.text(), data) ] return [None]
class PredicateNodeProperty(NodeProperty): """ This class implements the property dialog for predicate nodes. Note that this dialog window is not used for value-domain nodes even though they are predicate nodes. """ def __init__(self, diagram, node, session): """ Initialize the node properties dialog. :type diagram: Diagram :type node: AbstractNode :type session: Session """ super().__init__(diagram, node, session) meta = diagram.project.meta(node.type(), node.text()) self.urlLabel = QtWidgets.QLabel(self) self.urlLabel.setFont(Font('Roboto', 12)) self.urlLabel.setText('URL') self.urlField = StringField(self) self.urlField.setFixedWidth(300) self.urlField.setFont(Font('Roboto', 12)) self.urlField.setValue(meta.get('url', '')) self.descriptionLabel = QtWidgets.QLabel(self) self.descriptionLabel.setFont(Font('Roboto', 12)) self.descriptionLabel.setText('Description') self.descriptionField = TextField(self) self.descriptionField.setFixedSize(300, 160) self.descriptionField.setFont(Font('Roboto', 12)) self.descriptionField.setValue(meta.get('description', '')) self.generalLayout.addRow(self.urlLabel, self.urlField) self.generalLayout.addRow(self.descriptionLabel, self.descriptionField) ############################################# # LABEL TAB ################################# self.textLabel = QtWidgets.QLabel(self) self.textLabel.setFont(Font('Roboto', 12)) self.textLabel.setText('Text') self.textField = StringField(self) self.textField.setFixedWidth(300) self.textField.setFont(Font('Roboto', 12)) self.textField.setValue(self.node.text()) self.refactorLabel = QtWidgets.QLabel(self) self.refactorLabel.setFont(Font('Roboto', 12)) self.refactorLabel.setText('Refactor') self.refactorField = CheckBox(self) self.refactorField.setFont(Font('Roboto', 12)) self.refactorField.setChecked(False) if node.type() in {Item.AttributeNode, Item.ConceptNode, Item.RoleNode}: if node.special() is not None: self.refactorField.setEnabled(False) self.labelWidget = QtWidgets.QWidget() self.labelLayout = QtWidgets.QFormLayout(self.labelWidget) self.labelLayout.addRow(self.textLabel, self.textField) self.labelLayout.addRow(self.refactorLabel, self.refactorField) self.mainWidget.addTab(self.labelWidget, 'Label') ############################################# # SLOTS ################################# @QtCore.pyqtSlot() def complete(self): """ Executed when the dialog is accepted. """ commands = [self.positionChanged(), self.metaDataChanged()] commands.extend(self.textChanged()) if any(commands): self.session.undostack.beginMacro('edit {0} properties'.format(self.node.name)) for command in commands: if command: self.session.undostack.push(command) self.session.undostack.endMacro() super().accept() ############################################# # AUXILIARY METHODS ################################# def metaDataChanged(self): """ Change the url and description of the node. :rtype: QUndoCommand """ meta = self.diagram.project.meta(self.node.type(), self.node.text()) copy = meta.copy() copy['description'] = self.descriptionField.value() copy['url'] = self.urlField.value() if copy != meta: return CommandNodeChangeMeta(self.diagram, self.node, meta, copy) return None def textChanged(self): """ Change the label of the node. :rtype: list """ data = self.textField.value().strip() data = data if not isEmpty(data) else self.node.label.template if self.node.text() != data: if self.refactorField.isChecked(): item = self.node.type() name = self.node.text() project = self.diagram.project return [CommandLabelChange(n.diagram, n, n.text(), data) for n in project.predicates(item, name)] return [CommandLabelChange(self.diagram, self.node, self.node.text(), data)] return [None]
def __init__(self, session): """ Initialize the Preferences dialog. :type session: Session """ super().__init__(session) settings = QtCore.QSettings(ORGANIZATION, APPNAME) ############################################# # GENERAL TAB ################################# ## EDITOR GROUP prefix = QtWidgets.QLabel(self, objectName='diagram_size_prefix') prefix.setFont(Font('Roboto', 12)) prefix.setText('Diagram size') self.addWidget(prefix) spinbox = SpinBox(self, objectName='diagram_size_field') spinbox.setFont(Font('Roboto', 12)) spinbox.setRange(Diagram.MinSize, Diagram.MaxSize) spinbox.setSingleStep(100) spinbox.setToolTip('Default size of all the new created diagrams') spinbox.setValue(settings.value('diagram/size', 5000, int)) self.addWidget(spinbox) formlayout = QtWidgets.QFormLayout() formlayout.addRow(self.widget('diagram_size_prefix'), self.widget('diagram_size_field')) groupbox = QtWidgets.QGroupBox('Editor', self, objectName='editor_widget') groupbox.setLayout(formlayout) self.addWidget(groupbox) ## UPDATE GROUP prefix = QtWidgets.QLabel(self, objectName='update_startup_prefix') prefix.setFont(Font('Roboto', 12)) prefix.setText('Check for updates on startup') self.addWidget(prefix) checkbox = CheckBox(self, objectName='update_startup_checkbox') checkbox.setChecked(settings.value('update/check_on_startup', True, bool)) checkbox.setFont(Font('Roboto', 12)) checkbox.setToolTip('Whether or not application updates needs to be checked upon startup') self.addWidget(checkbox) prefix = QtWidgets.QLabel(self, objectName='update_channel_prefix') prefix.setFont(Font('Roboto', 12)) prefix.setText('Update channel') self.addWidget(prefix) combobox = ComboBox(objectName='update_channel_switch') combobox.setEditable(False) combobox.setFont(Font('Roboto', 12)) combobox.setFocusPolicy(QtCore.Qt.StrongFocus) combobox.setScrollEnabled(False) combobox.setToolTip('Update channel (current = %s)' % settings.value('update/channel', Channel.Stable.value, str)) combobox.addItems([x.value for x in Channel]) combobox.setCurrentText(settings.value('update/channel', Channel.Stable.value, str)) self.addWidget(combobox) formlayout = QtWidgets.QFormLayout() formlayout.addRow(self.widget('update_startup_prefix'), self.widget('update_startup_checkbox')) formlayout.addRow(self.widget('update_channel_prefix'), self.widget('update_channel_switch')) groupbox = QtWidgets.QGroupBox('Update', self, objectName='update_widget') groupbox.setLayout(formlayout) self.addWidget(groupbox) ## GENERAL TAB LAYOUT CONFIGURATION layout = QtWidgets.QVBoxLayout() layout.setAlignment(QtCore.Qt.AlignTop) layout.addWidget(self.widget('editor_widget'), 0, QtCore.Qt.AlignTop) layout.addWidget(self.widget('update_widget'), 0, QtCore.Qt.AlignTop) widget = QtWidgets.QWidget() widget.setLayout(layout) widget.setObjectName('general_widget') self.addWidget(widget) ############################################# # EXPORT TAB ################################# self.checks = {x: CheckBox(x.value, self) for x in OWLAxiom} for axiom, checkbox in self.checks.items(): checkbox.setChecked(settings.value('export/axiom/{}'.format(axiom.value), True, bool)) ## NON-LOGICAL GROUP layout = QtWidgets.QGridLayout() layout.setColumnMinimumWidth(0, 230) layout.setColumnMinimumWidth(1, 230) layout.setColumnMinimumWidth(2, 230) layout.addWidget(self.checks[OWLAxiom.Annotation], 0, 0) layout.addWidget(self.checks[OWLAxiom.Declaration], 0, 1) layout.addWidget(QtWidgets.QWidget(self), 0, 2) widget = QtWidgets.QGroupBox('Non-Logical', self, objectName='axioms_non_logical') widget.setLayout(layout) self.addWidget(widget) ## INTENSIONAL GROUP layout = QtWidgets.QGridLayout() layout.setColumnMinimumWidth(0, 230) layout.setColumnMinimumWidth(1, 230) layout.setColumnMinimumWidth(2, 230) layout.addWidget(self.checks[OWLAxiom.AsymmetricObjectProperty], 0, 0) layout.addWidget(self.checks[OWLAxiom.DataPropertyDomain], 1, 0) layout.addWidget(self.checks[OWLAxiom.DataPropertyRange], 2, 0) layout.addWidget(self.checks[OWLAxiom.DisjointClasses], 3, 0) layout.addWidget(self.checks[OWLAxiom.DisjointDataProperties], 4, 0) layout.addWidget(self.checks[OWLAxiom.DisjointObjectProperties], 5, 0) layout.addWidget(self.checks[OWLAxiom.EquivalentClasses], 6, 0) layout.addWidget(self.checks[OWLAxiom.EquivalentDataProperties], 7, 0) layout.addWidget(self.checks[OWLAxiom.EquivalentObjectProperties], 0, 1) layout.addWidget(self.checks[OWLAxiom.FunctionalDataProperty], 1, 1) layout.addWidget(self.checks[OWLAxiom.FunctionalObjectProperty], 2, 1) layout.addWidget(self.checks[OWLAxiom.InverseFunctionalObjectProperty], 3, 1) layout.addWidget(self.checks[OWLAxiom.InverseObjectProperties], 4, 1) layout.addWidget(self.checks[OWLAxiom.IrreflexiveObjectProperty], 5, 1) layout.addWidget(self.checks[OWLAxiom.ObjectPropertyDomain], 6, 1) layout.addWidget(self.checks[OWLAxiom.ObjectPropertyRange], 7, 1) layout.addWidget(self.checks[OWLAxiom.ReflexiveObjectProperty], 0, 2) layout.addWidget(self.checks[OWLAxiom.SubClassOf], 1, 2) layout.addWidget(self.checks[OWLAxiom.SubDataPropertyOf], 2, 2) layout.addWidget(self.checks[OWLAxiom.SubObjectPropertyOf], 3, 2) layout.addWidget(self.checks[OWLAxiom.SymmetricObjectProperty], 4, 2) layout.addWidget(self.checks[OWLAxiom.TransitiveObjectProperty], 5, 2) widget = QtWidgets.QGroupBox('Intensional', self, objectName='axioms_intensional') widget.setLayout(layout) self.addWidget(widget) ## EXTENSIONAL GROUP layout = QtWidgets.QGridLayout() layout.setColumnMinimumWidth(0, 230) layout.setColumnMinimumWidth(1, 230) layout.setColumnMinimumWidth(2, 230) layout.addWidget(self.checks[OWLAxiom.ClassAssertion], 0, 0) layout.addWidget(self.checks[OWLAxiom.DataPropertyAssertion], 1, 0) layout.addWidget(self.checks[OWLAxiom.NegativeDataPropertyAssertion], 0, 1) layout.addWidget(self.checks[OWLAxiom.NegativeObjectPropertyAssertion], 1, 1) layout.addWidget(self.checks[OWLAxiom.ObjectPropertyAssertion], 0, 2) widget = QtWidgets.QGroupBox('Extensional', self, objectName='axioms_extensional') widget.setLayout(layout) self.addWidget(widget) ## LOGICAL GROUP layout = QtWidgets.QVBoxLayout() layout.addWidget(self.widget('axioms_intensional')) layout.addWidget(self.widget('axioms_extensional')) widget = QtWidgets.QGroupBox('Logical', self, objectName='axioms_logical') widget.setLayout(layout) self.addWidget(widget) ## EXPORT TAB LAYOUT CONFIGURATION layout = QtWidgets.QVBoxLayout() layout.addWidget(self.widget('axioms_non_logical')) layout.addWidget(self.widget('axioms_logical')) groupbox = QtWidgets.QGroupBox('OWL 2 Axioms for which exporting is enabled', self) groupbox.setLayout(layout) layout = QtWidgets.QVBoxLayout() layout.setContentsMargins(10, 10, 10, 10) layout.addWidget(groupbox) widget = QtWidgets.QWidget(self, objectName='axioms_widget') widget.setLayout(layout) self.addWidget(widget) ############################################# # PLUGINS TAB ################################# table = QtWidgets.QTableWidget(len(self.session.plugins()), 5, self, objectName='plugins_table') table.setHorizontalHeaderLabels(['Name', 'Version', 'Author', 'Contact', 'Uninstall']) table.setFont(Font('Roboto', 12)) table.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) table.setFocusPolicy(QtCore.Qt.NoFocus) self.addWidget(table) header = table.horizontalHeader() header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(1, QtWidgets.QHeaderView.Fixed) header.setSectionResizeMode(2, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(4, QtWidgets.QHeaderView.Fixed) header.setSectionsClickable(False) header.setSectionsMovable(False) header = table.verticalHeader() header.setSectionResizeMode(QtWidgets.QHeaderView.Fixed) self.uninstall = dict() for row, plugin in enumerate(sorted(self.session.plugins(), key=lambda x: x.name())): item = QtWidgets.QTableWidgetItem(plugin.name()) item.setTextAlignment(QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) table.setItem(row, 0, item) item = QtWidgets.QTableWidgetItem('v{0}'.format(plugin.version())) item.setTextAlignment(QtCore.Qt.AlignCenter) item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) table.setItem(row, 1, item) item = QtWidgets.QTableWidgetItem(plugin.author()) item.setTextAlignment(QtCore.Qt.AlignCenter) item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) table.setItem(row, 2, item) item = QtWidgets.QTableWidgetItem(plugin.contact()) item.setTextAlignment(QtCore.Qt.AlignCenter) item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEditable) table.setItem(row, 3, item) p_widget = QtWidgets.QWidget() p_checkbox = CheckBox() p_checkbox.setEnabled(not plugin.isBuiltIn()) p_layout = QtWidgets.QHBoxLayout(p_widget) p_layout.addWidget(p_checkbox) p_layout.setAlignment(QtCore.Qt.AlignCenter) p_layout.setContentsMargins(0, 0, 0, 0) table.setCellWidget(row, 4, p_widget) self.uninstall[plugin] = p_checkbox button = QtWidgets.QToolButton(self, objectName='plugins_install_button') button.setDefaultAction(self.session.action('install_plugin')) button.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) button.setFont(Font('Roboto', 13)) self.addWidget(button) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.widget('plugins_table'), 1) layout.addWidget(self.widget('plugins_install_button'), 0, QtCore.Qt.AlignRight) widget = QtWidgets.QWidget(objectName='plugins_widget') widget.setLayout(layout) self.addWidget(widget) ############################################# # CONFIRMATION BOX ################################# confirmation = QtWidgets.QDialogButtonBox(QtCore.Qt.Horizontal, self, objectName='confirmation_widget') confirmation.addButton(QtWidgets.QDialogButtonBox.Save) confirmation.addButton(QtWidgets.QDialogButtonBox.Cancel) confirmation.setContentsMargins(10, 0, 10, 10) confirmation.setFont(Font('Roboto', 12)) self.addWidget(confirmation) ############################################# # MAIN WIDGET ################################# widget = QtWidgets.QTabWidget(self, objectName='main_widget') widget.addTab(self.widget('general_widget'), QtGui.QIcon(':/icons/24/ic_settings_black'), 'General') widget.addTab(self.widget('axioms_widget'), QtGui.QIcon(':/icons/24/ic_export_black'), 'Export') widget.addTab(self.widget('plugins_widget'), QtGui.QIcon(':/icons/24/ic_extension_black'), 'Plugins') self.addWidget(widget) layout = QtWidgets.QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.widget('main_widget')) layout.addWidget(self.widget('confirmation_widget'), 0, QtCore.Qt.AlignRight) self.setLayout(layout) self.setMinimumSize(740, 420) self.setWindowIcon(QtGui.QIcon(':/icons/128/ic_eddy')) self.setWindowTitle('Preferences') connect(confirmation.accepted, self.accept) connect(confirmation.rejected, self.reject)