Beispiel #1
0
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()
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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)
Beispiel #5
0
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()
Beispiel #6
0
    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)
Beispiel #7
0
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()