class ConnectCredentialsWidget(QWidget): rememberStateChanged = pyqtSignal(int) def __init__(self, parent=None): QWidget.__init__(self, parent) self.leLogin = IconLineEdit(self) self.leLogin.setIcon(QIcon(os.path.join(iconsPath, "envelope.svg"))) self.leLogin.setPlaceholderText("Email") self.lePassword = PasswordLineEdit(self) self.chkRemember = QCheckBox(self) self.chkRemember.setText("Remember me") self.lblResetPassword = QLabel(self) self.lblResetPassword.setAlignment(Qt.AlignCenter) self.lblResetPassword.setOpenExternalLinks(True) self.lblResetPassword.setTextInteractionFlags(Qt.LinksAccessibleByKeyboard | Qt.LinksAccessibleByMouse) self.lblResetPassword.setText("<html><head/><body><p><a href='https://boundlessgeo.auth0.com/login?client=rmtncamSKiwRBuVYTvFYJGtTspVuplMh'><span style='text-decoration: underline; color:#0000ff;'>Don't remember your password?</span></a></p></body></html>") self.lblRegister = QLabel(self) self.lblRegister.setAlignment(Qt.AlignCenter) self.lblRegister.setOpenExternalLinks(True) self.lblRegister.setTextInteractionFlags(Qt.LinksAccessibleByKeyboard | Qt.LinksAccessibleByMouse) self.lblRegister.setText("<html><head/><body><p><a href='https://connect.boundlessgeo.com'><span style='text-decoration: underline; color:#0000ff;'>Don't have an account?</span></a></p></body></html>") self.layout = QVBoxLayout(self) self.layout.addWidget(self.leLogin) self.layout.addWidget(self.lePassword) self.layout.addWidget(self.chkRemember) self.layout.addWidget(self.lblResetPassword) self.layout.addWidget(self.lblRegister) self.setLayout(self.layout) self.chkRemember.stateChanged.connect(self.rememberCheckChanged) def login(self): return self.leLogin.text() def setLogin(self, login): self.leLogin.setText(login) def password(self): return self.lePassword.text() def setPassword(self, password): self.lePassword.setText(password) def remember(self): return self.chkRemember.isChecked() def setRemember(self, state): self.chkRemember.setCheckState(state) def rememberCheckChanged(self, state): self.rememberStateChanged.emit(state)
def do_post_offline_convert_action(self): """ Show an information label that the project has been copied with a nice link to open the result folder. """ export_folder = self.get_export_folder_from_dialog() result_label = QLabel(self.tr(u'Finished creating the project at {result_folder}. Please copy this folder to ' u'your QField device.').format( result_folder=u'<a href="{folder}">{folder}</a>'.format(folder=export_folder))) result_label.setTextFormat(Qt.RichText) result_label.setTextInteractionFlags(Qt.TextBrowserInteraction) result_label.linkActivated.connect(lambda: open_folder(export_folder)) result_label.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred) self.iface.messageBar().pushWidget(result_label, Qgis.Info, 0)
def mk_prj_storage_icon(self, qgs_type_storage: str) -> QLabel: """Returns a QLabel with the matching icon for the storage type. :param qgs_type_storage: storage type :type qgs_type_storage: str :return: QLabel to be set in a cellWidget :rtype: QLabel """ lbl_location_type = QLabel(self.tableWidget) lbl_location_type.setPixmap( QPixmap(icon_per_storage_type(qgs_type_storage))) lbl_location_type.setScaledContents(True) lbl_location_type.setMaximumSize(20, 20) lbl_location_type.setAlignment(Qt.AlignCenter) lbl_location_type.setTextInteractionFlags(Qt.NoTextInteraction) lbl_location_type.setToolTip(qgs_type_storage) return lbl_location_type
def do_post_offline_convert_action(self): """ Show an information label that the project has been copied with a nice link to open the result folder. """ export_folder = self.get_export_folder_from_dialog() result_label = QLabel( self. tr(u'Finished creating the project at {result_folder}. Please copy this folder to ' u'your QField device.').format( result_folder=u'<a href="{folder}">{folder}</a>'.format( folder=export_folder))) result_label.setTextFormat(Qt.RichText) result_label.setTextInteractionFlags(Qt.TextBrowserInteraction) result_label.linkActivated.connect(lambda: open_folder(export_folder)) result_label.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred) self.iface.messageBar().pushWidget(result_label, QgsMessageBar.INFO, 0)
class PlanetOrderItemTypeWidget(QWidget): selectionChanged = pyqtSignal() def __init__(self, item_type, images): super().__init__() self.thumbnails = [] self.item_type = item_type self.images = images layout = QGridLayout() layout.setMargin(0) self.labelThumbnail = QLabel() pixmap = QPixmap(PLACEHOLDER_THUMB, "SVG") thumb = pixmap.scaled(96, 96, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.labelThumbnail.setPixmap(thumb) self.labelThumbnail.setFixedSize(96, 96) layout.addWidget(self.labelThumbnail, 0, 0, 3, 1) for image in images: url = f"{image['_links']['thumbnail']}?api_key={PlanetClient.getInstance().api_key()}" download_thumbnail(url, self) labelName = IconLabel( f"<b>{PlanetClient.getInstance().item_types_names()[self.item_type]}</b>", SATELLITE_ICON, ) labelNumItems = IconLabel(f"{len(images)} items", NITEMS_ICON) layout.addWidget(labelNumItems, 0, 1) layout.addWidget(labelName, 1, 1) self.btnDetails = QPushButton() self.btnDetails.setFlat(True) self.btnDetails.setIcon(EXPAND_MORE_ICON) self.btnDetails.clicked.connect(self._btnDetailsClicked) layout.addWidget(self.btnDetails, 0, 2) self.widgetDetails = QWidget() layout.addWidget(self.widgetDetails, 3, 0, 1, 3) line = QFrame() line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) layout.addWidget(line, 4, 0, 1, 3) self.setLayout(layout) self.widgetDetails.hide() self.updateGeometry() self.populate_details() def populate_details(self): self.bundleWidgets = [] client = PlanetClient.getInstance() permissions = [img[PERMISSIONS] for img in self.images] item_bundles = client.bundles_for_item_type(self.item_type, permissions=permissions) default = default_bundles.get(self.item_type, "") def _center(obj): hlayout = QHBoxLayout() hlayout.addStretch() hlayout.addWidget(obj) hlayout.addStretch() return hlayout layout = QVBoxLayout() layout.setMargin(0) layout.setSpacing(20) layout.addLayout(_center(QLabel("<b>RECTIFIED ASSETS</b>"))) gridlayout = QGridLayout() gridlayout.setMargin(0) widgets = {} i = 0 for bundleid, bundle in item_bundles.items(): if bundle["rectification"] == "orthorectified": name = bundle["name"] description = bundle["description"] udm = bundle.get("auxiliaryFiles", "").lower().startswith("udm2") assets = bundle["assets"][self.item_type] can_harmonize = ("ortho_analytic_4b_sr" in assets or "ortho_analytic_8b_sr" in assets) w = PlanetOrderBundleWidget(bundleid, name, description, udm, can_harmonize, True) gridlayout.addWidget(w, i // 2, i % 2) w.setSelected(False) widgets[bundleid] = w w.selectionChanged.connect( partial(self._bundle_selection_changed, w)) self.bundleWidgets.append(w) i += 1 selected = False for defaultid in default: for bundleid, w in widgets.items(): if defaultid == bundleid: w.setSelected(True) selected = True break if selected: break layout.addLayout(gridlayout) self.labelUnrectified = QLabel("<b>UNRECTIFIED ASSETS</b>") layout.addLayout(_center(self.labelUnrectified)) self.widgetUnrectified = QWidget() gridlayoutUnrect = QGridLayout() gridlayoutUnrect.setMargin(0) i = 0 for bundleid, bundle in item_bundles.items(): if bundle["rectification"] != "orthorectified": name = bundle["name"] description = bundle["description"] udm = bundle.get("auxiliaryFiles", "").lower().startswith("udm2") assets = bundle["assets"][self.item_type] can_harmonize = ("ortho_analytic_4b_sr" in assets or "ortho_analytic_8b_sr" in assets) w = PlanetOrderBundleWidget(bundleid, name, description, udm, can_harmonize, False) gridlayoutUnrect.addWidget(w, i // 2, i % 2) w.selectionChanged.connect( partial(self._bundle_selection_changed, w)) self.bundleWidgets.append(w) i += 1 self.widgetUnrectified.setLayout(gridlayoutUnrect) layout.addWidget(self.widgetUnrectified) self.labelMore = QLabel('<a href="#">+ Show More</a>') self.labelMore.setOpenExternalLinks(False) self.labelMore.setTextInteractionFlags(Qt.LinksAccessibleByMouse) self.labelMore.linkActivated.connect(self._showMoreClicked) layout.addLayout(_center(self.labelMore)) self.widgetUnrectified.hide() self.labelUnrectified.hide() self.widgetDetails.setLayout(layout) def _bundle_selection_changed(self, widget): for w in self.bundleWidgets: if widget != w: w.setSelected(False, False) self.selectionChanged.emit() def _showMoreClicked(self): visible = self.widgetUnrectified.isVisible() self.widgetUnrectified.setVisible(not visible) self.labelUnrectified.setVisible(not visible) if visible: self.labelMore.setText('<a href="#">+ Show More</a>') else: self.labelMore.setText('<a href="#">- Show Less</a>') def expand(self): self.widgetDetails.show() self.btnDetails.setIcon(EXPAND_LESS_ICON) self.updateGeometry() def _btnDetailsClicked(self): if self.widgetDetails.isVisible(): self.widgetDetails.hide() self.btnDetails.setIcon(EXPAND_MORE_ICON) else: self.widgetDetails.show() self.btnDetails.setIcon(EXPAND_LESS_ICON) self.updateGeometry() def bundles(self): bundles = [] for w in self.bundleWidgets: if w.selected(): bundle = {} bundle["id"] = w.bundleid bundle["name"] = w.name bundle["filetype"] = w.filetype() bundle["udm"] = w.udm bundle["rectified"] = w.rectified bundle["canharmonize"] = w.can_harmonize bundles.append(bundle) return bundles def set_thumbnail(self, img): thumbnail = QPixmap(img) self.thumbnails.append( thumbnail.scaled(96, 96, Qt.KeepAspectRatio, Qt.SmoothTransformation)) if len(self.images) == len(self.thumbnails): bboxes = [img[GEOMETRY] for img in self.images] pixmap = createCompoundThumbnail(bboxes, self.thumbnails) thumb = pixmap.scaled(128, 128, Qt.KeepAspectRatio, Qt.SmoothTransformation) self.labelThumbnail.setPixmap(thumb)
class DebugWidget(QWidget): def __init__(self, exc_info, parent=None): QWidget.__init__(self, parent) etype, value, tb = exc_info self.tb = tb self.entries = traceback.extract_tb(tb) self.setWindowTitle('Python Error') msg = str(value).replace("\n", "<br>").replace(" ", " ") self.error = QLabel("<h1>" + etype.__name__ + "</h1><b>" + msg + "</b>") self.error.setTextInteractionFlags(Qt.TextSelectableByMouse) self.frames = FramesView() self.frames.setTraceback(tb) self.frames.selectionModel().currentChanged.connect( self.current_frame_changed) self.source = SourceView() self.splitterSrc = QSplitter(Qt.Horizontal) self.splitterSrc.addWidget(self.frames) self.splitterSrc.addWidget(self.source) self.splitterSrc.setStretchFactor(0, 1) self.splitterSrc.setStretchFactor(1, 2) self.variables = VariablesView() self.console = ConsoleWidget(exc_info) self.splitterMain = QSplitter(Qt.Vertical) self.splitterMain.addWidget(self.splitterSrc) self.splitterMain.addWidget(self.variables) self.splitterMain.addWidget(self.console) l = QVBoxLayout() l.addWidget(self.error) l.addWidget(self.splitterMain) self.setLayout(l) self.resize(800, 600) s = QSettings() self.splitterSrc.restoreState(s.value("/FirstAid/splitterSrc", b"")) self.splitterMain.restoreState(s.value("/FirstAid/splitterMain", b"")) self.restoreGeometry(s.value("/FirstAid/geometry", b"")) # select the last frame self.frames.setCurrentIndex( self.frames.model().index(len(self.entries) - 1)) def closeEvent(self, event): s = QSettings() s.setValue("/FirstAid/splitterSrc", self.splitterSrc.saveState()) s.setValue("/FirstAid/splitterMain", self.splitterMain.saveState()) s.setValue("/FirstAid/geometry", self.saveGeometry()) QWidget.closeEvent(self, event) def current_frame_changed(self, current, previous): row = current.row() if row >= 0 and row < len(self.entries): self.go_to_frame(row) def go_to_frame(self, index): filename = self.entries[index][0] lineno = self.entries[index][1] self.source.openFile(filename) self.source.jumpToLine(lineno) local_vars = frame_from_traceback(self.tb, index).f_locals self.variables.setVariables(local_vars) self.console.go_to_frame(index)