def _init_widgets(self, layout_object): """Initialize widgets""" lbl_title = QLabel() lbl_title.setStyleSheet( 'padding: 2px; font-weight: bold; background-color: ' 'rgb(200, 200, 200);') lbl_title.setText(self.tr('QR Code')) self._cd_value_widget = CodeValueWidget(self) self._cd_value_widget.value_changed.connect( self._on_code_value_changed) value_groupbox = QgsCollapsibleGroupBoxBasic(self.tr('Data')) gp_layout = QVBoxLayout() gp_layout.setContentsMargins(0, 0, 0, 0) gp_layout.addWidget(self._cd_value_widget) value_groupbox.setLayout(gp_layout) # Item appearance appearance_groupbox = QgsCollapsibleGroupBoxBasic( self.tr('Appearance')) appearance_layout = QGridLayout() # Data color lbl_data_clr = QLabel(self.tr('Data color')) self._data_clr_btn = QgsColorButton() self._data_clr_btn.setColorDialogTitle(self.tr('Select Data Color')) self._data_clr_btn.setContext('composer') self._data_clr_btn.setAllowOpacity(False) self._data_clr_btn.colorChanged.connect(self.on_data_color_changed) appearance_layout.addWidget(lbl_data_clr, 0, 0) appearance_layout.addWidget(self._data_clr_btn, 0, 1) appearance_layout.setColumnStretch(2, 1) # Background color lbl_background_clr = QLabel(self.tr('Background color')) self._background_clr_btn = QgsColorButton() self._background_clr_btn.setColorDialogTitle( self.tr('Select Background Color')) self._background_clr_btn.setContext('composer') self._background_clr_btn.setAllowOpacity(False) self._background_clr_btn.colorChanged.connect( self.on_background_color_changed) appearance_layout.addWidget(lbl_background_clr, 1, 0) appearance_layout.addWidget(self._background_clr_btn, 1, 1) appearance_groupbox.setLayout(appearance_layout) # Properties widget self._prop_widget = QgsLayoutItemPropertiesWidget(self, layout_object) self._prop_widget.showBackgroundGroup(False) # Add widgets to layout layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(lbl_title) layout.addWidget(value_groupbox) layout.addWidget(appearance_groupbox) layout.addWidget(self._prop_widget) # Set layout self.setLayout(layout)
def __init__(self, order, dialog): super().__init__() self.dialog = dialog self.order = order txt = (f'<b>Order {order.name()}<br>({order.date()})</b><br>' f'{order.assets_count()} assets - state: {order.state()}') label = QLabel(txt) if not order.is_zipped(): label.setStyleSheet("color: gray") button = QPushButton( 'Re-Download' if order.downloaded() else 'Download') button.clicked.connect(self.download) button.setEnabled(order.state() == 'success' and order.is_zipped()) vlayout = QVBoxLayout() vlayout.addWidget(button) if order.downloaded(): labelOpenFolder = QLabel("<a href='#'>Open order folder</a>") vlayout.addWidget(labelOpenFolder) labelOpenFolder.setOpenExternalLinks(False) labelOpenFolder.linkActivated.connect( lambda: QDesktopServices.openUrl( QUrl.fromLocalFile(self.order.download_folder()))) layout = QHBoxLayout() layout.addWidget(label) layout.addStretch() layout.addLayout(vlayout) self.setLayout(layout)
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, results, only_symbology, geodata_server, metadata_server, parent): super(PublishReportDialog, self).__init__(parent) self.results = results self.setupUi(self) txt_on = self.tr('on').upper() txt_off = self.tr('off').upper() self.setWindowIcon(QIcon(files.getIconPath('geocat'))) self.tableWidget.horizontalHeader().setSectionResizeMode( QHeaderView.Stretch) if isinstance(geodata_server, bases.DataCatalogServerBase): url = geodata_server.baseUrl self.labelUrlMapServer.setText(f'<a href="{url}">{url}</a>') else: self.labelUrlMapServer.setText("----") if isinstance(metadata_server, bases.MetaCatalogServerBase): url = metadata_server.baseUrl self.labelUrlMetadataServer.setText(f'<a href="{url}">{url}</a>') else: self.labelUrlMetadataServer.setText("----") publish_data = geodata_server is not None self.labelPublishMapData.setText( txt_on if publish_data and not only_symbology else txt_off) self.labelPublishSymbology.setText( txt_on if publish_data or only_symbology else txt_off) self.labelPublishMetadata.setText( txt_on if metadata_server is not None else txt_off) self.tableWidget.setRowCount(len(results)) # Populate report table for i, name in enumerate(results.keys()): # Add layer name item self.tableWidget.setItem(i, 0, QTableWidgetItem(name)) # Just show "success" in the last column if there are no errors and warnings warnings, errors = results[name] if not (warnings or errors): self.tableWidget.setItem(i, 1, QTableWidgetItem('OK')) continue # Show error and warning count and dialog button (for details) in the last column if there are issues status_widget = QWidget() layout = QHBoxLayout(status_widget) button = QToolButton() button.setIcon(QIcon(files.getIconPath("attention"))) button.clicked.connect(partial(self.openDetails, name)) layout.addWidget(button) status_lbl = QLabel() status_lbl.setText( self.tr(f"{len(warnings)} warnings, {len(errors)} errors")) if errors: # Also render text in red if there are any errors status_lbl.setStyleSheet("QLabel { color: red; }") layout.addWidget(status_lbl) layout.setAlignment(Qt.AlignLeft) layout.setContentsMargins(0, 0, 0, 0) status_widget.setLayout(layout) self.tableWidget.setCellWidget(i, 1, status_widget)
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 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 = TreeGroupItem(alg.group()) if not active: groupItem.setInactive() if provider.id() in ('qgis', 'native', '3d'): 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 text = provider.name() if not provider.id() in ('qgis', 'native', '3d'): 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: parent.setText(0, text) for group, groupItem in sorted(groups.items(), key=operator.itemgetter(1)): parent.addChild(groupItem) if not provider.id() in ('qgis', 'native', '3d'): parent.setHidden(parent.childCount() == 0)
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 create_heading_label(text: str) -> QLabel: label = QLabel(text) sp = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) sp.setHorizontalStretch(0) sp.setVerticalStretch(0) sp.setHeightForWidth(label.sizePolicy().hasHeightForWidth()) label.setSizePolicy(sp) label.setStyleSheet( "padding: 2px; font-weight: bold; background-color: rgb(200, 200, 200);" ) return label
def update_history_view(self): """Update the history view.""" historic_folder = query_historic() files = os.listdir(historic_folder) self.dialog.list_historic.clear() for file in files[::-1]: file_path = join(historic_folder, file) with open(file_path, encoding='utf8') as json_file: data = json.load(json_file, object_hook=as_enum) name = data['file_name'] item = QListWidgetItem(self.dialog.list_historic) self.dialog.list_historic.addItem(item) group = QFrame() group.setFrameStyle(QFrame.StyledPanel) group.setStyleSheet('QFrame { margin: 3px; }') group.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) hbox = QHBoxLayout() vbox = QVBoxLayout() label_name = QLabel(name) label_name.setStyleSheet('font-weight: bold;') label_name.setWordWrap(True) vbox.addWidget(label_name) for label in data['description']: if not label: label = tr('No description') real_label = QLabel(label) real_label.setWordWrap(True) vbox.addWidget(real_label) hbox.addItem(vbox) button_run = QPushButton() button_save = QPushButton() button_run.setIcon(QIcon(QgsApplication.iconPath("mActionStart.svg"))) button_save.setIcon(QIcon(QgsApplication.iconPath("mActionFileSave.svg"))) button_run.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) button_save.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) button_run.setToolTip(tr('Run the query')) button_save.setToolTip(tr('Save this query in a new preset')) hbox.addWidget(button_run) hbox.addWidget(button_save) group.setLayout(hbox) # Actions on click run = partial(self.run_saved_query, data) button_run.clicked.connect(run) save = partial(self.save_history_preset, data) button_save.clicked.connect(save) item.setSizeHint(group.minimumSizeHint()) self.dialog.list_historic.setItemWidget(item, group)
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 = TreeGroupItem(alg.group()) if not active: groupItem.setInactive() if provider.id() in ('qgis', 'native', '3d'): 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 text = provider.name() if not provider.id() in ('qgis', 'native', '3d'): 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: parent.setText(0, text) for group, groupItem in sorted(groups.items(), key=operator.itemgetter(1)): parent.addChild(groupItem) if not provider.id() in ('qgis', 'native', '3d'): parent.setHidden(parent.childCount() == 0)
def _init_widgets(self, layout_object): """Initialize widgets""" lbl_title = QLabel() lbl_title.setStyleSheet( 'padding: 2px; font-weight: bold; background-color: ' 'rgb(200, 200, 200);') lbl_title.setText(self.tr('Linear Barcode')) self._cd_value_widget = CodeValueWidget(self) self._cd_value_widget.value_changed.connect( self._on_code_value_changed) value_groupbox = QgsCollapsibleGroupBoxBasic(self.tr('Data')) gp_layout = QVBoxLayout() gp_layout.setContentsMargins(0, 0, 0, 0) gp_layout.addWidget(self._cd_value_widget) value_groupbox.setLayout(gp_layout) # Barcode properties barcode_props_groupbox = QgsCollapsibleGroupBoxBasic( self.tr('Properties')) barcode_props_layout = QGridLayout() lbl_barcode_type = QLabel(self.tr('Linear barcode type')) self._barcode_cbo = LinearMetadataCombobox() self._barcode_cbo.metadata_changed.connect( self._on_linear_type_changed) barcode_props_layout.addWidget(lbl_barcode_type, 0, 0) barcode_props_layout.addWidget(self._barcode_cbo, 0, 1) self._chk_checksum = QCheckBox(self.tr('Add checksum')) self._chk_checksum.stateChanged.connect(self._on_add_checksum) barcode_props_layout.addWidget(self._chk_checksum, 1, 0, 1, 2) self._chk_render_txt = QCheckBox(self.tr('Render barcode text')) self._chk_render_txt.stateChanged.connect(self._on_render_text_changed) barcode_props_layout.addWidget(self._chk_render_txt, 2, 0, 1, 2) barcode_props_layout.setColumnStretch(1, 1) barcode_props_groupbox.setLayout(barcode_props_layout) # Properties widget self._prop_widget = QgsLayoutItemPropertiesWidget(self, layout_object) self._prop_widget.showBackgroundGroup(False) # Add widgets to layout layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(lbl_title) layout.addWidget(barcode_props_groupbox) layout.addWidget(value_groupbox) layout.addWidget(self._prop_widget) # Set layout self.setLayout(layout)
def setup_default_preset(self): """Setup the display of presets""" preset_folder = resources_path('map_preset') folders = os.listdir(preset_folder) for folder_name in folders: file_path = join(preset_folder, folder_name, folder_name + '.json') with open(file_path, encoding='utf8') as json_file: data = json.load(json_file, object_hook=as_enum) item = QListWidgetItem(self.dialog.list_default_mp) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) self.dialog.list_default_mp.addItem(item) widget = QFrame() widget.setFrameStyle(QFrame.StyledPanel) widget.setStyleSheet('QFrame { margin: 3px; };') widget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) hbox = QHBoxLayout() vbox = QVBoxLayout() picture = QLabel() icon_path = resources_path('map_preset', folder_name, folder_name + '_icon.png') if not os.path.isfile(icon_path): icon_path = resources_path('icons', 'QuickOSM.svg') icon = QPixmap(icon_path) icon.scaled(QSize(150, 250), Qt.KeepAspectRatio) picture.setPixmap(icon) picture.setStyleSheet( 'max-height: 150px; max-width: 250px; margin-right: 50px;') hbox.addWidget(picture) title = QLabel(data['file_name']) title.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) title.setStyleSheet('font: bold 20px; margin-bottom: 25px;') vbox.addWidget(title) for label in data['description']: if not label: label = tr('No description') real_label = QLabel(label) real_label.setWordWrap(True) vbox.addWidget(real_label) hbox.addItem(vbox) widget.setLayout(hbox) item.setSizeHint(widget.minimumSizeHint()) self.dialog.list_default_mp.setItemWidget(item, widget)
def add_menu_section_action(text, menu, tag='b', pad=0.5): """Because QMenu.addSection() fails to render with some UI styles, and QWidgetAction defaults to no padding. :param text: Text for action's title :type text: str :param menu: QMenu to add section action :type menu: QMenu :param tag: Simple HTML tag (sans < or >) to style the text, e.g. b, i, u :type tag: str :param pad: Value for QLabel qss em and ex padding :type pad: float """ lbl = QLabel(f'<{tag}>{text}</{tag}>', menu) lbl.setStyleSheet( f'QLabel {{ padding-left: {pad}em; padding-right: {pad}em; ' f'padding-top: {pad}ex; padding-bottom: {pad}ex;}}') wa = QWidgetAction(menu) wa.setDefaultWidget(lbl) menu.addAction(wa) return wa
def __init__(self, order, dialog): super().__init__() self.dialog = dialog self.order = order txt = (f'<b>Order {order.name()}<br>({order.date()})</b><br>' f'{order.assets_count()} assets - state: {order.state()}') label = QLabel(txt) if not order.is_zipped(): label.setStyleSheet("color: gray") button = QPushButton('Download') button.clicked.connect(self.download) button.setEnabled(order.state() == 'success' and order.is_zipped()) layout = QHBoxLayout() layout.addWidget(label) layout.addStretch() layout.addWidget(button) self.setLayout(layout)
def __init__(self, order, dialog): super().__init__() self.dialog = dialog self.order = order txt = ( '<style>h3{margin-bottom: 0px;}</style>' f'<b><h3>Order {order.name()}</h3></b>' f'<b>Placed on</b>: {order.date()}<br>' f'<b>Id</b>: {order.id()}<br>' f'<b>Imagery source</b>: {order.item_type()}<br>' #f'<b>Assets ordered</b>: {order.assets_ordered()}<br>' #f'<b>File format</b>: {order.file_format()}<br>' f'<b>Asset count</b>: {order.assets_count()}<br>') label = QLabel(txt) if not order.is_zipped(): label.setStyleSheet("color: gray") button = QPushButton( 'Re-Download' if order.downloaded() else 'Download') button.clicked.connect(self.download) button.setEnabled(order.state() == 'success' and order.is_zipped()) vlayout = QVBoxLayout() vlayout.addWidget(button) if order.downloaded(): labelOpenFolder = QLabel("<a href='#'>Open order folder</a>") vlayout.addWidget(labelOpenFolder) labelOpenFolder.setOpenExternalLinks(False) labelOpenFolder.linkActivated.connect( lambda: QDesktopServices.openUrl( QUrl.fromLocalFile(self.order.download_folder()))) layout = QHBoxLayout() layout.addWidget(label) layout.addStretch() layout.addLayout(vlayout) self.setLayout(layout)
def __get_custom_widget_item_for_result(self, qr_result): label = QLabel() if not qr_result: style = WIDGET_STYLE_QUALITY_RULE_INITIAL_STATE label.setText("0%") elif qr_result.level == EnumQualityRuleResult.SUCCESS: style = WIDGET_STYLE_QUALITY_RULE_SUCCESS icon = QIcon( ":/Asistente-LADM-COL/resources/images/qr_validation.svg") label.setPixmap(icon.pixmap(QSize(16, 16))) elif qr_result.level == EnumQualityRuleResult.ERRORS: style = WIDGET_STYLE_QUALITY_RULE_ERRORS label.setText(str(qr_result.record_count)) elif qr_result.level == EnumQualityRuleResult.UNDEFINED: style = WIDGET_STYLE_QUALITY_RULE_UNDEFINED else: # EnumQualityRuleResult.CRITICAL style = WIDGET_STYLE_QUALITY_RULE_CRITICAL label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) label.setStyleSheet("QLabel{}".format(style)) return label
class TrackingDisplay(QToolBar): ''' Display the position of a mobile and add action for centering the map on the vehicle and erasing the track ''' def __init__(self, mobile, parent=None): super(TrackingDisplay, self).__init__(parent) self.setMovable(True) self.setFloatable(True) self.mobile = mobile self.timedOut = True self.lastFix = 0.0 s = QSettings() self.defFormat = s.value('PosiView/Misc/DefaultFormat', defaultValue=0, type=int) self.format = self.defFormat & 3 self.withSuff = cf.FlagDegreesUseStringSuffix if bool( self.defFormat & 4) else cf.FormatFlag(0) try: self.sep = cf.separator() + ' ' except AttributeError: self.sep = ', ' self.createActions() self.mobile.newPosition.connect(self.onNewPosition) self.mobile.timeout.connect(self.onTimeout) self.posText = '0.000000, 0.000000' def createActions(self): self.nameLabel = QLabel(self.mobile.name) self.nameLabel.setMinimumSize(80, 23) self.nameLabelAction = QWidgetAction(self) self.nameLabelAction.setDefaultWidget(self.nameLabel) self.addAction(self.nameLabelAction) self.enableAction = QAction("Enable Display", self) self.enableAction.setCheckable(True) self.enableAction.setChecked(True) icon = QIcon(':/plugins/PosiView/ledgrey.png') icon.addFile(':/plugins/PosiView/ledgreen.png', QSize(), QIcon.Normal, QIcon.On) self.enableAction.setIcon(icon) self.addAction(self.enableAction) self.enableAction.triggered.connect(self.onEnableClicked) self.enableAction.triggered.connect(self.mobile.setEnabled) self.addSeparator() self.posLabel = QLabel("--:--:-- 0.000000, 0.000000") self.posLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) widths = (180, 196, 204, 180, 184, 200, 208, 184) self.posLabel.setMinimumSize(widths[self.format], 23) self.posLabel.setStyleSheet( 'background: red; font-size: 8pt; color: white;') self.posLabelAction = QWidgetAction(self) self.posLabelAction.setDefaultWidget(self.posLabel) self.addAction(self.posLabelAction) self.centerAction = QAction(QIcon(':/plugins/PosiView/center.png'), "Center &Map", self) self.addAction(self.centerAction) self.deleteTrackAction = QAction( QIcon(':/plugins/PosiView/deletetrack.png'), 'Delete &Track', self) self.addAction(self.deleteTrackAction) self.deleteTrackAction.triggered.connect(self.mobile.deleteTrack) self.centerAction.triggered.connect(self.mobile.centerOnMap) @pyqtSlot(float, QgsPointXY, float, float) def onNewPosition(self, fix, pos, depth, altitude): s = str() if fix > 0: s = strftime('%H:%M:%S ', gmtime(fix)) else: s = '--:--:-- ' if self.format == 1: f, pr = cf.FormatDegreesMinutes, 4 elif self.format == 2: f, pr = cf.FormatDegreesMinutesSeconds, 2 else: f, pr = cf.FormatDecimalDegrees, 6 self.posText = self.sep.join( (cf.formatY(pos.y(), f, pr, self.withSuff), cf.formatX(pos.x(), f, pr, self.withSuff))) s += self.posText if depth > -9999: s += "\nd = {:.1f}".format(depth) if altitude > -9999: if depth > -9999: s += " alt = {:.1f}".format(altitude) else: s += "\nalt = {:.1f}".format(altitude) self.posLabel.setText(s) if self.timedOut: if fix > self.lastFix: self.posLabel.setStyleSheet( 'background: lime; font-size: 8pt; color: black;') self.timedOut = False self.lastFix = fix @pyqtSlot() def onTimeout(self): if not self.timedOut: self.timedOut = True self.posLabel.setStyleSheet( 'background: red; font-size: 8pt; color: white;') @pyqtSlot(bool) def onEnableClicked(self, enable): self.timedOut = True if enable: self.posLabel.setStyleSheet( 'background: red; font-size: 8pt; color: white;') else: self.posLabel.setStyleSheet( 'background: white; font-size: 8pt; color: black;') def mousePressEvent(self, event): if event.button() == Qt.LeftButton: if event.modifiers() == Qt.ControlModifier: QGuiApplication.clipboard().setText(self.posText) else: drag = QDrag(self) mimeData = QMimeData() mimeData.setText(self.posText) drag.setMimeData(mimeData) drag.exec_() def releaseMobile(self): self.mobile = None
def update_personal_preset_view(self): """Update the presets displayed.""" preset_folder = query_preset() files = filter( lambda folder: os.path.isdir(join(preset_folder, folder)), os.listdir(preset_folder)) self.dialog.list_personal_preset_mp.clear() for file in files: file_path = join(preset_folder, file, file + '.json') with open(file_path, encoding='utf8') as json_file: data = json.load(json_file, object_hook=as_enum) name = data['file_name'] item = QListWidgetItem(self.dialog.list_personal_preset_mp) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) self.dialog.list_personal_preset_mp.addItem(item) preset = QFrame() preset.setObjectName('FramePreset') preset.setFrameStyle(QFrame.StyledPanel) preset.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) hbox = QHBoxLayout() vbox = QVBoxLayout() label_name = QLabel(name) label_name.setStyleSheet('font-weight: bold;') label_name.setWordWrap(True) vbox.addWidget(label_name) for label in data['description']: if not label: label = tr('No description') real_label = QLabel(label) real_label.setWordWrap(True) vbox.addWidget(real_label) hbox.addItem(vbox) button_edit = QPushButton() button_remove = QPushButton() button_edit.setIcon( QIcon(QgsApplication.iconPath("mActionToggleEditing.svg"))) button_remove.setIcon( QIcon(QgsApplication.iconPath('symbologyRemove.svg'))) button_edit.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) button_remove.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) button_edit.setToolTip(tr('Edit the preset')) button_remove.setToolTip(tr('Delete the preset')) hbox.addWidget(button_edit) hbox.addWidget(button_remove) if data['advanced']: self.listAdvanced.append(True) preset.setStyleSheet('#FramePreset { margin: 3px;' ' border: 3px solid ' + self.advanced_selected + ';' ' border-width: 1px 1px 1px 4px;}') else: self.listAdvanced.append(False) preset.setStyleSheet('#FramePreset { margin: 3px;' ' border: 3px solid ' + self.basic_selected + ';' ' border-width: 1px 1px 1px 4px;}') preset.setLayout(hbox) # Actions on click remove = partial(self.verification_remove_preset, item, name) button_remove.clicked.connect(remove) edit = partial(self.edit_preset, data) button_edit.clicked.connect(edit) item.setSizeHint(preset.minimumSizeHint()) self.dialog.list_personal_preset_mp.setItemWidget(item, preset) self.listAdvanced.append(False)
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)
class QmsSearchResultItemWidget(QWidget): def __init__(self, geoservice, image_ba, parent=None, extent_renderer=None): QWidget.__init__(self, parent) self.extent_renderer = extent_renderer self.layout = QHBoxLayout(self) self.layout.setContentsMargins(5, 10, 5, 10) self.setLayout(self.layout) self.service_icon = QLabel(self) self.service_icon.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.service_icon.resize(24, 24) qimg = QImage.fromData(image_ba) pixmap = QPixmap.fromImage(qimg) self.service_icon.setPixmap(pixmap) self.layout.addWidget(self.service_icon) self.service_desc_layout = QGridLayout(self) self.service_desc_layout.setSpacing(0) self.layout.addLayout(self.service_desc_layout) self.service_name = QLabel(self) self.service_name.setTextFormat(Qt.RichText) self.service_name.setWordWrap(True) self.service_name.setText(u" <strong> {} </strong>".format( geoservice.get('name', u""))) self.service_desc_layout.addWidget(self.service_name, 0, 0, 1, 3) self.service_type = QLabel(self) self.service_type.setTextFormat(Qt.RichText) self.service_type.setWordWrap(True) self.service_type.setText(geoservice.get('type', u"").upper() + " ") self.service_desc_layout.addWidget(self.service_type, 1, 0) self.service_deteils = QLabel(self) self.service_deteils.setTextFormat(Qt.RichText) self.service_deteils.setWordWrap(True) self.service_deteils.setOpenExternalLinks(True) self.service_deteils.setText(u"<a href=\"{0}\">{1}</a>, ".format( Client().geoservice_info_url(geoservice.get('id', u"")), self.tr('details'))) self.service_desc_layout.addWidget(self.service_deteils, 1, 1) self.service_report = QLabel(self) self.service_report.setTextFormat(Qt.RichText) self.service_report.setWordWrap(True) self.service_report.setOpenExternalLinks(True) self.service_report.setText(u"<a href=\"{0}\">{1}</a><div/>".format( Client().geoservice_report_url(geoservice.get('id', u"")), self.tr('report a problem'))) self.service_desc_layout.addWidget(self.service_report, 1, 2) self.service_desc_layout.setColumnStretch(2, 1) self.status_label = QLabel(self) self.status_label.setTextFormat(Qt.RichText) self.status_label.setText(u'\u2022') status = geoservice.get('cumulative_status', u'') if status == 'works': self.status_label.setStyleSheet("color: green; font-size: 30px") if status == 'failed': self.status_label.setStyleSheet("color: red; font-size: 30px") if status == 'problematic': self.status_label.setStyleSheet("color: yellow; font-size: 30px") self.layout.addWidget(self.status_label) self.addButton = QToolButton() self.addButton.setText(self.tr("Add")) self.addButton.clicked.connect(self.addToMap) self.layout.addWidget(self.addButton) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum) self.geoservice = geoservice self.image_ba = image_ba def addToMap(self): try: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) client = Client() client.set_proxy(*QGISSettings.get_qgis_proxy()) geoservice_info = client.get_geoservice_info(self.geoservice) ds = DataSourceSerializer.read_from_json(geoservice_info) add_layer_to_map(ds) CachedServices().add_service(self.geoservice, self.image_ba) except Exception as ex: plPrint(unicode(ex)) pass finally: QApplication.restoreOverrideCursor() def mouseDoubleClickEvent(self, event): self.addToMap() def enterEvent(self, event): extent = self.geoservice.get('extent', None) if self.extent_renderer and extent: if ';' in extent: extent = extent.split(';')[1] geom = QgsGeometry.fromWkt(extent) self.extent_renderer.show_feature(geom) def leaveEvent(self, event): if self.extent_renderer: self.extent_renderer.clear_feature()
class TrackingDisplay(QToolBar): ''' Display the position of a mobile and add action for centering the map on the vehicle and erasing the track ''' def __init__(self, mobile, parent=None): super(TrackingDisplay, self).__init__(parent) self.setMovable(True) self.setFloatable(True) self.mobile = mobile self.timedOut = True self.lastFix = 0.0 s = QSettings() self.defFormat = s.value('PosiView/Misc/DefaultFormat', defaultValue=0, type=int) self.format = self.defFormat & 3 self.withSuff = QgsCoordinateFormatter.FlagDegreesUseStringSuffix if bool(self.defFormat & 4) else QgsCoordinateFormatter.FormatFlag(0) self.createActions() self.mobile.newPosition.connect(self.onNewPosition) self.mobile.timeout.connect(self.onTimeout) def createActions(self): self.nameLabel = QLabel(self.mobile.name) self.nameLabel.setMinimumSize(80, 23) self.nameLabelAction = QWidgetAction(self) self.nameLabelAction.setDefaultWidget(self.nameLabel) self.addAction(self.nameLabelAction) self.enableAction = QAction("Enable Display", self) self.enableAction.setCheckable(True) self.enableAction.setChecked(True) icon = QIcon(':/plugins/PosiView/ledgrey.png') icon.addFile(':/plugins/PosiView/ledgreen.png', QSize(), QIcon.Normal, QIcon.On) self.enableAction.setIcon(icon) self.addAction(self.enableAction) self.enableAction.triggered.connect(self.onEnableClicked) self.enableAction.triggered.connect(self.mobile.setEnabled) self.addSeparator() self.posLabel = QLabel("--:--:-- 0.000000 0.000000") self.posLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) widths = (180, 196, 204, 180, 184, 200, 208, 184) self.posLabel.setMinimumSize(widths[self.format], 23) self.posLabel.setStyleSheet('background: red; font-size: 8pt; color: white;') self.posLabelAction = QWidgetAction(self) self.posLabelAction.setDefaultWidget(self.posLabel) self.addAction(self.posLabelAction) self.centerAction = QAction(QIcon(':/plugins/PosiView/center.png'), "Center &Map", self) self.addAction(self.centerAction) self.deleteTrackAction = QAction(QIcon(':/plugins/PosiView/deletetrack.png'), 'Delete &Track', self) self.addAction(self.deleteTrackAction) self.deleteTrackAction.triggered.connect(self.mobile.deleteTrack) self.centerAction.triggered.connect(self.mobile.centerOnMap) @pyqtSlot(float, QgsPointXY, float, float) def onNewPosition(self, fix, pos, depth, altitude): s = str() if fix > 0: s = strftime('%H:%M:%S ', gmtime(fix)) else: s = '--:--:-- ' if self.format == 0: s += "{:f} {:f}".format(pos.y(), pos.x()) elif self.format == 1: s += ', '.join(QgsCoordinateFormatter.format(pos, QgsCoordinateFormatter.FormatDegreesMinutes, 4, self.withSuff ).rsplit(',')[::-1]) else: s += ', '.join(QgsCoordinateFormatter.format(pos, QgsCoordinateFormatter.FormatDegreesMinutesSeconds, 2, self.withSuff ).rsplit(',')[::-1]) if depth > -9999: s += "\nd = {:.1f}".format(depth) if altitude > -9999: if depth > -9999: s += " alt = {:.1f}".format(altitude) else: s += "\nalt = {:.1f}".format(altitude) self.posLabel.setText(s) if self.timedOut: if fix > self.lastFix: self.posLabel.setStyleSheet('background: lime; font-size: 8pt; color: black;') self.timedOut = False self.lastFix = fix @pyqtSlot() def onTimeout(self): if not self.timedOut: self.timedOut = True self.posLabel.setStyleSheet('background: red; font-size: 8pt; color: white;') @pyqtSlot(bool) def onEnableClicked(self, enable): self.timedOut = True if enable: self.posLabel.setStyleSheet('background: red; font-size: 8pt; color: white;') else: self.posLabel.setStyleSheet('background: white; font-size: 8pt; color: black;') def releaseMobile(self): self.mobile = None
class AboutDialog(QDialog): def __init__(self): QDialog.__init__(self) self.initGui() self.btnHelp = self.buttonBox.button(QDialogButtonBox.Help) self.lblLogo.setPixmap(QPixmap(":/icons/qconsolidate.png")) cfg = configparser.SafeConfigParser() cfg.read(os.path.join(os.path.dirname(__file__), "metadata.txt")) version = cfg.get("general", "version") self.lblVersion.setText(self.tr("Version: %s") % (version)) doc = QTextDocument() doc.setHtml(self.getAboutText()) self.textBrowser.setDocument(doc) self.textBrowser.setOpenExternalLinks(True) self.buttonBox.helpRequested.connect(self.openHelp) self.btnClose = self.buttonBox.button(QDialogButtonBox.Close) self.btnClose.clicked.connect(self.reject) def initGui(self): self.setWindowTitle('QConsolidate3') self.buttonBox = QDialogButtonBox(QDialogButtonBox.Close | QDialogButtonBox.Help) self.label = QLabel("QConsolidate3") self.label.setStyleSheet("font-weight: bold") self.lblLogo = QLabel() self.lblVersion = QLabel() self.textBrowser = QTextBrowser() self.h_layout = QHBoxLayout() self.h_layout.addWidget(self.lblLogo) self.h_layout.addWidget(self.label) self.v_layout = QVBoxLayout() self.v_layout.addLayout(self.h_layout) self.v_layout.addWidget(self.lblVersion) self.v_layout.addWidget(self.textBrowser) self.v_layout.addWidget(self.buttonBox) self.setLayout(self.v_layout) def openHelp(self): QDesktopServices.openUrl( QUrl("https://github.com/danzig666/qconsolidate3")) def getAboutText(self): return self.tr(""" <p>Consolidates all layers from current QGIS project into one directory (optionally zipping the whole project in a single file).</p> <p><strong>Developed by</strong>: Danzig </p> <p>Fork of the q-consolidate plugin by Alexander Bruy</p> <p>and the OQ-Consolidate plugin GEM Foundation</p> <p><strong>Homepage</strong>: <a href="https://github.com/danzig666/qconsolidate3/"> homepage</a></p> <p>Please report bugs at <a href="https://github.com/danzig666/qconsolidate3/issues"> bugtracker</a>.</p> """)
class QmsSearchResultItemWidget(QWidget): def __init__(self, geoservice, image_ba, parent=None, extent_renderer=None): QWidget.__init__(self, parent) self.extent_renderer = extent_renderer self.layout = QHBoxLayout(self) self.layout.setContentsMargins(5, 10, 5, 10) self.setLayout(self.layout) self.service_icon = QLabel(self) self.service_icon.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.service_icon.resize(24, 24) qimg = QImage.fromData(image_ba) pixmap = QPixmap.fromImage(qimg) self.service_icon.setPixmap(pixmap) self.layout.addWidget(self.service_icon) self.service_desc_layout = QGridLayout(self) self.service_desc_layout.setSpacing(0) self.layout.addLayout(self.service_desc_layout) self.service_name = QLabel(self) self.service_name.setTextFormat(Qt.RichText) self.service_name.setWordWrap(True) self.service_name.setText(u" <strong> {} </strong>".format(geoservice.get('name', u""))) self.service_desc_layout.addWidget(self.service_name, 0, 0, 1, 3) self.service_type = QLabel(self) self.service_type.setTextFormat(Qt.RichText) self.service_type.setWordWrap(True) self.service_type.setText(geoservice.get('type', u"").upper() + " ") self.service_desc_layout.addWidget(self.service_type, 1, 0) self.service_deteils = QLabel(self) self.service_deteils.setTextFormat(Qt.RichText) self.service_deteils.setWordWrap(True) self.service_deteils.setOpenExternalLinks(True) self.service_deteils.setText(u"<a href=\"{0}\">{1}</a>, ".format( Client().geoservice_info_url(geoservice.get('id', u"")), self.tr('details') )) self.service_desc_layout.addWidget(self.service_deteils, 1, 1) self.service_report = QLabel(self) self.service_report.setTextFormat(Qt.RichText) self.service_report.setWordWrap(True) self.service_report.setOpenExternalLinks(True) self.service_report.setText(u"<a href=\"{0}\">{1}</a><div/>".format( Client().geoservice_report_url(geoservice.get('id', u"")), self.tr('report a problem') )) self.service_desc_layout.addWidget(self.service_report, 1, 2) self.service_desc_layout.setColumnStretch(2, 1) self.status_label = QLabel(self) self.status_label.setTextFormat(Qt.RichText) self.status_label.setText(u'\u2022') status = geoservice.get('cumulative_status', u'') if status == 'works': self.status_label.setStyleSheet("color: green; font-size: 30px") if status == 'failed': self.status_label.setStyleSheet("color: red; font-size: 30px") if status == 'problematic': self.status_label.setStyleSheet("color: yellow; font-size: 30px") self.layout.addWidget(self.status_label) self.addButton = QToolButton() self.addButton.setText(self.tr("Add")) self.addButton.clicked.connect(self.addToMap) self.layout.addWidget(self.addButton) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum) self.geoservice = geoservice self.image_ba = image_ba def addToMap(self): try: QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) client = Client() client.set_proxy(*QGISSettings.get_qgis_proxy()) geoservice_info = client.get_geoservice_info(self.geoservice) ds = DataSourceSerializer.read_from_json(geoservice_info) add_layer_to_map(ds) CachedServices().add_service(self.geoservice, self.image_ba) except Exception as ex: plPrint(unicode(ex)) pass finally: QApplication.restoreOverrideCursor() def mouseDoubleClickEvent(self, event): self.addToMap() def enterEvent(self, event): extent = self.geoservice.get('extent', None) if self.extent_renderer and extent: if ';' in extent: extent = extent.split(';')[1] geom = QgsGeometry.fromWkt(extent) self.extent_renderer.show_feature(geom) def leaveEvent(self, event): if self.extent_renderer: self.extent_renderer.clear_feature()