class ModelerDialog(BASE, WIDGET): ALG_ITEM = 'ALG_ITEM' PROVIDER_ITEM = 'PROVIDER_ITEM' GROUP_ITEM = 'GROUP_ITEM' NAME_ROLE = Qt.UserRole TAG_ROLE = Qt.UserRole + 1 TYPE_ROLE = Qt.UserRole + 2 CANVAS_SIZE = 4000 update_model = pyqtSignal() def __init__(self, model=None): super().__init__(None) self.setAttribute(Qt.WA_DeleteOnClose) self.setupUi(self) self._variables_scope = None # LOTS of bug reports when we include the dock creation in the UI file # see e.g. #16428, #19068 # So just roll it all by hand......! self.propertiesDock = QgsDockWidget(self) self.propertiesDock.setFeatures( QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.propertiesDock.setObjectName("propertiesDock") propertiesDockContents = QWidget() self.verticalDockLayout_1 = QVBoxLayout(propertiesDockContents) self.verticalDockLayout_1.setContentsMargins(0, 0, 0, 0) self.verticalDockLayout_1.setSpacing(0) self.scrollArea_1 = QgsScrollArea(propertiesDockContents) sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollArea_1.sizePolicy().hasHeightForWidth()) self.scrollArea_1.setSizePolicy(sizePolicy) self.scrollArea_1.setFocusPolicy(Qt.WheelFocus) self.scrollArea_1.setFrameShape(QFrame.NoFrame) self.scrollArea_1.setFrameShadow(QFrame.Plain) self.scrollArea_1.setWidgetResizable(True) self.scrollAreaWidgetContents_1 = QWidget() self.gridLayout = QGridLayout(self.scrollAreaWidgetContents_1) self.gridLayout.setContentsMargins(6, 6, 6, 6) self.gridLayout.setSpacing(4) self.label_1 = QLabel(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.label_1, 0, 0, 1, 1) self.textName = QLineEdit(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.textName, 0, 1, 1, 1) self.label_2 = QLabel(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) self.textGroup = QLineEdit(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.textGroup, 1, 1, 1, 1) self.label_1.setText(self.tr("Name")) self.textName.setToolTip(self.tr("Enter model name here")) self.label_2.setText(self.tr("Group")) self.textGroup.setToolTip(self.tr("Enter group name here")) self.scrollArea_1.setWidget(self.scrollAreaWidgetContents_1) self.verticalDockLayout_1.addWidget(self.scrollArea_1) self.propertiesDock.setWidget(propertiesDockContents) self.propertiesDock.setWindowTitle(self.tr("Model Properties")) self.inputsDock = QgsDockWidget(self) self.inputsDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.inputsDock.setObjectName("inputsDock") self.inputsDockContents = QWidget() self.verticalLayout_3 = QVBoxLayout(self.inputsDockContents) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.scrollArea_2 = QgsScrollArea(self.inputsDockContents) sizePolicy.setHeightForWidth(self.scrollArea_2.sizePolicy().hasHeightForWidth()) self.scrollArea_2.setSizePolicy(sizePolicy) self.scrollArea_2.setFocusPolicy(Qt.WheelFocus) self.scrollArea_2.setFrameShape(QFrame.NoFrame) self.scrollArea_2.setFrameShadow(QFrame.Plain) self.scrollArea_2.setWidgetResizable(True) self.scrollAreaWidgetContents_2 = QWidget() self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents_2) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.inputsTree = QTreeWidget(self.scrollAreaWidgetContents_2) self.inputsTree.setAlternatingRowColors(True) self.inputsTree.header().setVisible(False) self.verticalLayout.addWidget(self.inputsTree) self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2) self.verticalLayout_3.addWidget(self.scrollArea_2) self.inputsDock.setWidget(self.inputsDockContents) self.addDockWidget(Qt.DockWidgetArea(1), self.inputsDock) self.inputsDock.setWindowTitle(self.tr("Inputs")) self.algorithmsDock = QgsDockWidget(self) self.algorithmsDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.algorithmsDock.setObjectName("algorithmsDock") self.algorithmsDockContents = QWidget() self.verticalLayout_4 = QVBoxLayout(self.algorithmsDockContents) self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) self.scrollArea_3 = QgsScrollArea(self.algorithmsDockContents) sizePolicy.setHeightForWidth(self.scrollArea_3.sizePolicy().hasHeightForWidth()) self.scrollArea_3.setSizePolicy(sizePolicy) self.scrollArea_3.setFocusPolicy(Qt.WheelFocus) self.scrollArea_3.setFrameShape(QFrame.NoFrame) self.scrollArea_3.setFrameShadow(QFrame.Plain) self.scrollArea_3.setWidgetResizable(True) self.scrollAreaWidgetContents_3 = QWidget() self.verticalLayout_2 = QVBoxLayout(self.scrollAreaWidgetContents_3) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(4) self.searchBox = QgsFilterLineEdit(self.scrollAreaWidgetContents_3) self.verticalLayout_2.addWidget(self.searchBox) self.algorithmTree = QgsProcessingToolboxTreeView(None, QgsApplication.processingRegistry()) self.algorithmTree.setAlternatingRowColors(True) self.algorithmTree.header().setVisible(False) self.verticalLayout_2.addWidget(self.algorithmTree) self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3) self.verticalLayout_4.addWidget(self.scrollArea_3) self.algorithmsDock.setWidget(self.algorithmsDockContents) self.addDockWidget(Qt.DockWidgetArea(1), self.algorithmsDock) self.algorithmsDock.setWindowTitle(self.tr("Algorithms")) self.searchBox.setToolTip(self.tr("Enter algorithm name to filter list")) self.searchBox.setShowSearchIcon(True) self.variables_dock = QgsDockWidget(self) self.variables_dock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.variables_dock.setObjectName("variablesDock") self.variables_dock_contents = QWidget() vl_v = QVBoxLayout() vl_v.setContentsMargins(0, 0, 0, 0) self.variables_editor = QgsVariableEditorWidget() vl_v.addWidget(self.variables_editor) self.variables_dock_contents.setLayout(vl_v) self.variables_dock.setWidget(self.variables_dock_contents) self.addDockWidget(Qt.DockWidgetArea(1), self.variables_dock) self.variables_dock.setWindowTitle(self.tr("Variables")) self.addDockWidget(Qt.DockWidgetArea(1), self.propertiesDock) self.tabifyDockWidget(self.propertiesDock, self.variables_dock) self.variables_editor.scopeChanged.connect(self.variables_changed) self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.centralWidget().layout().insertWidget(0, self.bar) try: self.setDockOptions(self.dockOptions() | QMainWindow.GroupedDragging) except: pass if iface is not None: self.mToolbar.setIconSize(iface.iconSize()) self.setStyleSheet(iface.mainWindow().styleSheet()) self.toolbutton_export_to_script = QToolButton() self.toolbutton_export_to_script.setPopupMode(QToolButton.InstantPopup) self.export_to_script_algorithm_action = QAction(QCoreApplication.translate('ModelerDialog', 'Export as Script Algorithm…')) self.toolbutton_export_to_script.addActions([self.export_to_script_algorithm_action]) self.mToolbar.insertWidget(self.mActionExportImage, self.toolbutton_export_to_script) self.export_to_script_algorithm_action.triggered.connect(self.export_as_script_algorithm) self.mActionOpen.setIcon( QgsApplication.getThemeIcon('/mActionFileOpen.svg')) self.mActionSave.setIcon( QgsApplication.getThemeIcon('/mActionFileSave.svg')) self.mActionSaveAs.setIcon( QgsApplication.getThemeIcon('/mActionFileSaveAs.svg')) self.mActionSaveInProject.setIcon( QgsApplication.getThemeIcon('/mAddToProject.svg')) self.mActionZoomActual.setIcon( QgsApplication.getThemeIcon('/mActionZoomActual.svg')) self.mActionZoomIn.setIcon( QgsApplication.getThemeIcon('/mActionZoomIn.svg')) self.mActionZoomOut.setIcon( QgsApplication.getThemeIcon('/mActionZoomOut.svg')) self.mActionExportImage.setIcon( QgsApplication.getThemeIcon('/mActionSaveMapAsImage.svg')) self.mActionZoomToItems.setIcon( QgsApplication.getThemeIcon('/mActionZoomFullExtent.svg')) self.mActionExportPdf.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsPDF.svg')) self.mActionExportSvg.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsSVG.svg')) self.toolbutton_export_to_script.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsPython.svg')) self.mActionEditHelp.setIcon( QgsApplication.getThemeIcon('/mActionEditHelpContent.svg')) self.mActionRun.setIcon( QgsApplication.getThemeIcon('/mActionStart.svg')) self.addDockWidget(Qt.LeftDockWidgetArea, self.propertiesDock) self.addDockWidget(Qt.LeftDockWidgetArea, self.inputsDock) self.addDockWidget(Qt.LeftDockWidgetArea, self.algorithmsDock) self.tabifyDockWidget(self.inputsDock, self.algorithmsDock) self.inputsDock.raise_() self.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) settings = QgsSettings() self.restoreState(settings.value("/Processing/stateModeler", QByteArray())) self.restoreGeometry(settings.value("/Processing/geometryModeler", QByteArray())) self.scene = ModelerScene(self, dialog=self) self.scene.setSceneRect(QRectF(0, 0, self.CANVAS_SIZE, self.CANVAS_SIZE)) self.view.setScene(self.scene) self.view.setAcceptDrops(True) self.view.ensureVisible(0, 0, 10, 10) self.view.scale(QgsApplication.desktop().logicalDpiX() / 96, QgsApplication.desktop().logicalDpiX() / 96) def _dragEnterEvent(event): if event.mimeData().hasText() or event.mimeData().hasFormat('application/x-vnd.qgis.qgis.algorithmid'): event.acceptProposedAction() else: event.ignore() def _dropEvent(event): def alg_dropped(algorithm_id, pos): alg = QgsApplication.processingRegistry().createAlgorithmById(algorithm_id) if alg is not None: self._addAlgorithm(alg, pos) else: assert False, algorithm_id def input_dropped(id, pos): if id in [param.id() for param in QgsApplication.instance().processingRegistry().parameterTypes()]: self.addInputOfType(itemId, pos) if event.mimeData().hasFormat('application/x-vnd.qgis.qgis.algorithmid'): data = event.mimeData().data('application/x-vnd.qgis.qgis.algorithmid') stream = QDataStream(data, QIODevice.ReadOnly) algorithm_id = stream.readQString() QTimer.singleShot(0, lambda id=algorithm_id, pos=self.view.mapToScene(event.pos()): alg_dropped(id, pos)) event.accept() elif event.mimeData().hasText(): itemId = event.mimeData().text() QTimer.singleShot(0, lambda id=itemId, pos=self.view.mapToScene(event.pos()): input_dropped(id, pos)) event.accept() else: event.ignore() def _dragMoveEvent(event): if event.mimeData().hasText() or event.mimeData().hasFormat('application/x-vnd.qgis.qgis.algorithmid'): event.accept() else: event.ignore() def _wheelEvent(event): self.view.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) settings = QgsSettings() factor = settings.value('/qgis/zoom_favor', 2.0) # "Normal" mouse has an angle delta of 120, precision mouses provide data # faster, in smaller steps factor = 1.0 + (factor - 1.0) / 120.0 * abs(event.angleDelta().y()) if (event.modifiers() == Qt.ControlModifier): factor = 1.0 + (factor - 1.0) / 20.0 if event.angleDelta().y() < 0: factor = 1 / factor self.view.scale(factor, factor) def _enterEvent(e): QGraphicsView.enterEvent(self.view, e) self.view.viewport().setCursor(Qt.ArrowCursor) def _mouseReleaseEvent(e): QGraphicsView.mouseReleaseEvent(self.view, e) self.view.viewport().setCursor(Qt.ArrowCursor) def _mousePressEvent(e): if e.button() == Qt.MidButton: self.previousMousePos = e.pos() else: QGraphicsView.mousePressEvent(self.view, e) def _mouseMoveEvent(e): if e.buttons() == Qt.MidButton: offset = self.previousMousePos - e.pos() self.previousMousePos = e.pos() self.view.verticalScrollBar().setValue(self.view.verticalScrollBar().value() + offset.y()) self.view.horizontalScrollBar().setValue(self.view.horizontalScrollBar().value() + offset.x()) else: QGraphicsView.mouseMoveEvent(self.view, e) self.view.setDragMode(QGraphicsView.ScrollHandDrag) self.view.dragEnterEvent = _dragEnterEvent self.view.dropEvent = _dropEvent self.view.dragMoveEvent = _dragMoveEvent self.view.wheelEvent = _wheelEvent self.view.enterEvent = _enterEvent self.view.mousePressEvent = _mousePressEvent self.view.mouseMoveEvent = _mouseMoveEvent def _mimeDataInput(items): mimeData = QMimeData() text = items[0].data(0, Qt.UserRole) mimeData.setText(text) return mimeData self.inputsTree.mimeData = _mimeDataInput self.inputsTree.setDragDropMode(QTreeWidget.DragOnly) self.inputsTree.setDropIndicatorShown(True) self.algorithms_model = ModelerToolboxModel(self, QgsApplication.processingRegistry()) self.algorithmTree.setToolboxProxyModel(self.algorithms_model) self.algorithmTree.setDragDropMode(QTreeWidget.DragOnly) self.algorithmTree.setDropIndicatorShown(True) filters = QgsProcessingToolboxProxyModel.Filters(QgsProcessingToolboxProxyModel.FilterModeler) if ProcessingConfig.getSetting(ProcessingConfig.SHOW_ALGORITHMS_KNOWN_ISSUES): filters |= QgsProcessingToolboxProxyModel.FilterShowKnownIssues self.algorithmTree.setFilters(filters) if hasattr(self.searchBox, 'setPlaceholderText'): self.searchBox.setPlaceholderText(QCoreApplication.translate('ModelerDialog', 'Search…')) if hasattr(self.textName, 'setPlaceholderText'): self.textName.setPlaceholderText(self.tr('Enter model name here')) if hasattr(self.textGroup, 'setPlaceholderText'): self.textGroup.setPlaceholderText(self.tr('Enter group name here')) # Connect signals and slots self.inputsTree.doubleClicked.connect(self.addInput) self.searchBox.textChanged.connect(self.algorithmTree.setFilterString) self.algorithmTree.doubleClicked.connect(self.addAlgorithm) # Ctrl+= should also trigger a zoom in action ctrlEquals = QShortcut(QKeySequence("Ctrl+="), self) ctrlEquals.activated.connect(self.zoomIn) self.mActionOpen.triggered.connect(self.openModel) self.mActionSave.triggered.connect(self.save) self.mActionSaveAs.triggered.connect(self.saveAs) self.mActionSaveInProject.triggered.connect(self.saveInProject) self.mActionZoomIn.triggered.connect(self.zoomIn) self.mActionZoomOut.triggered.connect(self.zoomOut) self.mActionZoomActual.triggered.connect(self.zoomActual) self.mActionZoomToItems.triggered.connect(self.zoomToItems) self.mActionExportImage.triggered.connect(self.exportAsImage) self.mActionExportPdf.triggered.connect(self.exportAsPdf) self.mActionExportSvg.triggered.connect(self.exportAsSvg) #self.mActionExportPython.triggered.connect(self.exportAsPython) self.mActionEditHelp.triggered.connect(self.editHelp) self.mActionRun.triggered.connect(self.runModel) if model is not None: self.model = model.create() self.model.setSourceFilePath(model.sourceFilePath()) self.textGroup.setText(self.model.group()) self.textName.setText(self.model.displayName()) self.repaintModel() else: self.model = QgsProcessingModelAlgorithm() self.model.setProvider(QgsApplication.processingRegistry().providerById('model')) self.update_variables_gui() self.fillInputsTree() self.view.centerOn(0, 0) self.help = None self.hasChanged = False def closeEvent(self, evt): settings = QgsSettings() settings.setValue("/Processing/stateModeler", self.saveState()) settings.setValue("/Processing/geometryModeler", self.saveGeometry()) if self.hasChanged: ret = QMessageBox.question( self, self.tr('Save Model?'), self.tr('There are unsaved changes in this model. Do you want to keep those?'), QMessageBox.Save | QMessageBox.Cancel | QMessageBox.Discard, QMessageBox.Cancel) if ret == QMessageBox.Save: self.saveModel(False) evt.accept() elif ret == QMessageBox.Discard: evt.accept() else: evt.ignore() else: evt.accept() def editHelp(self): alg = self.model dlg = HelpEditionDialog(alg) dlg.exec_() if dlg.descriptions: self.model.setHelpContent(dlg.descriptions) self.hasChanged = True def update_variables_gui(self): variables_scope = QgsExpressionContextScope(self.tr('Model Variables')) for k, v in self.model.variables().items(): variables_scope.setVariable(k, v) variables_context = QgsExpressionContext() variables_context.appendScope(variables_scope) self.variables_editor.setContext(variables_context) self.variables_editor.setEditableScopeIndex(0) def variables_changed(self): self.model.setVariables(self.variables_editor.variablesInActiveScope()) def runModel(self): if len(self.model.childAlgorithms()) == 0: self.bar.pushMessage("", self.tr("Model doesn't contain any algorithm and/or parameter and can't be executed"), level=Qgis.Warning, duration=5) return dlg = AlgorithmDialog(self.model.create(), parent=iface.mainWindow()) dlg.exec_() def save(self): self.saveModel(False) def saveAs(self): self.saveModel(True) def saveInProject(self): if not self.can_save(): return self.model.setName(str(self.textName.text())) self.model.setGroup(str(self.textGroup.text())) self.model.setSourceFilePath(None) project_provider = QgsApplication.processingRegistry().providerById(PROJECT_PROVIDER_ID) project_provider.add_model(self.model) self.update_model.emit() self.bar.pushMessage("", self.tr("Model was saved inside current project"), level=Qgis.Success, duration=5) self.hasChanged = False QgsProject.instance().setDirty(True) def zoomIn(self): self.view.setTransformationAnchor(QGraphicsView.NoAnchor) point = self.view.mapToScene(QPoint(self.view.viewport().width() / 2, self.view.viewport().height() / 2)) settings = QgsSettings() factor = settings.value('/qgis/zoom_favor', 2.0) self.view.scale(factor, factor) self.view.centerOn(point) self.repaintModel() def zoomOut(self): self.view.setTransformationAnchor(QGraphicsView.NoAnchor) point = self.view.mapToScene(QPoint(self.view.viewport().width() / 2, self.view.viewport().height() / 2)) settings = QgsSettings() factor = settings.value('/qgis/zoom_favor', 2.0) factor = 1 / factor self.view.scale(factor, factor) self.view.centerOn(point) self.repaintModel() def zoomActual(self): point = self.view.mapToScene(QPoint(self.view.viewport().width() / 2, self.view.viewport().height() / 2)) self.view.resetTransform() self.view.scale(QgsApplication.desktop().logicalDpiX() / 96, QgsApplication.desktop().logicalDpiX() / 96) self.view.centerOn(point) def zoomToItems(self): totalRect = self.scene.itemsBoundingRect() totalRect.adjust(-10, -10, 10, 10) self.view.fitInView(totalRect, Qt.KeepAspectRatio) def exportAsImage(self): self.repaintModel(controls=False) filename, fileFilter = QFileDialog.getSaveFileName(self, self.tr('Save Model As Image'), '', self.tr('PNG files (*.png *.PNG)')) if not filename: return if not filename.lower().endswith('.png'): filename += '.png' totalRect = self.scene.itemsBoundingRect() totalRect.adjust(-10, -10, 10, 10) imgRect = QRectF(0, 0, totalRect.width(), totalRect.height()) img = QImage(totalRect.width(), totalRect.height(), QImage.Format_ARGB32_Premultiplied) img.fill(Qt.white) painter = QPainter() painter.setRenderHint(QPainter.Antialiasing) painter.begin(img) self.scene.render(painter, imgRect, totalRect) painter.end() img.save(filename) self.bar.pushMessage("", self.tr("Successfully exported model as image to <a href=\"{}\">{}</a>").format(QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) self.repaintModel(controls=True) def exportAsPdf(self): self.repaintModel(controls=False) filename, fileFilter = QFileDialog.getSaveFileName(self, self.tr('Save Model As PDF'), '', self.tr('PDF files (*.pdf *.PDF)')) if not filename: return if not filename.lower().endswith('.pdf'): filename += '.pdf' totalRect = self.scene.itemsBoundingRect() totalRect.adjust(-10, -10, 10, 10) printerRect = QRectF(0, 0, totalRect.width(), totalRect.height()) printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(filename) printer.setPaperSize(QSizeF(printerRect.width(), printerRect.height()), QPrinter.DevicePixel) printer.setFullPage(True) painter = QPainter(printer) self.scene.render(painter, printerRect, totalRect) painter.end() self.bar.pushMessage("", self.tr("Successfully exported model as PDF to <a href=\"{}\">{}</a>").format(QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) self.repaintModel(controls=True) def exportAsSvg(self): self.repaintModel(controls=False) filename, fileFilter = QFileDialog.getSaveFileName(self, self.tr('Save Model As SVG'), '', self.tr('SVG files (*.svg *.SVG)')) if not filename: return if not filename.lower().endswith('.svg'): filename += '.svg' totalRect = self.scene.itemsBoundingRect() totalRect.adjust(-10, -10, 10, 10) svgRect = QRectF(0, 0, totalRect.width(), totalRect.height()) svg = QSvgGenerator() svg.setFileName(filename) svg.setSize(QSize(totalRect.width(), totalRect.height())) svg.setViewBox(svgRect) svg.setTitle(self.model.displayName()) painter = QPainter(svg) self.scene.render(painter, svgRect, totalRect) painter.end() self.bar.pushMessage("", self.tr("Successfully exported model as SVG to <a href=\"{}\">{}</a>").format(QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) self.repaintModel(controls=True) def exportAsPython(self): filename, filter = QFileDialog.getSaveFileName(self, self.tr('Save Model As Python Script'), '', self.tr('Processing scripts (*.py *.PY)')) if not filename: return if not filename.lower().endswith('.py'): filename += '.py' text = self.model.asPythonCode() with codecs.open(filename, 'w', encoding='utf-8') as fout: fout.write(text) self.bar.pushMessage("", self.tr("Successfully exported model as python script to <a href=\"{}\">{}</a>").format(QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) def can_save(self): """ Tests whether a model can be saved, or if it is not yet valid :return: bool """ if str(self.textName.text()).strip() == '': self.bar.pushWarning( "", self.tr('Please a enter model name before saving') ) return False return True def saveModel(self, saveAs): if not self.can_save(): return self.model.setName(str(self.textName.text())) self.model.setGroup(str(self.textGroup.text())) if self.model.sourceFilePath() and not saveAs: filename = self.model.sourceFilePath() else: filename, filter = QFileDialog.getSaveFileName(self, self.tr('Save Model'), ModelerUtils.modelsFolders()[0], self.tr('Processing models (*.model3 *.MODEL3)')) if filename: if not filename.endswith('.model3'): filename += '.model3' self.model.setSourceFilePath(filename) if filename: if not self.model.toFile(filename): if saveAs: QMessageBox.warning(self, self.tr('I/O error'), self.tr('Unable to save edits. Reason:\n {0}').format(str(sys.exc_info()[1]))) else: QMessageBox.warning(self, self.tr("Can't save model"), QCoreApplication.translate('QgsPluginInstallerInstallingDialog', ( "This model can't be saved in its original location (probably you do not " "have permission to do it). Please, use the 'Save as…' option.")) ) return self.update_model.emit() if saveAs: self.bar.pushMessage("", self.tr("Model was correctly saved to <a href=\"{}\">{}</a>").format(QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) else: self.bar.pushMessage("", self.tr("Model was correctly saved"), level=Qgis.Success, duration=5) self.hasChanged = False def openModel(self): filename, selected_filter = QFileDialog.getOpenFileName(self, self.tr('Open Model'), ModelerUtils.modelsFolders()[0], self.tr('Processing models (*.model3 *.MODEL3)')) if filename: self.loadModel(filename) def loadModel(self, filename): alg = QgsProcessingModelAlgorithm() if alg.fromFile(filename): self.model = alg self.model.setProvider(QgsApplication.processingRegistry().providerById('model')) self.textGroup.setText(alg.group()) self.textName.setText(alg.name()) self.repaintModel() self.update_variables_gui() self.view.centerOn(0, 0) self.hasChanged = False else: QgsMessageLog.logMessage(self.tr('Could not load model {0}').format(filename), self.tr('Processing'), Qgis.Critical) QMessageBox.critical(self, self.tr('Open Model'), self.tr('The selected model could not be loaded.\n' 'See the log for more information.')) def repaintModel(self, controls=True): self.scene = ModelerScene(self, dialog=self) self.scene.setSceneRect(QRectF(0, 0, self.CANVAS_SIZE, self.CANVAS_SIZE)) self.scene.paintModel(self.model, controls) self.view.setScene(self.scene) def addInput(self): item = self.inputsTree.currentItem() param = item.data(0, Qt.UserRole) self.addInputOfType(param) def addInputOfType(self, paramType, pos=None): dlg = ModelerParameterDefinitionDialog(self.model, paramType) dlg.exec_() if dlg.param is not None: if pos is None: pos = self.getPositionForParameterItem() if isinstance(pos, QPoint): pos = QPointF(pos) component = QgsProcessingModelParameter(dlg.param.name()) component.setDescription(dlg.param.name()) component.setPosition(pos) self.model.addModelParameter(dlg.param, component) self.repaintModel() # self.view.ensureVisible(self.scene.getLastParameterItem()) self.hasChanged = True def getPositionForParameterItem(self): MARGIN = 20 BOX_WIDTH = 200 BOX_HEIGHT = 80 if len(self.model.parameterComponents()) > 0: maxX = max([i.position().x() for i in list(self.model.parameterComponents().values())]) newX = min(MARGIN + BOX_WIDTH + maxX, self.CANVAS_SIZE - BOX_WIDTH) else: newX = MARGIN + BOX_WIDTH / 2 return QPointF(newX, MARGIN + BOX_HEIGHT / 2) def fillInputsTree(self): icon = QIcon(os.path.join(pluginPath, 'images', 'input.svg')) parametersItem = QTreeWidgetItem() parametersItem.setText(0, self.tr('Parameters')) sortedParams = sorted(QgsApplication.instance().processingRegistry().parameterTypes(), key=lambda pt: pt.name()) for param in sortedParams: if param.flags() & QgsProcessingParameterType.ExposeToModeler: paramItem = QTreeWidgetItem() paramItem.setText(0, param.name()) paramItem.setData(0, Qt.UserRole, param.id()) paramItem.setIcon(0, icon) paramItem.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled) paramItem.setToolTip(0, param.description()) parametersItem.addChild(paramItem) self.inputsTree.addTopLevelItem(parametersItem) parametersItem.setExpanded(True) def addAlgorithm(self): algorithm = self.algorithmTree.selectedAlgorithm() if algorithm is not None: alg = QgsApplication.processingRegistry().createAlgorithmById(algorithm.id()) self._addAlgorithm(alg) def _addAlgorithm(self, alg, pos=None): dlg = ModelerParametersDialog(alg, self.model) if dlg.exec_(): alg = dlg.createAlgorithm() if pos is None: alg.setPosition(self.getPositionForAlgorithmItem()) else: alg.setPosition(pos) from processing.modeler.ModelerGraphicItem import ModelerGraphicItem for i, out in enumerate(alg.modelOutputs()): alg.modelOutput(out).setPosition(alg.position() + QPointF(ModelerGraphicItem.BOX_WIDTH, (i + 1.5) * ModelerGraphicItem.BOX_HEIGHT)) self.model.addChildAlgorithm(alg) self.repaintModel() self.hasChanged = True def getPositionForAlgorithmItem(self): MARGIN = 20 BOX_WIDTH = 200 BOX_HEIGHT = 80 if self.model.childAlgorithms(): maxX = max([alg.position().x() for alg in list(self.model.childAlgorithms().values())]) maxY = max([alg.position().y() for alg in list(self.model.childAlgorithms().values())]) newX = min(MARGIN + BOX_WIDTH + maxX, self.CANVAS_SIZE - BOX_WIDTH) newY = min(MARGIN + BOX_HEIGHT + maxY, self.CANVAS_SIZE - BOX_HEIGHT) else: newX = MARGIN + BOX_WIDTH / 2 newY = MARGIN * 2 + BOX_HEIGHT + BOX_HEIGHT / 2 return QPointF(newX, newY) def export_as_script_algorithm(self): dlg = ScriptEditorDialog(None) dlg.editor.setText('\n'.join(self.model.asPythonCode(QgsProcessing.PythonQgsProcessingAlgorithmSubclass, 4))) dlg.show()
def __init__(self, model=None): super().__init__(None) self.setAttribute(Qt.WA_DeleteOnClose) self.setupUi(self) self._variables_scope = None # LOTS of bug reports when we include the dock creation in the UI file # see e.g. #16428, #19068 # So just roll it all by hand......! self.propertiesDock = QgsDockWidget(self) self.propertiesDock.setFeatures( QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.propertiesDock.setObjectName("propertiesDock") propertiesDockContents = QWidget() self.verticalDockLayout_1 = QVBoxLayout(propertiesDockContents) self.verticalDockLayout_1.setContentsMargins(0, 0, 0, 0) self.verticalDockLayout_1.setSpacing(0) self.scrollArea_1 = QgsScrollArea(propertiesDockContents) sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollArea_1.sizePolicy().hasHeightForWidth()) self.scrollArea_1.setSizePolicy(sizePolicy) self.scrollArea_1.setFocusPolicy(Qt.WheelFocus) self.scrollArea_1.setFrameShape(QFrame.NoFrame) self.scrollArea_1.setFrameShadow(QFrame.Plain) self.scrollArea_1.setWidgetResizable(True) self.scrollAreaWidgetContents_1 = QWidget() self.gridLayout = QGridLayout(self.scrollAreaWidgetContents_1) self.gridLayout.setContentsMargins(6, 6, 6, 6) self.gridLayout.setSpacing(4) self.label_1 = QLabel(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.label_1, 0, 0, 1, 1) self.textName = QLineEdit(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.textName, 0, 1, 1, 1) self.label_2 = QLabel(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) self.textGroup = QLineEdit(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.textGroup, 1, 1, 1, 1) self.label_1.setText(self.tr("Name")) self.textName.setToolTip(self.tr("Enter model name here")) self.label_2.setText(self.tr("Group")) self.textGroup.setToolTip(self.tr("Enter group name here")) self.scrollArea_1.setWidget(self.scrollAreaWidgetContents_1) self.verticalDockLayout_1.addWidget(self.scrollArea_1) self.propertiesDock.setWidget(propertiesDockContents) self.propertiesDock.setWindowTitle(self.tr("Model Properties")) self.inputsDock = QgsDockWidget(self) self.inputsDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.inputsDock.setObjectName("inputsDock") self.inputsDockContents = QWidget() self.verticalLayout_3 = QVBoxLayout(self.inputsDockContents) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.scrollArea_2 = QgsScrollArea(self.inputsDockContents) sizePolicy.setHeightForWidth(self.scrollArea_2.sizePolicy().hasHeightForWidth()) self.scrollArea_2.setSizePolicy(sizePolicy) self.scrollArea_2.setFocusPolicy(Qt.WheelFocus) self.scrollArea_2.setFrameShape(QFrame.NoFrame) self.scrollArea_2.setFrameShadow(QFrame.Plain) self.scrollArea_2.setWidgetResizable(True) self.scrollAreaWidgetContents_2 = QWidget() self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents_2) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.inputsTree = QTreeWidget(self.scrollAreaWidgetContents_2) self.inputsTree.setAlternatingRowColors(True) self.inputsTree.header().setVisible(False) self.verticalLayout.addWidget(self.inputsTree) self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2) self.verticalLayout_3.addWidget(self.scrollArea_2) self.inputsDock.setWidget(self.inputsDockContents) self.addDockWidget(Qt.DockWidgetArea(1), self.inputsDock) self.inputsDock.setWindowTitle(self.tr("Inputs")) self.algorithmsDock = QgsDockWidget(self) self.algorithmsDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.algorithmsDock.setObjectName("algorithmsDock") self.algorithmsDockContents = QWidget() self.verticalLayout_4 = QVBoxLayout(self.algorithmsDockContents) self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) self.scrollArea_3 = QgsScrollArea(self.algorithmsDockContents) sizePolicy.setHeightForWidth(self.scrollArea_3.sizePolicy().hasHeightForWidth()) self.scrollArea_3.setSizePolicy(sizePolicy) self.scrollArea_3.setFocusPolicy(Qt.WheelFocus) self.scrollArea_3.setFrameShape(QFrame.NoFrame) self.scrollArea_3.setFrameShadow(QFrame.Plain) self.scrollArea_3.setWidgetResizable(True) self.scrollAreaWidgetContents_3 = QWidget() self.verticalLayout_2 = QVBoxLayout(self.scrollAreaWidgetContents_3) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(4) self.searchBox = QgsFilterLineEdit(self.scrollAreaWidgetContents_3) self.verticalLayout_2.addWidget(self.searchBox) self.algorithmTree = QgsProcessingToolboxTreeView(None, QgsApplication.processingRegistry()) self.algorithmTree.setAlternatingRowColors(True) self.algorithmTree.header().setVisible(False) self.verticalLayout_2.addWidget(self.algorithmTree) self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3) self.verticalLayout_4.addWidget(self.scrollArea_3) self.algorithmsDock.setWidget(self.algorithmsDockContents) self.addDockWidget(Qt.DockWidgetArea(1), self.algorithmsDock) self.algorithmsDock.setWindowTitle(self.tr("Algorithms")) self.searchBox.setToolTip(self.tr("Enter algorithm name to filter list")) self.searchBox.setShowSearchIcon(True) self.variables_dock = QgsDockWidget(self) self.variables_dock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.variables_dock.setObjectName("variablesDock") self.variables_dock_contents = QWidget() vl_v = QVBoxLayout() vl_v.setContentsMargins(0, 0, 0, 0) self.variables_editor = QgsVariableEditorWidget() vl_v.addWidget(self.variables_editor) self.variables_dock_contents.setLayout(vl_v) self.variables_dock.setWidget(self.variables_dock_contents) self.addDockWidget(Qt.DockWidgetArea(1), self.variables_dock) self.variables_dock.setWindowTitle(self.tr("Variables")) self.addDockWidget(Qt.DockWidgetArea(1), self.propertiesDock) self.tabifyDockWidget(self.propertiesDock, self.variables_dock) self.variables_editor.scopeChanged.connect(self.variables_changed) self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.centralWidget().layout().insertWidget(0, self.bar) try: self.setDockOptions(self.dockOptions() | QMainWindow.GroupedDragging) except: pass if iface is not None: self.mToolbar.setIconSize(iface.iconSize()) self.setStyleSheet(iface.mainWindow().styleSheet()) self.toolbutton_export_to_script = QToolButton() self.toolbutton_export_to_script.setPopupMode(QToolButton.InstantPopup) self.export_to_script_algorithm_action = QAction(QCoreApplication.translate('ModelerDialog', 'Export as Script Algorithm…')) self.toolbutton_export_to_script.addActions([self.export_to_script_algorithm_action]) self.mToolbar.insertWidget(self.mActionExportImage, self.toolbutton_export_to_script) self.export_to_script_algorithm_action.triggered.connect(self.export_as_script_algorithm) self.mActionOpen.setIcon( QgsApplication.getThemeIcon('/mActionFileOpen.svg')) self.mActionSave.setIcon( QgsApplication.getThemeIcon('/mActionFileSave.svg')) self.mActionSaveAs.setIcon( QgsApplication.getThemeIcon('/mActionFileSaveAs.svg')) self.mActionSaveInProject.setIcon( QgsApplication.getThemeIcon('/mAddToProject.svg')) self.mActionZoomActual.setIcon( QgsApplication.getThemeIcon('/mActionZoomActual.svg')) self.mActionZoomIn.setIcon( QgsApplication.getThemeIcon('/mActionZoomIn.svg')) self.mActionZoomOut.setIcon( QgsApplication.getThemeIcon('/mActionZoomOut.svg')) self.mActionExportImage.setIcon( QgsApplication.getThemeIcon('/mActionSaveMapAsImage.svg')) self.mActionZoomToItems.setIcon( QgsApplication.getThemeIcon('/mActionZoomFullExtent.svg')) self.mActionExportPdf.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsPDF.svg')) self.mActionExportSvg.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsSVG.svg')) self.toolbutton_export_to_script.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsPython.svg')) self.mActionEditHelp.setIcon( QgsApplication.getThemeIcon('/mActionEditHelpContent.svg')) self.mActionRun.setIcon( QgsApplication.getThemeIcon('/mActionStart.svg')) self.addDockWidget(Qt.LeftDockWidgetArea, self.propertiesDock) self.addDockWidget(Qt.LeftDockWidgetArea, self.inputsDock) self.addDockWidget(Qt.LeftDockWidgetArea, self.algorithmsDock) self.tabifyDockWidget(self.inputsDock, self.algorithmsDock) self.inputsDock.raise_() self.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) settings = QgsSettings() self.restoreState(settings.value("/Processing/stateModeler", QByteArray())) self.restoreGeometry(settings.value("/Processing/geometryModeler", QByteArray())) self.scene = ModelerScene(self, dialog=self) self.scene.setSceneRect(QRectF(0, 0, self.CANVAS_SIZE, self.CANVAS_SIZE)) self.view.setScene(self.scene) self.view.setAcceptDrops(True) self.view.ensureVisible(0, 0, 10, 10) self.view.scale(QgsApplication.desktop().logicalDpiX() / 96, QgsApplication.desktop().logicalDpiX() / 96) def _dragEnterEvent(event): if event.mimeData().hasText() or event.mimeData().hasFormat('application/x-vnd.qgis.qgis.algorithmid'): event.acceptProposedAction() else: event.ignore() def _dropEvent(event): def alg_dropped(algorithm_id, pos): alg = QgsApplication.processingRegistry().createAlgorithmById(algorithm_id) if alg is not None: self._addAlgorithm(alg, pos) else: assert False, algorithm_id def input_dropped(id, pos): if id in [param.id() for param in QgsApplication.instance().processingRegistry().parameterTypes()]: self.addInputOfType(itemId, pos) if event.mimeData().hasFormat('application/x-vnd.qgis.qgis.algorithmid'): data = event.mimeData().data('application/x-vnd.qgis.qgis.algorithmid') stream = QDataStream(data, QIODevice.ReadOnly) algorithm_id = stream.readQString() QTimer.singleShot(0, lambda id=algorithm_id, pos=self.view.mapToScene(event.pos()): alg_dropped(id, pos)) event.accept() elif event.mimeData().hasText(): itemId = event.mimeData().text() QTimer.singleShot(0, lambda id=itemId, pos=self.view.mapToScene(event.pos()): input_dropped(id, pos)) event.accept() else: event.ignore() def _dragMoveEvent(event): if event.mimeData().hasText() or event.mimeData().hasFormat('application/x-vnd.qgis.qgis.algorithmid'): event.accept() else: event.ignore() def _wheelEvent(event): self.view.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) settings = QgsSettings() factor = settings.value('/qgis/zoom_favor', 2.0) # "Normal" mouse has an angle delta of 120, precision mouses provide data # faster, in smaller steps factor = 1.0 + (factor - 1.0) / 120.0 * abs(event.angleDelta().y()) if (event.modifiers() == Qt.ControlModifier): factor = 1.0 + (factor - 1.0) / 20.0 if event.angleDelta().y() < 0: factor = 1 / factor self.view.scale(factor, factor) def _enterEvent(e): QGraphicsView.enterEvent(self.view, e) self.view.viewport().setCursor(Qt.ArrowCursor) def _mouseReleaseEvent(e): QGraphicsView.mouseReleaseEvent(self.view, e) self.view.viewport().setCursor(Qt.ArrowCursor) def _mousePressEvent(e): if e.button() == Qt.MidButton: self.previousMousePos = e.pos() else: QGraphicsView.mousePressEvent(self.view, e) def _mouseMoveEvent(e): if e.buttons() == Qt.MidButton: offset = self.previousMousePos - e.pos() self.previousMousePos = e.pos() self.view.verticalScrollBar().setValue(self.view.verticalScrollBar().value() + offset.y()) self.view.horizontalScrollBar().setValue(self.view.horizontalScrollBar().value() + offset.x()) else: QGraphicsView.mouseMoveEvent(self.view, e) self.view.setDragMode(QGraphicsView.ScrollHandDrag) self.view.dragEnterEvent = _dragEnterEvent self.view.dropEvent = _dropEvent self.view.dragMoveEvent = _dragMoveEvent self.view.wheelEvent = _wheelEvent self.view.enterEvent = _enterEvent self.view.mousePressEvent = _mousePressEvent self.view.mouseMoveEvent = _mouseMoveEvent def _mimeDataInput(items): mimeData = QMimeData() text = items[0].data(0, Qt.UserRole) mimeData.setText(text) return mimeData self.inputsTree.mimeData = _mimeDataInput self.inputsTree.setDragDropMode(QTreeWidget.DragOnly) self.inputsTree.setDropIndicatorShown(True) self.algorithms_model = ModelerToolboxModel(self, QgsApplication.processingRegistry()) self.algorithmTree.setToolboxProxyModel(self.algorithms_model) self.algorithmTree.setDragDropMode(QTreeWidget.DragOnly) self.algorithmTree.setDropIndicatorShown(True) filters = QgsProcessingToolboxProxyModel.Filters(QgsProcessingToolboxProxyModel.FilterModeler) if ProcessingConfig.getSetting(ProcessingConfig.SHOW_ALGORITHMS_KNOWN_ISSUES): filters |= QgsProcessingToolboxProxyModel.FilterShowKnownIssues self.algorithmTree.setFilters(filters) if hasattr(self.searchBox, 'setPlaceholderText'): self.searchBox.setPlaceholderText(QCoreApplication.translate('ModelerDialog', 'Search…')) if hasattr(self.textName, 'setPlaceholderText'): self.textName.setPlaceholderText(self.tr('Enter model name here')) if hasattr(self.textGroup, 'setPlaceholderText'): self.textGroup.setPlaceholderText(self.tr('Enter group name here')) # Connect signals and slots self.inputsTree.doubleClicked.connect(self.addInput) self.searchBox.textChanged.connect(self.algorithmTree.setFilterString) self.algorithmTree.doubleClicked.connect(self.addAlgorithm) # Ctrl+= should also trigger a zoom in action ctrlEquals = QShortcut(QKeySequence("Ctrl+="), self) ctrlEquals.activated.connect(self.zoomIn) self.mActionOpen.triggered.connect(self.openModel) self.mActionSave.triggered.connect(self.save) self.mActionSaveAs.triggered.connect(self.saveAs) self.mActionSaveInProject.triggered.connect(self.saveInProject) self.mActionZoomIn.triggered.connect(self.zoomIn) self.mActionZoomOut.triggered.connect(self.zoomOut) self.mActionZoomActual.triggered.connect(self.zoomActual) self.mActionZoomToItems.triggered.connect(self.zoomToItems) self.mActionExportImage.triggered.connect(self.exportAsImage) self.mActionExportPdf.triggered.connect(self.exportAsPdf) self.mActionExportSvg.triggered.connect(self.exportAsSvg) #self.mActionExportPython.triggered.connect(self.exportAsPython) self.mActionEditHelp.triggered.connect(self.editHelp) self.mActionRun.triggered.connect(self.runModel) if model is not None: self.model = model.create() self.model.setSourceFilePath(model.sourceFilePath()) self.textGroup.setText(self.model.group()) self.textName.setText(self.model.displayName()) self.repaintModel() else: self.model = QgsProcessingModelAlgorithm() self.model.setProvider(QgsApplication.processingRegistry().providerById('model')) self.update_variables_gui() self.fillInputsTree() self.view.centerOn(0, 0) self.help = None self.hasChanged = False
def __init__(self, model=None): super().__init__(None) self.setAttribute(Qt.WA_DeleteOnClose) self.setupUi(self) self._variables_scope = None # LOTS of bug reports when we include the dock creation in the UI file # see e.g. #16428, #19068 # So just roll it all by hand......! self.propertiesDock = QgsDockWidget(self) self.propertiesDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.propertiesDock.setObjectName("propertiesDock") propertiesDockContents = QWidget() self.verticalDockLayout_1 = QVBoxLayout(propertiesDockContents) self.verticalDockLayout_1.setContentsMargins(0, 0, 0, 0) self.verticalDockLayout_1.setSpacing(0) self.scrollArea_1 = QgsScrollArea(propertiesDockContents) sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.scrollArea_1.sizePolicy().hasHeightForWidth()) self.scrollArea_1.setSizePolicy(sizePolicy) self.scrollArea_1.setFocusPolicy(Qt.WheelFocus) self.scrollArea_1.setFrameShape(QFrame.NoFrame) self.scrollArea_1.setFrameShadow(QFrame.Plain) self.scrollArea_1.setWidgetResizable(True) self.scrollAreaWidgetContents_1 = QWidget() self.gridLayout = QGridLayout(self.scrollAreaWidgetContents_1) self.gridLayout.setContentsMargins(6, 6, 6, 6) self.gridLayout.setSpacing(4) self.label_1 = QLabel(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.label_1, 0, 0, 1, 1) self.textName = QLineEdit(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.textName, 0, 1, 1, 1) self.label_2 = QLabel(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) self.textGroup = QLineEdit(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.textGroup, 1, 1, 1, 1) self.label_1.setText(self.tr("Name")) self.textName.setToolTip(self.tr("Enter model name here")) self.label_2.setText(self.tr("Group")) self.textGroup.setToolTip(self.tr("Enter group name here")) self.scrollArea_1.setWidget(self.scrollAreaWidgetContents_1) self.verticalDockLayout_1.addWidget(self.scrollArea_1) self.propertiesDock.setWidget(propertiesDockContents) self.propertiesDock.setWindowTitle(self.tr("Model Properties")) self.inputsDock = QgsDockWidget(self) self.inputsDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.inputsDock.setObjectName("inputsDock") self.inputsDockContents = QWidget() self.verticalLayout_3 = QVBoxLayout(self.inputsDockContents) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.scrollArea_2 = QgsScrollArea(self.inputsDockContents) sizePolicy.setHeightForWidth( self.scrollArea_2.sizePolicy().hasHeightForWidth()) self.scrollArea_2.setSizePolicy(sizePolicy) self.scrollArea_2.setFocusPolicy(Qt.WheelFocus) self.scrollArea_2.setFrameShape(QFrame.NoFrame) self.scrollArea_2.setFrameShadow(QFrame.Plain) self.scrollArea_2.setWidgetResizable(True) self.scrollAreaWidgetContents_2 = QWidget() self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents_2) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.inputsTree = QTreeWidget(self.scrollAreaWidgetContents_2) self.inputsTree.setAlternatingRowColors(True) self.inputsTree.header().setVisible(False) self.verticalLayout.addWidget(self.inputsTree) self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2) self.verticalLayout_3.addWidget(self.scrollArea_2) self.inputsDock.setWidget(self.inputsDockContents) self.addDockWidget(Qt.DockWidgetArea(1), self.inputsDock) self.inputsDock.setWindowTitle(self.tr("Inputs")) self.algorithmsDock = QgsDockWidget(self) self.algorithmsDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.algorithmsDock.setObjectName("algorithmsDock") self.algorithmsDockContents = QWidget() self.verticalLayout_4 = QVBoxLayout(self.algorithmsDockContents) self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) self.scrollArea_3 = QgsScrollArea(self.algorithmsDockContents) sizePolicy.setHeightForWidth( self.scrollArea_3.sizePolicy().hasHeightForWidth()) self.scrollArea_3.setSizePolicy(sizePolicy) self.scrollArea_3.setFocusPolicy(Qt.WheelFocus) self.scrollArea_3.setFrameShape(QFrame.NoFrame) self.scrollArea_3.setFrameShadow(QFrame.Plain) self.scrollArea_3.setWidgetResizable(True) self.scrollAreaWidgetContents_3 = QWidget() self.verticalLayout_2 = QVBoxLayout(self.scrollAreaWidgetContents_3) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(4) self.searchBox = QgsFilterLineEdit(self.scrollAreaWidgetContents_3) self.verticalLayout_2.addWidget(self.searchBox) self.algorithmTree = QgsProcessingToolboxTreeView( None, QgsApplication.processingRegistry()) self.algorithmTree.setAlternatingRowColors(True) self.algorithmTree.header().setVisible(False) self.verticalLayout_2.addWidget(self.algorithmTree) self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3) self.verticalLayout_4.addWidget(self.scrollArea_3) self.algorithmsDock.setWidget(self.algorithmsDockContents) self.addDockWidget(Qt.DockWidgetArea(1), self.algorithmsDock) self.algorithmsDock.setWindowTitle(self.tr("Algorithms")) self.searchBox.setToolTip( self.tr("Enter algorithm name to filter list")) self.searchBox.setShowSearchIcon(True) self.variables_dock = QgsDockWidget(self) self.variables_dock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.variables_dock.setObjectName("variablesDock") self.variables_dock_contents = QWidget() vl_v = QVBoxLayout() vl_v.setContentsMargins(0, 0, 0, 0) self.variables_editor = QgsVariableEditorWidget() vl_v.addWidget(self.variables_editor) self.variables_dock_contents.setLayout(vl_v) self.variables_dock.setWidget(self.variables_dock_contents) self.addDockWidget(Qt.DockWidgetArea(1), self.variables_dock) self.variables_dock.setWindowTitle(self.tr("Variables")) self.addDockWidget(Qt.DockWidgetArea(1), self.propertiesDock) self.tabifyDockWidget(self.propertiesDock, self.variables_dock) self.variables_editor.scopeChanged.connect(self.variables_changed) self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.centralWidget().layout().insertWidget(0, self.bar) try: self.setDockOptions(self.dockOptions() | QMainWindow.GroupedDragging) except: pass if iface is not None: self.mToolbar.setIconSize(iface.iconSize()) self.setStyleSheet(iface.mainWindow().styleSheet()) self.toolbutton_export_to_script = QToolButton() self.toolbutton_export_to_script.setPopupMode(QToolButton.InstantPopup) self.export_to_script_algorithm_action = QAction( QCoreApplication.translate('ModelerDialog', 'Export as Script Algorithm…')) self.toolbutton_export_to_script.addActions( [self.export_to_script_algorithm_action]) self.mToolbar.insertWidget(self.mActionExportImage, self.toolbutton_export_to_script) self.export_to_script_algorithm_action.triggered.connect( self.export_as_script_algorithm) self.mActionOpen.setIcon( QgsApplication.getThemeIcon('/mActionFileOpen.svg')) self.mActionSave.setIcon( QgsApplication.getThemeIcon('/mActionFileSave.svg')) self.mActionSaveAs.setIcon( QgsApplication.getThemeIcon('/mActionFileSaveAs.svg')) self.mActionSaveInProject.setIcon( QgsApplication.getThemeIcon('/mAddToProject.svg')) self.mActionZoomActual.setIcon( QgsApplication.getThemeIcon('/mActionZoomActual.svg')) self.mActionZoomIn.setIcon( QgsApplication.getThemeIcon('/mActionZoomIn.svg')) self.mActionZoomOut.setIcon( QgsApplication.getThemeIcon('/mActionZoomOut.svg')) self.mActionExportImage.setIcon( QgsApplication.getThemeIcon('/mActionSaveMapAsImage.svg')) self.mActionZoomToItems.setIcon( QgsApplication.getThemeIcon('/mActionZoomFullExtent.svg')) self.mActionExportPdf.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsPDF.svg')) self.mActionExportSvg.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsSVG.svg')) self.toolbutton_export_to_script.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsPython.svg')) self.mActionEditHelp.setIcon( QgsApplication.getThemeIcon('/mActionEditHelpContent.svg')) self.mActionRun.setIcon( QgsApplication.getThemeIcon('/mActionStart.svg')) self.addDockWidget(Qt.LeftDockWidgetArea, self.propertiesDock) self.addDockWidget(Qt.LeftDockWidgetArea, self.inputsDock) self.addDockWidget(Qt.LeftDockWidgetArea, self.algorithmsDock) self.tabifyDockWidget(self.inputsDock, self.algorithmsDock) self.inputsDock.raise_() self.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) settings = QgsSettings() self.restoreState( settings.value("/Processing/stateModeler", QByteArray())) self.restoreGeometry( settings.value("/Processing/geometryModeler", QByteArray())) self.scene = ModelerScene(self, dialog=self) self.scene.setSceneRect( QRectF(0, 0, self.CANVAS_SIZE, self.CANVAS_SIZE)) self.view.setScene(self.scene) self.view.setAcceptDrops(True) self.view.ensureVisible(0, 0, 10, 10) self.view.scale(QgsApplication.desktop().logicalDpiX() / 96, QgsApplication.desktop().logicalDpiX() / 96) def _dragEnterEvent(event): if event.mimeData().hasText() or event.mimeData().hasFormat( 'application/x-vnd.qgis.qgis.algorithmid'): event.acceptProposedAction() else: event.ignore() def _dropEvent(event): def alg_dropped(algorithm_id, pos): alg = QgsApplication.processingRegistry().createAlgorithmById( algorithm_id) if alg is not None: self._addAlgorithm(alg, pos) else: assert False, algorithm_id def input_dropped(id, pos): if id in [ param.id() for param in QgsApplication.instance(). processingRegistry().parameterTypes() ]: self.addInputOfType(itemId, pos) if event.mimeData().hasFormat( 'application/x-vnd.qgis.qgis.algorithmid'): data = event.mimeData().data( 'application/x-vnd.qgis.qgis.algorithmid') stream = QDataStream(data, QIODevice.ReadOnly) algorithm_id = stream.readQString() QTimer.singleShot( 0, lambda id=algorithm_id, pos=self.view.mapToScene(event.pos( )): alg_dropped(id, pos)) event.accept() elif event.mimeData().hasText(): itemId = event.mimeData().text() QTimer.singleShot(0, lambda id=itemId, pos=self.view.mapToScene( event.pos()): input_dropped(id, pos)) event.accept() else: event.ignore() def _dragMoveEvent(event): if event.mimeData().hasText() or event.mimeData().hasFormat( 'application/x-vnd.qgis.qgis.algorithmid'): event.accept() else: event.ignore() def _wheelEvent(event): self.view.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) settings = QgsSettings() factor = settings.value('/qgis/zoom_favor', 2.0) # "Normal" mouse has an angle delta of 120, precision mouses provide data # faster, in smaller steps factor = 1.0 + (factor - 1.0) / 120.0 * abs(event.angleDelta().y()) if (event.modifiers() == Qt.ControlModifier): factor = 1.0 + (factor - 1.0) / 20.0 if event.angleDelta().y() < 0: factor = 1 / factor self.view.scale(factor, factor) def _enterEvent(e): QGraphicsView.enterEvent(self.view, e) self.view.viewport().setCursor(Qt.ArrowCursor) def _mouseReleaseEvent(e): QGraphicsView.mouseReleaseEvent(self.view, e) self.view.viewport().setCursor(Qt.ArrowCursor) def _mousePressEvent(e): if e.button() == Qt.MidButton: self.previousMousePos = e.pos() else: QGraphicsView.mousePressEvent(self.view, e) def _mouseMoveEvent(e): if e.buttons() == Qt.MidButton: offset = self.previousMousePos - e.pos() self.previousMousePos = e.pos() self.view.verticalScrollBar().setValue( self.view.verticalScrollBar().value() + offset.y()) self.view.horizontalScrollBar().setValue( self.view.horizontalScrollBar().value() + offset.x()) else: QGraphicsView.mouseMoveEvent(self.view, e) self.view.setDragMode(QGraphicsView.ScrollHandDrag) self.view.dragEnterEvent = _dragEnterEvent self.view.dropEvent = _dropEvent self.view.dragMoveEvent = _dragMoveEvent self.view.wheelEvent = _wheelEvent self.view.enterEvent = _enterEvent self.view.mousePressEvent = _mousePressEvent self.view.mouseMoveEvent = _mouseMoveEvent def _mimeDataInput(items): mimeData = QMimeData() text = items[0].data(0, Qt.UserRole) mimeData.setText(text) return mimeData self.inputsTree.mimeData = _mimeDataInput self.inputsTree.setDragDropMode(QTreeWidget.DragOnly) self.inputsTree.setDropIndicatorShown(True) self.algorithms_model = ModelerToolboxModel( self, QgsApplication.processingRegistry()) self.algorithmTree.setToolboxProxyModel(self.algorithms_model) self.algorithmTree.setDragDropMode(QTreeWidget.DragOnly) self.algorithmTree.setDropIndicatorShown(True) filters = QgsProcessingToolboxProxyModel.Filters( QgsProcessingToolboxProxyModel.FilterModeler) if ProcessingConfig.getSetting( ProcessingConfig.SHOW_ALGORITHMS_KNOWN_ISSUES): filters |= QgsProcessingToolboxProxyModel.FilterShowKnownIssues self.algorithmTree.setFilters(filters) if hasattr(self.searchBox, 'setPlaceholderText'): self.searchBox.setPlaceholderText( QCoreApplication.translate('ModelerDialog', 'Search…')) if hasattr(self.textName, 'setPlaceholderText'): self.textName.setPlaceholderText(self.tr('Enter model name here')) if hasattr(self.textGroup, 'setPlaceholderText'): self.textGroup.setPlaceholderText(self.tr('Enter group name here')) # Connect signals and slots self.inputsTree.doubleClicked.connect(self.addInput) self.searchBox.textChanged.connect(self.algorithmTree.setFilterString) self.algorithmTree.doubleClicked.connect(self.addAlgorithm) # Ctrl+= should also trigger a zoom in action ctrlEquals = QShortcut(QKeySequence("Ctrl+="), self) ctrlEquals.activated.connect(self.zoomIn) self.mActionOpen.triggered.connect(self.openModel) self.mActionSave.triggered.connect(self.save) self.mActionSaveAs.triggered.connect(self.saveAs) self.mActionSaveInProject.triggered.connect(self.saveInProject) self.mActionZoomIn.triggered.connect(self.zoomIn) self.mActionZoomOut.triggered.connect(self.zoomOut) self.mActionZoomActual.triggered.connect(self.zoomActual) self.mActionZoomToItems.triggered.connect(self.zoomToItems) self.mActionExportImage.triggered.connect(self.exportAsImage) self.mActionExportPdf.triggered.connect(self.exportAsPdf) self.mActionExportSvg.triggered.connect(self.exportAsSvg) #self.mActionExportPython.triggered.connect(self.exportAsPython) self.mActionEditHelp.triggered.connect(self.editHelp) self.mActionRun.triggered.connect(self.runModel) if model is not None: self.model = model.create() self.model.setSourceFilePath(model.sourceFilePath()) self.textGroup.setText(self.model.group()) self.textName.setText(self.model.displayName()) self.repaintModel() else: self.model = QgsProcessingModelAlgorithm() self.model.setProvider( QgsApplication.processingRegistry().providerById('model')) self.update_variables_gui() self.fillInputsTree() self.view.centerOn(0, 0) self.help = None self.hasChanged = False
def __init__(self, parent): QtGui.QWidget.__init__(self, parent) self.setObjectName(_fromUtf8("QgsCompositionWidgetBase")) self.resize(345, 506) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) self.setSizePolicy(sizePolicy) self.verticalLayout = QtGui.QVBoxLayout(self) self.verticalLayout.setSpacing(0) self.verticalLayout.setMargin(0) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.scrollArea = QtGui.QScrollArea(self) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.scrollArea.sizePolicy().hasHeightForWidth()) self.scrollArea.setSizePolicy(sizePolicy) self.scrollArea.setFocusPolicy(QtCore.Qt.WheelFocus) self.scrollArea.setFrameShape(QtGui.QFrame.StyledPanel) self.scrollArea.setFrameShadow(QtGui.QFrame.Plain) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName(_fromUtf8("scrollArea")) self.scrollAreaWidgetContents = QtGui.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect( 0, 0, 327, 1085)) self.scrollAreaWidgetContents.setObjectName( _fromUtf8("scrollAreaWidgetContents")) self.verticalLayout_2 = QtGui.QVBoxLayout( self.scrollAreaWidgetContents) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.groupBox = QgsCollapsibleGroupBoxBasic( self.scrollAreaWidgetContents) self.groupBox.setFocusPolicy(QtCore.Qt.StrongFocus) self.groupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.groupBox.setProperty("collapsed", False) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.textLabel7 = QtGui.QLabel(self.groupBox) self.textLabel7.setWordWrap(True) self.textLabel7.setObjectName(_fromUtf8("textLabel7")) self.gridLayout.addWidget(self.textLabel7, 4, 0, 1, 1) self.label_2 = QtGui.QLabel(self.groupBox) self.label_2.setWordWrap(True) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) self.mPaperUnitsComboBox = QtGui.QComboBox(self.groupBox) self.mPaperUnitsComboBox.setEnabled(True) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mPaperUnitsComboBox.sizePolicy().hasHeightForWidth()) self.mPaperUnitsComboBox.setSizePolicy(sizePolicy) self.mPaperUnitsComboBox.setObjectName( _fromUtf8("mPaperUnitsComboBox")) self.gridLayout.addWidget(self.mPaperUnitsComboBox, 3, 1, 1, 1) self.label_3 = QtGui.QLabel(self.groupBox) self.label_3.setWordWrap(True) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout.addWidget(self.label_3, 3, 0, 1, 1) self.textLabel3 = QtGui.QLabel(self.groupBox) self.textLabel3.setWordWrap(True) self.textLabel3.setObjectName(_fromUtf8("textLabel3")) self.gridLayout.addWidget(self.textLabel3, 0, 0, 1, 1) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.mPaperHeightDoubleSpinBox = QgsDoubleSpinBox(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mPaperHeightDoubleSpinBox.sizePolicy().hasHeightForWidth()) self.mPaperHeightDoubleSpinBox.setSizePolicy(sizePolicy) self.mPaperHeightDoubleSpinBox.setPrefix(_fromUtf8("")) self.mPaperHeightDoubleSpinBox.setSuffix(_fromUtf8("")) self.mPaperHeightDoubleSpinBox.setMaximum(99999.0) self.mPaperHeightDoubleSpinBox.setProperty("showClearButton", False) self.mPaperHeightDoubleSpinBox.setObjectName( _fromUtf8("mPaperHeightDoubleSpinBox")) self.horizontalLayout_3.addWidget(self.mPaperHeightDoubleSpinBox) self.mPaperHeightDDBtn = QgsDataDefinedButton(self.groupBox) self.mPaperHeightDDBtn.setObjectName(_fromUtf8("mPaperHeightDDBtn")) self.horizontalLayout_3.addWidget(self.mPaperHeightDDBtn) self.gridLayout.addLayout(self.horizontalLayout_3, 2, 1, 1, 1) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.mPaperWidthDoubleSpinBox = QgsDoubleSpinBox(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mPaperWidthDoubleSpinBox.sizePolicy().hasHeightForWidth()) self.mPaperWidthDoubleSpinBox.setSizePolicy(sizePolicy) self.mPaperWidthDoubleSpinBox.setPrefix(_fromUtf8("")) self.mPaperWidthDoubleSpinBox.setSuffix(_fromUtf8("")) self.mPaperWidthDoubleSpinBox.setMaximum(99999.0) self.mPaperWidthDoubleSpinBox.setProperty("showClearButton", False) self.mPaperWidthDoubleSpinBox.setObjectName( _fromUtf8("mPaperWidthDoubleSpinBox")) self.horizontalLayout_2.addWidget(self.mPaperWidthDoubleSpinBox) self.mPaperWidthDDBtn = QgsDataDefinedButton(self.groupBox) self.mPaperWidthDDBtn.setObjectName(_fromUtf8("mPaperWidthDDBtn")) self.horizontalLayout_2.addWidget(self.mPaperWidthDDBtn) self.gridLayout.addLayout(self.horizontalLayout_2, 1, 1, 1, 1) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.mPaperSizeComboBox = QtGui.QComboBox(self.groupBox) self.mPaperSizeComboBox.setEnabled(True) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mPaperSizeComboBox.sizePolicy().hasHeightForWidth()) self.mPaperSizeComboBox.setSizePolicy(sizePolicy) self.mPaperSizeComboBox.setObjectName(_fromUtf8("mPaperSizeComboBox")) self.horizontalLayout.addWidget(self.mPaperSizeComboBox) self.mPaperSizeDDBtn = QgsDataDefinedButton(self.groupBox) self.mPaperSizeDDBtn.setObjectName(_fromUtf8("mPaperSizeDDBtn")) self.horizontalLayout.addWidget(self.mPaperSizeDDBtn) self.gridLayout.addLayout(self.horizontalLayout, 0, 1, 1, 1) self.label = QtGui.QLabel(self.groupBox) self.label.setWordWrap(True) self.label.setObjectName(_fromUtf8("label")) self.gridLayout.addWidget(self.label, 1, 0, 1, 1) self.horizontalLayout_5 = QtGui.QHBoxLayout() self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) self.mPaperOrientationComboBox = QtGui.QComboBox(self.groupBox) self.mPaperOrientationComboBox.setEnabled(True) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mPaperOrientationComboBox.sizePolicy().hasHeightForWidth()) self.mPaperOrientationComboBox.setSizePolicy(sizePolicy) self.mPaperOrientationComboBox.setObjectName( _fromUtf8("mPaperOrientationComboBox")) self.horizontalLayout_5.addWidget(self.mPaperOrientationComboBox) self.mPaperOrientationDDBtn = QgsDataDefinedButton(self.groupBox) self.mPaperOrientationDDBtn.setObjectName( _fromUtf8("mPaperOrientationDDBtn")) self.horizontalLayout_5.addWidget(self.mPaperOrientationDDBtn) self.gridLayout.addLayout(self.horizontalLayout_5, 4, 1, 1, 1) self.verticalLayout_2.addWidget(self.groupBox) self.groupBox_5 = QgsCollapsibleGroupBoxBasic( self.scrollAreaWidgetContents) self.groupBox_5.setObjectName(_fromUtf8("groupBox_5")) self.verticalLayout_5 = QtGui.QVBoxLayout(self.groupBox_5) self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) self.gridLayout_5 = QtGui.QGridLayout() self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) self.label_4 = QtGui.QLabel(self.groupBox_5) self.label_4.setObjectName(_fromUtf8("label_4")) self.gridLayout_5.addWidget(self.label_4, 0, 1, 1, 1) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout_5.addItem(spacerItem, 0, 0, 1, 1) spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.gridLayout_5.addItem(spacerItem1, 0, 3, 1, 1) self.mTopMarginSpinBox = QgsDoubleSpinBox(self.groupBox_5) self.mTopMarginSpinBox.setSingleStep(0.1) self.mTopMarginSpinBox.setObjectName(_fromUtf8("mTopMarginSpinBox")) self.gridLayout_5.addWidget(self.mTopMarginSpinBox, 0, 2, 1, 1) self.horizontalLayout_7 = QtGui.QHBoxLayout() self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) self.label_5 = QtGui.QLabel(self.groupBox_5) self.label_5.setObjectName(_fromUtf8("label_5")) self.horizontalLayout_7.addWidget(self.label_5) self.mLeftMarginSpinBox = QgsDoubleSpinBox(self.groupBox_5) self.mLeftMarginSpinBox.setSingleStep(0.1) self.mLeftMarginSpinBox.setObjectName(_fromUtf8("mLeftMarginSpinBox")) self.horizontalLayout_7.addWidget(self.mLeftMarginSpinBox) self.label_11 = QtGui.QLabel(self.groupBox_5) self.label_11.setObjectName(_fromUtf8("label_11")) self.horizontalLayout_7.addWidget(self.label_11) self.mRightMarginSpinBox = QgsDoubleSpinBox(self.groupBox_5) self.mRightMarginSpinBox.setSingleStep(0.1) self.mRightMarginSpinBox.setObjectName( _fromUtf8("mRightMarginSpinBox")) self.horizontalLayout_7.addWidget(self.mRightMarginSpinBox) self.gridLayout_5.addLayout(self.horizontalLayout_7, 1, 0, 1, 4) self.label_12 = QtGui.QLabel(self.groupBox_5) self.label_12.setObjectName(_fromUtf8("label_12")) self.gridLayout_5.addWidget(self.label_12, 2, 1, 1, 1) self.mBottomMarginSpinBox = QgsDoubleSpinBox(self.groupBox_5) self.mBottomMarginSpinBox.setSingleStep(0.1) self.mBottomMarginSpinBox.setObjectName( _fromUtf8("mBottomMarginSpinBox")) self.gridLayout_5.addWidget(self.mBottomMarginSpinBox, 2, 2, 1, 1) self.mResizePageButton = QtGui.QPushButton(self.groupBox_5) self.mResizePageButton.setObjectName(_fromUtf8("mResizePageButton")) self.gridLayout_5.addWidget(self.mResizePageButton, 3, 1, 1, 2) self.verticalLayout_5.addLayout(self.gridLayout_5) self.verticalLayout_2.addWidget(self.groupBox_5) self.groupBox_4 = QgsCollapsibleGroupBoxBasic( self.scrollAreaWidgetContents) self.groupBox_4.setObjectName(_fromUtf8("groupBox_4")) self.gridLayout_4 = QtGui.QGridLayout(self.groupBox_4) self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) self.mNumPagesLabel = QtGui.QLabel(self.groupBox_4) self.mNumPagesLabel.setWordWrap(True) self.mNumPagesLabel.setObjectName(_fromUtf8("mNumPagesLabel")) self.gridLayout_4.addWidget(self.mNumPagesLabel, 0, 0, 1, 1) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.mNumPagesSpinBox = QgsSpinBox(self.groupBox_4) self.mNumPagesSpinBox.setMinimum(1) self.mNumPagesSpinBox.setProperty("showClearButton", False) self.mNumPagesSpinBox.setObjectName(_fromUtf8("mNumPagesSpinBox")) self.horizontalLayout_4.addWidget(self.mNumPagesSpinBox) self.mNumPagesDDBtn = QgsDataDefinedButton(self.groupBox_4) self.mNumPagesDDBtn.setObjectName(_fromUtf8("mNumPagesDDBtn")) self.horizontalLayout_4.addWidget(self.mNumPagesDDBtn) self.gridLayout_4.addLayout(self.horizontalLayout_4, 0, 1, 1, 1) self.label_10 = QtGui.QLabel(self.groupBox_4) self.label_10.setObjectName(_fromUtf8("label_10")) self.gridLayout_4.addWidget(self.label_10, 1, 0, 1, 1) self.mPageStyleButton = QtGui.QPushButton(self.groupBox_4) self.mPageStyleButton.setObjectName(_fromUtf8("mPageStyleButton")) self.gridLayout_4.addWidget(self.mPageStyleButton, 1, 1, 1, 1) self.verticalLayout_2.addWidget(self.groupBox_4) self.groupBox_3 = QgsCollapsibleGroupBoxBasic( self.scrollAreaWidgetContents) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) self.gridLayout_3 = QtGui.QGridLayout(self.groupBox_3) self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) self.mResolutionSpinBox = QgsSpinBox(self.groupBox_3) self.mResolutionSpinBox.setPrefix(_fromUtf8("")) self.mResolutionSpinBox.setMaximum(3000) self.mResolutionSpinBox.setProperty("showClearButton", False) self.mResolutionSpinBox.setObjectName(_fromUtf8("mResolutionSpinBox")) self.gridLayout_3.addWidget(self.mResolutionSpinBox, 1, 1, 1, 1) self.mPrintAsRasterCheckBox = QtGui.QCheckBox(self.groupBox_3) self.mPrintAsRasterCheckBox.setCheckable(True) self.mPrintAsRasterCheckBox.setChecked(False) self.mPrintAsRasterCheckBox.setObjectName( _fromUtf8("mPrintAsRasterCheckBox")) self.gridLayout_3.addWidget(self.mPrintAsRasterCheckBox, 2, 0, 1, 1) self.mWorldFileMapComboBox = QtGui.QComboBox(self.groupBox_3) self.mWorldFileMapComboBox.setEnabled(False) self.mWorldFileMapComboBox.setEditable(False) self.mWorldFileMapComboBox.setObjectName( _fromUtf8("mWorldFileMapComboBox")) self.gridLayout_3.addWidget(self.mWorldFileMapComboBox, 3, 1, 1, 1) self.mGenerateWorldFileCheckBox = QtGui.QCheckBox(self.groupBox_3) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mGenerateWorldFileCheckBox.sizePolicy().hasHeightForWidth()) self.mGenerateWorldFileCheckBox.setSizePolicy(sizePolicy) self.mGenerateWorldFileCheckBox.setObjectName( _fromUtf8("mGenerateWorldFileCheckBox")) self.gridLayout_3.addWidget(self.mGenerateWorldFileCheckBox, 3, 0, 1, 1) self.label_9 = QtGui.QLabel(self.groupBox_3) self.label_9.setObjectName(_fromUtf8("label_9")) self.gridLayout_3.addWidget(self.label_9, 1, 0, 1, 1) self.verticalLayout_2.addWidget(self.groupBox_3) self.mSnapToGridGroupCheckBox = QgsCollapsibleGroupBoxBasic( self.scrollAreaWidgetContents) self.mSnapToGridGroupCheckBox.setFocusPolicy(QtCore.Qt.StrongFocus) self.mSnapToGridGroupCheckBox.setCheckable(False) self.mSnapToGridGroupCheckBox.setChecked(False) self.mSnapToGridGroupCheckBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.mSnapToGridGroupCheckBox.setProperty("collapsed", True) self.mSnapToGridGroupCheckBox.setObjectName( _fromUtf8("mSnapToGridGroupCheckBox")) self.gridLayout_2 = QtGui.QGridLayout(self.mSnapToGridGroupCheckBox) self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.label_8 = QtGui.QLabel(self.mSnapToGridGroupCheckBox) self.label_8.setWordWrap(True) self.label_8.setObjectName(_fromUtf8("label_8")) self.gridLayout_2.addWidget(self.label_8, 0, 0, 1, 1) self.mGridResolutionSpinBox = QgsDoubleSpinBox( self.mSnapToGridGroupCheckBox) self.mGridResolutionSpinBox.setPrefix(_fromUtf8("")) self.mGridResolutionSpinBox.setMinimum(0.5) self.mGridResolutionSpinBox.setMaximum(9999.0) self.mGridResolutionSpinBox.setProperty("showClearButton", False) self.mGridResolutionSpinBox.setObjectName( _fromUtf8("mGridResolutionSpinBox")) self.gridLayout_2.addWidget(self.mGridResolutionSpinBox, 0, 1, 1, 1) self.label_6 = QtGui.QLabel(self.mSnapToGridGroupCheckBox) self.label_6.setWordWrap(True) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridLayout_2.addWidget(self.label_6, 1, 0, 1, 1) self.verticalLayout_3 = QtGui.QVBoxLayout() self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.mOffsetXSpinBox = QgsDoubleSpinBox(self.mSnapToGridGroupCheckBox) self.mOffsetXSpinBox.setMaximum(9999.0) self.mOffsetXSpinBox.setObjectName(_fromUtf8("mOffsetXSpinBox")) self.verticalLayout_3.addWidget(self.mOffsetXSpinBox) self.mOffsetYSpinBox = QgsDoubleSpinBox(self.mSnapToGridGroupCheckBox) self.mOffsetYSpinBox.setMaximum(9999.0) self.mOffsetYSpinBox.setObjectName(_fromUtf8("mOffsetYSpinBox")) self.verticalLayout_3.addWidget(self.mOffsetYSpinBox) self.gridLayout_2.addLayout(self.verticalLayout_3, 1, 1, 1, 1) self.label_7 = QtGui.QLabel(self.mSnapToGridGroupCheckBox) self.label_7.setObjectName(_fromUtf8("label_7")) self.gridLayout_2.addWidget(self.label_7, 2, 0, 1, 1) self.mSnapToleranceSpinBox = QgsSpinBox(self.mSnapToGridGroupCheckBox) self.mSnapToleranceSpinBox.setMaximum(200) self.mSnapToleranceSpinBox.setProperty("showClearButton", False) self.mSnapToleranceSpinBox.setObjectName( _fromUtf8("mSnapToleranceSpinBox")) self.gridLayout_2.addWidget(self.mSnapToleranceSpinBox, 2, 1, 1, 1) self.gridLayout_2.setColumnStretch(1, 1) self.verticalLayout_2.addWidget(self.mSnapToGridGroupCheckBox) self.groupBox_2 = QgsCollapsibleGroupBox(self.scrollAreaWidgetContents) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.verticalLayout_4 = QtGui.QVBoxLayout(self.groupBox_2) self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) self.mVariableEditor = QgsVariableEditorWidget(self.groupBox_2) self.mVariableEditor.setMinimumSize(QtCore.QSize(0, 200)) self.mVariableEditor.setObjectName(_fromUtf8("mVariableEditor")) self.verticalLayout_4.addWidget(self.mVariableEditor) self.verticalLayout_2.addWidget(self.groupBox_2) spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem2) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.verticalLayout.addWidget(self.scrollArea) self.textLabel7.setBuddy(self.mPaperOrientationComboBox) self.textLabel3.setBuddy(self.mPaperSizeComboBox) self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) self.setTabOrder(self.scrollArea, self.groupBox) self.setTabOrder(self.groupBox, self.mPaperSizeComboBox) self.setTabOrder(self.mPaperSizeComboBox, self.mPaperSizeDDBtn) self.setTabOrder(self.mPaperSizeDDBtn, self.mPaperWidthDoubleSpinBox) self.setTabOrder(self.mPaperWidthDoubleSpinBox, self.mPaperWidthDDBtn) self.setTabOrder(self.mPaperWidthDDBtn, self.mPaperHeightDoubleSpinBox) self.setTabOrder(self.mPaperHeightDoubleSpinBox, self.mPaperHeightDDBtn) self.setTabOrder(self.mPaperHeightDDBtn, self.mPaperUnitsComboBox) self.setTabOrder(self.mPaperUnitsComboBox, self.mPaperOrientationComboBox) self.setTabOrder(self.mPaperOrientationComboBox, self.mPaperOrientationDDBtn) self.setTabOrder(self.mPaperOrientationDDBtn, self.mTopMarginSpinBox) self.setTabOrder(self.mTopMarginSpinBox, self.mLeftMarginSpinBox) self.setTabOrder(self.mLeftMarginSpinBox, self.mRightMarginSpinBox) self.setTabOrder(self.mRightMarginSpinBox, self.mBottomMarginSpinBox) self.setTabOrder(self.mBottomMarginSpinBox, self.mResizePageButton) self.setTabOrder(self.mResizePageButton, self.mNumPagesSpinBox) self.setTabOrder(self.mNumPagesSpinBox, self.mNumPagesDDBtn) self.setTabOrder(self.mNumPagesDDBtn, self.mPageStyleButton) self.setTabOrder(self.mPageStyleButton, self.mResolutionSpinBox) self.setTabOrder(self.mResolutionSpinBox, self.mPrintAsRasterCheckBox) self.setTabOrder(self.mPrintAsRasterCheckBox, self.mGenerateWorldFileCheckBox) self.setTabOrder(self.mGenerateWorldFileCheckBox, self.mWorldFileMapComboBox) self.setTabOrder(self.mWorldFileMapComboBox, self.mSnapToGridGroupCheckBox) self.setTabOrder(self.mSnapToGridGroupCheckBox, self.mGridResolutionSpinBox) self.setTabOrder(self.mGridResolutionSpinBox, self.mOffsetXSpinBox) self.setTabOrder(self.mOffsetXSpinBox, self.mOffsetYSpinBox) self.setTabOrder(self.mOffsetYSpinBox, self.mSnapToleranceSpinBox) self.groupBox_2.setVisible(False) self.groupBox.setVisible(False) self.groupBox_5.setVisible(False)
class ModelerDialog(BASE, WIDGET): ALG_ITEM = 'ALG_ITEM' PROVIDER_ITEM = 'PROVIDER_ITEM' GROUP_ITEM = 'GROUP_ITEM' NAME_ROLE = Qt.UserRole TAG_ROLE = Qt.UserRole + 1 TYPE_ROLE = Qt.UserRole + 2 CANVAS_SIZE = 4000 update_model = pyqtSignal() def __init__(self, model=None): super().__init__(None) self.setAttribute(Qt.WA_DeleteOnClose) self.setupUi(self) self._variables_scope = None # LOTS of bug reports when we include the dock creation in the UI file # see e.g. #16428, #19068 # So just roll it all by hand......! self.propertiesDock = QgsDockWidget(self) self.propertiesDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.propertiesDock.setObjectName("propertiesDock") propertiesDockContents = QWidget() self.verticalDockLayout_1 = QVBoxLayout(propertiesDockContents) self.verticalDockLayout_1.setContentsMargins(0, 0, 0, 0) self.verticalDockLayout_1.setSpacing(0) self.scrollArea_1 = QgsScrollArea(propertiesDockContents) sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.scrollArea_1.sizePolicy().hasHeightForWidth()) self.scrollArea_1.setSizePolicy(sizePolicy) self.scrollArea_1.setFocusPolicy(Qt.WheelFocus) self.scrollArea_1.setFrameShape(QFrame.NoFrame) self.scrollArea_1.setFrameShadow(QFrame.Plain) self.scrollArea_1.setWidgetResizable(True) self.scrollAreaWidgetContents_1 = QWidget() self.gridLayout = QGridLayout(self.scrollAreaWidgetContents_1) self.gridLayout.setContentsMargins(6, 6, 6, 6) self.gridLayout.setSpacing(4) self.label_1 = QLabel(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.label_1, 0, 0, 1, 1) self.textName = QLineEdit(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.textName, 0, 1, 1, 1) self.label_2 = QLabel(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) self.textGroup = QLineEdit(self.scrollAreaWidgetContents_1) self.gridLayout.addWidget(self.textGroup, 1, 1, 1, 1) self.label_1.setText(self.tr("Name")) self.textName.setToolTip(self.tr("Enter model name here")) self.label_2.setText(self.tr("Group")) self.textGroup.setToolTip(self.tr("Enter group name here")) self.scrollArea_1.setWidget(self.scrollAreaWidgetContents_1) self.verticalDockLayout_1.addWidget(self.scrollArea_1) self.propertiesDock.setWidget(propertiesDockContents) self.propertiesDock.setWindowTitle(self.tr("Model Properties")) self.inputsDock = QgsDockWidget(self) self.inputsDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.inputsDock.setObjectName("inputsDock") self.inputsDockContents = QWidget() self.verticalLayout_3 = QVBoxLayout(self.inputsDockContents) self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.scrollArea_2 = QgsScrollArea(self.inputsDockContents) sizePolicy.setHeightForWidth( self.scrollArea_2.sizePolicy().hasHeightForWidth()) self.scrollArea_2.setSizePolicy(sizePolicy) self.scrollArea_2.setFocusPolicy(Qt.WheelFocus) self.scrollArea_2.setFrameShape(QFrame.NoFrame) self.scrollArea_2.setFrameShadow(QFrame.Plain) self.scrollArea_2.setWidgetResizable(True) self.scrollAreaWidgetContents_2 = QWidget() self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents_2) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setSpacing(0) self.inputsTree = QTreeWidget(self.scrollAreaWidgetContents_2) self.inputsTree.setAlternatingRowColors(True) self.inputsTree.header().setVisible(False) self.verticalLayout.addWidget(self.inputsTree) self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2) self.verticalLayout_3.addWidget(self.scrollArea_2) self.inputsDock.setWidget(self.inputsDockContents) self.addDockWidget(Qt.DockWidgetArea(1), self.inputsDock) self.inputsDock.setWindowTitle(self.tr("Inputs")) self.algorithmsDock = QgsDockWidget(self) self.algorithmsDock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.algorithmsDock.setObjectName("algorithmsDock") self.algorithmsDockContents = QWidget() self.verticalLayout_4 = QVBoxLayout(self.algorithmsDockContents) self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) self.scrollArea_3 = QgsScrollArea(self.algorithmsDockContents) sizePolicy.setHeightForWidth( self.scrollArea_3.sizePolicy().hasHeightForWidth()) self.scrollArea_3.setSizePolicy(sizePolicy) self.scrollArea_3.setFocusPolicy(Qt.WheelFocus) self.scrollArea_3.setFrameShape(QFrame.NoFrame) self.scrollArea_3.setFrameShadow(QFrame.Plain) self.scrollArea_3.setWidgetResizable(True) self.scrollAreaWidgetContents_3 = QWidget() self.verticalLayout_2 = QVBoxLayout(self.scrollAreaWidgetContents_3) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setSpacing(4) self.searchBox = QgsFilterLineEdit(self.scrollAreaWidgetContents_3) self.verticalLayout_2.addWidget(self.searchBox) self.algorithmTree = QgsProcessingToolboxTreeView( None, QgsApplication.processingRegistry()) self.algorithmTree.setAlternatingRowColors(True) self.algorithmTree.header().setVisible(False) self.verticalLayout_2.addWidget(self.algorithmTree) self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3) self.verticalLayout_4.addWidget(self.scrollArea_3) self.algorithmsDock.setWidget(self.algorithmsDockContents) self.addDockWidget(Qt.DockWidgetArea(1), self.algorithmsDock) self.algorithmsDock.setWindowTitle(self.tr("Algorithms")) self.searchBox.setToolTip( self.tr("Enter algorithm name to filter list")) self.searchBox.setShowSearchIcon(True) self.variables_dock = QgsDockWidget(self) self.variables_dock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.variables_dock.setObjectName("variablesDock") self.variables_dock_contents = QWidget() vl_v = QVBoxLayout() vl_v.setContentsMargins(0, 0, 0, 0) self.variables_editor = QgsVariableEditorWidget() vl_v.addWidget(self.variables_editor) self.variables_dock_contents.setLayout(vl_v) self.variables_dock.setWidget(self.variables_dock_contents) self.addDockWidget(Qt.DockWidgetArea(1), self.variables_dock) self.variables_dock.setWindowTitle(self.tr("Variables")) self.addDockWidget(Qt.DockWidgetArea(1), self.propertiesDock) self.tabifyDockWidget(self.propertiesDock, self.variables_dock) self.variables_editor.scopeChanged.connect(self.variables_changed) self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.centralWidget().layout().insertWidget(0, self.bar) try: self.setDockOptions(self.dockOptions() | QMainWindow.GroupedDragging) except: pass if iface is not None: self.mToolbar.setIconSize(iface.iconSize()) self.setStyleSheet(iface.mainWindow().styleSheet()) self.toolbutton_export_to_script = QToolButton() self.toolbutton_export_to_script.setPopupMode(QToolButton.InstantPopup) self.export_to_script_algorithm_action = QAction( QCoreApplication.translate('ModelerDialog', 'Export as Script Algorithm…')) self.toolbutton_export_to_script.addActions( [self.export_to_script_algorithm_action]) self.mToolbar.insertWidget(self.mActionExportImage, self.toolbutton_export_to_script) self.export_to_script_algorithm_action.triggered.connect( self.export_as_script_algorithm) self.mActionOpen.setIcon( QgsApplication.getThemeIcon('/mActionFileOpen.svg')) self.mActionSave.setIcon( QgsApplication.getThemeIcon('/mActionFileSave.svg')) self.mActionSaveAs.setIcon( QgsApplication.getThemeIcon('/mActionFileSaveAs.svg')) self.mActionSaveInProject.setIcon( QgsApplication.getThemeIcon('/mAddToProject.svg')) self.mActionZoomActual.setIcon( QgsApplication.getThemeIcon('/mActionZoomActual.svg')) self.mActionZoomIn.setIcon( QgsApplication.getThemeIcon('/mActionZoomIn.svg')) self.mActionZoomOut.setIcon( QgsApplication.getThemeIcon('/mActionZoomOut.svg')) self.mActionExportImage.setIcon( QgsApplication.getThemeIcon('/mActionSaveMapAsImage.svg')) self.mActionZoomToItems.setIcon( QgsApplication.getThemeIcon('/mActionZoomFullExtent.svg')) self.mActionExportPdf.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsPDF.svg')) self.mActionExportSvg.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsSVG.svg')) self.toolbutton_export_to_script.setIcon( QgsApplication.getThemeIcon('/mActionSaveAsPython.svg')) self.mActionEditHelp.setIcon( QgsApplication.getThemeIcon('/mActionEditHelpContent.svg')) self.mActionRun.setIcon( QgsApplication.getThemeIcon('/mActionStart.svg')) self.addDockWidget(Qt.LeftDockWidgetArea, self.propertiesDock) self.addDockWidget(Qt.LeftDockWidgetArea, self.inputsDock) self.addDockWidget(Qt.LeftDockWidgetArea, self.algorithmsDock) self.tabifyDockWidget(self.inputsDock, self.algorithmsDock) self.inputsDock.raise_() self.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) settings = QgsSettings() self.restoreState( settings.value("/Processing/stateModeler", QByteArray())) self.restoreGeometry( settings.value("/Processing/geometryModeler", QByteArray())) self.scene = ModelerScene(self, dialog=self) self.scene.setSceneRect( QRectF(0, 0, self.CANVAS_SIZE, self.CANVAS_SIZE)) self.view.setScene(self.scene) self.view.setAcceptDrops(True) self.view.ensureVisible(0, 0, 10, 10) self.view.scale(QgsApplication.desktop().logicalDpiX() / 96, QgsApplication.desktop().logicalDpiX() / 96) def _dragEnterEvent(event): if event.mimeData().hasText() or event.mimeData().hasFormat( 'application/x-vnd.qgis.qgis.algorithmid'): event.acceptProposedAction() else: event.ignore() def _dropEvent(event): def alg_dropped(algorithm_id, pos): alg = QgsApplication.processingRegistry().createAlgorithmById( algorithm_id) if alg is not None: self._addAlgorithm(alg, pos) else: assert False, algorithm_id def input_dropped(id, pos): if id in [ param.id() for param in QgsApplication.instance(). processingRegistry().parameterTypes() ]: self.addInputOfType(itemId, pos) if event.mimeData().hasFormat( 'application/x-vnd.qgis.qgis.algorithmid'): data = event.mimeData().data( 'application/x-vnd.qgis.qgis.algorithmid') stream = QDataStream(data, QIODevice.ReadOnly) algorithm_id = stream.readQString() QTimer.singleShot( 0, lambda id=algorithm_id, pos=self.view.mapToScene(event.pos( )): alg_dropped(id, pos)) event.accept() elif event.mimeData().hasText(): itemId = event.mimeData().text() QTimer.singleShot(0, lambda id=itemId, pos=self.view.mapToScene( event.pos()): input_dropped(id, pos)) event.accept() else: event.ignore() def _dragMoveEvent(event): if event.mimeData().hasText() or event.mimeData().hasFormat( 'application/x-vnd.qgis.qgis.algorithmid'): event.accept() else: event.ignore() def _wheelEvent(event): self.view.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) settings = QgsSettings() factor = settings.value('/qgis/zoom_favor', 2.0) # "Normal" mouse has an angle delta of 120, precision mouses provide data # faster, in smaller steps factor = 1.0 + (factor - 1.0) / 120.0 * abs(event.angleDelta().y()) if (event.modifiers() == Qt.ControlModifier): factor = 1.0 + (factor - 1.0) / 20.0 if event.angleDelta().y() < 0: factor = 1 / factor self.view.scale(factor, factor) def _enterEvent(e): QGraphicsView.enterEvent(self.view, e) self.view.viewport().setCursor(Qt.ArrowCursor) def _mouseReleaseEvent(e): QGraphicsView.mouseReleaseEvent(self.view, e) self.view.viewport().setCursor(Qt.ArrowCursor) def _mousePressEvent(e): if e.button() == Qt.MidButton: self.previousMousePos = e.pos() else: QGraphicsView.mousePressEvent(self.view, e) def _mouseMoveEvent(e): if e.buttons() == Qt.MidButton: offset = self.previousMousePos - e.pos() self.previousMousePos = e.pos() self.view.verticalScrollBar().setValue( self.view.verticalScrollBar().value() + offset.y()) self.view.horizontalScrollBar().setValue( self.view.horizontalScrollBar().value() + offset.x()) else: QGraphicsView.mouseMoveEvent(self.view, e) self.view.setDragMode(QGraphicsView.ScrollHandDrag) self.view.dragEnterEvent = _dragEnterEvent self.view.dropEvent = _dropEvent self.view.dragMoveEvent = _dragMoveEvent self.view.wheelEvent = _wheelEvent self.view.enterEvent = _enterEvent self.view.mousePressEvent = _mousePressEvent self.view.mouseMoveEvent = _mouseMoveEvent def _mimeDataInput(items): mimeData = QMimeData() text = items[0].data(0, Qt.UserRole) mimeData.setText(text) return mimeData self.inputsTree.mimeData = _mimeDataInput self.inputsTree.setDragDropMode(QTreeWidget.DragOnly) self.inputsTree.setDropIndicatorShown(True) self.algorithms_model = ModelerToolboxModel( self, QgsApplication.processingRegistry()) self.algorithmTree.setToolboxProxyModel(self.algorithms_model) self.algorithmTree.setDragDropMode(QTreeWidget.DragOnly) self.algorithmTree.setDropIndicatorShown(True) filters = QgsProcessingToolboxProxyModel.Filters( QgsProcessingToolboxProxyModel.FilterModeler) if ProcessingConfig.getSetting( ProcessingConfig.SHOW_ALGORITHMS_KNOWN_ISSUES): filters |= QgsProcessingToolboxProxyModel.FilterShowKnownIssues self.algorithmTree.setFilters(filters) if hasattr(self.searchBox, 'setPlaceholderText'): self.searchBox.setPlaceholderText( QCoreApplication.translate('ModelerDialog', 'Search…')) if hasattr(self.textName, 'setPlaceholderText'): self.textName.setPlaceholderText(self.tr('Enter model name here')) if hasattr(self.textGroup, 'setPlaceholderText'): self.textGroup.setPlaceholderText(self.tr('Enter group name here')) # Connect signals and slots self.inputsTree.doubleClicked.connect(self.addInput) self.searchBox.textChanged.connect(self.algorithmTree.setFilterString) self.algorithmTree.doubleClicked.connect(self.addAlgorithm) # Ctrl+= should also trigger a zoom in action ctrlEquals = QShortcut(QKeySequence("Ctrl+="), self) ctrlEquals.activated.connect(self.zoomIn) self.mActionOpen.triggered.connect(self.openModel) self.mActionSave.triggered.connect(self.save) self.mActionSaveAs.triggered.connect(self.saveAs) self.mActionSaveInProject.triggered.connect(self.saveInProject) self.mActionZoomIn.triggered.connect(self.zoomIn) self.mActionZoomOut.triggered.connect(self.zoomOut) self.mActionZoomActual.triggered.connect(self.zoomActual) self.mActionZoomToItems.triggered.connect(self.zoomToItems) self.mActionExportImage.triggered.connect(self.exportAsImage) self.mActionExportPdf.triggered.connect(self.exportAsPdf) self.mActionExportSvg.triggered.connect(self.exportAsSvg) #self.mActionExportPython.triggered.connect(self.exportAsPython) self.mActionEditHelp.triggered.connect(self.editHelp) self.mActionRun.triggered.connect(self.runModel) if model is not None: self.model = model.create() self.model.setSourceFilePath(model.sourceFilePath()) self.textGroup.setText(self.model.group()) self.textName.setText(self.model.displayName()) self.repaintModel() else: self.model = QgsProcessingModelAlgorithm() self.model.setProvider( QgsApplication.processingRegistry().providerById('model')) self.update_variables_gui() self.fillInputsTree() self.view.centerOn(0, 0) self.help = None self.hasChanged = False def closeEvent(self, evt): settings = QgsSettings() settings.setValue("/Processing/stateModeler", self.saveState()) settings.setValue("/Processing/geometryModeler", self.saveGeometry()) if self.hasChanged: ret = QMessageBox.question( self, self.tr('Save Model?'), self. tr('There are unsaved changes in this model. Do you want to keep those?' ), QMessageBox.Save | QMessageBox.Cancel | QMessageBox.Discard, QMessageBox.Cancel) if ret == QMessageBox.Save: self.saveModel(False) evt.accept() elif ret == QMessageBox.Discard: evt.accept() else: evt.ignore() else: evt.accept() def editHelp(self): alg = self.model dlg = HelpEditionDialog(alg) dlg.exec_() if dlg.descriptions: self.model.setHelpContent(dlg.descriptions) self.hasChanged = True def update_variables_gui(self): variables_scope = QgsExpressionContextScope(self.tr('Model Variables')) for k, v in self.model.variables().items(): variables_scope.setVariable(k, v) variables_context = QgsExpressionContext() variables_context.appendScope(variables_scope) self.variables_editor.setContext(variables_context) self.variables_editor.setEditableScopeIndex(0) def variables_changed(self): self.model.setVariables(self.variables_editor.variablesInActiveScope()) def runModel(self): if len(self.model.childAlgorithms()) == 0: self.bar.pushMessage( "", self. tr("Model doesn't contain any algorithm and/or parameter and can't be executed" ), level=Qgis.Warning, duration=5) return dlg = AlgorithmDialog(self.model.create(), parent=iface.mainWindow()) dlg.exec_() def save(self): self.saveModel(False) def saveAs(self): self.saveModel(True) def saveInProject(self): if not self.can_save(): return self.model.setName(str(self.textName.text())) self.model.setGroup(str(self.textGroup.text())) self.model.setSourceFilePath(None) project_provider = QgsApplication.processingRegistry().providerById( PROJECT_PROVIDER_ID) project_provider.add_model(self.model) self.update_model.emit() self.bar.pushMessage("", self.tr("Model was saved inside current project"), level=Qgis.Success, duration=5) self.hasChanged = False QgsProject.instance().setDirty(True) def zoomIn(self): self.view.setTransformationAnchor(QGraphicsView.NoAnchor) point = self.view.mapToScene( QPoint(self.view.viewport().width() / 2, self.view.viewport().height() / 2)) settings = QgsSettings() factor = settings.value('/qgis/zoom_favor', 2.0) self.view.scale(factor, factor) self.view.centerOn(point) self.repaintModel() def zoomOut(self): self.view.setTransformationAnchor(QGraphicsView.NoAnchor) point = self.view.mapToScene( QPoint(self.view.viewport().width() / 2, self.view.viewport().height() / 2)) settings = QgsSettings() factor = settings.value('/qgis/zoom_favor', 2.0) factor = 1 / factor self.view.scale(factor, factor) self.view.centerOn(point) self.repaintModel() def zoomActual(self): point = self.view.mapToScene( QPoint(self.view.viewport().width() / 2, self.view.viewport().height() / 2)) self.view.resetTransform() self.view.scale(QgsApplication.desktop().logicalDpiX() / 96, QgsApplication.desktop().logicalDpiX() / 96) self.view.centerOn(point) def zoomToItems(self): totalRect = self.scene.itemsBoundingRect() totalRect.adjust(-10, -10, 10, 10) self.view.fitInView(totalRect, Qt.KeepAspectRatio) def exportAsImage(self): self.repaintModel(controls=False) filename, fileFilter = QFileDialog.getSaveFileName( self, self.tr('Save Model As Image'), '', self.tr('PNG files (*.png *.PNG)')) if not filename: return if not filename.lower().endswith('.png'): filename += '.png' totalRect = self.scene.itemsBoundingRect() totalRect.adjust(-10, -10, 10, 10) imgRect = QRectF(0, 0, totalRect.width(), totalRect.height()) img = QImage(totalRect.width(), totalRect.height(), QImage.Format_ARGB32_Premultiplied) img.fill(Qt.white) painter = QPainter() painter.setRenderHint(QPainter.Antialiasing) painter.begin(img) self.scene.render(painter, imgRect, totalRect) painter.end() img.save(filename) self.bar.pushMessage( "", self.tr( "Successfully exported model as image to <a href=\"{}\">{}</a>" ).format( QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) self.repaintModel(controls=True) def exportAsPdf(self): self.repaintModel(controls=False) filename, fileFilter = QFileDialog.getSaveFileName( self, self.tr('Save Model As PDF'), '', self.tr('PDF files (*.pdf *.PDF)')) if not filename: return if not filename.lower().endswith('.pdf'): filename += '.pdf' totalRect = self.scene.itemsBoundingRect() totalRect.adjust(-10, -10, 10, 10) printerRect = QRectF(0, 0, totalRect.width(), totalRect.height()) printer = QPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(filename) printer.setPaperSize(QSizeF(printerRect.width(), printerRect.height()), QPrinter.DevicePixel) printer.setFullPage(True) painter = QPainter(printer) self.scene.render(painter, printerRect, totalRect) painter.end() self.bar.pushMessage( "", self.tr( "Successfully exported model as PDF to <a href=\"{}\">{}</a>"). format( QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) self.repaintModel(controls=True) def exportAsSvg(self): self.repaintModel(controls=False) filename, fileFilter = QFileDialog.getSaveFileName( self, self.tr('Save Model As SVG'), '', self.tr('SVG files (*.svg *.SVG)')) if not filename: return if not filename.lower().endswith('.svg'): filename += '.svg' totalRect = self.scene.itemsBoundingRect() totalRect.adjust(-10, -10, 10, 10) svgRect = QRectF(0, 0, totalRect.width(), totalRect.height()) svg = QSvgGenerator() svg.setFileName(filename) svg.setSize(QSize(totalRect.width(), totalRect.height())) svg.setViewBox(svgRect) svg.setTitle(self.model.displayName()) painter = QPainter(svg) self.scene.render(painter, svgRect, totalRect) painter.end() self.bar.pushMessage( "", self.tr( "Successfully exported model as SVG to <a href=\"{}\">{}</a>"). format( QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) self.repaintModel(controls=True) def exportAsPython(self): filename, filter = QFileDialog.getSaveFileName( self, self.tr('Save Model As Python Script'), '', self.tr('Processing scripts (*.py *.PY)')) if not filename: return if not filename.lower().endswith('.py'): filename += '.py' text = self.model.asPythonCode() with codecs.open(filename, 'w', encoding='utf-8') as fout: fout.write(text) self.bar.pushMessage( "", self. tr("Successfully exported model as python script to <a href=\"{}\">{}</a>" ).format( QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) def can_save(self): """ Tests whether a model can be saved, or if it is not yet valid :return: bool """ if str(self.textName.text()).strip() == '': self.bar.pushWarning( "", self.tr('Please a enter model name before saving')) return False return True def saveModel(self, saveAs): if not self.can_save(): return self.model.setName(str(self.textName.text())) self.model.setGroup(str(self.textGroup.text())) if self.model.sourceFilePath() and not saveAs: filename = self.model.sourceFilePath() else: filename, filter = QFileDialog.getSaveFileName( self, self.tr('Save Model'), ModelerUtils.modelsFolders()[0], self.tr('Processing models (*.model3 *.MODEL3)')) if filename: if not filename.endswith('.model3'): filename += '.model3' self.model.setSourceFilePath(filename) if filename: if not self.model.toFile(filename): if saveAs: QMessageBox.warning( self, self.tr('I/O error'), self.tr('Unable to save edits. Reason:\n {0}').format( str(sys.exc_info()[1]))) else: QMessageBox.warning( self, self.tr("Can't save model"), QCoreApplication. translate('QgsPluginInstallerInstallingDialog', ( "This model can't be saved in its original location (probably you do not " "have permission to do it). Please, use the 'Save as…' option." ))) return self.update_model.emit() if saveAs: self.bar.pushMessage( "", self.tr( "Model was correctly saved to <a href=\"{}\">{}</a>"). format( QUrl.fromLocalFile(filename).toString(), QDir.toNativeSeparators(filename)), level=Qgis.Success, duration=5) else: self.bar.pushMessage("", self.tr("Model was correctly saved"), level=Qgis.Success, duration=5) self.hasChanged = False def openModel(self): filename, selected_filter = QFileDialog.getOpenFileName( self, self.tr('Open Model'), ModelerUtils.modelsFolders()[0], self.tr('Processing models (*.model3 *.MODEL3)')) if filename: self.loadModel(filename) def loadModel(self, filename): alg = QgsProcessingModelAlgorithm() if alg.fromFile(filename): self.model = alg self.model.setProvider( QgsApplication.processingRegistry().providerById('model')) self.textGroup.setText(alg.group()) self.textName.setText(alg.name()) self.repaintModel() self.update_variables_gui() self.view.centerOn(0, 0) self.hasChanged = False else: QgsMessageLog.logMessage( self.tr('Could not load model {0}').format(filename), self.tr('Processing'), Qgis.Critical) QMessageBox.critical( self, self.tr('Open Model'), self.tr('The selected model could not be loaded.\n' 'See the log for more information.')) def repaintModel(self, controls=True): self.scene = ModelerScene(self, dialog=self) self.scene.setSceneRect( QRectF(0, 0, self.CANVAS_SIZE, self.CANVAS_SIZE)) self.scene.paintModel(self.model, controls) self.view.setScene(self.scene) def addInput(self): item = self.inputsTree.currentItem() param = item.data(0, Qt.UserRole) self.addInputOfType(param) def addInputOfType(self, paramType, pos=None): dlg = ModelerParameterDefinitionDialog(self.model, paramType) dlg.exec_() if dlg.param is not None: if pos is None: pos = self.getPositionForParameterItem() if isinstance(pos, QPoint): pos = QPointF(pos) component = QgsProcessingModelParameter(dlg.param.name()) component.setDescription(dlg.param.name()) component.setPosition(pos) self.model.addModelParameter(dlg.param, component) self.repaintModel() # self.view.ensureVisible(self.scene.getLastParameterItem()) self.hasChanged = True def getPositionForParameterItem(self): MARGIN = 20 BOX_WIDTH = 200 BOX_HEIGHT = 80 if len(self.model.parameterComponents()) > 0: maxX = max([ i.position().x() for i in list(self.model.parameterComponents().values()) ]) newX = min(MARGIN + BOX_WIDTH + maxX, self.CANVAS_SIZE - BOX_WIDTH) else: newX = MARGIN + BOX_WIDTH / 2 return QPointF(newX, MARGIN + BOX_HEIGHT / 2) def fillInputsTree(self): icon = QIcon(os.path.join(pluginPath, 'images', 'input.svg')) parametersItem = QTreeWidgetItem() parametersItem.setText(0, self.tr('Parameters')) sortedParams = sorted( QgsApplication.instance().processingRegistry().parameterTypes(), key=lambda pt: pt.name()) for param in sortedParams: if param.flags() & QgsProcessingParameterType.ExposeToModeler: paramItem = QTreeWidgetItem() paramItem.setText(0, param.name()) paramItem.setData(0, Qt.UserRole, param.id()) paramItem.setIcon(0, icon) paramItem.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled) paramItem.setToolTip(0, param.description()) parametersItem.addChild(paramItem) self.inputsTree.addTopLevelItem(parametersItem) parametersItem.setExpanded(True) def addAlgorithm(self): algorithm = self.algorithmTree.selectedAlgorithm() if algorithm is not None: alg = QgsApplication.processingRegistry().createAlgorithmById( algorithm.id()) self._addAlgorithm(alg) def _addAlgorithm(self, alg, pos=None): dlg = ModelerParametersDialog(alg, self.model) if dlg.exec_(): alg = dlg.createAlgorithm() if pos is None: alg.setPosition(self.getPositionForAlgorithmItem()) else: alg.setPosition(pos) from processing.modeler.ModelerGraphicItem import ModelerGraphicItem for i, out in enumerate(alg.modelOutputs()): alg.modelOutput(out).setPosition( alg.position() + QPointF(ModelerGraphicItem.BOX_WIDTH, (i + 1.5) * ModelerGraphicItem.BOX_HEIGHT)) self.model.addChildAlgorithm(alg) self.repaintModel() self.hasChanged = True def getPositionForAlgorithmItem(self): MARGIN = 20 BOX_WIDTH = 200 BOX_HEIGHT = 80 if self.model.childAlgorithms(): maxX = max([ alg.position().x() for alg in list(self.model.childAlgorithms().values()) ]) maxY = max([ alg.position().y() for alg in list(self.model.childAlgorithms().values()) ]) newX = min(MARGIN + BOX_WIDTH + maxX, self.CANVAS_SIZE - BOX_WIDTH) newY = min(MARGIN + BOX_HEIGHT + maxY, self.CANVAS_SIZE - BOX_HEIGHT) else: newX = MARGIN + BOX_WIDTH / 2 newY = MARGIN * 2 + BOX_HEIGHT + BOX_HEIGHT / 2 return QPointF(newX, newY) def export_as_script_algorithm(self): dlg = ScriptEditorDialog(None) dlg.editor.setText('\n'.join( self.model.asPythonCode( QgsProcessing.PythonQgsProcessingAlgorithmSubclass, 4))) dlg.show()
def __init__(self, parent, composerObject): QtGui.QWidget.__init__(self, parent) self.mComposerObject = composerObject self.setObjectName(_fromUtf8("QgsComposerItemWidgetBase")) self.resize(290, 847) self.verticalLayout_2 = QtGui.QVBoxLayout(self) self.verticalLayout_2.setMargin(0) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.mGeneralOptionsGroupBox = QgsCollapsibleGroupBoxBasic(self) self.mGeneralOptionsGroupBox.setFocusPolicy(QtCore.Qt.StrongFocus) self.mGeneralOptionsGroupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.mGeneralOptionsGroupBox.setProperty("collapsed", True) self.mGeneralOptionsGroupBox.setObjectName( _fromUtf8("mGeneralOptionsGroupBox")) self.verticalLayout = QtGui.QVBoxLayout(self.mGeneralOptionsGroupBox) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.gridLayout_3 = QtGui.QGridLayout() self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) self.mWidthLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mWidthLabel.setObjectName(_fromUtf8("mWidthLabel")) self.gridLayout_3.addWidget(self.mWidthLabel, 3, 0, 1, 1) self.mXLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mXLabel.setObjectName(_fromUtf8("mXLabel")) self.gridLayout_3.addWidget(self.mXLabel, 1, 0, 1, 1) self.mHeightLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mHeightLabel.setObjectName(_fromUtf8("mHeightLabel")) self.gridLayout_3.addWidget(self.mHeightLabel, 4, 0, 1, 1) self.mYLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mYLabel.setObjectName(_fromUtf8("mYLabel")) self.gridLayout_3.addWidget(self.mYLabel, 2, 0, 1, 1) self.mPageLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mPageLabel.setObjectName(_fromUtf8("mPageLabel")) self.gridLayout_3.addWidget(self.mPageLabel, 0, 0, 1, 1) self.mXPositionDDBtn = QgsDataDefinedButton( self.mGeneralOptionsGroupBox) self.mXPositionDDBtn.setObjectName(_fromUtf8("mXPositionDDBtn")) self.gridLayout_3.addWidget(self.mXPositionDDBtn, 1, 3, 1, 1) self.mYPositionDDBtn = QgsDataDefinedButton( self.mGeneralOptionsGroupBox) self.mYPositionDDBtn.setObjectName(_fromUtf8("mYPositionDDBtn")) self.gridLayout_3.addWidget(self.mYPositionDDBtn, 2, 3, 1, 1) self.mWidthDDBtn = QgsDataDefinedButton(self.mGeneralOptionsGroupBox) self.mWidthDDBtn.setObjectName(_fromUtf8("mWidthDDBtn")) self.gridLayout_3.addWidget(self.mWidthDDBtn, 3, 3, 1, 1) self.mHeightDDBtn = QgsDataDefinedButton(self.mGeneralOptionsGroupBox) self.mHeightDDBtn.setObjectName(_fromUtf8("mHeightDDBtn")) self.gridLayout_3.addWidget(self.mHeightDDBtn, 4, 3, 1, 1) self.mPageSpinBox = QgsSpinBox(self.mGeneralOptionsGroupBox) self.mPageSpinBox.setMinimum(1) self.mPageSpinBox.setProperty("showClearButton", False) self.mPageSpinBox.setObjectName(_fromUtf8("mPageSpinBox")) self.gridLayout_3.addWidget(self.mPageSpinBox, 0, 1, 1, 3) self.mWidthSpin = QgsDoubleSpinBox(self.mGeneralOptionsGroupBox) self.mWidthSpin.setDecimals(3) self.mWidthSpin.setMaximum(9999999.0) self.mWidthSpin.setProperty("showClearButton", False) self.mWidthSpin.setObjectName(_fromUtf8("mWidthSpin")) self.gridLayout_3.addWidget(self.mWidthSpin, 3, 1, 1, 2) self.mHeightSpin = QgsDoubleSpinBox(self.mGeneralOptionsGroupBox) self.mHeightSpin.setDecimals(3) self.mHeightSpin.setMaximum(9999999.0) self.mHeightSpin.setProperty("showClearButton", False) self.mHeightSpin.setObjectName(_fromUtf8("mHeightSpin")) self.gridLayout_3.addWidget(self.mHeightSpin, 4, 1, 1, 2) self.mYPosSpin = QgsDoubleSpinBox(self.mGeneralOptionsGroupBox) self.mYPosSpin.setDecimals(3) self.mYPosSpin.setMinimum(-9999999.0) self.mYPosSpin.setMaximum(9999999.0) self.mYPosSpin.setProperty("showClearButton", False) self.mYPosSpin.setObjectName(_fromUtf8("mYPosSpin")) self.gridLayout_3.addWidget(self.mYPosSpin, 2, 1, 1, 2) self.mXPosSpin = QgsDoubleSpinBox(self.mGeneralOptionsGroupBox) self.mXPosSpin.setDecimals(3) self.mXPosSpin.setMinimum(-9999999.0) self.mXPosSpin.setMaximum(9999999.0) self.mXPosSpin.setProperty("showClearButton", False) self.mXPosSpin.setObjectName(_fromUtf8("mXPosSpin")) self.gridLayout_3.addWidget(self.mXPosSpin, 1, 1, 1, 2) self.gridLayout_3.setColumnStretch(1, 1) self.gridLayout_3.setColumnStretch(2, 1) self.gridLayout_3.setColumnStretch(3, 1) self.verticalLayout.addLayout(self.gridLayout_3) self.horizontalLayout_7 = QtGui.QHBoxLayout() self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) self.label_2 = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.label_2.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout_7.addWidget(self.label_2) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.mUpperMiddleCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mUpperMiddleCheckBox.sizePolicy().hasHeightForWidth()) self.mUpperMiddleCheckBox.setSizePolicy(sizePolicy) self.mUpperMiddleCheckBox.setText(_fromUtf8("")) self.mUpperMiddleCheckBox.setObjectName( _fromUtf8("mUpperMiddleCheckBox")) self.gridLayout.addWidget(self.mUpperMiddleCheckBox, 0, 1, 1, 1) self.mMiddleRightCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mMiddleRightCheckBox.sizePolicy().hasHeightForWidth()) self.mMiddleRightCheckBox.setSizePolicy(sizePolicy) self.mMiddleRightCheckBox.setText(_fromUtf8("")) self.mMiddleRightCheckBox.setObjectName( _fromUtf8("mMiddleRightCheckBox")) self.gridLayout.addWidget(self.mMiddleRightCheckBox, 1, 2, 1, 1) self.mMiddleCheckBox = QtGui.QCheckBox(self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mMiddleCheckBox.sizePolicy().hasHeightForWidth()) self.mMiddleCheckBox.setSizePolicy(sizePolicy) self.mMiddleCheckBox.setText(_fromUtf8("")) self.mMiddleCheckBox.setObjectName(_fromUtf8("mMiddleCheckBox")) self.gridLayout.addWidget(self.mMiddleCheckBox, 1, 1, 1, 1) self.mUpperRightCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mUpperRightCheckBox.sizePolicy().hasHeightForWidth()) self.mUpperRightCheckBox.setSizePolicy(sizePolicy) self.mUpperRightCheckBox.setText(_fromUtf8("")) self.mUpperRightCheckBox.setObjectName( _fromUtf8("mUpperRightCheckBox")) self.gridLayout.addWidget(self.mUpperRightCheckBox, 0, 2, 1, 1) self.mLowerMiddleCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mLowerMiddleCheckBox.sizePolicy().hasHeightForWidth()) self.mLowerMiddleCheckBox.setSizePolicy(sizePolicy) self.mLowerMiddleCheckBox.setText(_fromUtf8("")) self.mLowerMiddleCheckBox.setObjectName( _fromUtf8("mLowerMiddleCheckBox")) self.gridLayout.addWidget(self.mLowerMiddleCheckBox, 2, 1, 1, 1) self.mLowerRightCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mLowerRightCheckBox.sizePolicy().hasHeightForWidth()) self.mLowerRightCheckBox.setSizePolicy(sizePolicy) self.mLowerRightCheckBox.setText(_fromUtf8("")) self.mLowerRightCheckBox.setObjectName( _fromUtf8("mLowerRightCheckBox")) self.gridLayout.addWidget(self.mLowerRightCheckBox, 2, 2, 1, 1) self.mUpperLeftCheckBox = QtGui.QCheckBox(self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mUpperLeftCheckBox.sizePolicy().hasHeightForWidth()) self.mUpperLeftCheckBox.setSizePolicy(sizePolicy) self.mUpperLeftCheckBox.setText(_fromUtf8("")) self.mUpperLeftCheckBox.setObjectName(_fromUtf8("mUpperLeftCheckBox")) self.gridLayout.addWidget(self.mUpperLeftCheckBox, 0, 0, 1, 1) self.mLowerLeftCheckBox = QtGui.QCheckBox(self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mLowerLeftCheckBox.sizePolicy().hasHeightForWidth()) self.mLowerLeftCheckBox.setSizePolicy(sizePolicy) self.mLowerLeftCheckBox.setText(_fromUtf8("")) self.mLowerLeftCheckBox.setObjectName(_fromUtf8("mLowerLeftCheckBox")) self.gridLayout.addWidget(self.mLowerLeftCheckBox, 2, 0, 1, 1) self.mMiddleLeftCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mMiddleLeftCheckBox.sizePolicy().hasHeightForWidth()) self.mMiddleLeftCheckBox.setSizePolicy(sizePolicy) self.mMiddleLeftCheckBox.setText(_fromUtf8("")) self.mMiddleLeftCheckBox.setObjectName( _fromUtf8("mMiddleLeftCheckBox")) self.gridLayout.addWidget(self.mMiddleLeftCheckBox, 1, 0, 1, 1) self.horizontalLayout_7.addLayout(self.gridLayout) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_7.addItem(spacerItem) self.verticalLayout.addLayout(self.horizontalLayout_7) self.verticalLayout_2.addWidget(self.mGeneralOptionsGroupBox) self.mTransformsGroupBox = QgsCollapsibleGroupBoxBasic(self) self.mTransformsGroupBox.setFocusPolicy(QtCore.Qt.StrongFocus) self.mTransformsGroupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.mTransformsGroupBox.setProperty("collapsed", True) self.mTransformsGroupBox.setObjectName( _fromUtf8("mTransformsGroupBox")) self.gridLayout_5 = QtGui.QGridLayout(self.mTransformsGroupBox) self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) self.label = QtGui.QLabel(self.mTransformsGroupBox) self.label.setObjectName(_fromUtf8("label")) self.gridLayout_5.addWidget(self.label, 0, 0, 1, 1) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.mItemRotationSpinBox = QgsDoubleSpinBox(self.mTransformsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mItemRotationSpinBox.sizePolicy().hasHeightForWidth()) self.mItemRotationSpinBox.setSizePolicy(sizePolicy) self.mItemRotationSpinBox.setMaximum(360.0) self.mItemRotationSpinBox.setObjectName( _fromUtf8("mItemRotationSpinBox")) self.horizontalLayout_4.addWidget(self.mItemRotationSpinBox) self.mItemRotationDDBtn = QgsDataDefinedButton( self.mTransformsGroupBox) self.mItemRotationDDBtn.setObjectName(_fromUtf8("mItemRotationDDBtn")) self.horizontalLayout_4.addWidget(self.mItemRotationDDBtn) self.gridLayout_5.addLayout(self.horizontalLayout_4, 0, 1, 1, 1) self.gridLayout_5.setColumnStretch(1, 1) self.verticalLayout_2.addWidget(self.mTransformsGroupBox) self.mFrameGroupBox = QgsCollapsibleGroupBoxBasic(self) self.mFrameGroupBox.setCheckable(True) self.mFrameGroupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.mFrameGroupBox.setProperty("collapsed", True) self.mFrameGroupBox.setObjectName(_fromUtf8("mFrameGroupBox")) self.gridLayout_6 = QtGui.QGridLayout(self.mFrameGroupBox) self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) self.label_3 = QtGui.QLabel(self.mFrameGroupBox) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout_6.addWidget(self.label_3, 0, 0, 1, 1) self.horizontalLayout_6 = QtGui.QHBoxLayout() self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) self.mFrameColorButton = QgsColorButtonV2(self.mFrameGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mFrameColorButton.sizePolicy().hasHeightForWidth()) self.mFrameColorButton.setSizePolicy(sizePolicy) self.mFrameColorButton.setMinimumSize(QtCore.QSize(120, 0)) self.mFrameColorButton.setMaximumSize(QtCore.QSize(120, 16777215)) self.mFrameColorButton.setText(_fromUtf8("")) self.mFrameColorButton.setObjectName(_fromUtf8("mFrameColorButton")) self.horizontalLayout_6.addWidget(self.mFrameColorButton) spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem1) self.gridLayout_6.addLayout(self.horizontalLayout_6, 0, 1, 1, 1) self.mOutlineWidthLabel = QtGui.QLabel(self.mFrameGroupBox) self.mOutlineWidthLabel.setWordWrap(True) self.mOutlineWidthLabel.setObjectName(_fromUtf8("mOutlineWidthLabel")) self.gridLayout_6.addWidget(self.mOutlineWidthLabel, 1, 0, 1, 1) self.mOutlineWidthSpinBox = QgsDoubleSpinBox(self.mFrameGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mOutlineWidthSpinBox.sizePolicy().hasHeightForWidth()) self.mOutlineWidthSpinBox.setSizePolicy(sizePolicy) self.mOutlineWidthSpinBox.setSingleStep(0.1) self.mOutlineWidthSpinBox.setProperty("showClearButton", False) self.mOutlineWidthSpinBox.setObjectName( _fromUtf8("mOutlineWidthSpinBox")) self.gridLayout_6.addWidget(self.mOutlineWidthSpinBox, 1, 1, 1, 1) self.label_8 = QtGui.QLabel(self.mFrameGroupBox) self.label_8.setObjectName(_fromUtf8("label_8")) self.gridLayout_6.addWidget(self.label_8, 2, 0, 1, 1) self.mFrameJoinStyleCombo = QgsPenJoinStyleComboBox( self.mFrameGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mFrameJoinStyleCombo.sizePolicy().hasHeightForWidth()) self.mFrameJoinStyleCombo.setSizePolicy(sizePolicy) self.mFrameJoinStyleCombo.setObjectName( _fromUtf8("mFrameJoinStyleCombo")) self.gridLayout_6.addWidget(self.mFrameJoinStyleCombo, 2, 1, 1, 1) self.verticalLayout_2.addWidget(self.mFrameGroupBox) self.mBackgroundGroupBox = QgsCollapsibleGroupBoxBasic(self) self.mBackgroundGroupBox.setCheckable(True) self.mBackgroundGroupBox.setChecked(True) self.mBackgroundGroupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.mBackgroundGroupBox.setProperty("collapsed", True) self.mBackgroundGroupBox.setObjectName( _fromUtf8("mBackgroundGroupBox")) self.gridLayout_7 = QtGui.QGridLayout(self.mBackgroundGroupBox) self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7")) self.label_4 = QtGui.QLabel(self.mBackgroundGroupBox) self.label_4.setObjectName(_fromUtf8("label_4")) self.gridLayout_7.addWidget(self.label_4, 0, 0, 1, 1) self.horizontalLayout_5 = QtGui.QHBoxLayout() self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) self.mBackgroundColorButton = QgsColorButtonV2( self.mBackgroundGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mBackgroundColorButton.sizePolicy().hasHeightForWidth()) self.mBackgroundColorButton.setSizePolicy(sizePolicy) self.mBackgroundColorButton.setMinimumSize(QtCore.QSize(120, 0)) self.mBackgroundColorButton.setMaximumSize(QtCore.QSize(120, 16777215)) self.mBackgroundColorButton.setText(_fromUtf8("")) self.mBackgroundColorButton.setObjectName( _fromUtf8("mBackgroundColorButton")) self.horizontalLayout_5.addWidget(self.mBackgroundColorButton) spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_5.addItem(spacerItem2) self.gridLayout_7.addLayout(self.horizontalLayout_5, 0, 1, 1, 1) self.verticalLayout_2.addWidget(self.mBackgroundGroupBox) self.groupBox = QgsCollapsibleGroupBoxBasic(self) self.groupBox.setFocusPolicy(QtCore.Qt.StrongFocus) self.groupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.groupBox.setProperty("collapsed", True) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.gridLayout_8 = QtGui.QGridLayout(self.groupBox) self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8")) self.mItemIdLabel = QtGui.QLabel(self.groupBox) self.mItemIdLabel.setObjectName(_fromUtf8("mItemIdLabel")) self.gridLayout_8.addWidget(self.mItemIdLabel, 0, 0, 1, 1) self.mItemIdLineEdit = QtGui.QLineEdit(self.groupBox) self.mItemIdLineEdit.setObjectName(_fromUtf8("mItemIdLineEdit")) self.gridLayout_8.addWidget(self.mItemIdLineEdit, 0, 1, 1, 1) self.verticalLayout_2.addWidget(self.groupBox) self.groupRendering = QgsCollapsibleGroupBoxBasic(self) self.groupRendering.setFocusPolicy(QtCore.Qt.StrongFocus) self.groupRendering.setProperty("collapsed", True) self.groupRendering.setProperty("syncGroup", _fromUtf8("composeritem")) self.groupRendering.setObjectName(_fromUtf8("groupRendering")) self.gridLayout_4 = QtGui.QGridLayout(self.groupRendering) self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) self.labelBlendMode = QtGui.QLabel(self.groupRendering) self.labelBlendMode.setObjectName(_fromUtf8("labelBlendMode")) self.gridLayout_4.addWidget(self.labelBlendMode, 0, 0, 1, 1) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.mBlendModeCombo = QgsBlendModeComboBox(self.groupRendering) self.mBlendModeCombo.setObjectName(_fromUtf8("mBlendModeCombo")) self.horizontalLayout_3.addWidget(self.mBlendModeCombo) self.mBlendModeDDBtn = QgsDataDefinedButton(self.groupRendering) self.mBlendModeDDBtn.setObjectName(_fromUtf8("mBlendModeDDBtn")) self.horizontalLayout_3.addWidget(self.mBlendModeDDBtn) self.gridLayout_4.addLayout(self.horizontalLayout_3, 0, 1, 1, 1) self.labelTransparency = QtGui.QLabel(self.groupRendering) self.labelTransparency.setObjectName(_fromUtf8("labelTransparency")) self.gridLayout_4.addWidget(self.labelTransparency, 1, 0, 1, 1) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.mTransparencySlider = QtGui.QSlider(self.groupRendering) self.mTransparencySlider.setMaximum(100) self.mTransparencySlider.setOrientation(QtCore.Qt.Horizontal) self.mTransparencySlider.setObjectName( _fromUtf8("mTransparencySlider")) self.horizontalLayout_2.addWidget(self.mTransparencySlider) self.mTransparencySpnBx = QgsSpinBox(self.groupRendering) self.mTransparencySpnBx.setMinimumSize(QtCore.QSize(80, 25)) self.mTransparencySpnBx.setMaximum(100) self.mTransparencySpnBx.setObjectName(_fromUtf8("mTransparencySpnBx")) self.horizontalLayout_2.addWidget(self.mTransparencySpnBx) self.mTransparencyDDBtn = QgsDataDefinedButton(self.groupRendering) self.mTransparencyDDBtn.setObjectName(_fromUtf8("mTransparencyDDBtn")) self.horizontalLayout_2.addWidget(self.mTransparencyDDBtn) self.gridLayout_4.addLayout(self.horizontalLayout_2, 1, 1, 1, 1) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.mExcludeFromPrintsCheckBox = QtGui.QCheckBox(self.groupRendering) self.mExcludeFromPrintsCheckBox.setObjectName( _fromUtf8("mExcludeFromPrintsCheckBox")) self.horizontalLayout.addWidget(self.mExcludeFromPrintsCheckBox) self.mExcludePrintsDDBtn = QgsDataDefinedButton(self.groupRendering) self.mExcludePrintsDDBtn.setObjectName( _fromUtf8("mExcludePrintsDDBtn")) self.horizontalLayout.addWidget(self.mExcludePrintsDDBtn) self.gridLayout_4.addLayout(self.horizontalLayout, 2, 0, 1, 2) self.verticalLayout_2.addWidget(self.groupRendering) self.groupBox_3 = QgsCollapsibleGroupBox(self) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) self.verticalLayout_4 = QtGui.QVBoxLayout(self.groupBox_3) self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) self.mVariableEditor = QgsVariableEditorWidget(self.groupBox_3) self.mVariableEditor.setMinimumSize(QtCore.QSize(0, 200)) self.mVariableEditor.setObjectName(_fromUtf8("mVariableEditor")) self.verticalLayout_4.addWidget(self.mVariableEditor) self.verticalLayout_2.addWidget(self.groupBox_3) spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.MinimumExpanding) self.verticalLayout_2.addItem(spacerItem3) self.mOutlineWidthLabel.setBuddy(self.mOutlineWidthSpinBox) self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) self.setTabOrder(self.mGeneralOptionsGroupBox, self.mPageSpinBox) self.setTabOrder(self.mPageSpinBox, self.mXPosSpin) self.setTabOrder(self.mXPosSpin, self.mXPositionDDBtn) self.setTabOrder(self.mXPositionDDBtn, self.mYPosSpin) self.setTabOrder(self.mYPosSpin, self.mYPositionDDBtn) self.setTabOrder(self.mYPositionDDBtn, self.mWidthSpin) self.setTabOrder(self.mWidthSpin, self.mWidthDDBtn) self.setTabOrder(self.mWidthDDBtn, self.mHeightSpin) self.setTabOrder(self.mHeightSpin, self.mHeightDDBtn) self.setTabOrder(self.mHeightDDBtn, self.mUpperLeftCheckBox) self.setTabOrder(self.mUpperLeftCheckBox, self.mUpperMiddleCheckBox) self.setTabOrder(self.mUpperMiddleCheckBox, self.mUpperRightCheckBox) self.setTabOrder(self.mUpperRightCheckBox, self.mMiddleLeftCheckBox) self.setTabOrder(self.mMiddleLeftCheckBox, self.mMiddleCheckBox) self.setTabOrder(self.mMiddleCheckBox, self.mMiddleRightCheckBox) self.setTabOrder(self.mMiddleRightCheckBox, self.mLowerLeftCheckBox) self.setTabOrder(self.mLowerLeftCheckBox, self.mLowerMiddleCheckBox) self.setTabOrder(self.mLowerMiddleCheckBox, self.mLowerRightCheckBox) self.setTabOrder(self.mLowerRightCheckBox, self.mTransformsGroupBox) self.setTabOrder(self.mTransformsGroupBox, self.mItemRotationSpinBox) self.setTabOrder(self.mItemRotationSpinBox, self.mItemRotationDDBtn) self.setTabOrder(self.mItemRotationDDBtn, self.mFrameGroupBox) self.setTabOrder(self.mFrameGroupBox, self.mFrameColorButton) self.setTabOrder(self.mFrameColorButton, self.mOutlineWidthSpinBox) self.setTabOrder(self.mOutlineWidthSpinBox, self.mFrameJoinStyleCombo) self.setTabOrder(self.mFrameJoinStyleCombo, self.mBackgroundGroupBox) self.setTabOrder(self.mBackgroundGroupBox, self.mBackgroundColorButton) self.setTabOrder(self.mBackgroundColorButton, self.groupBox) self.setTabOrder(self.groupBox, self.mItemIdLineEdit) self.setTabOrder(self.mItemIdLineEdit, self.groupRendering) self.setTabOrder(self.groupRendering, self.mBlendModeCombo) self.setTabOrder(self.mBlendModeCombo, self.mBlendModeDDBtn) self.setTabOrder(self.mBlendModeDDBtn, self.mTransparencySlider) self.setTabOrder(self.mTransparencySlider, self.mTransparencySpnBx) self.setTabOrder(self.mTransparencySpnBx, self.mTransparencyDDBtn) self.setTabOrder(self.mTransparencyDDBtn, self.mExcludeFromPrintsCheckBox) self.setTabOrder(self.mExcludeFromPrintsCheckBox, self.mExcludePrintsDDBtn) # self.mComposerObject = None self.groupBox_3.setVisible(False)
class Ui_QgsComposerItemWidgetBase(QtGui.QWidget): def __init__(self, parent, composerObject): QtGui.QWidget.__init__(self, parent) self.mComposerObject = composerObject self.setObjectName(_fromUtf8("QgsComposerItemWidgetBase")) self.resize(290, 847) self.verticalLayout_2 = QtGui.QVBoxLayout(self) self.verticalLayout_2.setMargin(0) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.mGeneralOptionsGroupBox = QgsCollapsibleGroupBoxBasic(self) self.mGeneralOptionsGroupBox.setFocusPolicy(QtCore.Qt.StrongFocus) self.mGeneralOptionsGroupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.mGeneralOptionsGroupBox.setProperty("collapsed", True) self.mGeneralOptionsGroupBox.setObjectName( _fromUtf8("mGeneralOptionsGroupBox")) self.verticalLayout = QtGui.QVBoxLayout(self.mGeneralOptionsGroupBox) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.gridLayout_3 = QtGui.QGridLayout() self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) self.mWidthLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mWidthLabel.setObjectName(_fromUtf8("mWidthLabel")) self.gridLayout_3.addWidget(self.mWidthLabel, 3, 0, 1, 1) self.mXLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mXLabel.setObjectName(_fromUtf8("mXLabel")) self.gridLayout_3.addWidget(self.mXLabel, 1, 0, 1, 1) self.mHeightLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mHeightLabel.setObjectName(_fromUtf8("mHeightLabel")) self.gridLayout_3.addWidget(self.mHeightLabel, 4, 0, 1, 1) self.mYLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mYLabel.setObjectName(_fromUtf8("mYLabel")) self.gridLayout_3.addWidget(self.mYLabel, 2, 0, 1, 1) self.mPageLabel = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.mPageLabel.setObjectName(_fromUtf8("mPageLabel")) self.gridLayout_3.addWidget(self.mPageLabel, 0, 0, 1, 1) self.mXPositionDDBtn = QgsDataDefinedButton( self.mGeneralOptionsGroupBox) self.mXPositionDDBtn.setObjectName(_fromUtf8("mXPositionDDBtn")) self.gridLayout_3.addWidget(self.mXPositionDDBtn, 1, 3, 1, 1) self.mYPositionDDBtn = QgsDataDefinedButton( self.mGeneralOptionsGroupBox) self.mYPositionDDBtn.setObjectName(_fromUtf8("mYPositionDDBtn")) self.gridLayout_3.addWidget(self.mYPositionDDBtn, 2, 3, 1, 1) self.mWidthDDBtn = QgsDataDefinedButton(self.mGeneralOptionsGroupBox) self.mWidthDDBtn.setObjectName(_fromUtf8("mWidthDDBtn")) self.gridLayout_3.addWidget(self.mWidthDDBtn, 3, 3, 1, 1) self.mHeightDDBtn = QgsDataDefinedButton(self.mGeneralOptionsGroupBox) self.mHeightDDBtn.setObjectName(_fromUtf8("mHeightDDBtn")) self.gridLayout_3.addWidget(self.mHeightDDBtn, 4, 3, 1, 1) self.mPageSpinBox = QgsSpinBox(self.mGeneralOptionsGroupBox) self.mPageSpinBox.setMinimum(1) self.mPageSpinBox.setProperty("showClearButton", False) self.mPageSpinBox.setObjectName(_fromUtf8("mPageSpinBox")) self.gridLayout_3.addWidget(self.mPageSpinBox, 0, 1, 1, 3) self.mWidthSpin = QgsDoubleSpinBox(self.mGeneralOptionsGroupBox) self.mWidthSpin.setDecimals(3) self.mWidthSpin.setMaximum(9999999.0) self.mWidthSpin.setProperty("showClearButton", False) self.mWidthSpin.setObjectName(_fromUtf8("mWidthSpin")) self.gridLayout_3.addWidget(self.mWidthSpin, 3, 1, 1, 2) self.mHeightSpin = QgsDoubleSpinBox(self.mGeneralOptionsGroupBox) self.mHeightSpin.setDecimals(3) self.mHeightSpin.setMaximum(9999999.0) self.mHeightSpin.setProperty("showClearButton", False) self.mHeightSpin.setObjectName(_fromUtf8("mHeightSpin")) self.gridLayout_3.addWidget(self.mHeightSpin, 4, 1, 1, 2) self.mYPosSpin = QgsDoubleSpinBox(self.mGeneralOptionsGroupBox) self.mYPosSpin.setDecimals(3) self.mYPosSpin.setMinimum(-9999999.0) self.mYPosSpin.setMaximum(9999999.0) self.mYPosSpin.setProperty("showClearButton", False) self.mYPosSpin.setObjectName(_fromUtf8("mYPosSpin")) self.gridLayout_3.addWidget(self.mYPosSpin, 2, 1, 1, 2) self.mXPosSpin = QgsDoubleSpinBox(self.mGeneralOptionsGroupBox) self.mXPosSpin.setDecimals(3) self.mXPosSpin.setMinimum(-9999999.0) self.mXPosSpin.setMaximum(9999999.0) self.mXPosSpin.setProperty("showClearButton", False) self.mXPosSpin.setObjectName(_fromUtf8("mXPosSpin")) self.gridLayout_3.addWidget(self.mXPosSpin, 1, 1, 1, 2) self.gridLayout_3.setColumnStretch(1, 1) self.gridLayout_3.setColumnStretch(2, 1) self.gridLayout_3.setColumnStretch(3, 1) self.verticalLayout.addLayout(self.gridLayout_3) self.horizontalLayout_7 = QtGui.QHBoxLayout() self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) self.label_2 = QtGui.QLabel(self.mGeneralOptionsGroupBox) self.label_2.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout_7.addWidget(self.label_2) self.gridLayout = QtGui.QGridLayout() self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.mUpperMiddleCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mUpperMiddleCheckBox.sizePolicy().hasHeightForWidth()) self.mUpperMiddleCheckBox.setSizePolicy(sizePolicy) self.mUpperMiddleCheckBox.setText(_fromUtf8("")) self.mUpperMiddleCheckBox.setObjectName( _fromUtf8("mUpperMiddleCheckBox")) self.gridLayout.addWidget(self.mUpperMiddleCheckBox, 0, 1, 1, 1) self.mMiddleRightCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mMiddleRightCheckBox.sizePolicy().hasHeightForWidth()) self.mMiddleRightCheckBox.setSizePolicy(sizePolicy) self.mMiddleRightCheckBox.setText(_fromUtf8("")) self.mMiddleRightCheckBox.setObjectName( _fromUtf8("mMiddleRightCheckBox")) self.gridLayout.addWidget(self.mMiddleRightCheckBox, 1, 2, 1, 1) self.mMiddleCheckBox = QtGui.QCheckBox(self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mMiddleCheckBox.sizePolicy().hasHeightForWidth()) self.mMiddleCheckBox.setSizePolicy(sizePolicy) self.mMiddleCheckBox.setText(_fromUtf8("")) self.mMiddleCheckBox.setObjectName(_fromUtf8("mMiddleCheckBox")) self.gridLayout.addWidget(self.mMiddleCheckBox, 1, 1, 1, 1) self.mUpperRightCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mUpperRightCheckBox.sizePolicy().hasHeightForWidth()) self.mUpperRightCheckBox.setSizePolicy(sizePolicy) self.mUpperRightCheckBox.setText(_fromUtf8("")) self.mUpperRightCheckBox.setObjectName( _fromUtf8("mUpperRightCheckBox")) self.gridLayout.addWidget(self.mUpperRightCheckBox, 0, 2, 1, 1) self.mLowerMiddleCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mLowerMiddleCheckBox.sizePolicy().hasHeightForWidth()) self.mLowerMiddleCheckBox.setSizePolicy(sizePolicy) self.mLowerMiddleCheckBox.setText(_fromUtf8("")) self.mLowerMiddleCheckBox.setObjectName( _fromUtf8("mLowerMiddleCheckBox")) self.gridLayout.addWidget(self.mLowerMiddleCheckBox, 2, 1, 1, 1) self.mLowerRightCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mLowerRightCheckBox.sizePolicy().hasHeightForWidth()) self.mLowerRightCheckBox.setSizePolicy(sizePolicy) self.mLowerRightCheckBox.setText(_fromUtf8("")) self.mLowerRightCheckBox.setObjectName( _fromUtf8("mLowerRightCheckBox")) self.gridLayout.addWidget(self.mLowerRightCheckBox, 2, 2, 1, 1) self.mUpperLeftCheckBox = QtGui.QCheckBox(self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mUpperLeftCheckBox.sizePolicy().hasHeightForWidth()) self.mUpperLeftCheckBox.setSizePolicy(sizePolicy) self.mUpperLeftCheckBox.setText(_fromUtf8("")) self.mUpperLeftCheckBox.setObjectName(_fromUtf8("mUpperLeftCheckBox")) self.gridLayout.addWidget(self.mUpperLeftCheckBox, 0, 0, 1, 1) self.mLowerLeftCheckBox = QtGui.QCheckBox(self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mLowerLeftCheckBox.sizePolicy().hasHeightForWidth()) self.mLowerLeftCheckBox.setSizePolicy(sizePolicy) self.mLowerLeftCheckBox.setText(_fromUtf8("")) self.mLowerLeftCheckBox.setObjectName(_fromUtf8("mLowerLeftCheckBox")) self.gridLayout.addWidget(self.mLowerLeftCheckBox, 2, 0, 1, 1) self.mMiddleLeftCheckBox = QtGui.QCheckBox( self.mGeneralOptionsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mMiddleLeftCheckBox.sizePolicy().hasHeightForWidth()) self.mMiddleLeftCheckBox.setSizePolicy(sizePolicy) self.mMiddleLeftCheckBox.setText(_fromUtf8("")) self.mMiddleLeftCheckBox.setObjectName( _fromUtf8("mMiddleLeftCheckBox")) self.gridLayout.addWidget(self.mMiddleLeftCheckBox, 1, 0, 1, 1) self.horizontalLayout_7.addLayout(self.gridLayout) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_7.addItem(spacerItem) self.verticalLayout.addLayout(self.horizontalLayout_7) self.verticalLayout_2.addWidget(self.mGeneralOptionsGroupBox) self.mTransformsGroupBox = QgsCollapsibleGroupBoxBasic(self) self.mTransformsGroupBox.setFocusPolicy(QtCore.Qt.StrongFocus) self.mTransformsGroupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.mTransformsGroupBox.setProperty("collapsed", True) self.mTransformsGroupBox.setObjectName( _fromUtf8("mTransformsGroupBox")) self.gridLayout_5 = QtGui.QGridLayout(self.mTransformsGroupBox) self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) self.label = QtGui.QLabel(self.mTransformsGroupBox) self.label.setObjectName(_fromUtf8("label")) self.gridLayout_5.addWidget(self.label, 0, 0, 1, 1) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.mItemRotationSpinBox = QgsDoubleSpinBox(self.mTransformsGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mItemRotationSpinBox.sizePolicy().hasHeightForWidth()) self.mItemRotationSpinBox.setSizePolicy(sizePolicy) self.mItemRotationSpinBox.setMaximum(360.0) self.mItemRotationSpinBox.setObjectName( _fromUtf8("mItemRotationSpinBox")) self.horizontalLayout_4.addWidget(self.mItemRotationSpinBox) self.mItemRotationDDBtn = QgsDataDefinedButton( self.mTransformsGroupBox) self.mItemRotationDDBtn.setObjectName(_fromUtf8("mItemRotationDDBtn")) self.horizontalLayout_4.addWidget(self.mItemRotationDDBtn) self.gridLayout_5.addLayout(self.horizontalLayout_4, 0, 1, 1, 1) self.gridLayout_5.setColumnStretch(1, 1) self.verticalLayout_2.addWidget(self.mTransformsGroupBox) self.mFrameGroupBox = QgsCollapsibleGroupBoxBasic(self) self.mFrameGroupBox.setCheckable(True) self.mFrameGroupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.mFrameGroupBox.setProperty("collapsed", True) self.mFrameGroupBox.setObjectName(_fromUtf8("mFrameGroupBox")) self.gridLayout_6 = QtGui.QGridLayout(self.mFrameGroupBox) self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) self.label_3 = QtGui.QLabel(self.mFrameGroupBox) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout_6.addWidget(self.label_3, 0, 0, 1, 1) self.horizontalLayout_6 = QtGui.QHBoxLayout() self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) self.mFrameColorButton = QgsColorButtonV2(self.mFrameGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mFrameColorButton.sizePolicy().hasHeightForWidth()) self.mFrameColorButton.setSizePolicy(sizePolicy) self.mFrameColorButton.setMinimumSize(QtCore.QSize(120, 0)) self.mFrameColorButton.setMaximumSize(QtCore.QSize(120, 16777215)) self.mFrameColorButton.setText(_fromUtf8("")) self.mFrameColorButton.setObjectName(_fromUtf8("mFrameColorButton")) self.horizontalLayout_6.addWidget(self.mFrameColorButton) spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem1) self.gridLayout_6.addLayout(self.horizontalLayout_6, 0, 1, 1, 1) self.mOutlineWidthLabel = QtGui.QLabel(self.mFrameGroupBox) self.mOutlineWidthLabel.setWordWrap(True) self.mOutlineWidthLabel.setObjectName(_fromUtf8("mOutlineWidthLabel")) self.gridLayout_6.addWidget(self.mOutlineWidthLabel, 1, 0, 1, 1) self.mOutlineWidthSpinBox = QgsDoubleSpinBox(self.mFrameGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mOutlineWidthSpinBox.sizePolicy().hasHeightForWidth()) self.mOutlineWidthSpinBox.setSizePolicy(sizePolicy) self.mOutlineWidthSpinBox.setSingleStep(0.1) self.mOutlineWidthSpinBox.setProperty("showClearButton", False) self.mOutlineWidthSpinBox.setObjectName( _fromUtf8("mOutlineWidthSpinBox")) self.gridLayout_6.addWidget(self.mOutlineWidthSpinBox, 1, 1, 1, 1) self.label_8 = QtGui.QLabel(self.mFrameGroupBox) self.label_8.setObjectName(_fromUtf8("label_8")) self.gridLayout_6.addWidget(self.label_8, 2, 0, 1, 1) self.mFrameJoinStyleCombo = QgsPenJoinStyleComboBox( self.mFrameGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mFrameJoinStyleCombo.sizePolicy().hasHeightForWidth()) self.mFrameJoinStyleCombo.setSizePolicy(sizePolicy) self.mFrameJoinStyleCombo.setObjectName( _fromUtf8("mFrameJoinStyleCombo")) self.gridLayout_6.addWidget(self.mFrameJoinStyleCombo, 2, 1, 1, 1) self.verticalLayout_2.addWidget(self.mFrameGroupBox) self.mBackgroundGroupBox = QgsCollapsibleGroupBoxBasic(self) self.mBackgroundGroupBox.setCheckable(True) self.mBackgroundGroupBox.setChecked(True) self.mBackgroundGroupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.mBackgroundGroupBox.setProperty("collapsed", True) self.mBackgroundGroupBox.setObjectName( _fromUtf8("mBackgroundGroupBox")) self.gridLayout_7 = QtGui.QGridLayout(self.mBackgroundGroupBox) self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7")) self.label_4 = QtGui.QLabel(self.mBackgroundGroupBox) self.label_4.setObjectName(_fromUtf8("label_4")) self.gridLayout_7.addWidget(self.label_4, 0, 0, 1, 1) self.horizontalLayout_5 = QtGui.QHBoxLayout() self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) self.mBackgroundColorButton = QgsColorButtonV2( self.mBackgroundGroupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.mBackgroundColorButton.sizePolicy().hasHeightForWidth()) self.mBackgroundColorButton.setSizePolicy(sizePolicy) self.mBackgroundColorButton.setMinimumSize(QtCore.QSize(120, 0)) self.mBackgroundColorButton.setMaximumSize(QtCore.QSize(120, 16777215)) self.mBackgroundColorButton.setText(_fromUtf8("")) self.mBackgroundColorButton.setObjectName( _fromUtf8("mBackgroundColorButton")) self.horizontalLayout_5.addWidget(self.mBackgroundColorButton) spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_5.addItem(spacerItem2) self.gridLayout_7.addLayout(self.horizontalLayout_5, 0, 1, 1, 1) self.verticalLayout_2.addWidget(self.mBackgroundGroupBox) self.groupBox = QgsCollapsibleGroupBoxBasic(self) self.groupBox.setFocusPolicy(QtCore.Qt.StrongFocus) self.groupBox.setProperty("syncGroup", _fromUtf8("composeritem")) self.groupBox.setProperty("collapsed", True) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.gridLayout_8 = QtGui.QGridLayout(self.groupBox) self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8")) self.mItemIdLabel = QtGui.QLabel(self.groupBox) self.mItemIdLabel.setObjectName(_fromUtf8("mItemIdLabel")) self.gridLayout_8.addWidget(self.mItemIdLabel, 0, 0, 1, 1) self.mItemIdLineEdit = QtGui.QLineEdit(self.groupBox) self.mItemIdLineEdit.setObjectName(_fromUtf8("mItemIdLineEdit")) self.gridLayout_8.addWidget(self.mItemIdLineEdit, 0, 1, 1, 1) self.verticalLayout_2.addWidget(self.groupBox) self.groupRendering = QgsCollapsibleGroupBoxBasic(self) self.groupRendering.setFocusPolicy(QtCore.Qt.StrongFocus) self.groupRendering.setProperty("collapsed", True) self.groupRendering.setProperty("syncGroup", _fromUtf8("composeritem")) self.groupRendering.setObjectName(_fromUtf8("groupRendering")) self.gridLayout_4 = QtGui.QGridLayout(self.groupRendering) self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) self.labelBlendMode = QtGui.QLabel(self.groupRendering) self.labelBlendMode.setObjectName(_fromUtf8("labelBlendMode")) self.gridLayout_4.addWidget(self.labelBlendMode, 0, 0, 1, 1) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.mBlendModeCombo = QgsBlendModeComboBox(self.groupRendering) self.mBlendModeCombo.setObjectName(_fromUtf8("mBlendModeCombo")) self.horizontalLayout_3.addWidget(self.mBlendModeCombo) self.mBlendModeDDBtn = QgsDataDefinedButton(self.groupRendering) self.mBlendModeDDBtn.setObjectName(_fromUtf8("mBlendModeDDBtn")) self.horizontalLayout_3.addWidget(self.mBlendModeDDBtn) self.gridLayout_4.addLayout(self.horizontalLayout_3, 0, 1, 1, 1) self.labelTransparency = QtGui.QLabel(self.groupRendering) self.labelTransparency.setObjectName(_fromUtf8("labelTransparency")) self.gridLayout_4.addWidget(self.labelTransparency, 1, 0, 1, 1) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.mTransparencySlider = QtGui.QSlider(self.groupRendering) self.mTransparencySlider.setMaximum(100) self.mTransparencySlider.setOrientation(QtCore.Qt.Horizontal) self.mTransparencySlider.setObjectName( _fromUtf8("mTransparencySlider")) self.horizontalLayout_2.addWidget(self.mTransparencySlider) self.mTransparencySpnBx = QgsSpinBox(self.groupRendering) self.mTransparencySpnBx.setMinimumSize(QtCore.QSize(80, 25)) self.mTransparencySpnBx.setMaximum(100) self.mTransparencySpnBx.setObjectName(_fromUtf8("mTransparencySpnBx")) self.horizontalLayout_2.addWidget(self.mTransparencySpnBx) self.mTransparencyDDBtn = QgsDataDefinedButton(self.groupRendering) self.mTransparencyDDBtn.setObjectName(_fromUtf8("mTransparencyDDBtn")) self.horizontalLayout_2.addWidget(self.mTransparencyDDBtn) self.gridLayout_4.addLayout(self.horizontalLayout_2, 1, 1, 1, 1) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.mExcludeFromPrintsCheckBox = QtGui.QCheckBox(self.groupRendering) self.mExcludeFromPrintsCheckBox.setObjectName( _fromUtf8("mExcludeFromPrintsCheckBox")) self.horizontalLayout.addWidget(self.mExcludeFromPrintsCheckBox) self.mExcludePrintsDDBtn = QgsDataDefinedButton(self.groupRendering) self.mExcludePrintsDDBtn.setObjectName( _fromUtf8("mExcludePrintsDDBtn")) self.horizontalLayout.addWidget(self.mExcludePrintsDDBtn) self.gridLayout_4.addLayout(self.horizontalLayout, 2, 0, 1, 2) self.verticalLayout_2.addWidget(self.groupRendering) self.groupBox_3 = QgsCollapsibleGroupBox(self) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) self.verticalLayout_4 = QtGui.QVBoxLayout(self.groupBox_3) self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) self.mVariableEditor = QgsVariableEditorWidget(self.groupBox_3) self.mVariableEditor.setMinimumSize(QtCore.QSize(0, 200)) self.mVariableEditor.setObjectName(_fromUtf8("mVariableEditor")) self.verticalLayout_4.addWidget(self.mVariableEditor) self.verticalLayout_2.addWidget(self.groupBox_3) spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.MinimumExpanding) self.verticalLayout_2.addItem(spacerItem3) self.mOutlineWidthLabel.setBuddy(self.mOutlineWidthSpinBox) self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) self.setTabOrder(self.mGeneralOptionsGroupBox, self.mPageSpinBox) self.setTabOrder(self.mPageSpinBox, self.mXPosSpin) self.setTabOrder(self.mXPosSpin, self.mXPositionDDBtn) self.setTabOrder(self.mXPositionDDBtn, self.mYPosSpin) self.setTabOrder(self.mYPosSpin, self.mYPositionDDBtn) self.setTabOrder(self.mYPositionDDBtn, self.mWidthSpin) self.setTabOrder(self.mWidthSpin, self.mWidthDDBtn) self.setTabOrder(self.mWidthDDBtn, self.mHeightSpin) self.setTabOrder(self.mHeightSpin, self.mHeightDDBtn) self.setTabOrder(self.mHeightDDBtn, self.mUpperLeftCheckBox) self.setTabOrder(self.mUpperLeftCheckBox, self.mUpperMiddleCheckBox) self.setTabOrder(self.mUpperMiddleCheckBox, self.mUpperRightCheckBox) self.setTabOrder(self.mUpperRightCheckBox, self.mMiddleLeftCheckBox) self.setTabOrder(self.mMiddleLeftCheckBox, self.mMiddleCheckBox) self.setTabOrder(self.mMiddleCheckBox, self.mMiddleRightCheckBox) self.setTabOrder(self.mMiddleRightCheckBox, self.mLowerLeftCheckBox) self.setTabOrder(self.mLowerLeftCheckBox, self.mLowerMiddleCheckBox) self.setTabOrder(self.mLowerMiddleCheckBox, self.mLowerRightCheckBox) self.setTabOrder(self.mLowerRightCheckBox, self.mTransformsGroupBox) self.setTabOrder(self.mTransformsGroupBox, self.mItemRotationSpinBox) self.setTabOrder(self.mItemRotationSpinBox, self.mItemRotationDDBtn) self.setTabOrder(self.mItemRotationDDBtn, self.mFrameGroupBox) self.setTabOrder(self.mFrameGroupBox, self.mFrameColorButton) self.setTabOrder(self.mFrameColorButton, self.mOutlineWidthSpinBox) self.setTabOrder(self.mOutlineWidthSpinBox, self.mFrameJoinStyleCombo) self.setTabOrder(self.mFrameJoinStyleCombo, self.mBackgroundGroupBox) self.setTabOrder(self.mBackgroundGroupBox, self.mBackgroundColorButton) self.setTabOrder(self.mBackgroundColorButton, self.groupBox) self.setTabOrder(self.groupBox, self.mItemIdLineEdit) self.setTabOrder(self.mItemIdLineEdit, self.groupRendering) self.setTabOrder(self.groupRendering, self.mBlendModeCombo) self.setTabOrder(self.mBlendModeCombo, self.mBlendModeDDBtn) self.setTabOrder(self.mBlendModeDDBtn, self.mTransparencySlider) self.setTabOrder(self.mTransparencySlider, self.mTransparencySpnBx) self.setTabOrder(self.mTransparencySpnBx, self.mTransparencyDDBtn) self.setTabOrder(self.mTransparencyDDBtn, self.mExcludeFromPrintsCheckBox) self.setTabOrder(self.mExcludeFromPrintsCheckBox, self.mExcludePrintsDDBtn) # self.mComposerObject = None self.groupBox_3.setVisible(False) def retranslateUi(self): self.setWindowTitle( _translate("QgsComposerItemWidgetBase", "Global Options", None)) self.mGeneralOptionsGroupBox.setTitle( _translate("QgsComposerItemWidgetBase", "Position and size", None)) self.mWidthLabel.setText( _translate("QgsComposerItemWidgetBase", "Width", None)) self.mXLabel.setText(_translate("QgsComposerItemWidgetBase", "X", None)) self.mHeightLabel.setText( _translate("QgsComposerItemWidgetBase", "Height", None)) self.mYLabel.setText(_translate("QgsComposerItemWidgetBase", "Y", None)) self.mPageLabel.setText( _translate("QgsComposerItemWidgetBase", "Page", None)) self.mXPositionDDBtn.setText( _translate("QgsComposerItemWidgetBase", "...", None)) self.mYPositionDDBtn.setText( _translate("QgsComposerItemWidgetBase", "...", None)) self.mWidthDDBtn.setText( _translate("QgsComposerItemWidgetBase", "...", None)) self.mHeightDDBtn.setText( _translate("QgsComposerItemWidgetBase", "...", None)) self.mWidthSpin.setSuffix( _translate("QgsComposerItemWidgetBase", " mm", None)) self.mHeightSpin.setSuffix( _translate("QgsComposerItemWidgetBase", " mm", None)) self.mYPosSpin.setSuffix( _translate("QgsComposerItemWidgetBase", " mm", None)) self.mXPosSpin.setSuffix( _translate("QgsComposerItemWidgetBase", " mm", None)) self.label_2.setText( _translate("QgsComposerItemWidgetBase", "Reference point", None)) self.mTransformsGroupBox.setTitle( _translate("QgsComposerItemWidgetBase", "Rotation", None)) self.label.setText( _translate("QgsComposerItemWidgetBase", "Rotation", None)) self.mItemRotationSpinBox.setSuffix( _translate("QgsComposerItemWidgetBase", " °", None)) self.mItemRotationDDBtn.setText( _translate("QgsComposerItemWidgetBase", "...", None)) self.mFrameGroupBox.setTitle( _translate("QgsComposerItemWidgetBase", "Frame", None)) self.label_3.setText( _translate("QgsComposerItemWidgetBase", "Frame color", None)) self.mOutlineWidthLabel.setText( _translate("QgsComposerItemWidgetBase", "Thickness", None)) self.mOutlineWidthSpinBox.setSuffix( _translate("QgsComposerItemWidgetBase", " mm", None)) self.label_8.setText( _translate("QgsComposerItemWidgetBase", "Join style", None)) self.mBackgroundGroupBox.setTitle( _translate("QgsComposerItemWidgetBase", "Background", None)) self.label_4.setText( _translate("QgsComposerItemWidgetBase", "Background color", None)) self.groupBox.setTitle( _translate("QgsComposerItemWidgetBase", "Item ID", None)) self.mItemIdLabel.setText( _translate("QgsComposerItemWidgetBase", "Id", None)) self.groupRendering.setTitle( _translate("QgsComposerItemWidgetBase", "Rendering", None)) self.labelBlendMode.setText( _translate("QgsComposerItemWidgetBase", "Blending mode", None)) self.mBlendModeDDBtn.setText( _translate("QgsComposerItemWidgetBase", "...", None)) self.labelTransparency.setText( _translate("QgsComposerItemWidgetBase", "Transparency", None)) self.mTransparencyDDBtn.setText( _translate("QgsComposerItemWidgetBase", "...", None)) self.mExcludeFromPrintsCheckBox.setText( _translate("QgsComposerItemWidgetBase", "Exclude item from exports", None)) self.mExcludePrintsDDBtn.setText( _translate("QgsComposerItemWidgetBase", "...", None)) self.groupBox_3.setTitle( _translate("QgsComposerItemWidgetBase", "Variables", None)) def ddPropertyForWidget(self, widget): # Q_UNUSED( widget ); # //base implementation, return no property return QgsComposerObject.NoProperty def updateDataDefinedProperty(self): #match data defined button to item's data defined property ddButton = self.sender() ddButton._class_ = QgsDataDefinedButton if (not isinstance(ddButton, QgsDataDefinedButton)): return property = self.ddPropertyForWidget(ddButton) if (property == QgsComposerObject.NoProperty): return #set the data defined property and refresh the item self.setDataDefinedProperty(ddButton, property) self.mComposerObject.refreshDataDefinedProperty(property) def setDataDefinedProperty(self, ddBtn, p): if (not self.mComposerObject): return map = ddBtn.definedProperty() self.mComposerObject.setDataDefinedProperty( p, map.value("active").toInt(), map.value("useexpr").toInt(), map.value("expression"), map.value("field")) def atlasComposition(self): if (not self.mComposerObject): return None composition = self.mComposerObject.composition() if (not composition): return None return composition.atlasComposition() def atlasCoverageLayer(self): atlasMap = self.atlasComposition() if (atlasMap and atlasMap.enabled()): return atlasMap.coverageLayer() return None
# coding: utf-8 from qgis.core import QgsExpressionContextUtils, QgsExpressionContext from qgis.gui import QgsVariableEditorWidget from qgis.utils import iface canvas = iface.mapCanvas() variable_editor_widget = QgsVariableEditorWidget() expression_context = QgsExpressionContext() expression_context.appendScope(QgsExpressionContextUtils.globalScope()) expression_context.appendScope(QgsExpressionContextUtils.projectScope()) expression_context.appendScope(QgsExpressionContextUtils.mapSettingsScope( canvas.mapSettings() )) variable_editor_widget.setContext(expression_context) variable_editor_widget.reloadContext() variable_editor_widget.setEditableScopeIndex(0) print(variable_editor_widget.context()) print(variable_editor_widget.editableScope()) print(variable_editor_widget.settingGroup()) print(variable_editor_widget.variablesInActiveScope()) variable_editor_widget.show()
# coding: utf-8 from qgis.core import QgsExpressionContextUtils, QgsExpressionContext from qgis.gui import QgsVariableEditorWidget from qgis.utils import iface canvas = iface.mapCanvas() variable_editor_widget = QgsVariableEditorWidget() expression_context = QgsExpressionContext() expression_context.appendScope(QgsExpressionContextUtils.globalScope()) expression_context.appendScope(QgsExpressionContextUtils.projectScope()) expression_context.appendScope( QgsExpressionContextUtils.mapSettingsScope(canvas.mapSettings())) variable_editor_widget.setContext(expression_context) variable_editor_widget.reloadContext() variable_editor_widget.setEditableScopeIndex(0) print(variable_editor_widget.context()) print(variable_editor_widget.editableScope()) print(variable_editor_widget.settingGroup()) print(variable_editor_widget.variablesInActiveScope()) variable_editor_widget.show()