def fillTree(self): allLessons = defaultdict(list) for lesson in lessons: allLessons[lesson.group].append(lesson) self.lessonsTree.clear() lessonIcon = QIcon(os.path.dirname(__file__) + "/lesson.gif") for group, groupLessons in list(allLessons.items()): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.description = groups.get(group, "") for lesson in groupLessons: lessonItem = QTreeWidgetItem() lessonItem.lesson = lesson lessonItem.setText(0, lesson.name) lessonItem.setIcon(0, lessonIcon) groupItem.addChild(lessonItem) if lesson.version[0] is not None and str(lesson.version[0]) > QGis.QGIS_VERSION: lessonItem.setText(0, lesson.name + " (requires QGIS >= {})".format(lesson.version[0])) lessonItem.setDisabled(True) if lesson.version[1] is not None and str(lesson.version[1]) < QGis.QGIS_VERSION: lessonItem.setText(0, lesson.name + " (requires QGIS <= {})".format(lesson.version[1])) lessonItem.setDisabled(True) self.lessonsTree.addTopLevelItem(groupItem) self.lessonsTree.sortItems(0, 0) self.lessonsTree.expandAll()
def populate(self): groups = {} count = 0 provider = algList.algs[self.providerName] algs = list(provider.values()) name = "ACTIVATE_" + self.providerName.upper().replace(" ", "_") active = ProcessingConfig.getSetting(name) # Add algorithms for alg in algs: if not alg.showInToolbox: continue if alg.group in groups: groupItem = groups[alg.group] else: groupItem = QTreeWidgetItem() name = alg.i18n_group or alg.group if not active: groupItem.setForeground(0, Qt.darkGray) groupItem.setText(0, name) groupItem.setToolTip(0, name) groups[alg.group] = groupItem algItem = TreeAlgorithmItem(alg) if not active: algItem.setForeground(0, Qt.darkGray) groupItem.addChild(algItem) count += 1 actions = Processing.actions[self.providerName] for action in actions: if action.group in groups: groupItem = groups[action.group] else: groupItem = QTreeWidgetItem() groupItem.setText(0, action.group) groups[action.group] = groupItem algItem = TreeActionItem(action) groupItem.addChild(algItem) text = self.provider.getDescription() if not active: def activateProvider(): self.toolbox.activateProvider(self.providerName) label = QLabel(text + " <a href='%s'>Activate</a>") label.setStyleSheet("QLabel {background-color: white; color: grey;}") label.linkActivated.connect(activateProvider) self.tree.setItemWidget(self, 0, label) else: text += QCoreApplication.translate("TreeProviderItem", " [{0} geoalgorithms]").format(count) self.setText(0, text) self.setToolTip(0, self.text(0)) for groupItem in list(groups.values()): self.addChild(groupItem) self.setHidden(self.childCount() == 0)
def addRecentAlgorithms(self, updating): showRecent = ProcessingConfig.getSetting( ProcessingConfig.SHOW_RECENT_ALGORITHMS) if showRecent: recent = ProcessingLog.getRecentAlgorithms() if len(recent) != 0: found = False if updating: recentItem = self.algorithmTree.topLevelItem(0) if recentItem.text(0) == self.tr('Recently used'): treeWidget = recentItem.treeWidget() treeWidget.takeTopLevelItem( treeWidget.indexOfTopLevelItem(recentItem)) recentItem = QTreeWidgetItem() recentItem.setText(0, self.tr('Recently used')) for algname in recent: alg = QgsApplication.processingRegistry().createAlgorithmById(algname) if alg is not None: algItem = TreeAlgorithmItem(alg) recentItem.addChild(algItem) found = True if found: self.algorithmTree.insertTopLevelItem(0, recentItem) recentItem.setExpanded(True) self.algorithmTree.setWordWrap(True)
def __init__(self): super(ScriptSelector, self).__init__(None) self.setupUi(self) self.scripts = None allScripts = defaultdict(list) alglist = algList.getProviderFromName("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.unselectAllLabel.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 computeDiffs(self): self.featuresTree.clear() self.changes = self.localChanges(self.layer) layerItem = QTreeWidgetItem() layerItem.setText(0, self.layer.name()) layerItem.setIcon(0, layerIcon) self.featuresTree.addTopLevelItem(layerItem) addedItem = QTreeWidgetItem() addedItem.setText(0, "Added") addedItem.setIcon(0, addedIcon) removedItem = QTreeWidgetItem() removedItem.setText(0, "Removed") removedItem.setIcon(0, removedIcon) modifiedItem = QTreeWidgetItem() modifiedItem.setText(0, "Modified") modifiedItem.setIcon(0, modifiedIcon) layerSubItems = {LOCAL_FEATURE_ADDED: addedItem, LOCAL_FEATURE_REMOVED: removedItem, LOCAL_FEATURE_MODIFIED: modifiedItem} for c in list(self.changes.values()): item = QTreeWidgetItem() item.setText(0, c.fid) item.setIcon(0, featureIcon) layerSubItems[c.changetype].addChild(item) for i in [LOCAL_FEATURE_ADDED, LOCAL_FEATURE_REMOVED, LOCAL_FEATURE_MODIFIED]: layerItem.addChild(layerSubItems[i]) layerSubItems[i].setText(0, "%s [%i features]" % (layerSubItems[i].text(0), layerSubItems[i].childCount())) self.attributesTable.clear() self.attributesTable.verticalHeader().hide() self.attributesTable.horizontalHeader().hide() self.featuresTree.expandAll()
def _getItem(self, name, icon, params): icon = QIcon(icon) item = QTreeWidgetItem() item.setText(0, name) item.setIcon(0, icon) for param in params: subItem = TreeSettingItem(item, self.tree, name, param) item.addChild(subItem) return item
def populate(self): groups = {} count = 0 algs = self.provider.algorithms() active = self.provider.isActive() # Add algorithms for alg in algs: if alg.flags() & QgsProcessingAlgorithm.FlagHideFromToolbox: continue if alg.group() in groups: groupItem = groups[alg.group()] else: groupItem = QTreeWidgetItem() name = alg.group() if not active: groupItem.setForeground(0, Qt.darkGray) groupItem.setText(0, name) groupItem.setToolTip(0, name) groups[alg.group()] = groupItem algItem = TreeAlgorithmItem(alg) if not active: algItem.setForeground(0, Qt.darkGray) groupItem.addChild(algItem) count += 1 if self.provider.id() in ProviderActions.actions: actions = ProviderActions.actions[self.provider.id()] for action in actions: if action.group in groups: groupItem = groups[action.group] else: groupItem = QTreeWidgetItem() groupItem.setText(0, action.group) groups[action.group] = groupItem algItem = TreeActionItem(action) groupItem.addChild(algItem) text = self.provider.name() if not active: def activateProvider(): self.toolbox.activateProvider(self.provider.id()) label = QLabel(text + " <a href='%s'>Activate</a>") label.setStyleSheet("QLabel {background-color: white; color: grey;}") label.linkActivated.connect(activateProvider) self.tree.setItemWidget(self, 0, label) else: text += QCoreApplication.translate("TreeProviderItem", " [{0} geoalgorithms]").format(count) self.setText(0, text) self.setToolTip(0, self.text(0)) for groupItem in list(groups.values()): self.addChild(groupItem) self.setHidden(self.childCount() == 0)
def fillAlgorithmTreeUsingProviders(self): self.algorithmTree.clear() text = str(self.searchBox.text()) search_strings = text.split(' ') allAlgs = algList.algs for provider_id in list(allAlgs.keys()): name = 'ACTIVATE_' + provider_id.upper().replace(' ', '_') if not ProcessingConfig.getSetting(name): continue groups = {} algs = list(allAlgs[provider_id].values()) # Add algorithms for alg in algs: if not alg.showInModeler: continue if alg.commandLineName() == self.alg.commandLineName(): continue item_text = [alg.name.lower()] item_text.extend(alg.tags.split(',')) show = not search_strings or all( any(part in t for t in item_text) for part in search_strings) if show: if alg.group in groups: groupItem = groups[alg.group] else: groupItem = QTreeWidgetItem() name = alg.i18n_group or alg.group groupItem.setText(0, name) groupItem.setToolTip(0, name) groups[alg.group] = groupItem algItem = TreeAlgorithmItem(alg) groupItem.addChild(algItem) if len(groups) > 0: providerItem = QTreeWidgetItem() provider = QgsApplication.processingRegistry().providerById(provider_id) providerItem.setText(0, provider.name()) providerItem.setToolTip(0, provider.name()) providerItem.setIcon(0, provider.icon()) for groupItem in list(groups.values()): providerItem.addChild(groupItem) self.algorithmTree.addTopLevelItem(providerItem) providerItem.setExpanded(text != '') for groupItem in list(groups.values()): if text != '': groupItem.setExpanded(True) self.algorithmTree.sortItems(0, Qt.AscendingOrder)
def fillInputsTree(self): icon = QIcon(os.path.join(pluginPath, 'images', 'input.png')) parametersItem = QTreeWidgetItem() parametersItem.setText(0, self.tr('Parameters')) for paramType in ModelerParameterDefinitionDialog.paramTypes: paramItem = QTreeWidgetItem() paramItem.setText(0, paramType) paramItem.setIcon(0, icon) paramItem.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled) parametersItem.addChild(paramItem) self.inputsTree.addTopLevelItem(parametersItem) parametersItem.setExpanded(True)
def fillAlgorithmTreeUsingProviders(self): self.algorithmTree.clear() text = str(self.searchBox.text()) search_strings = text.split(' ') for provider in QgsApplication.processingRegistry().providers(): if not provider.isActive(): continue groups = {} # Add algorithms for alg in provider.algorithms(): if alg.flags() & QgsProcessingAlgorithm.FlagHideFromModeler: continue if alg.id() == self.alg.id(): continue item_text = [alg.displayName().lower()] item_text.extend(alg.tags()) show = not search_strings or all( any(part in t for t in item_text) for part in search_strings) if show: if alg.group() in groups: groupItem = groups[alg.group()] else: groupItem = QTreeWidgetItem() name = alg.group() groupItem.setText(0, name) groupItem.setToolTip(0, name) groups[alg.group()] = groupItem algItem = TreeAlgorithmItem(alg) groupItem.addChild(algItem) if len(groups) > 0: providerItem = QTreeWidgetItem() providerItem.setText(0, provider.name()) providerItem.setToolTip(0, provider.name()) providerItem.setIcon(0, provider.icon()) for groupItem in list(groups.values()): providerItem.addChild(groupItem) self.algorithmTree.addTopLevelItem(providerItem) providerItem.setExpanded(text != '') for groupItem in list(groups.values()): if text != '': groupItem.setExpanded(True) self.algorithmTree.sortItems(0, Qt.AscendingOrder)
def fillConflictsTree(self): topTreeItems = {} for c in self.conflicts: path = os.path.dirname(c.path) if path in topTreeItems: topItem = topTreeItems[path] else: topItem = QTreeWidgetItem() topItem.setText(0, path) topItem.setIcon(0, layerIcon) topTreeItems[path] = topItem conflictItem = ConflictItem(c) topItem.addChild(conflictItem) for item in list(topTreeItems.values()): self.conflictsTree.addTopLevelItem(item)
def __init__(self, report): super(ReportDialog, self).__init__() self.setupUi(self) self.actionSaveAll.setIcon(QgsApplication.getThemeIcon('/mActionFileSave.svg')) self.actionSaveSelected.setIcon(QgsApplication.getThemeIcon('/mActionFileSaveAs.svg')) self.actionOpenTracker.setIcon(QgsApplication.getThemeIcon('/mActionHelpAPI.png')) self.actionSaveAll.triggered.connect(lambda: self.saveResults(True)) self.actionSaveSelected.triggered.connect(lambda: self.saveResults(False)) self.resultsTree.clear() results = report.results self.saveFailed(results) self.reopen = False allResults = defaultdict(list) for result in results: test = result.test allResults[test.group].append(result) for group, groupResults in list(allResults.items()): groupItem = QTreeWidgetItem() groupItem.setText(0, group) for result in groupResults: resultItem = QTreeWidgetItem() resultItem.result = result resultItem.setText(0, result.test.name) resultItem.setForeground(0, self.resultColor[result.status]) groupItem.addChild(resultItem) self.resultsTree.addTopLevelItem(groupItem) self.resultsTree.expandAll() self.resultsTree.itemClicked.connect(self.itemClicked) self.resultsTree.customContextMenuRequested.connect(self.showPopupMenu) button = QPushButton("Re-open test selector"); def _reopen(): self.reopen = True self.close() button.clicked.connect(_reopen) self.buttonBox.addButton(button, QDialogButtonBox.ActionRole); self.buttonBox.rejected.connect(self.close)
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 fillAlgorithmTreeUsingProviders(self): self.algorithmTree.clear() text = unicode(self.searchBox.text()) allAlgs = ModelerUtils.allAlgs for providerName in allAlgs.keys(): name = 'ACTIVATE_' + providerName.upper().replace(' ', '_') if not ProcessingConfig.getSetting(name): continue groups = {} provider = allAlgs[providerName] algs = provider.values() # Add algorithms for alg in algs: if not alg.showInModeler or alg.allowOnlyOpenedLayers: continue if alg.commandLineName() == self.alg.commandLineName(): continue if text == '' or text.lower() in alg.name.lower(): if alg.group in groups: groupItem = groups[alg.group] else: groupItem = QTreeWidgetItem() name = alg.i18n_group or alg.group groupItem.setText(0, name) groupItem.setToolTip(0, name) groups[alg.group] = groupItem algItem = TreeAlgorithmItem(alg) groupItem.addChild(algItem) if len(groups) > 0: providerItem = QTreeWidgetItem() providerItem.setText(0, ModelerUtils.providers[providerName].getDescription()) providerItem.setToolTip(0, ModelerUtils.providers[providerName].getDescription()) providerItem.setIcon(0, ModelerUtils.providers[providerName].getIcon()) for groupItem in groups.values(): providerItem.addChild(groupItem) self.algorithmTree.addTopLevelItem(providerItem) providerItem.setExpanded(text != '') for groupItem in groups.values(): if text != '': groupItem.setExpanded(True) self.algorithmTree.sortItems(0, Qt.AscendingOrder)
def computeDiffs(self): self.commit1 = self.commit1Panel.getRef() self.commit2 = self.commit2Panel.getRef() self.featuresTree.clear() changes = execute(lambda: self.repo.diff(self.commit1.commitid, self.commit2.commitid)) layerItems = {} layerSubItems = {} self.changes = {} for c in changes: self.changes[c.path] = c layername = c.path.split("/")[0] featureid = c.path.split("/")[-1] if layername not in layerItems: item = QTreeWidgetItem() item.setText(0, layername) item.setIcon(0, layerIcon) layerItems[layername] = item addedItem = QTreeWidgetItem() addedItem.setText(0, "Added") addedItem.setIcon(0, addedIcon) removedItem = QTreeWidgetItem() removedItem.setText(0, "Removed") removedItem.setIcon(0, removedIcon) modifiedItem = QTreeWidgetItem() modifiedItem.setText(0, "Modified") modifiedItem.setIcon(0, modifiedIcon) layerSubItems[layername] = {FEATURE_ADDED: addedItem, FEATURE_REMOVED: removedItem, FEATURE_MODIFIED:modifiedItem} item = FeatureItem(layername, featureid) layerSubItems[layername][c.changetype].addChild(item) for layername, item in layerItems.iteritems(): for i in [FEATURE_ADDED, FEATURE_REMOVED, FEATURE_MODIFIED]: subItem = layerSubItems[layername][i] item.addChild(subItem) subItem.setText(0, "%s [%i features]" % (subItem.text(0), subItem.childCount())) self.featuresTree.addTopLevelItem(item) self.attributesTable.clear() self.attributesTable.verticalHeader().hide() self.attributesTable.horizontalHeader().hide() self.featuresTree.expandAll()
def __setupModelData(self): dsList = DataSourcesList().data_sources.values() groupInfoList = GroupsList().groups groupsItems = [] groups = [] for ds in dsList: if ds.group in groups: group_item = groupsItems[groups.index(ds.group)] else: group_item = QTreeWidgetItem() group_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group) group_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") group_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.Unchecked) groupInfo = groupInfoList.get(ds.group) if groupInfo is not None: group_item.setIcon(self.COLUMN_GROUP_DS, QIcon(groupInfo.icon)) else: group_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group + " (%s!)" % self.tr("group not found")) group_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, groupInfo) groups.append(ds.group) groupsItems.append(group_item) self.rootItem.addChild(group_item) ds_item = QTreeWidgetItem() ds_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.alias) ds_item.setIcon(self.COLUMN_GROUP_DS, QIcon(ds.icon_path)) ds_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, ds) ds_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") ds_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) ds_check_state = Qt.Checked if ds.id in PluginSettings.get_hide_ds_id_list(): ds_check_state = Qt.Unchecked ds_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) if group_item.childCount() != 0 and group_item.checkState(1) != ds_check_state: group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.PartiallyChecked) else: group_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) group_item.addChild( ds_item )
def fillInputsTree(self): from processing.core.Processing import Processing icon = QIcon(os.path.join(pluginPath, 'images', 'input.svg')) parametersItem = QTreeWidgetItem() parametersItem.setText(0, self.tr('Parameters')) sortedParams = sorted(Processing.registeredParameters().items()) for param in sortedParams: if param[1]['exposeToModeller']: paramItem = QTreeWidgetItem() paramItem.setText(0, param[1]['name']) paramItem.setData(0, Qt.UserRole, param[0]) paramItem.setIcon(0, icon) paramItem.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled) paramItem.setToolTip(0, param[1]['description']) parametersItem.addChild(paramItem) self.inputsTree.addTopLevelItem(parametersItem) parametersItem.setExpanded(True)
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 computeDiffs(self): self.featuresTree.clear() self.changes = self.localChanges(self.layer) layerItem = QTreeWidgetItem() layerItem.setText(0, self.layer.name()) layerItem.setIcon(0, layerIcon) self.featuresTree.addTopLevelItem(layerItem) addedItem = QTreeWidgetItem() addedItem.setText(0, "Added") addedItem.setIcon(0, addedIcon) removedItem = QTreeWidgetItem() removedItem.setText(0, "Removed") removedItem.setIcon(0, removedIcon) modifiedItem = QTreeWidgetItem() modifiedItem.setText(0, "Modified") modifiedItem.setIcon(0, modifiedIcon) layerSubItems = { LOCAL_FEATURE_ADDED: addedItem, LOCAL_FEATURE_REMOVED: removedItem, LOCAL_FEATURE_MODIFIED: modifiedItem } for c in list(self.changes.values()): item = QTreeWidgetItem() item.setText(0, c.fid) item.setIcon(0, featureIcon) layerSubItems[c.changetype].addChild(item) for i in [ LOCAL_FEATURE_ADDED, LOCAL_FEATURE_REMOVED, LOCAL_FEATURE_MODIFIED ]: layerItem.addChild(layerSubItems[i]) layerSubItems[i].setText( 0, "%s [%i features]" % (layerSubItems[i].text(0), layerSubItems[i].childCount())) self.attributesTable.clear() self.attributesTable.verticalHeader().hide() self.attributesTable.horizontalHeader().hide() self.featuresTree.expandAll()
def __init__(self): super(LessonSelector, self).__init__() self.setupUi(self) self.lesson = None allLessons = defaultdict(list) for lesson in lessons: allLessons[lesson.group].append(lesson) lessonIcon = QIcon(os.path.dirname(__file__) + '/lesson.gif') for group, groupLessons in allLessons.items(): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.description = groups.get(group, "") for lesson in groupLessons: lessonItem = QTreeWidgetItem() lessonItem.lesson = lesson lessonItem.setText(0, lesson.name) lessonItem.setIcon(0, lessonIcon) groupItem.addChild(lessonItem) self.lessonsTree.addTopLevelItem(groupItem) self.lessonsTree.sortItems(0, 0) self.lessonsTree.expandAll() self.lessonsTree.itemDoubleClicked.connect(self.itemDoubleClicked) self.btnRunLesson.setDefault(True) self.btnRunLesson.clicked.connect(self.okPressed) self.btnRemove.clicked.connect(self.remove) self.btnClose.clicked.connect(self.close) self.btnRemove.setEnabled(False) self.lessonsTree.currentItemChanged.connect(self.currentItemChanged) self.lessonsTree.setCurrentItem( self.lessonsTree.invisibleRootItem().child(0).child(0))
def fillTree(self): self.featuresTree.clear() for layer, changes in self.changes.items(): layerItem = QTreeWidgetItem() layerItem.setText(0, layer) layerItem.setIcon(0, layerIcon) self.featuresTree.addTopLevelItem(layerItem) addedItem = QTreeWidgetItem() addedItem.setText(0, "Added") addedItem.setIcon(0, addedIcon) layerItem.addChild(addedItem) removedItem = QTreeWidgetItem() removedItem.setText(0, "Removed") removedItem.setIcon(0, removedIcon) layerItem.addChild(removedItem) modifiedItem = QTreeWidgetItem() modifiedItem.setText(0, "Modified") modifiedItem.setIcon(0, modifiedIcon) layerItem.addChild(modifiedItem) subItems = [addedItem, modifiedItem, removedItem] for f in changes: new = f["new"] old = f["old"] item = FeatureItem(f["ID"], old, new) subItems[f["geogig.changeType"]].addChild(item) self.attributesTable.clear() self.attributesTable.verticalHeader().hide() self.attributesTable.horizontalHeader().hide() self.featuresTree.expandAll()
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 populateTree(self): for lyr_name in (lyr_utils.getLayerById(id_).name() for id_ in self.layer_ids): item = QTreeWidgetItem() item.setText(0, lyr_name) subitem = QTreeWidgetItem() subitem.setText(0, "Publish symbology") subitem.setIcon(0, SYMBOLOGY_ICON) item.addChild(subitem) subitem = QTreeWidgetItem() subitem.setText(0, "Publish data") subitem.setIcon(0, DATA_ICON) item.addChild(subitem) subitem = QTreeWidgetItem() subitem.setText(0, "Publish metadata") subitem.setIcon(0, METADATA_ICON) item.addChild(subitem) self.treeWidget.addTopLevelItem(item) item.setExpanded(False) item = QTreeWidgetItem() item.setText(0, "Create layer groups") item.setIcon(0, GROUPS_ICON) self.treeWidget.addTopLevelItem(item) QCoreApplication.processEvents()
def populateTree(self): for layer in self.layers: item = QTreeWidgetItem() item.setText(0, layer) subitem = QTreeWidgetItem() subitem.setText(0, "Publish symbology") subitem.setIcon(0, SYMBOLOGY_ICON) item.addChild(subitem) subitem = QTreeWidgetItem() subitem.setText(0, "Publish data") subitem.setIcon(0, DATA_ICON) item.addChild(subitem) subitem = QTreeWidgetItem() subitem.setText(0, "Publish metadata") subitem.setIcon(0, METADATA_ICON) item.addChild(subitem) self.treeWidget.addTopLevelItem(item) item.setExpanded(False) item = QTreeWidgetItem() item.setText(0, "Create layer groups") item.setIcon(0, GROUPS_ICON) self.treeWidget.addTopLevelItem(item) QCoreApplication.processEvents()
class MapStoryExplorer(BASE, WIDGET): def __init__(self): super(MapStoryExplorer, self).__init__(None) self.story = None self.currentLayerItem = None self.setupUi(self) self.setAllowedAreas(Qt.RightDockWidgetArea | Qt.LeftDockWidgetArea) self.layersTree.itemClicked.connect(self.treeItemClicked) self.layerDescription.setOpenLinks(False) self.layerDescription.anchorClicked.connect(self.layerDescriptionLinkClicked) self.layerDescription.setFocusPolicy(Qt.NoFocus) self.storyDescription.setOpenLinks(False) self.storyDescription.anchorClicked.connect(self.storyDescriptionLinkClicked) self.storyDescription.setFocusPolicy(Qt.NoFocus) with open(resourceFile("layerdescription.css")) as f: sheet = "".join(f.readlines()) self.layerDescription.document().setDefaultStyleSheet(sheet) self.storyDescription.document().setDefaultStyleSheet(sheet) if qtVersion < 5: self.layersTree.header().setResizeMode(0, QHeaderView.Stretch) self.layersTree.header().setResizeMode(1, QHeaderView.ResizeToContents) self.updateCurrentStory(None) def storyDescriptionLinkClicked(self, url): url = url.toString() if url == "search": dlg = SearchDialog() dlg.exec_() if dlg.mapstory is not None: story = Story.storyFromNumberId(dlg.mapstory) if story is None: QMessageBox.warning(iface.mainWindow(), "MapStory", "Cannot get MapStory data.\nCheck that the provided ID is correct.") else: self.updateCurrentStory(story) elif url == "download": outDir = QFileDialog.getExistingDirectory(self, self.tr("Select output directory"), "." ) if not outDir: return QDir().mkpath(outDir) settings = QSettings() systemEncoding = settings.value('/UI/encoding', 'System') startProgressBar(len(self.story.storyLayers()), "Download layers for off-line use:") for i, layer in enumerate(self.story.storyLayers()): filename = os.path.join(outDir, layer.name() + ".shp") uri = "%s?srsname=%s&typename=geonode:%s&version=1.0.0&request=GetFeature&service=WFS" % (layer.wfsUrl(), layer.crs(), layer.name()) qgslayer = QgsVectorLayer(uri, layer.name(), "WFS") writer = QgsVectorFileWriter(filename, systemEncoding, qgslayer.pendingFields(), qgslayer.dataProvider().geometryType(), qgslayer.crs()) for feat in qgslayer.getFeatures(): writer.addFeature(feat) del writer fieldname = self._getTimeField(qgslayer) if fieldname is not None: filename = os.path.join(outDir, layer.name() + ".timefield") with open(filename, "w") as f: f.write(fieldname) setProgress(i+1) closeProgressBar() iface.messageBar().pushMessage("MapStory", "Layers have been correctly saved as QGIS project.", level=QgsMessageBar.INFO, duration=3) def _getTimeField(self, layer): fields = layer.pendingFields() for f in fields: if f.typeName() == "xsd:dateTime": return f.name() def layerDescriptionLinkClicked(self, url): url = url.toString() service, url, name, crs = url.split("|") if service == "wms": uri = "url=%s&styles=&layers=%s&format=image/png&crs=%s" % (url,name, crs) qgslayer = execute(lambda: QgsRasterLayer(uri, name, "wms")) if not qgslayer.isValid(): raise Exception ("Layer at %s is not a valid layer" % uri) QgsMapLayerRegistry.instance().addMapLayers([qgslayer]) timeValues = self.story.storyLayerFromName(name).wmsTimeValues() addWmsAnimation(qgslayer, timeValues) elif service == "wfs": def f(): crs = iface.mapCanvas().mapRenderer().destinationCrs() uri = "%s?srsname=%s&typename=geonode:%s&version=1.0.0&request=GetFeature&service=WFS" % (url, crs.authid(), name) qgslayer = QgsVectorLayer(uri, name, "WFS") if not qgslayer.isValid(): raise Exception ("Layer at %s is not a valid layer" % uri) fieldname = self._getTimeField(qgslayer) if fieldname is None: QgsMapLayerRegistry.instance().addMapLayers([qgslayer]) else: memlayer = QgsVectorLayer("%s?crs=%s" % (GEOM_TYPE_MAP[qgslayer.wkbType()], crs.authid()), name, "memory") memlayer.startEditing() for field in qgslayer.pendingFields(): memlayer.addAttribute(field) for feat in qgslayer.getFeatures(): memlayer.addFeatures([feat]) memlayer.commitChanges() QgsMapLayerRegistry.instance().addMapLayers([memlayer]) memlayer.setSelectedFeatures([]) addWfsAnimation(memlayer, fieldname) execute(f) def updateCurrentStory(self, story): self.layersTree.clear() self.currentLayerItem = None self.story = story if story is None: self.storyDescription.setText("No MapStory selected. <a href='search'>[Click to open a MapStory]</a>") return self.storyDescription.setText(story.description()) self.layersItem = QTreeWidgetItem() self.layersItem.setText(0, "Layers") self.layersItem.setIcon(0, layersIcon) for layer in story.storyLayers(): item = LayerItem(layer) self.layersItem.addChild(item) self.layersTree.addTopLevelItem(self.layersItem) self.layersItem.setExpanded(True) def treeItemClicked(self, item, i): if self.currentLayerItem == item: return self.currentLayerItem = item if isinstance(item, LayerItem): self.updateCurrentLayer() def updateCurrentLayer(self): self.layerDescription.setText(self.currentLayerItem.layer.description())
def addAlgorithmsFromProvider(self, provider, parent): groups = {} count = 0 algs = provider.algorithms() active = provider.isActive() # Add algorithms for alg in algs: if alg.flags() & QgsProcessingAlgorithm.FlagHideFromToolbox: continue groupItem = None if alg.group() in groups: groupItem = groups[alg.group()] else: # check if group already exists for i in range(parent.childCount()): if parent.child(i).text(0) == alg.group(): groupItem = parent.child(i) groups[alg.group()] = groupItem break if not groupItem: groupItem = QTreeWidgetItem() name = alg.group() if not active: groupItem.setForeground(0, Qt.darkGray) groupItem.setText(0, name) groupItem.setToolTip(0, name) if provider.id() in ('qgis', 'native'): groupItem.setIcon(0, provider.icon()) groups[alg.group()] = groupItem algItem = TreeAlgorithmItem(alg) if not active: algItem.setForeground(0, Qt.darkGray) groupItem.addChild(algItem) count += 1 if provider.id() in ProviderActions.actions: actions = ProviderActions.actions[provider.id()] for action in actions: if action.group in groups: groupItem = groups[action.group] else: groupItem = QTreeWidgetItem() groupItem.setText(0, action.group) groups[action.group] = groupItem algItem = TreeActionItem(action) groupItem.addChild(algItem) text = provider.name() if not provider.id() in ('qgis', 'native'): if not active: def activateProvider(): self.activateProvider(provider.id()) label = QLabel(text + " <a href='%s'>Activate</a>") label.setStyleSheet("QLabel {background-color: white; color: grey;}") label.linkActivated.connect(activateProvider) self.algorithmTree.setItemWidget(item, 0, label) else: text += QCoreApplication.translate("TreeProviderItem", " [{0} geoalgorithms]").format(count) parent.setText(0, text) parent.setToolTip(0, parent.text(0)) for groupItem in list(groups.values()): parent.addChild(groupItem) if not provider.id() in ('qgis', 'native'): parent.setHidden(parent.childCount() == 0)
def data(self, profile_data): """Set data for the widget. :param profile_data: profile data. :type profile_data: dict It will replace the previous data. """ default_profile = generate_default_profile() self.clear() for hazard in sorted(default_profile.keys()): classifications = default_profile[hazard] hazard_widget_item = QTreeWidgetItem() hazard_widget_item.setData(0, Qt.UserRole, hazard) hazard_widget_item.setText(0, get_name(hazard)) for classification in sorted(classifications.keys()): # Filter out classification that doesn't support population. # TODO(IS): This is not the best place to put the filtering. # It's more suitable in the generate_default_profile method # in safe/definitions/utilities. classification_definition = definition(classification) supported_exposures = classification_definition.get( 'exposures', []) # Empty list means support all exposure if supported_exposures != []: if exposure_population not in supported_exposures: continue classes = classifications[classification] classification_widget_item = QTreeWidgetItem() classification_widget_item.setData(0, Qt.UserRole, classification) classification_widget_item.setText(0, get_name(classification)) hazard_widget_item.addChild(classification_widget_item) for the_class, the_value in list(classes.items()): the_class_widget_item = QTreeWidgetItem() the_class_widget_item.setData(0, Qt.UserRole, the_class) the_class_widget_item.setText( 0, get_class_name(the_class, classification)) classification_widget_item.addChild(the_class_widget_item) # Adding widget must be happened after addChild affected_check_box = QCheckBox(self) # Set from profile_data if exist, else get default profile_value = profile_data.get(hazard, {}).get( classification, {}).get(the_class, the_value) affected_check_box.setChecked(profile_value['affected']) self.setItemWidget(the_class_widget_item, 1, affected_check_box) displacement_rate_spinbox = PercentageSpinBox(self) displacement_rate_spinbox.setValue( profile_value['displacement_rate']) displacement_rate_spinbox.setEnabled( profile_value['affected']) self.setItemWidget(the_class_widget_item, 2, displacement_rate_spinbox) # Behaviour when the check box is checked # noinspection PyUnresolvedReferences affected_check_box.stateChanged.connect( displacement_rate_spinbox.setEnabled) if hazard_widget_item.childCount() > 0: self.widget_items.append(hazard_widget_item) self.addTopLevelItems(self.widget_items) self.expandAll()
def data(self, profile_data): """Set data for the widget. :param profile_data: profile data. :type profile_data: dict It will replace the previous data. """ default_profile = generate_default_profile() self.clear() for hazard in sorted(default_profile.keys()): classifications = default_profile[hazard] hazard_widget_item = QTreeWidgetItem() hazard_widget_item.setData(0, Qt.UserRole, hazard) hazard_widget_item.setText(0, get_name(hazard)) for classification in sorted(classifications.keys()): # Filter out classification that doesn't support population. # TODO(IS): This is not the best place to put the filtering. # It's more suitable in the generate_default_profile method # in safe/definitions/utilities. classification_definition = definition(classification) supported_exposures = classification_definition.get( 'exposures', []) # Empty list means support all exposure if supported_exposures != []: if exposure_population not in supported_exposures: continue classes = classifications[classification] classification_widget_item = QTreeWidgetItem() classification_widget_item.setData( 0, Qt.UserRole, classification) classification_widget_item.setText(0, get_name(classification)) hazard_widget_item.addChild(classification_widget_item) for the_class, the_value in list(classes.items()): the_class_widget_item = QTreeWidgetItem() the_class_widget_item.setData(0, Qt.UserRole, the_class) the_class_widget_item.setText( 0, get_class_name(the_class, classification)) classification_widget_item.addChild(the_class_widget_item) # Adding widget must be happened after addChild affected_check_box = QCheckBox(self) # Set from profile_data if exist, else get default profile_value = profile_data.get( hazard, {}).get(classification, {}).get( the_class, the_value) affected_check_box.setChecked(profile_value['affected']) self.setItemWidget( the_class_widget_item, 1, affected_check_box) displacement_rate_spinbox = PercentageSpinBox(self) displacement_rate_spinbox.setValue( profile_value['displacement_rate']) displacement_rate_spinbox.setEnabled( profile_value['affected']) self.setItemWidget( the_class_widget_item, 2, displacement_rate_spinbox) # Behaviour when the check box is checked # noinspection PyUnresolvedReferences affected_check_box.stateChanged.connect( displacement_rate_spinbox.setEnabled) if hazard_widget_item.childCount() > 0: self.widget_items.append(hazard_widget_item) self.addTopLevelItems(self.widget_items) self.expandAll()
def run(self): """Run method that performs all the real work""" # Create the dialog with elements (after translation) and keep reference # Only create GUI ONCE in callback, so that it will only load when the plugin is started if self.first_start == True: self.first_start = False self.dlg = DiversityCalcDialog() self.dlg.mcbPoly.setFilters(QgsMapLayerProxyModel.PolygonLayer) self.dlg.mcbPoint.setFilters(QgsMapLayerProxyModel.PointLayer) self.dlg.fcbCategory.setFilters(QgsFieldProxyModel.String) self.dlg.fcbSpecies.setFilters(QgsFieldProxyModel.String) self.dlg.fcbCategory.setLayer(self.dlg.mcbPoly.currentLayer()) self.dlg.fcbSpecies.setLayer(self.dlg.mcbPoint.currentLayer()) # show the dialog self.dlg.show() # Run the dialog event loop result = self.dlg.exec_() # See if OK was pressed if result: # Get required input parameters from the dialog lyrPoly = self.dlg.mcbPoly.currentLayer() lyrPoint = self.dlg.mcbPoint.currentLayer() fldCategory = self.dlg.fcbCategory.currentField() fldSpecies = self.dlg.fcbSpecies.currentField() dctMain = {} for poly in lyrPoly.getFeatures(): sCategory = poly.attribute(fldCategory) QgsMessageLog.logMessage("Category: {}".format(sCategory), "Diversity Calculator", level=Qgis.Info) dctSummary = dc_summarizePoly(poly, lyrPoint, fldSpecies) QgsMessageLog.logMessage("Summary: {}".format(dctSummary), "Diversity Calculator", level=Qgis.Info) dctMain = dc_mergeDictionaries(dctMain, sCategory, dctSummary) QMessageBox.information(self.dlg, "Summary", dc_resultString(dctMain)) dlgResults = DlgResults() for category, summary in dctMain.items(): total = sum(summary.values()) twiCat = QTreeWidgetItem(dlgResults.trwResults, [ category, str(total), str(dc_richness(summary)), "{:3.3f}".format( dc_evenness(summary)), "{:3.3f}".format( dc_shannons(summary)), "{:3.3f}".format( dc_simpsons(summary)) ]) for species, obs in summary.items(): twiCat.addChild( QTreeWidgetItem(twiCat, [species, str(obs)])) dlgResults.trwResults.addTopLevelItem(twiCat) dlgResults.show() dlgResults.exec_()
class TreeLayerItem(QTreeWidgetItem): layerIcon = QIcon( os.path.join(os.path.dirname(__file__), "icons", "layer.png")) def __init__(self, iface, layer, tree, dlg): QTreeWidgetItem.__init__(self) self.iface = iface self.layer = layer self.setText(0, layer.name()) self.setIcon(0, self.layerIcon) project = QgsProject.instance() if project.layerTreeRoot().findLayer(layer.id()).isVisible(): self.setCheckState(0, Qt.Checked) else: self.setCheckState(0, Qt.Unchecked) self.visibleItem = QTreeWidgetItem(self) self.visibleCheck = QCheckBox() vis = layer.customProperty("qgis2web/Visible", True) if vis == 0 or str(vis).lower() == "false": self.visibleCheck.setChecked(False) else: self.visibleCheck.setChecked(True) self.visibleItem.setText(0, "Visible") self.addChild(self.visibleItem) tree.setItemWidget(self.visibleItem, 1, self.visibleCheck) self.interactiveItem = QTreeWidgetItem(self) self.interactiveCheck = QCheckBox() int = True if int == 0 or str(int).lower() == "false": self.interactiveCheck.setChecked(False) else: self.interactiveCheck.setChecked(True) self.interactiveItem.setText(0, "Popups") self.addChild(self.interactiveItem) tree.setItemWidget(self.interactiveItem, 1, self.interactiveCheck) if layer.type() == layer.VectorLayer: if layer.providerType() == 'WFS': self.jsonItem = QTreeWidgetItem(self) self.jsonCheck = QCheckBox() if layer.customProperty("qgis2web/Encode to JSON") == 2: self.jsonCheck.setChecked(True) self.jsonItem.setText(0, "Encode to JSON") self.jsonCheck.stateChanged.connect(self.changeJSON) self.addChild(self.jsonItem) tree.setItemWidget(self.jsonItem, 1, self.jsonCheck) if layer.geometryType() == QgsWkbTypes.PointGeometry: self.clusterItem = QTreeWidgetItem(self) self.clusterCheck = QCheckBox() if layer.customProperty("qgis2web/Cluster") == 2: self.clusterCheck.setChecked(True) self.clusterItem.setText(0, "Cluster") self.clusterCheck.stateChanged.connect(self.changeCluster) self.addChild(self.clusterItem) tree.setItemWidget(self.clusterItem, 1, self.clusterCheck) self.popupItem = QTreeWidgetItem(self) self.popupItem.setText(0, "Popup fields") options = [] fields = self.layer.fields() for f in fields: fieldIndex = fields.indexFromName(f.name()) editorWidget = layer.editorWidgetSetup(fieldIndex).type() if editorWidget == 'Hidden': continue options.append(f.name()) for option in options: self.attr = QTreeWidgetItem(self) self.attrWidget = QComboBox() self.attrWidget.addItem("no label") self.attrWidget.addItem("inline label") self.attrWidget.addItem("header label") custProp = layer.customProperty("qgis2web/popup/" + option) if (custProp != "" and custProp is not None): self.attrWidget.setCurrentIndex( self.attrWidget.findText( layer.customProperty("qgis2web/popup/" + option))) self.attr.setText(1, option) self.popupItem.addChild(self.attr) tree.setItemWidget(self.attr, 2, self.attrWidget) self.addChild(self.popupItem) else: if layer.providerType() == 'wms': self.getFeatureInfoItem = QTreeWidgetItem(self) self.getFeatureInfoCheck = QCheckBox() if layer.customProperty("qgis2web/GetFeatureInfo") == 2: self.getFeatureInfoCheck.setChecked(True) self.getFeatureInfoItem.setText(0, "Enable GetFeatureInfo?") self.getFeatureInfoCheck.stateChanged.connect( self.changeGetFeatureInfo) self.addChild(self.getFeatureInfoItem) tree.setItemWidget(self.getFeatureInfoItem, 1, self.getFeatureInfoCheck) @property def popup(self): popup = [] self.tree = self.treeWidget() for p in range(self.childCount()): item = self.child(p).text(1) if item != "": popupVal = self.tree.itemWidget(self.child(p), 2).currentText() pair = (item, popupVal) popup.append(pair) popup = OrderedDict(popup) return popup @property def visible(self): return self.visibleCheck.isChecked() @property def interactive(self): return self.interactiveCheck.isChecked() @property def json(self): try: return self.jsonCheck.isChecked() except Exception: return False @property def cluster(self): try: return self.clusterCheck.isChecked() except Exception: return False @property def getFeatureInfo(self): try: return self.getFeatureInfoCheck.isChecked() except Exception: return False def changeJSON(self, isJSON): self.layer.setCustomProperty("qgis2web/Encode to JSON", isJSON) def changeCluster(self, isCluster): self.layer.setCustomProperty("qgis2web/Cluster", isCluster) def changeGetFeatureInfo(self, isGetFeatureInfo): self.layer.setCustomProperty("qgis2web/GetFeatureInfo", isGetFeatureInfo)
def fillAlgorithmTreeUsingProviders(self): self.algorithmTree.clear() text = str(self.searchBox.text()) search_strings = text.split(' ') qgis_groups = {} for provider in QgsApplication.processingRegistry().providers(): if not provider.isActive(): continue groups = {} # Add algorithms for alg in provider.algorithms(): if alg.flags() & QgsProcessingAlgorithm.FlagHideFromModeler: continue if alg.id() == self.model.id(): continue item_text = [alg.displayName().lower()] item_text.extend(alg.tags()) show = not search_strings or all( any(part in t for t in item_text) for part in search_strings) if show: if alg.group() in groups: groupItem = groups[alg.group()] elif provider.id() in ( 'qgis', 'native') and alg.group() in qgis_groups: groupItem = qgis_groups[alg.group()] else: groupItem = QTreeWidgetItem() name = alg.group() groupItem.setText(0, name) groupItem.setToolTip(0, name) groupItem.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) if provider.id() in ('qgis', 'native'): groupItem.setIcon(0, provider.icon()) qgis_groups[alg.group()] = groupItem else: groups[alg.group()] = groupItem algItem = TreeAlgorithmItem(alg) groupItem.addChild(algItem) if len(groups) > 0: providerItem = QTreeWidgetItem() providerItem.setText(0, provider.name()) providerItem.setToolTip(0, provider.name()) providerItem.setIcon(0, provider.icon()) providerItem.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) for groupItem in list(groups.values()): providerItem.addChild(groupItem) self.algorithmTree.addTopLevelItem(providerItem) providerItem.setExpanded(text != '') for groupItem in list(groups.values()): if text != '': groupItem.setExpanded(True) if len(qgis_groups) > 0: for groupItem in list(qgis_groups.values()): self.algorithmTree.addTopLevelItem(groupItem) for groupItem in list(qgis_groups.values()): if text != '': groupItem.setExpanded(True) self.algorithmTree.sortItems(0, Qt.AscendingOrder)
def __init__(self): super(TestSelector, self).__init__() self.setupUi(self) self.tests = None self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.layout().insertWidget(1, self.bar) allTests = defaultdict(list) for test in tests.tests: allTests[test.group].append(test) for group, groupTests in iteritems(allTests): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate); unitItem = QTreeWidgetItem() unitItem.setText(0, "Fully automated tests") unitItem.setFlags(unitItem.flags() | Qt.ItemIsTristate); manualItem = QTreeWidgetItem() manualItem.setText(0, "Manual and semi-automated tests") manualItem.setFlags(manualItem.flags() | Qt.ItemIsTristate); unitTestsByCategories = defaultdict(list) manualTestsByCategories = defaultdict(list) for test in groupTests: if isinstance(test, UnitTestWrapper): unitTestsByCategories[test.category].append(test) else: manualTestsByCategories[test.category].append(test) for testsList, parentItem in [(unitTestsByCategories, unitItem), (manualTestsByCategories, manualItem)]: for cat, catTests in iteritems(testsList): categoryItem = QTreeWidgetItem() categoryItem.setText(0, cat) categoryItem.setFlags(manualItem.flags() | Qt.ItemIsTristate); for test in catTests: testItem = QTreeWidgetItem() testItem.setFlags(testItem.flags() | Qt.ItemIsUserCheckable); testItem.setCheckState(0, Qt.Unchecked); testItem.test = test testItem.setText(0, test.name) categoryItem.addChild(testItem) parentItem.addChild(categoryItem) if manualItem.childCount(): groupItem.addChild(manualItem) if unitItem.childCount(): groupItem.addChild(unitItem) self.testsTree.addTopLevelItem(groupItem) groupItem.setExpanded(True) self.buttonBox.button(QDialogButtonBox.Ok).setText("Run selected tests") self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.selectAllLabel.linkActivated.connect(lambda: self.checkTests(lambda t: Qt.Checked)) self.unselectAllLabel.linkActivated.connect(lambda: self.checkTests(lambda t: Qt.Unchecked)) def _onlyManual(t): if isinstance(t, UnitTestWrapper): return Qt.Unchecked else: return Qt.Checked self.onlyManualLabel.linkActivated.connect(lambda: self.checkTests(_onlyManual)) def _onlyUnit(t): if isinstance(t, UnitTestWrapper): return Qt.Checked else: return Qt.Unchecked self.onlyUnitLabel.linkActivated.connect(lambda: self.checkTests(_onlyUnit)) filepath = os.path.expanduser("~/.testerplugin/failed.txt") if os.path.exists(filepath): with open(filepath) as f: failed = json.load(f) else: failed = [] def _onlyLastFailures(t): if t.group in failed and t.name in failed[t.group]: return Qt.Checked else: return Qt.Unchecked self.onlyLastFailuresLabel.linkActivated.connect(lambda: self.checkTests(_onlyLastFailures)) self.exportButton.clicked.connect(self.export)
class DSManagerModel(QAbstractItemModel): __metaclass__ = QSingleton COLUMN_GROUP_DS = 0 COLUMN_VISIBILITY = 1 COLUMN_SOURCE = 2 # instance = None # @classmethod # def getInstance(cls): # if cls.instance def __init__(self, parent=None): super(DSManagerModel, self).__init__(parent) self.columnNames = [] self.columnNames.insert(self.COLUMN_GROUP_DS, self.tr("Group/DS")) self.columnNames.insert(self.COLUMN_VISIBILITY, self.tr("Visible")) self.columnNames.insert(self.COLUMN_SOURCE, self.tr("Source")) self.rootItem = QTreeWidgetItem(self.columnNames) self.__setupModelData() def resetModel(self): self.beginResetModel() self.__clear() self.__setupModelData() self.endResetModel() self.modelReset.emit() def __clear(self): for groupIndex in range(self.rootItem.childCount() - 1, -1, -1): groupItem = self.rootItem.child(groupIndex) for dsIndex in range(groupItem.childCount() - 1, -1, -1): dsItem = groupItem.child(dsIndex) groupItem.removeChild(dsItem) self.rootItem.removeChild(groupItem) def __setupModelData(self): dsList = DataSourcesList().data_sources.values() groupInfoList = GroupsList().groups groupsItems = [] groups = [] for ds in dsList: if ds.group in groups: group_item = groupsItems[groups.index(ds.group)] else: group_item = QTreeWidgetItem() group_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group) group_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") group_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.Unchecked) groupInfo = groupInfoList.get(ds.group) if groupInfo is not None: group_item.setIcon(self.COLUMN_GROUP_DS, QIcon(groupInfo.icon)) else: group_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group + " (%s!)" % self.tr("group not found")) group_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, groupInfo) groups.append(ds.group) groupsItems.append(group_item) self.rootItem.addChild(group_item) ds_item = QTreeWidgetItem() ds_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.alias) ds_item.setIcon(self.COLUMN_GROUP_DS, QIcon(ds.icon_path)) ds_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, ds) ds_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") ds_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) ds_check_state = Qt.Checked if ds.id in PluginSettings.get_hide_ds_id_list(): ds_check_state = Qt.Unchecked ds_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) if group_item.childCount() != 0 and group_item.checkState(1) != ds_check_state: group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.PartiallyChecked) else: group_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) group_item.addChild( ds_item ) def setData(self, index, value, role): if not index.isValid(): return False else: item = index.internalPointer() if role == Qt.CheckStateRole: item.setData(self.COLUMN_VISIBILITY, role, value) self.dataChanged.emit( index, index ) self.updateChecks(index, value) return True def updateChecks(self, index, checkState): if self.hasChildren(index): for row in range(0, self.rowCount(index)): childItem = index.internalPointer().child(row) childItem.setCheckState(index.column(), checkState) self.dataChanged.emit( self.index(0, index.column(), index), self.index(row, index.column(), index) ) else: parentIndex = self.parent(index) parentItem = parentIndex.internalPointer() diff = False for row in range(0, self.rowCount(parentIndex)): childItem = parentItem.child(row) if childItem.checkState(index.column()) != checkState: diff = True break if diff: parentItem.setCheckState(index.column(), Qt.PartiallyChecked) else: parentItem.setCheckState(index.column(), checkState) self.dataChanged.emit( parentIndex, parentIndex ) def columnCount(self, parent): if parent.isValid(): return parent.internalPointer().columnCount() else: return self.rootItem.columnCount() def data(self, index, role): if not index.isValid(): return None if role not in [Qt.DisplayRole, Qt.CheckStateRole, Qt.DecorationRole, Qt.UserRole]: return None item = index.internalPointer() return item.data(index.column(), role) def flags(self, index): if not index.isValid(): item = self.rootItem else: item = index.internalPointer() return item.flags() def headerData(self, section, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole: return self.rootItem.data(section, Qt.DisplayRole) return None def index(self, row, column, parent): if not self.hasIndex(row, column, parent): return QModelIndex() if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() childItem = parentItem.child(row) if childItem: return self.createIndex(row, column, childItem) else: return QModelIndex() def parent(self, index): if not index.isValid(): return QModelIndex() childItem = index.internalPointer() parentItem = childItem.parent() if parentItem == self.rootItem: return QModelIndex() return self.createIndex(parentItem.parent().indexOfChild(parentItem), index.column(), parentItem) def rowCount(self, parent): if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() return parentItem.childCount() def sort(self, column, order=Qt.AscendingOrder): self.layoutAboutToBeChanged.emit() if column == self.COLUMN_VISIBILITY: role = Qt.CheckStateRole else: role = Qt.DisplayRole if order == Qt.AscendingOrder: # compareFunc = lambda a, b: True if cmp(a, b) < 0 else False compareFunc = lambda a, b: a < b # need to check else: # compareFunc = lambda a, b: True if cmp(a, b) > 0 else False compareFunc = lambda a, b: a >= b # need to check for groupIndexI in range(0, self.rootItem.childCount()): for groupIndexJ in range(0, groupIndexI): groupItemI = self.rootItem.child(groupIndexI) groupItemJ = self.rootItem.child(groupIndexJ) if compareFunc(groupItemI.data(column, role), groupItemJ.data(column, role)): self.rootItem.insertChild(groupIndexJ, self.rootItem.takeChild(groupIndexI)) break self.layoutChanged.emit() def checkAll(self): for row in range(0, self.rootItem.childCount()): groupItem = self.rootItem.child(row) groupIndex = self.createIndex(row, self.COLUMN_VISIBILITY, groupItem) self.setData(groupIndex, Qt.Checked, Qt.CheckStateRole) def uncheckAll(self): for row in range(0, self.rootItem.childCount()): groupItem = self.rootItem.child(row) groupIndex = self.createIndex(row, self.COLUMN_VISIBILITY, groupItem) self.setData(groupIndex, Qt.Unchecked, Qt.CheckStateRole) def saveSettings(self): hideDSidList = [] for groupIndex in range(0, self.rootItem.childCount()): groupItem = self.rootItem.child(groupIndex) for dsIndex in range(0, groupItem.childCount()): dsItem = groupItem.child(dsIndex) if dsItem.checkState(self.COLUMN_VISIBILITY) == Qt.Unchecked: hideDSidList.append(dsItem.data(self.COLUMN_GROUP_DS, Qt.UserRole).id) PluginSettings.set_hide_ds_id_list(hideDSidList) def isGroup(self, index): childItem = index.internalPointer() parentItem = childItem.parent() if parentItem == self.rootItem: return True return False
def populate(self): groups = {} count = 0 algs = self.provider.algorithms() active = self.provider.isActive() # Add algorithms for alg in algs: if alg.flags() & QgsProcessingAlgorithm.FlagHideFromToolbox: continue if alg.group() in groups: groupItem = groups[alg.group()] else: groupItem = QTreeWidgetItem() name = alg.group() if not active: groupItem.setForeground(0, Qt.darkGray) groupItem.setText(0, name) groupItem.setToolTip(0, name) groups[alg.group()] = groupItem algItem = TreeAlgorithmItem(alg) if not active: algItem.setForeground(0, Qt.darkGray) groupItem.addChild(algItem) count += 1 if self.provider.id() in ProviderActions.actions: actions = ProviderActions.actions[self.provider.id()] for action in actions: if action.group in groups: groupItem = groups[action.group] else: groupItem = QTreeWidgetItem() groupItem.setText(0, action.group) groups[action.group] = groupItem algItem = TreeActionItem(action) groupItem.addChild(algItem) text = self.provider.name() if not active: def activateProvider(): self.toolbox.activateProvider(self.provider.id()) label = QLabel(text + " <a href='%s'>Activate</a>") label.setStyleSheet( "QLabel {background-color: white; color: grey;}") label.linkActivated.connect(activateProvider) self.tree.setItemWidget(self, 0, label) else: text += QCoreApplication.translate( "TreeProviderItem", " [{0} geoalgorithms]").format(count) self.setText(0, text) self.setToolTip(0, self.text(0)) for groupItem in list(groups.values()): self.addChild(groupItem) self.setHidden(self.childCount() == 0)
def fillTree(self): layersItem = QTreeWidgetItem() layersItem.setText(0, self.tr('Values from data layers extents')) self.treeValues.addTopLevelItem(layersItem) layers = dataobjects.getAllLayers() for layer in layers: layerItem = QTreeWidgetItem() layerItem.setText(0, unicode(layer.name())) layerItem.addChild(TreeValueItem(self.tr('Min X'), layer.extent().xMinimum())) layerItem.addChild(TreeValueItem(self.tr('Max X'), layer.extent().xMaximum())) layerItem.addChild(TreeValueItem(self.tr('Min Y'), layer.extent().yMinimum())) layerItem.addChild(TreeValueItem(self.tr('Max Y'), layer.extent().yMaximum())) if isinstance(layer, QgsRasterLayer): cellsize = (layer.extent().xMaximum() - layer.extent().xMinimum()) / layer.width() layerItem.addChild(TreeValueItem(self.tr('Cellsize'), cellsize)) layersItem.addChild(layerItem) layersItem = QTreeWidgetItem() layersItem.setText(0, self.tr('Values from raster layers statistics')) self.treeValues.addTopLevelItem(layersItem) layers = dataobjects.getRasterLayers() for layer in layers: for i in range(layer.bandCount()): stats = layer.dataProvider().bandStatistics(i + 1) layerItem = QTreeWidgetItem() layerItem.setText(0, unicode(layer.name())) layerItem.addChild(TreeValueItem(self.tr('Mean'), stats.mean)) layerItem.addChild(TreeValueItem(self.tr('Std. deviation'), stats.stdDev)) layerItem.addChild(TreeValueItem(self.tr('Max value'), stats.maximumValue)) layerItem.addChild(TreeValueItem(self.tr('Min value'), stats.minimumValue)) layersItem.addChild(layerItem) canvasItem = QTreeWidgetItem() canvasItem.setText(0, self.tr('Values from QGIS map canvas')) self.treeValues.addTopLevelItem(canvasItem) extent = iface.mapCanvas().extent() extentItem = QTreeWidgetItem() extentItem.setText(0, self.tr('Current extent')) extentItem.addChild(TreeValueItem(self.tr('Min X'), extent.xMinimum())) extentItem.addChild(TreeValueItem(self.tr('Max X'), extent.xMaximum())) extentItem.addChild(TreeValueItem(self.tr('Min Y'), extent.yMinimum())) extentItem.addChild(TreeValueItem(self.tr('Max Y'), extent.yMaximum())) canvasItem.addChild(extentItem) extent = iface.mapCanvas().fullExtent() extentItem = QTreeWidgetItem() extentItem.setText(0, self.tr('Full extent of all layers in map canvas')) extentItem.addChild(TreeValueItem(self.tr('Min X'), extent.xMinimum())) extentItem.addChild(TreeValueItem(self.tr('Max X'), extent.xMaximum())) extentItem.addChild(TreeValueItem(self.tr('Min Y'), extent.yMinimum())) extentItem.addChild(TreeValueItem(self.tr('Max Y'), extent.yMaximum())) canvasItem.addChild(extentItem)
class DSManagerModel(QAbstractItemModel): __metaclass__ = QSingleton COLUMN_GROUP_DS = 0 COLUMN_VISIBILITY = 1 COLUMN_SOURCE = 2 # instance = None # @classmethod # def getInstance(cls): # if cls.instance def __init__(self, parent=None): super(DSManagerModel, self).__init__(parent) self.columnNames = [] self.columnNames.insert(self.COLUMN_GROUP_DS, self.tr("Group/DS")) self.columnNames.insert(self.COLUMN_VISIBILITY, self.tr("Visible")) self.columnNames.insert(self.COLUMN_SOURCE, self.tr("Source")) self.rootItem = QTreeWidgetItem(self.columnNames) self.__setupModelData() def resetModel(self): self.beginResetModel() self.__clear() self.__setupModelData() self.endResetModel() self.modelReset.emit() def __clear(self): for groupIndex in range(self.rootItem.childCount() - 1, -1, -1): groupItem = self.rootItem.child(groupIndex) for dsIndex in range(groupItem.childCount() - 1, -1, -1): dsItem = groupItem.child(dsIndex) groupItem.removeChild(dsItem) self.rootItem.removeChild(groupItem) def __setupModelData(self): dsList = DataSourcesList().data_sources.values() groupInfoList = GroupsList().groups groupsItems = [] groups = [] for ds in dsList: if ds.group in groups: group_item = groupsItems[groups.index(ds.group)] else: group_item = QTreeWidgetItem() group_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group) group_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") group_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.Unchecked) groupInfo = groupInfoList.get(ds.group) if groupInfo is not None: group_item.setIcon(self.COLUMN_GROUP_DS, QIcon(groupInfo.icon)) else: group_item.setData( self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.group + " (%s!)" % self.tr("group not found")) group_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, groupInfo) groups.append(ds.group) groupsItems.append(group_item) self.rootItem.addChild(group_item) ds_item = QTreeWidgetItem() ds_item.setData(self.COLUMN_GROUP_DS, Qt.DisplayRole, ds.alias) ds_item.setIcon(self.COLUMN_GROUP_DS, QIcon(ds.icon_path)) ds_item.setData(self.COLUMN_GROUP_DS, Qt.UserRole, ds) ds_item.setData(self.COLUMN_VISIBILITY, Qt.DisplayRole, "") ds_item.setData(self.COLUMN_SOURCE, Qt.DisplayRole, ds.category) ds_check_state = Qt.Checked if ds.id in PluginSettings.get_hide_ds_id_list(): ds_check_state = Qt.Unchecked ds_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) if group_item.childCount() != 0 and group_item.checkState( 1) != ds_check_state: group_item.setCheckState(self.COLUMN_VISIBILITY, Qt.PartiallyChecked) else: group_item.setCheckState(self.COLUMN_VISIBILITY, ds_check_state) group_item.addChild(ds_item) def setData(self, index, value, role): if not index.isValid(): return False else: item = index.internalPointer() if role == Qt.CheckStateRole: item.setData(self.COLUMN_VISIBILITY, role, value) self.dataChanged.emit(index, index) self.updateChecks(index, value) return True def updateChecks(self, index, checkState): if self.hasChildren(index): for row in range(0, self.rowCount(index)): childItem = index.internalPointer().child(row) childItem.setCheckState(index.column(), checkState) self.dataChanged.emit(self.index(0, index.column(), index), self.index(row, index.column(), index)) else: parentIndex = self.parent(index) parentItem = parentIndex.internalPointer() diff = False for row in range(0, self.rowCount(parentIndex)): childItem = parentItem.child(row) if childItem.checkState(index.column()) != checkState: diff = True break if diff: parentItem.setCheckState(index.column(), Qt.PartiallyChecked) else: parentItem.setCheckState(index.column(), checkState) self.dataChanged.emit(parentIndex, parentIndex) def columnCount(self, parent): if parent.isValid(): return parent.internalPointer().columnCount() else: return self.rootItem.columnCount() def data(self, index, role): if not index.isValid(): return None if role not in [ Qt.DisplayRole, Qt.CheckStateRole, Qt.DecorationRole, Qt.UserRole ]: return None item = index.internalPointer() return item.data(index.column(), role) def flags(self, index): if not index.isValid(): item = self.rootItem else: item = index.internalPointer() return item.flags() def headerData(self, section, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole: return self.rootItem.data(section, Qt.DisplayRole) return None def index(self, row, column, parent): if not self.hasIndex(row, column, parent): return QModelIndex() if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() childItem = parentItem.child(row) if childItem: return self.createIndex(row, column, childItem) else: return QModelIndex() def parent(self, index): if not index.isValid(): return QModelIndex() childItem = index.internalPointer() parentItem = childItem.parent() if parentItem == self.rootItem: return QModelIndex() return self.createIndex(parentItem.parent().indexOfChild(parentItem), index.column(), parentItem) def rowCount(self, parent): if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() return parentItem.childCount() def sort(self, column, order=Qt.AscendingOrder): self.layoutAboutToBeChanged.emit() if column == self.COLUMN_VISIBILITY: role = Qt.CheckStateRole else: role = Qt.DisplayRole if order == Qt.AscendingOrder: # compareFunc = lambda a, b: True if cmp(a, b) < 0 else False compareFunc = lambda a, b: a < b # need to check else: # compareFunc = lambda a, b: True if cmp(a, b) > 0 else False compareFunc = lambda a, b: a >= b # need to check for groupIndexI in range(0, self.rootItem.childCount()): for groupIndexJ in range(0, groupIndexI): groupItemI = self.rootItem.child(groupIndexI) groupItemJ = self.rootItem.child(groupIndexJ) if compareFunc(groupItemI.data(column, role), groupItemJ.data(column, role)): self.rootItem.insertChild( groupIndexJ, self.rootItem.takeChild(groupIndexI)) break self.layoutChanged.emit() def checkAll(self): for row in range(0, self.rootItem.childCount()): groupItem = self.rootItem.child(row) groupIndex = self.createIndex(row, self.COLUMN_VISIBILITY, groupItem) self.setData(groupIndex, Qt.Checked, Qt.CheckStateRole) def uncheckAll(self): for row in range(0, self.rootItem.childCount()): groupItem = self.rootItem.child(row) groupIndex = self.createIndex(row, self.COLUMN_VISIBILITY, groupItem) self.setData(groupIndex, Qt.Unchecked, Qt.CheckStateRole) def saveSettings(self): hideDSidList = [] for groupIndex in range(0, self.rootItem.childCount()): groupItem = self.rootItem.child(groupIndex) for dsIndex in range(0, groupItem.childCount()): dsItem = groupItem.child(dsIndex) if dsItem.checkState(self.COLUMN_VISIBILITY) == Qt.Unchecked: hideDSidList.append( dsItem.data(self.COLUMN_GROUP_DS, Qt.UserRole).id) PluginSettings.set_hide_ds_id_list(hideDSidList) def isGroup(self, index): childItem = index.internalPointer() parentItem = childItem.parent() if parentItem == self.rootItem: return True return False
def __init__(self): super(TestSelector, self).__init__() self.setupUi(self) self.tests = None self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.layout().insertWidget(1, self.bar) allTests = defaultdict(list) for test in tests.tests: allTests[test.group].append(test) for group, groupTests in allTests.items(): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate) unitItem = QTreeWidgetItem() unitItem.setText(0, 'Fully Automated Tests') unitItem.setFlags(unitItem.flags() | Qt.ItemIsTristate) manualItem = QTreeWidgetItem() manualItem.setText(0, 'Manual and Semi-Automated Tests') manualItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) unitTestsByCategories = defaultdict(list) manualTestsByCategories = defaultdict(list) for test in groupTests: if isinstance(test, UnitTestWrapper): unitTestsByCategories[test.category].append(test) else: manualTestsByCategories[test.category].append(test) for testsList, parentItem in [(unitTestsByCategories, unitItem), (manualTestsByCategories, manualItem) ]: for cat, catTests in testsList.items(): categoryItem = QTreeWidgetItem() categoryItem.setText(0, cat) categoryItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) for test in catTests: testItem = QTreeWidgetItem() testItem.setFlags(testItem.flags() | Qt.ItemIsUserCheckable) testItem.setCheckState(0, Qt.Unchecked) testItem.test = test testItem.setText(0, test.name) categoryItem.addChild(testItem) parentItem.addChild(categoryItem) if manualItem.childCount(): groupItem.addChild(manualItem) if unitItem.childCount(): groupItem.addChild(unitItem) self.testsTree.addTopLevelItem(groupItem) groupItem.setExpanded(True) self.testsTree.itemChanged.connect(self.toggleRunButton) self.buttonBox.button( QDialogButtonBox.Ok).setText('Run Selected Tests') self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.selectAllLabel.linkActivated.connect( lambda: self.checkTests(lambda t: Qt.Checked)) self.unselectAllLabel.linkActivated.connect( lambda: self.checkTests(lambda t: Qt.Unchecked)) def _onlyManual(t): if isinstance(t, UnitTestWrapper): return Qt.Unchecked else: return Qt.Checked self.onlyManualLabel.linkActivated.connect( lambda: self.checkTests(_onlyManual)) def _onlyUnit(t): if isinstance(t, UnitTestWrapper): return Qt.Checked else: return Qt.Unchecked self.onlyUnitLabel.linkActivated.connect( lambda: self.checkTests(_onlyUnit)) filepath = os.path.expanduser('~/.testerplugin/failed.txt') if os.path.exists(filepath): with open(filepath) as f: failed = json.load(f) else: failed = [] def _onlyLastFailures(t): if t.group in failed and t.name in failed[t.group]: return Qt.Checked else: return Qt.Unchecked self.onlyLastFailuresLabel.linkActivated.connect( lambda: self.checkTests(_onlyLastFailures)) self.exportButton.clicked.connect(self.export)
def fillTree(self): layersItem = QTreeWidgetItem() layersItem.setText(0, self.tr('Values from data layers extents')) self.treeValues.addTopLevelItem(layersItem) layers = dataobjects.getAllLayers() for layer in layers: layerItem = QTreeWidgetItem() layerItem.setText(0, str(layer.name())) layerItem.addChild(TreeValueItem(self.tr('Min X'), layer.extent().xMinimum())) layerItem.addChild(TreeValueItem(self.tr('Max X'), layer.extent().xMaximum())) layerItem.addChild(TreeValueItem(self.tr('Min Y'), layer.extent().yMinimum())) layerItem.addChild(TreeValueItem(self.tr('Max Y'), layer.extent().yMaximum())) if isinstance(layer, QgsRasterLayer): cellsize = (layer.extent().xMaximum() - layer.extent().xMinimum()) / layer.width() layerItem.addChild(TreeValueItem(self.tr('Cellsize'), cellsize)) layersItem.addChild(layerItem) layersItem = QTreeWidgetItem() layersItem.setText(0, self.tr('Values from raster layers statistics')) self.treeValues.addTopLevelItem(layersItem) layers = dataobjects.getRasterLayers() for layer in layers: for i in range(layer.bandCount()): stats = layer.dataProvider().bandStatistics(i + 1) layerItem = QTreeWidgetItem() layerItem.setText(0, str(layer.name())) layerItem.addChild(TreeValueItem(self.tr('Mean'), stats.mean)) layerItem.addChild(TreeValueItem(self.tr('Std. deviation'), stats.stdDev)) layerItem.addChild(TreeValueItem(self.tr('Max value'), stats.maximumValue)) layerItem.addChild(TreeValueItem(self.tr('Min value'), stats.minimumValue)) layersItem.addChild(layerItem) canvasItem = QTreeWidgetItem() canvasItem.setText(0, self.tr('Values from QGIS map canvas')) self.treeValues.addTopLevelItem(canvasItem) extent = iface.mapCanvas().extent() extentItem = QTreeWidgetItem() extentItem.setText(0, self.tr('Current extent')) extentItem.addChild(TreeValueItem(self.tr('Min X'), extent.xMinimum())) extentItem.addChild(TreeValueItem(self.tr('Max X'), extent.xMaximum())) extentItem.addChild(TreeValueItem(self.tr('Min Y'), extent.yMinimum())) extentItem.addChild(TreeValueItem(self.tr('Max Y'), extent.yMaximum())) canvasItem.addChild(extentItem) extent = iface.mapCanvas().fullExtent() extentItem = QTreeWidgetItem() extentItem.setText(0, self.tr('Full extent of all layers in map canvas')) extentItem.addChild(TreeValueItem(self.tr('Min X'), extent.xMinimum())) extentItem.addChild(TreeValueItem(self.tr('Max X'), extent.xMaximum())) extentItem.addChild(TreeValueItem(self.tr('Min Y'), extent.yMinimum())) extentItem.addChild(TreeValueItem(self.tr('Max Y'), extent.yMaximum())) canvasItem.addChild(extentItem)
class MainDialog(QDialog, FORM_CLASS): """The main dialog of QGIS2Web plugin.""" items = {} def __init__(self, iface, parent=None): super(MainDialog, self).__init__(parent) QDialog.__init__(self) self.setupUi(self) self.iface = iface self.previewUrl = None self.layer_search_combo = None self.layer_filter_select = None self.exporter_combo = None self.feedback = FeedbackDialog(self) self.feedback.setModal(True) stgs = QSettings() self.restoreGeometry( stgs.value("qgis2web/MainDialogGeometry", QByteArray(), type=QByteArray)) self.verticalLayout_2.addStretch() self.horizontalLayout_6.addStretch() if stgs.value("qgis2web/previewOnStartup", Qt.Checked) == Qt.Checked: self.previewOnStartup.setCheckState(Qt.Checked) else: self.previewOnStartup.setCheckState(Qt.Unchecked) if stgs.value("qgis2web/closeFeedbackOnSuccess", Qt.Checked) == Qt.Checked: self.closeFeedbackOnSuccess.setCheckState(Qt.Checked) else: self.closeFeedbackOnSuccess.setCheckState(Qt.Unchecked) self.previewFeatureLimit.setText( stgs.value("qgis2web/previewFeatureLimit", "1000")) self.appearanceParams.setSelectionMode( QAbstractItemView.SingleSelection) self.preview = None if webkit_available: widget = QWebView() self.preview = widget try: # if os.environ["TRAVIS"]: self.preview.setPage(WebPage()) except Exception: print("Failed to set custom webpage") webview = self.preview.page() webview.setNetworkAccessManager(QgsNetworkAccessManager.instance()) self.preview.settings().setAttribute( QWebSettings.DeveloperExtrasEnabled, True) self.preview.settings().setAttribute( QWebSettings.DnsPrefetchEnabled, True) else: widget = QTextBrowser() widget.setText( self.tr('Preview is not available since QtWebKit ' 'dependency is missing on your system')) self.right_layout.insertWidget(0, widget) self.populateConfigParams(self) self.populate_layers_and_groups(self) self.populateLayerSearch() self.populateAttrFilter() writer = WRITER_REGISTRY.createWriterFromProject() self.setStateToWriter(writer) self.exporter = EXPORTER_REGISTRY.createFromProject() self.exporter_combo.setCurrentIndex( self.exporter_combo.findText(self.exporter.name())) self.exporter_combo.currentIndexChanged.connect( self.exporterTypeChanged) self.toggleOptions() if webkit_available: if self.previewOnStartup.checkState() == Qt.Checked: self.autoUpdatePreview() self.buttonPreview.clicked.connect(self.previewMap) else: self.buttonPreview.setDisabled(True) QgsProject.instance().cleared.connect(self.reject) self.layersTree.model().dataChanged.connect(self.populateLayerSearch) self.layersTree.model().dataChanged.connect(self.populateAttrFilter) self.ol3.clicked.connect(self.changeFormat) self.leaflet.clicked.connect(self.changeFormat) self.mapbox.clicked.connect(self.changeFormat) self.buttonExport.clicked.connect(self.saveMap) helpText = os.path.join(os.path.dirname(os.path.realpath(__file__)), "helpFile.md") self.helpField.setSource(QUrl.fromLocalFile(helpText)) if webkit_available: self.devConsole = QWebInspector(self.preview) self.devConsole.setFixedHeight(0) self.devConsole.setObjectName("devConsole") self.devConsole.setPage(self.preview.page()) self.devConsole.hide() self.right_layout.insertWidget(1, self.devConsole) self.filter = devToggleFilter() self.filter.devToggle.connect(self.showHideDevConsole) self.installEventFilter(self.filter) self.setModal(False) @pyqtSlot(bool) def showHideDevConsole(self, visible): self.devConsole.setVisible(visible) def changeFormat(self): self.autoUpdatePreview() self.toggleOptions() def exporterTypeChanged(self): new_exporter_name = self.exporter_combo.currentText() try: self.exporter = [ e for e in EXPORTER_REGISTRY.getExporters() if e.name() == new_exporter_name ][0]() except Exception: pass def currentMapFormat(self): """ Returns the currently selected map writer type """ return self.getWriterFactory().type() def getWriterFactory(self): """ Returns a factory to create the currently selected map writer """ if self.mapFormat.checkedButton() == self.ol3: return OpenLayersWriter elif self.mapFormat.checkedButton() == self.leaflet: return LeafletWriter elif self.mapFormat.checkedButton() == self.mapbox: return MapboxWriter def createWriter(self): """ Creates a writer object reflecting the current settings in the dialog """ writer = self.getWriterFactory()() (writer.layers, writer.groups, writer.popup, writer.visible, writer.interactive, writer.json, writer.cluster, writer.getFeatureInfo) = self.getLayersAndGroups() writer.params = self.getParameters() return writer def showErrorMessage(self, error): """ Shows an error message in the preview window """ html = "<html>" html += "<head></head>" html += "<style>body {font-family: sans-serif;}</style>" html += "<body><h1>Error</h1>" html += "<p>qgis2web produced an error:</p><code>" html += error html += "</code></body></html>" if self.preview: self.preview.setHtml(html) def showFeedbackMessage(self, title, message): """ Shows a feedback message in the preview window """ html = "<html>" html += "<head></head>" html += "<style>body {font-family: sans-serif;}</style>" html += "<body><h1>{}</h1>".format(title) html += "<p>{}</p>".format(message) html += "</body></html>" if self.preview: self.preview.setHtml(html) def toggleOptions(self): currentWriter = self.getWriterFactory() for param, value in specificParams.items(): treeParam = self.appearanceParams.findItems( param, Qt.MatchExactly | Qt.MatchRecursive)[0] if currentWriter == OpenLayersWriter: if value == "OL3": treeParam.setDisabled(False) if treeParam.combo: treeParam.combo.setEnabled(True) else: treeParam.setDisabled(True) if treeParam.combo: treeParam.combo.setEnabled(False) else: if value == "OL3": treeParam.setDisabled(True) if treeParam.combo: treeParam.combo.setEnabled(False) else: treeParam.setDisabled(False) if treeParam.combo: treeParam.combo.setEnabled(True) for option, value in specificOptions.items(): treeOptions = self.layersTree.findItems( option, Qt.MatchExactly | Qt.MatchRecursive) for treeOption in treeOptions: if currentWriter == OpenLayersWriter: if value == "OL3": treeOption.setDisabled(False) else: treeOption.setDisabled(True) else: if value == "OL3": treeOption.setDisabled(True) else: treeOption.setDisabled(False) def createPreview(self): writer = self.createWriter() return writer.write(self.iface, dest_folder=utils.tempFolder()).index_file def shouldAutoPreview(self): """ Returns a tuple, with a bool for whether the preview should automatically be generated, and a string for explanations as to why the preview cannot be automatically generated """ writer = self.createWriter() total_features = 0 for layer in writer.layers: if isinstance(layer, QgsVectorLayer): total_features += layer.featureCount() if total_features > int(self.previewFeatureLimit.text()): # Too many features => too slow! return (False, self.tr('<p>A large number of features are ' 'present in the map. Generating the ' 'preview may take some time.</p>' '<p>Click Update Preview to generate the ' 'preview anyway.</p>')) return (True, None) def autoUpdatePreview(self): """ Triggered when a preview will be automatically generated, i.e. not as a result of the user manually clicking the Update Preview button. """ (auto_preview, message) = self.shouldAutoPreview() if not auto_preview: self.showFeedbackMessage(self.tr('Preview Map'), message) else: self.previewMap() def previewMap(self): preview_file = self.createPreview() self.loadPreviewFile(preview_file) def saveMap(self): writer = self.createWriter() write_folder = self.exporter.exportDirectory() if not write_folder: return self.feedback.reset() self.feedback.show() results = writer.write(self.iface, dest_folder=write_folder, feedback=self.feedback) self.feedback.showFeedback('Success') if self.closeFeedbackOnSuccess.checkState() == Qt.Checked: self.feedback.close() result = self.exporter.postProcess(results, feedback=self.feedback) if result and (not os.environ.get('CI') and not os.environ.get('TRAVIS')): webbrowser.open_new_tab(self.exporter.destinationUrl()) def populate_layers_and_groups(self, dlg): """Populate layers on QGIS into our layers and group tree view.""" root_node = QgsProject.instance().layerTreeRoot() tree_groups = [] tree_layers = root_node.findLayers() self.layers_item = QTreeWidgetItem() self.layers_item.setText(0, "Layers and Groups") self.layersTree.setColumnCount(3) for tree_layer in tree_layers: layer = tree_layer.layer() if (layer.type() != QgsMapLayer.PluginLayer and (layer.type() != QgsMapLayer.VectorLayer or layer.wkbType() != QgsWkbTypes.NoGeometry) and layer.customProperty("ol_layer_type") is None): try: # if layer.type() == QgsMapLayer.VectorLayer: # testDump = layer.renderer().dump() layer_parent = tree_layer.parent() if layer_parent.parent() is None: item = TreeLayerItem(self.iface, layer, self.layersTree, dlg) self.layers_item.addChild(item) else: if layer_parent not in tree_groups: tree_groups.append(layer_parent) except Exception: QgsMessageLog.logMessage(traceback.format_exc(), "qgis2web", level=Qgis.Critical) for tree_group in tree_groups: group_name = tree_group.name() group_layers = [ tree_layer.layer() for tree_layer in tree_group.findLayers() ] item = TreeGroupItem(group_name, group_layers, self.layersTree) self.layers_item.addChild(item) self.layersTree.addTopLevelItem(self.layers_item) self.layersTree.expandAll() self.layersTree.resizeColumnToContents(0) self.layersTree.resizeColumnToContents(1) for i in range(self.layers_item.childCount()): item = self.layers_item.child(i) if item.checkState(0) != Qt.Checked: item.setExpanded(False) def populateLayerSearch(self): self.layer_search_combo.clear() self.layer_search_combo.addItem("None") (layers, groups, popup, visible, interactive, json, cluster, getFeatureInfo) = self.getLayersAndGroups() for count, layer in enumerate(layers): if layer.type() == layer.VectorLayer: options = [] fields = layer.fields() for f in fields: fieldIndex = fields.indexFromName(f.name()) editorWidget = layer.editorWidgetSetup(fieldIndex).type() if editorWidget == 'Hidden': continue options.append(f.name()) for option in options: displayStr = layer.name() + ": " + option self.layer_search_combo.insertItem(0, displayStr) sln = utils.safeName(layer.name()) self.layer_search_combo.setItemData( self.layer_search_combo.findText(displayStr), sln + "_" + str(count)) def populateAttrFilter(self): self.layer_filter_select.clear() (layers, groups, popup, visible, interactive, json, cluster, getFeatureInfo) = self.getLayersAndGroups() options = [] for count, layer in enumerate(layers): if layer.type() == layer.VectorLayer: fields = layer.fields() for f in fields: fieldIndex = fields.indexFromName(f.name()) editorWidget = layer.editorWidgetSetup(fieldIndex).type() if editorWidget == 'Hidden': continue if utils.boilType(f.typeName()) in [ "int", "str", "real", "date", "bool", "time", "datetime" ]: options.append([ f.name() + ": " + utils.boilType(f.typeName()), layer.name() ]) preCleanOptions = {} for entry in options: if entry[0] not in list(preCleanOptions.keys()): preCleanOptions[entry[0]] = ": " + entry[1] else: preCleanOptions[entry[0]] = "| ".join( [preCleanOptions[entry[0]], entry[1]]) options = [] for key, value in preCleanOptions.items(): options.append(key + value) cleanOptions = list(set(options)) for option in cleanOptions: self.layer_filter_select.insertItem(0, option) def configureExporter(self): self.exporter.configure() def populateConfigParams(self, dlg): """ Populates the dialog with option items and widgets """ self.items = defaultdict(dict) tree = dlg.appearanceParams configure_export_action = QAction('...', self) configure_export_action.triggered.connect(self.configureExporter) params = getParams(configure_exporter_action=configure_export_action) for group, settings in params.items(): if group != "Data export": item = QTreeWidgetItem() item.setText(0, group) for param, value in settings.items(): subitem = self.createOptionItem(tree_widget=tree, parent_item=item, parameter=param, default_value=value) item.addChild(subitem) self.items[group][param] = subitem self.appearanceParams.addTopLevelItem(item) item.sortChildren(0, Qt.AscendingOrder) self.appearanceParams.expandAll() self.appearanceParams.resizeColumnToContents(0) self.appearanceParams.resizeColumnToContents(1) self.layer_search_combo.removeItem(1) self.layer_filter_select.takeItem(1) # configure export params in separate tab exportTree = dlg.exportParams for group, settings in params.items(): if group == "Data export": item = QTreeWidgetItem() item.setText(0, group) for param, value in settings.items(): subitem = self.createOptionItem(tree_widget=exportTree, parent_item=item, parameter=param, default_value=value) item.addChild(subitem) self.items[group][param] = subitem self.exportParams.addTopLevelItem(item) item.sortChildren(0, Qt.AscendingOrder) self.exportParams.expandAll() self.exportParams.resizeColumnToContents(0) self.exportParams.resizeColumnToContents(1) def createOptionItem(self, tree_widget, parent_item, parameter, default_value): """create the tree item corresponding to an option parameter""" action = None if isinstance(default_value, dict): action = default_value['action'] default_value = default_value['option'] subitem = TreeSettingItem(parent_item, tree_widget, parameter, default_value, action) if parameter == 'Layer search': self.layer_search_combo = subitem.combo if parameter == 'Attribute filter': self.layer_filter_select = subitem.list elif parameter == 'Exporter': self.exporter_combo = subitem.combo return subitem def setStateToWriter(self, writer): """ Sets the dialog state to match the specified writer """ self.selectMapFormat(writer) self.setStateToParams(writer.params) def setStateToParams(self, params): """ Sets the dialog state to match the specified parameters """ for group, settings in self.items.items(): for param, item in settings.items(): value = params[group][param] item.setValue(value) def selectMapFormat(self, writer): """ Updates dialog state to match the specified writer format """ self.ol3.setChecked(isinstance(writer, OpenLayersWriter)) self.leaflet.setChecked(isinstance(writer, LeafletWriter)) self.mapbox.setChecked(isinstance(writer, MapboxWriter)) def loadPreviewFile(self, file): """ Loads a web based preview from a local file path """ self.previewUrl = QUrl.fromLocalFile(file) if self.preview: self.preview.settings().clearMemoryCaches() self.preview.setUrl(self.previewUrl) def getParameters(self): parameters = defaultdict(dict) for group, settings in self.items.items(): for param, item in settings.items(): if param in ('Widget Icon', 'Widget Background'): parameters[group][param] = item._value.color().name() else: parameters[group][param] = item.value() if param == "Layer search": parameters["Appearance"]["Search layer"] = ( self.layer_search_combo.itemData( self.layer_search_combo.currentIndex())) if param == "Attribute filter": parameters["Appearance"]["Attribute filter"] = ( self.layer_filter_select.selectedItems()) return parameters def saveParameters(self): """ Saves current dialog state to project """ WRITER_REGISTRY.saveWriterToProject(self.createWriter()) EXPORTER_REGISTRY.writeToProject(self.exporter) def getLayersAndGroups(self): layers = [] groups = {} popup = [] visible = [] interactive = [] json = [] cluster = [] getFeatureInfo = [] for i in range(self.layers_item.childCount()): item = self.layers_item.child(i) if isinstance(item, TreeLayerItem): if item.checkState(0) == Qt.Checked: layers.append(item.layer) popup.append(item.popup) visible.append(item.visible) interactive.append(item.interactive) json.append(item.json) cluster.append(item.cluster) getFeatureInfo.append(item.getFeatureInfo) else: group = item.name groupLayers = [] if item.checkState(0) != Qt.Checked: continue for layer in item.layers: groupLayers.append(layer) layers.append(layer) popup.append({}) if item.visible: visible.append(True) else: visible.append(False) if item.interactive: interactive.append(True) else: interactive.append(False) if hasattr(item, "json") and item.json: json.append(True) else: json.append(False) if hasattr(item, "cluster") and item.cluster: cluster.append(True) else: cluster.append(False) if hasattr(item, "getFeatureInfo") and item.getFeatureInfo: getFeatureInfo.append(True) else: getFeatureInfo.append(False) groups[group] = groupLayers[::-1] return (layers[::-1], groups, popup[::-1], visible[::-1], interactive[::-1], json[::-1], cluster[::-1], getFeatureInfo[::-1]) def reject(self): self.saveParameters() (layers, groups, popup, visible, interactive, json, cluster, getFeatureInfo) = self.getLayersAndGroups() try: for layer, pop, vis, int in zip(layers, popup, visible, interactive): attrDict = {} for attr in pop: attrDict['attr'] = pop[attr] layer.setCustomProperty("qgis2web/popup/" + attr, pop[attr]) layer.setCustomProperty("qgis2web/Visible", vis) layer.setCustomProperty("qgis2web/Interactive", int) except Exception: pass QSettings().setValue("qgis2web/MainDialogGeometry", self.saveGeometry()) QSettings().setValue("qgis2web/previewOnStartup", self.previewOnStartup.checkState()) QSettings().setValue("qgis2web/closeFeedbackOnSuccess", self.closeFeedbackOnSuccess.checkState()) QSettings().setValue("qgis2web/previewFeatureLimit", self.previewFeatureLimit.text()) QDialog.close(self) def closeEvent(self, event): try: if self.devConsole or self.devConsole.isVisible() and self.preview: del self.devConsole del self.preview self.reject() event.accept() except Exception: pass
def populate(self): groups = {} count = 0 provider = algList.algs[self.providerName] algs = list(provider.values()) name = 'ACTIVATE_' + self.providerName.upper().replace(' ', '_') active = ProcessingConfig.getSetting(name) # Add algorithms for alg in algs: if not alg.showInToolbox: continue if alg.group in groups: groupItem = groups[alg.group] else: groupItem = QTreeWidgetItem() name = alg.i18n_group or alg.group if not active: groupItem.setForeground(0, Qt.darkGray) groupItem.setText(0, name) groupItem.setToolTip(0, name) groups[alg.group] = groupItem algItem = TreeAlgorithmItem(alg) if not active: algItem.setForeground(0, Qt.darkGray) groupItem.addChild(algItem) count += 1 actions = Processing.actions[self.providerName] for action in actions: if action.group in groups: groupItem = groups[action.group] else: groupItem = QTreeWidgetItem() groupItem.setText(0, action.group) groups[action.group] = groupItem algItem = TreeActionItem(action) groupItem.addChild(algItem) text = self.provider.getDescription() if not active: def activateProvider(): self.toolbox.activateProvider(self.providerName) label = QLabel(text + " <a href='%s'>Activate</a>") label.setStyleSheet( "QLabel {background-color: white; color: grey;}") label.linkActivated.connect(activateProvider) self.tree.setItemWidget(self, 0, label) else: text += QCoreApplication.translate( "TreeProviderItem", " [{0} geoalgorithms]").format(count) self.setText(0, text) self.setToolTip(0, self.text(0)) for groupItem in list(groups.values()): self.addChild(groupItem) self.setHidden(self.childCount() == 0)
def __init__(self): super(TestSelector, self).__init__() self.setupUi(self) self.tests = None self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.layout().insertWidget(1, self.bar) allTests = defaultdict(list) for test in tests.tests: allTests[test.group].append(test) for group, groupTests in iteritems(allTests): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate) unitItem = QTreeWidgetItem() unitItem.setText(0, "Fully automated tests") unitItem.setFlags(unitItem.flags() | Qt.ItemIsTristate) manualItem = QTreeWidgetItem() manualItem.setText(0, "Manual and semi-automated tests") manualItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) unitTestsByCategories = defaultdict(list) manualTestsByCategories = defaultdict(list) for test in groupTests: if isinstance(test, UnitTestWrapper): unitTestsByCategories[test.category].append(test) else: manualTestsByCategories[test.category].append(test) for testsList, parentItem in [(unitTestsByCategories, unitItem), (manualTestsByCategories, manualItem) ]: for cat, catTests in iteritems(testsList): categoryItem = QTreeWidgetItem() categoryItem.setText(0, cat) categoryItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) for test in catTests: testItem = QTreeWidgetItem() testItem.setFlags(testItem.flags() | Qt.ItemIsUserCheckable) testItem.setCheckState(0, Qt.Unchecked) testItem.test = test testItem.setText(0, test.name) categoryItem.addChild(testItem) parentItem.addChild(categoryItem) if manualItem.childCount(): groupItem.addChild(manualItem) if unitItem.childCount(): groupItem.addChild(unitItem) self.testsTree.addTopLevelItem(groupItem) groupItem.setExpanded(True) self.buttonBox.button( QDialogButtonBox.Ok).setText("Run selected tests") self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.selectAllLabel.linkActivated.connect( lambda: self.checkTests(lambda t: Qt.Checked)) self.unselectAllLabel.linkActivated.connect( lambda: self.checkTests(lambda t: Qt.Unchecked)) def _onlyManual(t): if isinstance(t, UnitTestWrapper): return Qt.Unchecked else: return Qt.Checked self.onlyManualLabel.linkActivated.connect( lambda: self.checkTests(_onlyManual)) def _onlyUnit(t): if isinstance(t, UnitTestWrapper): return Qt.Checked else: return Qt.Unchecked self.onlyUnitLabel.linkActivated.connect( lambda: self.checkTests(_onlyUnit)) self.exportButton.clicked.connect(self.export)
def __init__(self): super(TestSelector, self).__init__() self.setupUi(self) self.tests = None self.bar = QgsMessageBar() self.bar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.layout().insertWidget(1, self.bar) allTests = defaultdict(list) for test in tests.tests: allTests[test.group].append(test) for group, groupTests in iteritems(allTests): groupItem = QTreeWidgetItem() groupItem.setText(0, group) groupItem.setFlags(groupItem.flags() | Qt.ItemIsTristate) unitItem = QTreeWidgetItem() unitItem.setText(0, "Fully automated tests") unitItem.setFlags(unitItem.flags() | Qt.ItemIsTristate) manualItem = QTreeWidgetItem() manualItem.setText(0, "Manual and semi-automated tests") manualItem.setFlags(manualItem.flags() | Qt.ItemIsTristate) for test in groupTests: testItem = QTreeWidgetItem() testItem.setFlags(testItem.flags() | Qt.ItemIsUserCheckable) testItem.setCheckState(0, Qt.Unchecked) testItem.test = test testItem.setText(0, test.name) if isinstance(test, UnitTestWrapper): unitItem.addChild(testItem) else: manualItem.addChild(testItem) if manualItem.childCount(): groupItem.addChild(manualItem) if unitItem.childCount(): groupItem.addChild(unitItem) self.testsTree.addTopLevelItem(groupItem) groupItem.setExpanded(True) self.buttonBox.button(QDialogButtonBox.Ok).setText("Run selected tests") self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.selectAllLabel.linkActivated.connect(lambda: self.checkTests(lambda t: Qt.Checked)) self.unselectAllLabel.linkActivated.connect(lambda: self.checkTests(lambda t: Qt.Unchecked)) def _onlyManual(t): if isinstance(t, UnitTestWrapper): return Qt.Unchecked else: return Qt.Checked self.onlyManualLabel.linkActivated.connect(lambda: self.checkTests(_onlyManual)) def _onlyUnit(t): if isinstance(t, UnitTestWrapper): return Qt.Checked else: return Qt.Unchecked self.onlyUnitLabel.linkActivated.connect(lambda: self.checkTests(_onlyUnit)) self.exportButton.clicked.connect(self.export)