def __init__(self, provider, tree, toolbox): QTreeWidgetItem.__init__(self, tree) self.tree = tree self.toolbox = toolbox self.provider = provider self.setIcon(0, self.provider.icon()) self.populate()
def __init__(self, filename, name, icon): QTreeWidgetItem.__init__(self) self.name = name self.filename = filename self.setText(0, name) self.setIcon(0, icon) self.setCheckState(0, Qt.Unchecked)
def on_btnLoad_clicked(self): fileName, _ = QFileDialog.getOpenFileName(None, self.tr('Import Colors and elevations from XML'), QDir.homePath(), self.tr('XML files (*.xml *.XML)')) if fileName == '': return doc = QDomDocument() with codecs.open(fileName, 'r', encoding='utf-8') as f: content = f.read() if not doc.setContent(content): QMessageBox.critical(None, self.tr('Error parsing XML'), self.tr('The XML file could not be loaded')) return self.reliefClassTree.clear() reliefColorList = doc.elementsByTagName('ReliefColor') for i in range(reliefColorList.length()): elem = reliefColorList.at(i).toElement() item = QTreeWidgetItem() item.setText(0, elem.attribute('MinElevation')) item.setText(1, elem.attribute('MaxElevation')) item.setBackground(2, QBrush(QColor(int(elem.attribute('red')), int(elem.attribute('green')), int(elem.attribute('blue'))))) self.reliefClassTree.addTopLevelItem(item)
def fillTree(self): self.tree.clear() self.uptodateItem = QTreeWidgetItem() self.uptodateItem.setText(0, self.tr('Installed')) self.toupdateItem = QTreeWidgetItem() self.toupdateItem.setText(0, self.tr('Updatable')) self.notinstalledItem = QTreeWidgetItem() self.notinstalledItem.setText(0, self.tr('Not installed')) self.toupdateItem.setIcon(0, self.icon) self.uptodateItem.setIcon(0, self.icon) self.notinstalledItem.setIcon(0, self.icon) text = str(self.leFilter.text()) for i in sorted(list(self.resources.keys()), key=lambda kv: kv[2].lower()): filename = i version = self.resources[filename][0] name = self.resources[filename][1] treeBranch = self.getTreeBranchForState(filename, float(version)) if text == '' or text.lower() in filename.lower(): item = TreeItem(filename, name, self.icon) treeBranch.addChild(item) if treeBranch != self.notinstalledItem: item.setCheckState(0, Qt.Checked) self.tree.addTopLevelItem(self.toupdateItem) self.tree.addTopLevelItem(self.notinstalledItem) self.tree.addTopLevelItem(self.uptodateItem) if text != '': self.tree.expandAll() self.txtHelp.setHtml(self.HELP_TEXT)
def __init__(self, tree, parent, repo, layer, branch, branchCommitId): QTreeWidgetItem.__init__(self, parent) self.repo = repo self.tree = tree self.layer = layer self.branch = branch self.currentCommitId = None self.branchCommitId = branchCommitId self.setIcon(0, layerIcon) self.setText(0, self.layer) self.status = self.NOT_EXPORTED trackedlayer = getTrackingInfoForGeogigLayer(self.repo.url, layer) if trackedlayer: if os.path.exists(trackedlayer.geopkg): try: con = sqlite3.connect(trackedlayer.geopkg) cursor = con.cursor() cursor.execute("SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';" % layer) self.currentCommitId = cursor.fetchone()[0] cursor.close() con.close() if branchCommitId == self.currentCommitId: self.status = self.IN_SYNC else: self.status = self.NOT_IN_SYNC except: pass
def __init__(self, providerName, tree, toolbox): QTreeWidgetItem.__init__(self, tree) self.tree = tree self.toolbox = toolbox self.providerName = providerName self.provider = Processing.getProviderFromName(providerName) self.setIcon(0, self.provider.getIcon()) self.populate()
def __init__(self, alg): QTreeWidgetItem.__init__(self) self.alg = alg icon = alg.getIcon() name = AlgorithmClassification.getDisplayName(alg) self.setIcon(0, icon) self.setToolTip(0, name) self.setText(0, name)
def __init__(self, tree, repo, branch): QTreeWidgetItem.__init__(self) self.repo = repo self.tree = tree self.branch = branch self.setText(0, branch) self.setIcon(0, branchIcon) self.setChildIndicatorPolicy(QTreeWidgetItem.ShowIndicator)
def __init__(self, alg): QTreeWidgetItem.__init__(self) self.alg = alg icon = alg.getIcon() name = alg.displayName() self.setIcon(0, icon) self.setToolTip(0, name) self.setText(0, name)
def populateColors(self, colors): self.reliefClassTree.clear() for c in colors: item = QTreeWidgetItem() item.setText(0, str(c.minElevation)) item.setText(1, str(c.maxElevation)) item.setBackground(2, QBrush(c.color)) self.reliefClassTree.addTopLevelItem(item)
def __init__(self, provider_id, tree, toolbox): QTreeWidgetItem.__init__(self, tree) self.tree = tree self.toolbox = toolbox self.provider_id = provider_id self.provider = QgsApplication.processingRegistry().providerById(provider_id) self.setIcon(0, self.provider.icon()) self.populate()
def __init__(self, navigator, tree, repo): QTreeWidgetItem.__init__(self) self.navigator = navigator self.repo = repo self.tree = tree self.setSizeHint(0, QSize(self.sizeHint(0).width(), 25)) self.setChildIndicatorPolicy(QTreeWidgetItem.ShowIndicator) self.setText(0, self.repo.title) self.setIcon(0, repoIcon)
def __init__(self, connection): self.connIcon = QIcon(os.path.dirname(__file__) + '/../images/postgis.png') self.schemaIcon = QIcon(os.path.dirname(__file__) + '/../images/namespace.png') QTreeWidgetItem.__init__(self) self.setChildIndicatorPolicy(QTreeWidgetItem.ShowIndicator) self.connection = connection self.setText(0, connection) self.setIcon(0, self.connIcon)
def __init__(self, provider, tree, toolbox): QTreeWidgetItem.__init__(self, None) self.tree = tree self.toolbox = toolbox self.provider = provider self.setIcon(0, self.provider.icon()) self.setData(0, ProcessingToolbox.TYPE_ROLE, ProcessingToolbox.PROVIDER_ITEM) self.setToolTip(0, self.provider.longName()) self.populate()
def __init__(self, conflict): QTreeWidgetItem.__init__(self) self.setText(0, conflict.path) self.setIcon(0, featureIcon) self.setSizeHint(0, QSize(self.sizeHint(0).width(), 25)) self.conflict = conflict self._local = None self._remote = None self._origin = None
def __init__(self, branch, repo, path): QTreeWidgetItem.__init__(self) self.branch = branch self.ref = branch self.repo = repo self.path = path self.setChildIndicatorPolicy(QTreeWidgetItem.ShowIndicator) self.setText(0, branch) self.setIcon(0, branchIcon) self._commit = None
def __init__(self, alg): QTreeWidgetItem.__init__(self) self.alg = alg icon = alg.getIcon() nameEn, name = alg.displayNames() name = name if name != '' else nameEn self.setIcon(0, icon) self.setToolTip(0, name) self.setText(0, name) self.setData(0, Qt.UserRole, nameEn)
def populateSchemas(self): if self.childCount() != 0: return geodb = GeoDB.from_name(self.connection) schemas = geodb.list_schemas() for oid, name, owner, perms in schemas: item = QTreeWidgetItem() item.setText(0, name) item.setIcon(0, self.schemaIcon) self.addChild(item)
def showCompletion(self, rows): # Rows is an iterable of tuples like [("text",object1),("text2", object2),...] pal = self.editor.palette() color = pal.color(QPalette.Disabled, QPalette.WindowText) self.popup.setUpdatesEnabled(False) self.popup.clear() if rows is None or len( rows ) < 1: return for row in rows: item = QTreeWidgetItem(self.popup) item.setText(0, row[0]) #item.setText(1, hit['type']) item.setTextAlignment(1, Qt.AlignRight) item.setForeground(1, color) item.setData(2, Qt.UserRole, (row[1],)) # Try immutable py obj #http://stackoverflow.com/questions/9257422/how-to-get-the-original-python-data-from-qvariant self.popup.setCurrentItem(self.popup.topLevelItem(0)) self.popup.resizeColumnToContents(0) #self.popup.resizeColumnToContents(1) self.popup.adjustSize() self.popup.setUpdatesEnabled(True) h = self.popup.sizeHintForRow(0) * min(15, len(rows)) + 3 w = max(self.popup.width(), self.editor.width()) self.popup.resize(w, h) self.popup.move(self.editor.mapToGlobal(QPoint(0, self.editor.height()))) self.popup.setFocus() self.popup.show()
def populateTree(self): self.uptodateItem = QTreeWidgetItem() self.uptodateItem.setText(0, self.tr('Installed')) self.toupdateItem = QTreeWidgetItem() self.toupdateItem.setText(0, self.tr('Updatable')) self.notinstalledItem = QTreeWidgetItem() self.notinstalledItem.setText(0, self.tr('Not installed')) self.toupdateItem.setIcon(0, self.icon) self.uptodateItem.setIcon(0, self.icon) self.notinstalledItem.setIcon(0, self.icon) self.grabHTTP(self.urlBase + 'list.txt', self.treeLoaded)
def setValue(self, value): self.reliefClassTree.clear() rows = value.split(';') for r in rows: v = r.split(',') item = QTreeWidgetItem() item.setText(0, v[0]) item.setText(1, v[1]) color = QColor(int(v[2]), int(v[3]), int(v[4])) item.setBackground(2, QBrush(color)) self.reliefClassTree.addTopLevelItem(item)
def addLayerData(self, layerName, attribute): item = QTreeWidgetItem() item.setText(0, layerName) item.setText(1, attribute) self.layersTree.addTopLevelItem(item) comboBox = QComboBox() comboBox.addItem(self.tr('Points')) comboBox.addItem(self.tr('Structure lines')) comboBox.addItem(self.tr('Break lines')) comboBox.setCurrentIndex(0) self.layersTree.setItemWidget(item, 2, comboBox)
def __init__(self, alg): QTreeWidgetItem.__init__(self) self.alg = alg icon = alg.icon() nameEn = alg.name() name = alg.displayName() name = name if name != '' else nameEn self.setIcon(0, icon) self.setToolTip(0, self.formatAlgorithmTooltip(alg)) self.setText(0, name) self.setData(0, ProcessingToolbox.NAME_ROLE, nameEn) self.setData(0, ProcessingToolbox.TAG_ROLE, alg.tags()) self.setData(0, ProcessingToolbox.TYPE_ROLE, ProcessingToolbox.ALG_ITEM)
def __init__(self, parent, tree, providerName, param): QTreeWidgetItem.__init__(self, parent) self.providereName = providerName self.param = param self.tree = tree self.setText(0, param.description) self.paramName = settingName(providerName, param.name) if isinstance(param.defaultValue, bool): self.value = QSettings().value(self.paramName, defaultValue=param.defaultValue, type=bool) if self.value: self.setCheckState(1, Qt.Checked) else: self.setCheckState(1, Qt.Unchecked) elif isinstance(param.defaultValue, list): self.combo = QComboBox() for element in param.defaultValue: self.combo.addItem(element) self.tree.setItemWidget(self, 1, self.combo) self.value = QSettings().value(self.paramName, defaultValue=param.defaultValue[0]) idx = self.combo.findText(self.value) self.combo.setCurrentIndex(idx) elif param.description == "Password": self.passwordField = QLineEdit() self.passwordField.setEchoMode(QLineEdit.Password); #self.passwordField.setStyleSheet("QLineEdit { border: none }"); self.value = QSettings().value(self.paramName, defaultValue=param.defaultValue) self.passwordField.setText(str(self.value)) self.tree.setItemWidget(self, 1, self.passwordField) elif param.action is not None: layout = QHBoxLayout() layout.setMargin(0) layout.setSpacing(0) self.textbox = QLineEdit() self.value = QSettings().value(self.paramName, defaultValue=param.defaultValue) self.textbox.setText(str(self.value)) layout.addWidget(self.textbox) self.button = QToolButton() self.button.setText(param.actionText) self.button.clicked.connect(param.action) layout.addWidget(self.button) self.widget = QWidget() self.widget.setLayout(layout) self.tree.setItemWidget(self, 1, self.widget) else: self.textbox = QLineEdit() #self.textbox.setStyleSheet("QLineEdit { border: none }"); self.tree.setItemWidget(self, 1, self.textbox) self.value = QSettings().value(self.paramName, defaultValue=param.defaultValue) self.textbox.setText(str(self.value))
def fillTree(self): self.tree.clear() entries = ProcessingLog.getLogEntries() groupItem = QTreeWidgetItem() groupItem.setText(0, 'ALGORITHM') groupItem.setIcon(0, self.groupIcon) for entry in entries: item = TreeLogEntryItem(entry, True) item.setIcon(0, self.keyIcon) groupItem.insertChild(0, item) self.tree.addTopLevelItem(groupItem) groupItem.setExpanded(True)
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, 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 _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 fillTree(self): self.tree.clear() elements = ProcessingLog.getLogEntries() for category in list(elements.keys()): groupItem = QTreeWidgetItem() groupItem.setText(0, category) groupItem.setIcon(0, self.groupIcon) for entry in elements[category]: item = TreeLogEntryItem(entry, category == ProcessingLog.LOG_ALGORITHM) item.setIcon(0, self.keyIcon) groupItem.insertChild(0, item) self.tree.addTopLevelItem(groupItem)
def populateSchemas(self): if self.childCount() != 0: return settings = QSettings() connSettings = '/PostgreSQL/connections/' + self.connection database = settings.value(connSettings + '/database') user = settings.value(connSettings + '/username') host = settings.value(connSettings + '/host') port = settings.value(connSettings + '/port') passwd = settings.value(connSettings + '/password') uri = QgsDataSourceURI() uri.setConnection(host, str(port), database, user, passwd) connInfo = uri.connectionInfo() (success, user, passwd) = QgsCredentials.instance().get(connInfo, None, None) if success: QgsCredentials.instance().put(connInfo, user, passwd) geodb = GeoDB(host, int(port), database, user, passwd) schemas = geodb.list_schemas() for oid, name, owner, perms in schemas: item = QTreeWidgetItem() item.setText(0, name) item.setIcon(0, self.schemaIcon) self.addChild(item)
def populate(self): groups = {} count = 0 provider = algList.algs[self.provider_id] algs = list(provider.values()) name = 'ACTIVATE_' + self.provider_id.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.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)
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 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(parent, 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 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()
def fillInputsTree(self): icon = QIcon(os.path.join(pluginPath, 'images', 'input.svg')) 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 setupLayerList(self, layerList): self.mSublayersTreeWidget.setHeaderLabels(["Layer"]) self.mSublayersTreeWidget.setSortingEnabled(False) for layer in layerList: newItem = QTreeWidgetItem(self.mSublayersTreeWidget, [layer]) self.mSublayersTreeWidget.addTopLevelItem(newItem)
def fillAlgorithmTreeUsingProviders(self): self.algorithmTree.clear() text = str(self.searchBox.text()) allAlgs = algList.algs for providerName in list(allAlgs.keys()): name = 'ACTIVATE_' + providerName.upper().replace(' ', '_') if not ProcessingConfig.getSetting(name): continue groups = {} algs = list(allAlgs[providerName].values()) # Add algorithms for alg in algs: if not alg.showInModeler: 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() provider = algList.getProviderFromName(providerName) providerItem.setText(0, provider.getDescription()) providerItem.setToolTip(0, provider.getDescription()) providerItem.setIcon(0, provider.getIcon()) 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)
class GetScriptsAndModelsDialog(BASE, WIDGET): HELP_TEXT = QCoreApplication.translate( 'GetScriptsAndModelsDialog', '<h3> Processing resources manager </h3>' '<p>Check/uncheck algorithms in the tree to select the ones that you ' 'want to install or remove</p>' '<p>Algorithms are divided in 3 groups:</p>' '<ul><li><b>Installed:</b> Algorithms already in your system, with ' 'the latest version available</li>' '<li><b>Updatable:</b> Algorithms already in your system, but with ' 'a newer version available in the server</li>' '<li><b>Not installed:</b> Algorithms not installed in your ' 'system</li></ul>') MODELS = 0 SCRIPTS = 1 tr_disambiguation = {0: 'GetModelsAction', 1: 'GetScriptsAction'} def __init__(self, resourceType): super(GetScriptsAndModelsDialog, self).__init__(iface.mainWindow()) self.setupUi(self) if hasattr(self.leFilter, 'setPlaceholderText'): self.leFilter.setPlaceholderText(self.tr('Search...')) self.manager = QgsNetworkAccessManager.instance() repoUrl = ProcessingConfig.getSetting( ProcessingConfig.MODELS_SCRIPTS_REPO) self.resourceType = resourceType if self.resourceType == self.MODELS: self.folder = ModelerUtils.modelsFolders()[0] self.urlBase = '{}/models/'.format(repoUrl) self.icon = QgsApplication.getThemeIcon("/processingModel.svg") elif self.resourceType == self.SCRIPTS: self.folder = ScriptUtils.scriptsFolders()[0] self.urlBase = '{}/scripts/'.format(repoUrl) self.icon = QgsApplication.getThemeIcon("/processingScript.svg") self.lastSelectedItem = None self.updateProvider = False self.data = None self.populateTree() self.buttonBox.accepted.connect(self.okPressed) self.buttonBox.rejected.connect(self.cancelPressed) self.tree.currentItemChanged.connect(self.currentItemChanged) self.leFilter.textChanged.connect(self.fillTree) def popupError(self, error=None, url=None): """Popups an Error message bar for network errors.""" disambiguation = self.tr_disambiguation[self.resourceType] widget = iface.messageBar().createMessage( self.tr('Connection problem', disambiguation), self.tr('Could not connect to scripts/models repository', disambiguation)) if error and url: QgsMessageLog.logMessage( self.tr(u"Network error code: {} on URL: {}").format( error, url), self.tr(u"Processing"), QgsMessageLog.CRITICAL) button = QPushButton(QCoreApplication.translate( "Python", "View message log"), pressed=show_message_log) widget.layout().addWidget(button) iface.messageBar().pushWidget(widget, level=QgsMessageBar.CRITICAL, duration=5) def grabHTTP(self, url, loadFunction, arguments=None): """Grab distant content via QGIS internal classes and QtNetwork.""" QApplication.setOverrideCursor(Qt.WaitCursor) request = QUrl(url) reply = self.manager.get(QNetworkRequest(request)) if arguments: reply.finished.connect(partial(loadFunction, reply, arguments)) else: reply.finished.connect(partial(loadFunction, reply)) while not reply.isFinished(): QCoreApplication.processEvents() def populateTree(self): self.grabHTTP(self.urlBase + 'list.txt', self.treeLoaded) def treeLoaded(self, reply): """ update the tree of scripts/models whenever HTTP request is finished """ QApplication.restoreOverrideCursor() if reply.error() != QNetworkReply.NoError: self.popupError(reply.error(), reply.request().url().toString()) else: resources = bytes(reply.readAll()).decode('utf8').splitlines() resources = [r.split(',', 2) for r in resources] self.resources = {f: (v, n) for f, v, n in resources} reply.deleteLater() self.fillTree() def fillTree(self): self.tree.clear() self.uptodateItem = QTreeWidgetItem() self.uptodateItem.setText(0, self.tr('Installed')) self.toupdateItem = QTreeWidgetItem() self.toupdateItem.setText(0, self.tr('Updatable')) self.notinstalledItem = QTreeWidgetItem() self.notinstalledItem.setText(0, self.tr('Not installed')) self.toupdateItem.setIcon(0, self.icon) self.uptodateItem.setIcon(0, self.icon) self.notinstalledItem.setIcon(0, self.icon) text = str(self.leFilter.text()) for i in sorted(list(self.resources.keys()), key=lambda kv: kv[2].lower()): filename = i version = self.resources[filename][0] name = self.resources[filename][1] treeBranch = self.getTreeBranchForState(filename, float(version)) if text == '' or text.lower() in filename.lower(): item = TreeItem(filename, name, self.icon) treeBranch.addChild(item) if treeBranch != self.notinstalledItem: item.setCheckState(0, Qt.Checked) self.tree.addTopLevelItem(self.toupdateItem) self.tree.addTopLevelItem(self.notinstalledItem) self.tree.addTopLevelItem(self.uptodateItem) if text != '': self.tree.expandAll() self.txtHelp.setHtml(self.HELP_TEXT) def setHelp(self, reply, item): """Change the HTML content""" QApplication.restoreOverrideCursor() if reply.error() != QNetworkReply.NoError: html = self.tr( '<h2>No detailed description available for this script</h2>') else: content = bytes(reply.readAll()).decode('utf8') try: descriptions = json.loads(content) except json.decoder.JSONDecodeError: html = self.tr( '<h2>JSON Decoding Error - could not load help</h2>') except Exception: html = self.tr( '<h2>Unspecified Error - could not load help</h2>') html = '<h2>%s</h2>' % item.name html += self.tr('<p><b>Description:</b> {0}</p>').format( getDescription(ALG_DESC, descriptions)) html += self.tr('<p><b>Created by:</b> {0}').format( getDescription(ALG_CREATOR, descriptions)) html += self.tr('<p><b>Version:</b> {0}').format( getDescription(ALG_VERSION, descriptions)) reply.deleteLater() self.txtHelp.setHtml(html) def currentItemChanged(self, item, prev): if isinstance(item, TreeItem): url = self.urlBase + item.filename.replace(' ', '%20') + '.help' self.grabHTTP(url, self.setHelp, item) else: self.txtHelp.setHtml(self.HELP_TEXT) def getTreeBranchForState(self, filename, version): if not os.path.exists(os.path.join(self.folder, filename)): return self.notinstalledItem else: helpFile = os.path.join(self.folder, filename + '.help') try: with open(helpFile) as f: helpContent = json.load(f) currentVersion = float(helpContent[Help2Html.ALG_VERSION]) except Exception: currentVersion = 0 if version > currentVersion: return self.toupdateItem else: return self.uptodateItem def cancelPressed(self): super(GetScriptsAndModelsDialog, self).reject() def storeFile(self, reply, filename): """store a script/model that has been downloaded""" QApplication.restoreOverrideCursor() if reply.error() != QNetworkReply.NoError: if os.path.splitext(filename)[1].lower() == '.help': content = '{"ALG_VERSION" : %s}' % self.resources[ filename[:-5]][0] else: self.popupError(reply.error(), reply.request().url().toString()) content = None else: content = bytes(reply.readAll()).decode('utf8') reply.deleteLater() if content: path = os.path.join(self.folder, filename) with open(path, 'w') as f: f.write(content) self.progressBar.setValue(self.progressBar.value() + 1) def okPressed(self): toDownload = [] for i in range(self.toupdateItem.childCount()): item = self.toupdateItem.child(i) if item.checkState(0) == Qt.Checked: toDownload.append(item.filename) for i in range(self.notinstalledItem.childCount()): item = self.notinstalledItem.child(i) if item.checkState(0) == Qt.Checked: toDownload.append(item.filename) if toDownload: self.progressBar.setMaximum(len(toDownload) * 2) for i, filename in enumerate(toDownload): QCoreApplication.processEvents() url = self.urlBase + filename.replace(' ', '%20') self.grabHTTP(url, self.storeFile, filename) url += '.help' self.grabHTTP(url, self.storeFile, filename + '.help') toDelete = [] for i in range(self.uptodateItem.childCount()): item = self.uptodateItem.child(i) if item.checkState(0) == Qt.Unchecked: toDelete.append(item.filename) # Remove py and help files if they exist for filename in toDelete: for pathname in (filename, filename + u".help"): path = os.path.join(self.folder, pathname) if os.path.exists(path): os.remove(path) self.updateProvider = len(toDownload) + len(toDelete) > 0 super(GetScriptsAndModelsDialog, self).accept()
def __init__(self, result): QTreeWidgetItem.__init__(self) self.setIcon(0, result.icon) self.setText(0, '{0} [{1}]'.format(result.name, time.strftime('%I:%M:%S%p', result.timestamp))) self.algorithm = result.name self.filename = result.filename
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 __init__(self, name): QTreeWidgetItem.__init__(self) self.setToolTip(0, name) self.setText(0, name) self.setData(0, ModelerDialog.NAME_ROLE, name) self.setData(0, ModelerDialog.TYPE_ROLE, ModelerDialog.GROUP_ITEM)
def __init__(self, entry, isAlg): QTreeWidgetItem.__init__(self) self.entry = entry self.isAlg = isAlg self.setText(0, '[' + entry.date + '] ' + entry.text.split('|')[0])
def on_btnAdd_clicked(self): item = QTreeWidgetItem() item.setText(0, '0.00') item.setText(1, '0.00') item.setBackground(2, QBrush(QColor(127, 127, 127))) self.reliefClassTree.addTopLevelItem(item)
def __init__(self, result): QTreeWidgetItem.__init__(self) self.filename = result.filename self.setText(0, result.name)
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_()
def __init__(self, name): QTreeWidgetItem.__init__(self) self.setToolTip(0, name) self.setText(0, name) self.setData(0, ProcessingToolbox.NAME_ROLE, name) self.setData(0, ProcessingToolbox.TYPE_ROLE, ProcessingToolbox.GROUP_ITEM)
def __init__(self, tree): QTreeWidgetItem.__init__(self, tree)
def display(self): ''' Initialize top-level items ''' if len(self.items) == 0: return self.tree.clear() # If there is only one item then set it as the root item if len(self.items) == 1: rootItem = self.items[0] # Set root font rtFont = rootItem.font(0) rtFont.setBold(True) rootItem.setFont(0, rtFont) # Add the tree item to the tree widget self.tree.addTopLevelItem(rootItem) rootItem.setExpanded(True) else: rootItem = QTreeWidgetItem(self.tree) rootItem.setText(0, self.title) rootItem.setIcon(0, QIcon(self.rootResource)) # Set root font rtFont = rootItem.font(0) rtFont.setBold(True) rootItem.setFont(0, rtFont) rootItem.addChildren(self.items) rootItem.setExpanded(True) # Force the horizontal scrollbar to show self.tree.header().setSectionResizeMode(QHeaderView.ResizeToContents)
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 buildParentItem(self, dcollection, title, rootresource): ''' Builds tree widget items from a dictionary. ''' rtItem = QTreeWidgetItem() rtItem.setText(0, title) rtItem.setIcon(0, QIcon(rootresource)) topLevelItems = [] for k, v in dcollection.items(): parentItem = QTreeWidgetItem() if isinstance(v, dict): parentItem.setText(0, k) for kc, vc in v.items(): child = QTreeWidgetItem() child.setText(0, self._combine(kc, vc)) parentItem.addChild(child) else: parentItem.setText(0, self._combine(k, v)) topLevelItems.append(parentItem) rtItem.addChildren(topLevelItems) rtItem.setExpanded(True) return rtItem
def __init__(self, tree, stringlist): QTreeWidgetItem.__init__(self, tree, stringlist)
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 __init__(self, action): QTreeWidgetItem.__init__(self) self.action = action self.setText(0, action.i18n_name) self.setIcon(0, action.getIcon()) self.setData(0, Qt.UserRole, action.name)
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 __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)
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)
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.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 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)) 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 __init__(self, description, name): QTreeWidgetItem.__init__(self) self.name = name self.description = description self.setText(0, description)
def update_available_layers(self): self.trw_layers.setUpdatesEnabled(False) # Don't render until we're ready # Grab some context data show_domains = self.chk_show_domains.isChecked() show_structures = self.chk_show_structures.isChecked() show_associations = self.chk_show_associations.isChecked() top_level_items_expanded_info = [] for i in range(self.trw_layers.topLevelItemCount()): top_level_items_expanded_info.append(self.trw_layers.topLevelItem(i).isExpanded()) # Save selection self.update_selected_items() # Iterate models adding children self.trw_layers.blockSignals(True) # We don't want to get itemSelectionChanged here self.trw_layers.clear() self.trw_layers.blockSignals(False) sorted_models = sorted(self.models_tree.keys()) for model in sorted_models: children = [] model_item = QTreeWidgetItem([model]) # Filter by search text list_tables = self.filter_tables_by_search_text(self.models_tree[model].keys(), self.txt_search_text.text()) sorted_tables = sorted(list_tables) for table in sorted_tables: current_table_info = self.models_tree[model][table] if current_table_info[KIND_SETTINGS] == TABLE_PROP_DOMAIN and not show_domains \ or current_table_info[KIND_SETTINGS] == TABLE_PROP_STRUCTURE and not show_structures \ or current_table_info[KIND_SETTINGS] == TABLE_PROP_ASSOCIATION and not show_associations: continue table_item = QTreeWidgetItem([table]) table_item.setData(0, Qt.UserRole, self.models_tree[model][table]) geometry_type = QgsWkbTypes().geometryType(QgsWkbTypes().parseType(current_table_info[GEOMETRY_TYPE])) if current_table_info[GEOMETRY_TYPE] else None icon_name = self.icon_names[3 if geometry_type is None else geometry_type] # Is the layer already loaded? if self.qgis_utils.get_layer_from_layer_tree(current_table_info[TABLE_NAME], self._db.schema, geometry_type) is not None: table_item.setText(0, table + QCoreApplication.translate("DialogLoadLayers", " [already loaded]")) table_item.setData(0, Qt.ForegroundRole, QBrush(Qt.lightGray)) table_item.setFlags(Qt.ItemIsEnabled) # Not selectable else: # Laye not in QGIS Layer Tree if not current_table_info[KIND_SETTINGS]: # This is a class font = QFont() font.setBold(True) table_item.setData(0, Qt.FontRole, font) if current_table_info[KIND_SETTINGS] == TABLE_PROP_DOMAIN: icon_name = self.icon_names[4] elif current_table_info[KIND_SETTINGS] == TABLE_PROP_STRUCTURE: icon_name = self.icon_names[5] elif current_table_info[KIND_SETTINGS] == TABLE_PROP_ASSOCIATION: icon_name = self.icon_names[6] icon = QIcon(":/Asistente-LADM_COL/resources/images/{}.png".format(icon_name)) table_item.setData(0, Qt.DecorationRole, icon) children.append(table_item) model_item.addChildren(children) self.trw_layers.addTopLevelItem(model_item) # Set selection iterator = QTreeWidgetItemIterator(self.trw_layers, QTreeWidgetItemIterator.Selectable) self.trw_layers.blockSignals(True) # We don't want to get itemSelectionChanged here while iterator.value(): item = iterator.value() if item.text(0) in self.selected_items_dict: item.setSelected(True) iterator += 1 self.trw_layers.blockSignals(False) # Make model items non selectable # Set expand taking previous states into account for i in range(self.trw_layers.topLevelItemCount()): self.trw_layers.topLevelItem(i).setFlags(Qt.ItemIsEnabled) # Not selectable self.trw_layers.topLevelItem(i).setExpanded(top_level_items_expanded_info[i] if top_level_items_expanded_info else True) self.trw_layers.setUpdatesEnabled(True) # Now render!
def __init__(self, action): QTreeWidgetItem.__init__(self) self.action = action self.setText(0, action.name) self.setIcon(0, action.getIcon()) self.setData(0, ModelerDialog.NAME_ROLE, action.name)