From 8bce7a62a790b50261d8a878e41b8d77e527ed11 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 20 Sep 2017 14:03:18 +1000 Subject: [PATCH] Allow QgsDataItems to override default double click behavior --- python/core/qgsdataitem.sip | 9 +++++++++ src/core/qgsdataitem.cpp | 5 +++++ src/core/qgsdataitem.h | 8 ++++++++ src/gui/qgsbrowserdockwidget.cpp | 14 +++++++++++++- src/gui/qgsbrowserdockwidget.h | 3 +++ 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/python/core/qgsdataitem.sip b/python/core/qgsdataitem.sip index bf1484bffc5..7273aeaf03f 100644 --- a/python/core/qgsdataitem.sip +++ b/python/core/qgsdataitem.sip @@ -153,6 +153,15 @@ Create new data item. :rtype: bool %End + virtual bool handleDoubleClick(); +%Docstring + Called when a user double clicks on the item. Subclasses should return true + if they have implemented a double click handler and do not want the default + double click behaviour for items. +.. versionadded:: 3.0 + :rtype: bool +%End + virtual bool hasDragEnabled() const; %Docstring Returns true if the item may be dragged. diff --git a/src/core/qgsdataitem.cpp b/src/core/qgsdataitem.cpp index a4e76a68a16..c6f9fd2a720 100644 --- a/src/core/qgsdataitem.cpp +++ b/src/core/qgsdataitem.cpp @@ -510,6 +510,11 @@ bool QgsDataItem::equal( const QgsDataItem *other ) mPath == other->path() ); } +bool QgsDataItem::handleDoubleClick() +{ + return false; +} + QgsDataItem::State QgsDataItem::state() const { return mState; diff --git a/src/core/qgsdataitem.h b/src/core/qgsdataitem.h index 94cc92df1bb..ff4ffdb1fc0 100644 --- a/src/core/qgsdataitem.h +++ b/src/core/qgsdataitem.h @@ -155,6 +155,14 @@ class CORE_EXPORT QgsDataItem : public QObject */ virtual bool handleDrop( const QMimeData * /*data*/, Qt::DropAction /*action*/ ) { return false; } + /** + * Called when a user double clicks on the item. Subclasses should return true + * if they have implemented a double click handler and do not want the default + * double click behaviour for items. + * \since QGIS 3.0 + */ + virtual bool handleDoubleClick(); + /** Returns true if the item may be dragged. * Default implementation returns false. * A draggable item has to implement mimeUri() that will be used to pass data. diff --git a/src/gui/qgsbrowserdockwidget.cpp b/src/gui/qgsbrowserdockwidget.cpp index b47eaf1d611..70a55fbdc96 100644 --- a/src/gui/qgsbrowserdockwidget.cpp +++ b/src/gui/qgsbrowserdockwidget.cpp @@ -97,7 +97,7 @@ QgsBrowserDockWidget::QgsBrowserDockWidget( const QString &name, QgsBrowserModel connect( mLeFilter, &QgsFilterLineEdit::textChanged, this, &QgsBrowserDockWidget::setFilter ); connect( group, &QActionGroup::triggered, this, &QgsBrowserDockWidget::setFilterSyntax ); connect( mBrowserView, &QgsDockBrowserTreeView::customContextMenuRequested, this, &QgsBrowserDockWidget::showContextMenu ); - connect( mBrowserView, &QgsDockBrowserTreeView::doubleClicked, this, &QgsBrowserDockWidget::addLayerAtIndex ); + connect( mBrowserView, &QgsDockBrowserTreeView::doubleClicked, this, &QgsBrowserDockWidget::itemDoubleClicked ); connect( mSplitter, &QSplitter::splitterMoved, this, &QgsBrowserDockWidget::splitterMoved ); } @@ -155,6 +155,18 @@ void QgsBrowserDockWidget::showEvent( QShowEvent *e ) QgsDockWidget::showEvent( e ); } +void QgsBrowserDockWidget::itemDoubleClicked( const QModelIndex &index ) +{ + QgsDataItem *item = mModel->dataItem( mProxyModel->mapToSource( index ) ); + if ( !item ) + return; + + if ( item->handleDoubleClick() ) + return; + else + addLayerAtIndex( index ); // default double click handler +} + void QgsBrowserDockWidget::showContextMenu( QPoint pt ) { QModelIndex index = mProxyModel->mapToSource( mBrowserView->indexAt( pt ) ); diff --git a/src/gui/qgsbrowserdockwidget.h b/src/gui/qgsbrowserdockwidget.h index 2958e8677e4..5fb95169721 100644 --- a/src/gui/qgsbrowserdockwidget.h +++ b/src/gui/qgsbrowserdockwidget.h @@ -110,6 +110,9 @@ class GUI_EXPORT QgsBrowserDockWidget : public QgsDockWidget, private Ui::QgsBro //! Show event override void showEvent( QShowEvent *event ) override; + private slots: + void itemDoubleClicked( const QModelIndex &index ); + private: //! Refresh the model void refreshModel( const QModelIndex &index );