Skip to content

Commit

Permalink
Merge pull request #8396 from elpaso/datasource-select-dialog
Browse files Browse the repository at this point in the history
QgsDataSourceSelectDialog: a simple browser-based reusable data sourc…
  • Loading branch information
elpaso committed Nov 2, 2018
2 parents ea73459 + 105455c commit eca00ba
Show file tree
Hide file tree
Showing 6 changed files with 319 additions and 0 deletions.
65 changes: 65 additions & 0 deletions python/gui/auto_generated/qgsdatasourceselectdialog.sip.in
@@ -0,0 +1,65 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/gui/qgsdatasourceselectdialog.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/




class QgsDataSourceSelectDialog: QDialog
{
%Docstring
The QgsDataSourceSelectDialog class embeds the browser view to
select an existing data source.

By default any layer type can be chosen, the valid layer
type can be restricted by setting a layer type filter with
setLayerTypeFilter(layerType) or by activating the filter
directly from the constructor.

To retrieve the selected data source, uri() can be called and it
will return a (possibly invalid) QgsMimeDataUtils.Uri.

.. versionadded:: 3.6
%End

%TypeHeaderCode
#include "qgsdatasourceselectdialog.h"
%End
public:

QgsDataSourceSelectDialog( bool setFilterByLayerType = false,
const QgsMapLayer::LayerType &layerType = QgsMapLayer::LayerType::VectorLayer,
QWidget *parent = 0 );
%Docstring
Constructs a QgsDataSourceSelectDialog, optionally filtering by layer type

:param setFilterByLayerType: activates filtering by layer type
:param layerType: sets the layer type filter, this is in effect only if filtering by layer type is also active
:param parent: the object
%End

~QgsDataSourceSelectDialog();

void setLayerTypeFilter( const QgsMapLayer::LayerType &layerType );
%Docstring
Sets layer type filter to ``layerType`` and activates the filtering
%End

QgsMimeDataUtils::Uri uri() const;
%Docstring
Returns the (possibly invalid) uri of the selected data source
%End

};

