Esempio n. 1
0
class DataSourceSelectDialog(base, ui):
    """
    Reusable dialog for selecting a map layer source based on the QGIS browser.
    Allows for selection of disk based layers, together with layers from database
    and online providers (such as Oracle/Postgres/etc)
    """
    def __init__(self, layer_name, original_uri, layer_type, parent=None):
        super().__init__(parent)

        self.setupUi(self)
        self.setWindowTitle("Select Source for {}".format(layer_name))
        QgsGui.enableAutoGeometryRestore(self)

        # in case browser panel isn't open, we need to force initialize the model now
        iface.browserModel().initialize()

        self.browser_proxy_model = QgsBrowserProxyModel(self)
        self.browser_proxy_model.setBrowserModel(iface.browserModel())
        self.browser_proxy_model.setFilterByLayerType(True)
        self.browser_proxy_model.setLayerType(layer_type)
        self.mBrowserTreeView.setHeaderHidden(True)
        self.mBrowserTreeView.setModel(self.browser_proxy_model)
        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
        self.mBrowserTreeView.clicked.connect(self.on_layer_selected)
        self.uri = None
        self.description_label = None
        self.setDescription("Original source: {}".format(original_uri))

    def setDescription(self, description):
        """
        Sets the description to show in the dialog
        """
        if description:
            if not self.description_label:
                self.description_label = QLabel()
                self.description_label.setWordWrap(True)
                self.description_label.setMargin(4)
                self.verticalLayout.insertWidget(1, self.description_label)
            self.description_label.setText(description)
        else:
            if self.description_label:
                self.verticalLayout.removeWidget(self.description_label)
                self.description_label.deleteLater()
                self.description_label = None

    def on_layer_selected(self, index):
        """
        Triggered on selecting a layer
        """
        is_layer_compatible = False
        self.uri = QgsMimeDataUtils.Uri()
        if index.isValid():
            item = self.browser_proxy_model.dataItem(index)
            if item:
                if issubclass(item.__class__, QgsLayerItem):
                    is_layer_compatible = True
                    self.uri = item.mimeUri()

        self.buttonBox.button(
            QDialogButtonBox.Ok).setEnabled(is_layer_compatible)