# -*- coding: utf-8 -*- """ *************************************************************************** ScriptSelector.py --------------------- Date : May 2016 Copyright : (C) 2016 by Victor Olaya Email : volayaf at gmail dot com *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * *************************************************************************** """ from builtins import range __author__ = 'Victor Olaya' __date__ = 'May 2016' __copyright__ = '(C) 2016, Victor Olaya' # This will get replaced with a git SHA1 when you do a git archive import os from collections import defaultdict from qgis.PyQt import uic from qgis.PyQt.QtCore import Qt from qgis.PyQt.QtWidgets import QTreeWidgetItem, QFileDialog from qgis.core import QgsApplication pluginPath = os.path.split(os.path.dirname(__file__))[0] WIDGET, BASE = uic.loadUiType( os.path.join(pluginPath, 'ui', 'scriptselector.ui')) class ScriptSelector(BASE, WIDGET): def __init__(self): super(ScriptSelector, self).__init__(None) self.setupUi(self) self.scripts = None allScripts = defaultdict(list) alglist = QgsApplication.processingRegistry().providerById("script").algs for script in alglist: allScripts[script.group()].append(script) for group, groupScripts in list(allScripts.items()): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate) for script in groupScripts: scriptItem = QTreeWidgetItem() scriptItem.setFlags(scriptItem.flags() | Qt.ItemIsUserCheckable) scriptItem.setCheckState(0, Qt.Checked) scriptItem.script = script scriptItem.setText(0, script.name) groupItem.addChild(scriptItem) self.scriptsTree.addTopLevelItem(groupItem) self.scriptsTree.expandAll() self.selectAllLabel.linkActivated.connect(lambda: self.checkScripts(True)) self.deselectAllLabel.linkActivated.connect(lambda: self.checkScripts(False)) self.folderButton.clicked.connect(self.selectFolder) self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) def selectFolder(self): folder = QFileDialog.getExistingDirectory(self, 'Select folder') if folder: self.folderBox.setText(folder) def checkScripts(self, b): state = Qt.Checked if b else Qt.Unchecked for i in range(self.scriptsTree.topLevelItemCount()): item = self.scriptsTree.topLevelItem(i) for j in range(item.childCount()): child = item.child(j) child.setCheckState(0, state) def cancelPressed(self): self.close() def _getValue(self, textBox): textBox.setStyleSheet("QLineEdit{background: white}") value = textBox.text() if value: return value textBox.setStyleSheet("QLineEdit{background: yellow}") raise Exception("wrong parameter value") def okPressed(self): self.scripts = [] for i in range(self.scriptsTree.topLevelItemCount()): groupItem = self.scriptsTree.topLevelItem(i) for j in range(groupItem.childCount()): scriptItem = groupItem.child(j) if scriptItem.checkState(0) == Qt.Checked: self.scripts.append(scriptItem.script) self.folder = self._getValue(self.folderBox) try: self.name = self._getValue(self.nameBox) self.description = self._getValue(self.descriptionBox) self.author = self._getValue(self.authorBox) self.email = self._getValue(self.emailBox) except: return self.close()