/************************************************************************
* This file has been generated automatically from *
* *
* src/gui/qgsdatasourceselectdialog.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
1 change: 1 addition & 0 deletions python/gui/gui_auto.sip
Expand Up @@ -17,6 +17,7 @@
%Include auto_generated/qgsuserinputwidget.sip
%Include auto_generated/qgsbrowserdockwidget.sip
%Include auto_generated/qgsvertexmarker.sip
%Include auto_generated/qgsdatasourceselectdialog.sip
%Include auto_generated/qgsabstractdatasourcewidget.sip
%Include auto_generated/qgssourceselectprovider.sip
%Include auto_generated/qgssourceselectproviderregistry.sip
Expand Down
3 changes: 3 additions & 0 deletions src/gui/CMakeLists.txt
Expand Up @@ -244,6 +244,7 @@ SET(QGIS_GUI_SRCS
qgscustomdrophandler.cpp
qgscurveeditorwidget.cpp
qgsdatumtransformdialog.cpp
qgsdatasourceselectdialog.cpp
qgsdetaileditemdata.cpp
qgsdetaileditemdelegate.cpp
qgsdetaileditemwidget.cpp
Expand Down Expand Up @@ -422,6 +423,7 @@ SET(QGIS_GUI_MOC_HDRS
qgscurveeditorwidget.h
qgscustomdrophandler.h
qgsdatumtransformdialog.h
qgsdatasourceselectdialog.h
qgsdetaileditemdelegate.h
qgsdetaileditemwidget.h
qgsdial.h
Expand Down Expand Up @@ -787,6 +789,7 @@ SET(QGIS_GUI_HDRS
qgsbrowserdockwidget_p.h
qgsvertexmarker.h
qgsdatasourcemanagerdialog.h
qgsdatasourceselectdialog.h
qgsabstractdatasourcewidget.h
qgswidgetstatehelper_p.h
qgssourceselectprovider.h
Expand Down
90 changes: 90 additions & 0 deletions src/gui/qgsdatasourceselectdialog.cpp
@@ -0,0 +1,90 @@
/***************************************************************************
qgsdatasourceselectdialog.cpp - QgsDataSourceSelectDialog
---------------------
begin : 1.11.2018
copyright : (C) 2018 by Alessandro Pasotti
email : elpaso@itopen.it
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgsdatasourceselectdialog.h"
#include "ui_qgsdatasourceselectdialog.h"
#include "qgssettings.h"
#include "qgis.h"

#include <QPushButton>

QgsDataSourceSelectDialog::QgsDataSourceSelectDialog( bool setFilterByLayerType,
const QgsMapLayer::LayerType &layerType,
QWidget *parent )
: QDialog( parent )
{
setupUi( this );
setWindowTitle( tr( "Select a data source" ) );
QByteArray dlgGeom( QgsSettings().value( QStringLiteral( "/Windows/selectDataSourceDialog/geometry" ), QVariant(), QgsSettings::Section::Gui ).toByteArray() );
restoreGeometry( dlgGeom );

mBrowserModel.initialize();
mBrowserProxyModel.setBrowserModel( &mBrowserModel );
mBrowserTreeView->setHeaderHidden( true );

if ( setFilterByLayerType )
{
setLayerTypeFilter( layerType );
}
else
{
mBrowserTreeView->setModel( &mBrowserProxyModel );
buttonBox->button( QDialogButtonBox::StandardButton::Ok )->setEnabled( false );
}
connect( mBrowserTreeView, &QgsBrowserTreeView::clicked, this, &QgsDataSourceSelectDialog::onLayerSelected );
}


QgsDataSourceSelectDialog::~QgsDataSourceSelectDialog()
{
QgsSettings().setValue( QStringLiteral( "/Windows/selectDataSourceDialog/geometry" ), saveGeometry(), QgsSettings::Section::Gui );
}

void QgsDataSourceSelectDialog::setLayerTypeFilter( const QgsMapLayer::LayerType &layerType )
{
mBrowserProxyModel.setFilterByLayerType( true );
mBrowserProxyModel.setLayerType( layerType );
// reset model and button
mBrowserTreeView->setModel( &mBrowserProxyModel );
buttonBox->button( QDialogButtonBox::StandardButton::Ok )->setEnabled( false );
}

QgsMimeDataUtils::Uri QgsDataSourceSelectDialog::uri() const
{
return mUri;
}

void QgsDataSourceSelectDialog::onLayerSelected( const QModelIndex &index )
{
bool isLayerCompatible = false;
mUri = QgsMimeDataUtils::Uri();
if ( index.isValid() )
{
const QgsDataItem *dataItem( mBrowserProxyModel.dataItem( index ) );
if ( dataItem )
{
const QgsLayerItem *layerItem = qobject_cast<const QgsLayerItem *>( dataItem );
if ( layerItem && ( ! mBrowserProxyModel.filterByLayerType() ||
( layerItem->mapLayerType() == mBrowserProxyModel.layerType() ) ) )
{
isLayerCompatible = true;
mUri = layerItem->mimeUri();
}
}
}
buttonBox->button( QDialogButtonBox::StandardButton::Ok )->setEnabled( isLayerCompatible );
}

86 changes: 86 additions & 0 deletions src/gui/qgsdatasourceselectdialog.h
@@ -0,0 +1,86 @@
/***************************************************************************
qgsdatasourceselectdialog.h - QgsDataSourceSelectDialog
---------------------
begin : 1.11.2018
copyright : (C) 2018 by Alessandro Pasotti
email : elpaso@itopen.it
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSDATASOURCESELECTDIALOG_H
#define QGSDATASOURCESELECTDIALOG_H

#include <QObject>
#include "ui_qgsdatasourceselectdialog.h"

#include "qgis_gui.h"
#include "qgsmaplayer.h"
#include "qgsmimedatautils.h"
#include "qgsbrowsermodel.h"
#include "qgsbrowserproxymodel.h"


/**
* \ingroup gui
* The QgsDataSourceSelectDialog class embeds the browser view to
* select an existing data source.
*
* By default any layer type can be chosen, the valid layer
* type can be restricted by setting a layer type filter with
* setLayerTypeFilter(layerType) or by activating the filter
* directly from the constructor.
*
* To retrieve the selected data source, uri() can be called and it
* will return a (possibly invalid) QgsMimeDataUtils::Uri.
*
* \since QGIS 3.6
*/
class GUI_EXPORT QgsDataSourceSelectDialog: public QDialog, private Ui::QgsDataSourceSelectDialog
{
Q_OBJECT

public:

/**
* Constructs a QgsDataSourceSelectDialog, optionally filtering by layer type
*
* \param setFilterByLayerType activates filtering by layer type
* \param layerType sets the layer type filter, this is in effect only if filtering by layer type is also active
* \param parent the object
*/
QgsDataSourceSelectDialog( bool setFilterByLayerType = false,
const QgsMapLayer::LayerType &layerType = QgsMapLayer::LayerType::VectorLayer,
QWidget *parent = nullptr );

~QgsDataSourceSelectDialog() override;

/**
* Sets layer type filter to \a layerType and activates the filtering
*/
void setLayerTypeFilter( const QgsMapLayer::LayerType &layerType );

/**
* Returns the (possibly invalid) uri of the selected data source
*/
QgsMimeDataUtils::Uri uri() const;

private slots:

//! Triggered when a layer is selected in the browser
void onLayerSelected( const QModelIndex &index );

private:

QgsBrowserModel mBrowserModel;
QgsBrowserProxyModel mBrowserProxyModel;
QgsMimeDataUtils::Uri mUri;

};

#endif // QGSDATASOURCESELECTDIALOG_H
74 changes: 74 additions & 0 deletions src/ui/qgsdatasourceselectdialog.ui
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QgsDataSourceSelectDialog</class>
<widget class="QDialog" name="QgsDataSourceSelectDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QgsBrowserTreeView" name="mBrowserTreeView"/>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsBrowserTreeView</class>
<extends>QTreeView</extends>
<header>qgsbrowsertreeview.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>QgsDataSourceSelectDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>QgsDataSourceSelectDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

0 comments on commit eca00ba

Please sign in to comment.