def __init__(self, iface, parent=None): """Constructor.""" super(ProjectConfigurationDialog, self).__init__(parent=parent) self.iface = iface self.accepted.connect(self.onAccepted) self.project = QgsProject.instance() self.__project_configuration = ProjectConfiguration(self.project) self.setupUi(self) self.toggle_menu = QMenu(self) self.remove_all_action = QAction(self.tr("remove all layers"), self.toggle_menu) self.toggle_menu.addAction(self.remove_all_action) self.remove_hidden_action = QAction(self.tr("remove hidden layers"), self.toggle_menu) self.toggle_menu.addAction(self.remove_hidden_action) self.add_all_copy_action = QAction(self.tr("add all layers"), self.toggle_menu) self.toggle_menu.addAction(self.add_all_copy_action) self.add_visible_copy_action = QAction(self.tr("add visible layers"), self.toggle_menu) self.toggle_menu.addAction(self.add_visible_copy_action) self.add_all_offline_action = QAction(self.tr("add all vector layers as offline"), self.toggle_menu) self.toggle_menu.addAction(self.add_all_offline_action) self.add_visible_offline_action = QAction(self.tr("add visible vector layers as offline"), self.toggle_menu) self.toggle_menu.addAction(self.add_visible_offline_action) self.multipleToggleButton.setMenu(self.toggle_menu) self.multipleToggleButton.setAutoRaise(True) self.multipleToggleButton.setPopupMode(QToolButton.InstantPopup) self.toggle_menu.triggered.connect(self.toggle_menu_triggered) self.singleLayerRadioButton.toggled.connect(self.baseMapTypeChanged) self.unsupportedLayersList = list() self.reloadProject()
def __init__(self, parent=None): """Constructor.""" super().__init__(parent) self.setupUi(self) self.project = QgsProject.instance() self.__project_configuration = ProjectConfiguration(self.project) self.multipleToggleButton.setIcon(QIcon(os.path.join(os.path.dirname(__file__), '../resources/visibility.svg'))) self.toggle_menu = QMenu(self) self.remove_all_action = QAction(self.tr("Remove All Layers"), self.toggle_menu) self.toggle_menu.addAction(self.remove_all_action) self.remove_hidden_action = QAction(self.tr("Remove Hidden Layers"), self.toggle_menu) self.toggle_menu.addAction(self.remove_hidden_action) self.add_all_copy_action = QAction(self.tr("Add All Layers"), self.toggle_menu) self.toggle_menu.addAction(self.add_all_copy_action) self.add_visible_copy_action = QAction(self.tr("Add Visible Layers"), self.toggle_menu) self.toggle_menu.addAction(self.add_visible_copy_action) self.add_all_offline_action = QAction(self.tr("Add All Vector Layers as Offline"), self.toggle_menu) self.toggle_menu.addAction(self.add_all_offline_action) self.add_visible_offline_action = QAction(self.tr("Add Visible Vector Layers as Offline"), self.toggle_menu) self.toggle_menu.addAction(self.add_visible_offline_action) self.multipleToggleButton.setMenu(self.toggle_menu) self.multipleToggleButton.setAutoRaise(True) self.multipleToggleButton.setPopupMode(QToolButton.InstantPopup) self.toggle_menu.triggered.connect(self.toggle_menu_triggered) self.singleLayerRadioButton.toggled.connect(self.baseMapTypeChanged) self.unsupportedLayersList = list() self.reloadProject()
def reloadProject(self): """ Load all layers from the map layer registry into the table. """ self.layersTable.setRowCount(0) self.layersTable.setSortingEnabled(False) for layer in self.project.mapLayers().values(): layer_source = LayerSource(layer) count = self.layersTable.rowCount() self.layersTable.insertRow(count) item = QTableWidgetItem(layer.name()) item.setData(Qt.UserRole, layer_source) item.setData(Qt.EditRole, layer.name()) self.layersTable.setItem(count, 0, item) cbx = QComboBox() for action, description in layer_source.available_actions: cbx.addItem(description) cbx.setItemData(cbx.count() - 1, action) if layer_source.action == action: cbx.setCurrentIndex(cbx.count() - 1) self.layersTable.setCellWidget(count, 1, cbx) self.layersTable.resizeColumnsToContents() self.layersTable.sortByColumn(0, Qt.AscendingOrder) self.layersTable.setSortingEnabled(True) # Load Map Themes for theme in self.project.mapThemeCollection().mapThemes(): self.mapThemeComboBox.addItem(theme) self.layerComboBox.setFilters(QgsMapLayerProxyModel.RasterLayer) self.__project_configuration = ProjectConfiguration(self.project) self.createBaseMapGroupBox.setChecked( self.__project_configuration.create_base_map) if self.__project_configuration.base_map_type == ProjectProperties.BaseMapType.SINGLE_LAYER: self.singleLayerRadioButton.setChecked(True) else: self.mapThemeRadioButton.setChecked(True) self.mapThemeComboBox.setCurrentIndex( self.mapThemeComboBox.findText( self.__project_configuration.base_map_theme)) layer = self.project.mapLayer( self.__project_configuration.base_map_layer) self.layerComboBox.setLayer(layer) self.mapUnitsPerPixel.setText( str(self.__project_configuration.base_map_mupp)) self.tileSize.setText( str(self.__project_configuration.base_map_tile_size)) self.onlyOfflineCopyFeaturesInAoi.setChecked( self.__project_configuration.offline_copy_only_aoi)
def __init__(self, iface, parent=None): """Constructor.""" super(ProjectConfigurationDialog, self).__init__(parent=parent) self.iface = iface self.accepted.connect(self.onAccepted) self.project = QgsProject.instance() self.__project_configuration = ProjectConfiguration(self.project) self.setupUi(self) self.singleLayerRadioButton.toggled.connect(self.baseMapTypeChanged) self.reloadProject()
def update_info_visibility(self): """ Show the info label if there are unconfigured layers """ self.infoGroupBox.hide() for layer in self.project.mapLayers().values(): if not LayerSource(layer).is_configured: self.infoGroupBox.show() project_configuration = ProjectConfiguration(self.project) if project_configuration.offline_copy_only_aoi or project_configuration.create_base_map: self.informationStack.setCurrentWidget(self.selectExtentPage) else: self.informationStack.setCurrentWidget(self.progressPage)
def update_info_visibility(self): """ Show the info label if there are unconfigured layers """ pathResolver = QgsProject.instance().pathResolver() showInfoConfiguration = False localizedDataPathLayers = [] for layer in list(self.project.mapLayers().values()): if not LayerSource(layer).is_configured: showInfoConfiguration = True if layer.dataProvider() is not None: metadata = QgsProviderRegistry.instance().providerMetadata( layer.dataProvider().name()) if metadata is not None: decoded = metadata.decodeUri(layer.source()) if "path" in decoded: path = pathResolver.writePath(decoded["path"]) if path.startswith("localized:"): localizedDataPathLayers.append('- {} ({})'.format( layer.name(), path[10:])) self.infoConfigurationLabel.setVisible(showInfoConfiguration) if localizedDataPathLayers: if len(localizedDataPathLayers) == 1: self.infoLocalizedLayersLabel.setText( self.tr('The layer stored in a localized data path is:\n{}' ).format("\n".join(localizedDataPathLayers))) else: self.infoLocalizedLayersLabel.setText( self.tr( 'The layers stored in a localized data path are:\n{}'). format("\n".join(localizedDataPathLayers))) self.infoLocalizedLayersLabel.setVisible(True) self.infoLocalizedPresentLabel.setVisible(True) else: self.infoLocalizedLayersLabel.setVisible(False) self.infoLocalizedPresentLabel.setVisible(False) self.infoGroupBox.setVisible(showInfoConfiguration or len(localizedDataPathLayers) > 0) project_configuration = ProjectConfiguration(self.project) if project_configuration.offline_copy_only_aoi or project_configuration.create_base_map: self.informationStack.setCurrentWidget(self.selectExtentPage) else: self.informationStack.setCurrentWidget(self.progressPage)
def reloadProject(self): """ Load all layers from the map layer registry into the table. """ self.unsupportedLayersList = list() self.photoNamingTable = PhotoNamingTableWidget() self.photoNamingTab.layout().addWidget(self.photoNamingTable) self.layersTable.setRowCount(0) self.layersTable.setSortingEnabled(False) for layer in self.project.mapLayers().values(): layer_source = LayerSource(layer) count = self.layersTable.rowCount() self.layersTable.insertRow(count) item = QTableWidgetItem(layer.name()) item.setData(Qt.UserRole, layer_source) item.setData(Qt.EditRole, layer.name()) self.layersTable.setItem(count, 0, item) cmb = QComboBox() set_available_actions(cmb, layer_source) cbx = QCheckBox() cbx.setEnabled(layer_source.can_lock_geometry) cbx.setChecked(layer_source.is_geometry_locked) # it's more UI friendly when the checkbox is centered, an ugly workaround to achieve it cbx_widget = QWidget() cbx_layout = QHBoxLayout() cbx_layout.setAlignment(Qt.AlignCenter) cbx_layout.setContentsMargins(0, 0, 0, 0) cbx_layout.addWidget(cbx) cbx_widget.setLayout(cbx_layout) # NOTE the margin is not updated when the table column is resized, so better rely on the code above # cbx.setStyleSheet("margin-left:50%; margin-right:50%;") self.layersTable.setCellWidget(count, 1, cbx_widget) self.layersTable.setCellWidget(count, 2, cmb) if not layer_source.is_supported: self.unsupportedLayersList.append(layer_source) self.layersTable.item(count,0).setFlags(Qt.NoItemFlags) self.layersTable.cellWidget(count,1).setEnabled(False) self.layersTable.cellWidget(count,2).setEnabled(False) cmb.setCurrentIndex(cmb.findData(SyncAction.REMOVE)) # make sure layer_source is the same instance everywhere self.photoNamingTable.addLayerFields(layer_source) self.layersTable.resizeColumnsToContents() self.layersTable.sortByColumn(0, Qt.AscendingOrder) self.layersTable.setSortingEnabled(True) # Remove the tab when not yet suported in QGIS if Qgis.QGIS_VERSION_INT < 31300: self.tabWidget.removeTab(self.tabWidget.count() - 1) # Load Map Themes for theme in self.project.mapThemeCollection().mapThemes(): self.mapThemeComboBox.addItem(theme) self.layerComboBox.setFilters(QgsMapLayerProxyModel.RasterLayer) self.__project_configuration = ProjectConfiguration(self.project) self.createBaseMapGroupBox.setChecked(self.__project_configuration.create_base_map) if self.__project_configuration.base_map_type == ProjectProperties.BaseMapType.SINGLE_LAYER: self.singleLayerRadioButton.setChecked(True) else: self.mapThemeRadioButton.setChecked(True) self.mapThemeComboBox.setCurrentIndex( self.mapThemeComboBox.findText(self.__project_configuration.base_map_theme)) layer = QgsProject.instance().mapLayer(self.__project_configuration.base_map_layer) self.layerComboBox.setLayer(layer) self.mapUnitsPerPixel.setText(str(self.__project_configuration.base_map_mupp)) self.tileSize.setText(str(self.__project_configuration.base_map_tile_size)) self.onlyOfflineCopyFeaturesInAoi.setChecked(self.__project_configuration.offline_copy_only_aoi) if self.unsupportedLayersList: self.unsupportedLayersLabel.setVisible(True) unsupported_layers_text = '<b>{}: </b>'.format(self.tr('Warning')) unsupported_layers_text += self.tr("There are unsupported layers in your project which will not be available in QField.") unsupported_layers_text += self.tr(" If needed, you can create a Base Map to include those layers in your packaged project.") self.unsupportedLayersLabel.setText(unsupported_layers_text)
def reloadProject(self): """ Load all layers from the map layer registry into the table. """ self.unsupportedLayersList = list() self.layersTable.setRowCount(0) self.layersTable.setSortingEnabled(False) for layer in list(self.project.mapLayers().values()): layer_source = LayerSource(layer) if not layer_source.is_supported: self.unsupportedLayersList.append(layer_source) count = self.layersTable.rowCount() self.layersTable.insertRow(count) item = QTableWidgetItem(layer.name()) item.setData(Qt.UserRole, layer_source) item.setData(Qt.EditRole, layer.name()) self.layersTable.setItem(count, 0, item) cbx = QComboBox() for action, description in layer_source.available_actions: cbx.addItem(description) cbx.setItemData(cbx.count() - 1, action) if layer_source.action == action: cbx.setCurrentIndex(cbx.count() - 1) self.layersTable.setCellWidget(count, 1, cbx) self.layersTable.resizeColumnsToContents() self.layersTable.sortByColumn(0, Qt.AscendingOrder) self.layersTable.setSortingEnabled(True) # Load Map Themes for theme in self.project.mapThemeCollection().mapThemes(): self.mapThemeComboBox.addItem(theme) self.layerComboBox.setFilters(QgsMapLayerProxyModel.RasterLayer) self.__project_configuration = ProjectConfiguration(self.project) self.createBaseMapGroupBox.setChecked( self.__project_configuration.create_base_map) if self.__project_configuration.base_map_type == ProjectProperties.BaseMapType.SINGLE_LAYER: self.singleLayerRadioButton.setChecked(True) else: self.mapThemeRadioButton.setChecked(True) self.mapThemeComboBox.setCurrentIndex( self.mapThemeComboBox.findText( self.__project_configuration.base_map_theme)) layer = QgsProject.instance().mapLayer( self.__project_configuration.base_map_layer) self.layerComboBox.setLayer(layer) self.mapUnitsPerPixel.setText( str(self.__project_configuration.base_map_mupp)) self.tileSize.setText( str(self.__project_configuration.base_map_tile_size)) self.onlyOfflineCopyFeaturesInAoi.setChecked( self.__project_configuration.offline_copy_only_aoi) if self.unsupportedLayersList: self.unsupportedLayers.setVisible(True) unsuppoerted_layers_text = '<b>{}</b><br>'.format( self.tr('Warning')) unsuppoerted_layers_text += self.tr( "There are unsupported layers in your project. They will not be available on QField." ) unsuppoerted_layers_text += '<ul>' for layer in self.unsupportedLayersList: unsuppoerted_layers_text += '<li>' + '<b>' + layer.name + ':</b> ' + layer.warning unsuppoerted_layers_text += '<ul>' self.unsupportedLayers.setText(unsuppoerted_layers_text)