mirror of
https://github.com/qgis/QGIS.git
synced 2025-11-27 00:07:16 -05:00
move part of the logic of QgsLocatorWidget to core
This commit is contained in:
parent
79c5b35a39
commit
078b445057
@ -0,0 +1,93 @@
|
|||||||
|
/************************************************************************
|
||||||
|
* This file has been generated automatically from *
|
||||||
|
* *
|
||||||
|
* src/core/locator/qgslocatorwidgetcore.h *
|
||||||
|
* *
|
||||||
|
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class QgsLocatorWidgetCore : QObject
|
||||||
|
{
|
||||||
|
%Docstring
|
||||||
|
The QgsLocatorWidgetCore class provides the core functionality
|
||||||
|
to be used in a locator widget.
|
||||||
|
|
||||||
|
.. versionadded:: 3.6
|
||||||
|
%End
|
||||||
|
|
||||||
|
%TypeHeaderCode
|
||||||
|
#include "qgslocatorwidgetcore.h"
|
||||||
|
%End
|
||||||
|
public:
|
||||||
|
explicit QgsLocatorWidgetCore( QObject *parent = 0 );
|
||||||
|
%Docstring
|
||||||
|
Constructor of QgsLocatorWidgetCore
|
||||||
|
%End
|
||||||
|
|
||||||
|
void setMapCanvasInterface( QgsMapCanvasInterface *canvasInterface );
|
||||||
|
%Docstring
|
||||||
|
Set the map canvas interface
|
||||||
|
%End
|
||||||
|
|
||||||
|
void performSearch( const QString &text );
|
||||||
|
%Docstring
|
||||||
|
Perform a search
|
||||||
|
%End
|
||||||
|
|
||||||
|
QgsLocator *locator() const;
|
||||||
|
%Docstring
|
||||||
|
Returns the locator
|
||||||
|
%End
|
||||||
|
|
||||||
|
QgsLocatorProxyModel *proxyModel() const;
|
||||||
|
%Docstring
|
||||||
|
Returns the proxy model
|
||||||
|
%End
|
||||||
|
|
||||||
|
bool hasQueueRequested() const;
|
||||||
|
%Docstring
|
||||||
|
Returns true if some text to be search is pending in the queue
|
||||||
|
%End
|
||||||
|
|
||||||
|
bool isRunning() const;
|
||||||
|
%Docstring
|
||||||
|
Returns true if the a search is currently running
|
||||||
|
%End
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void resultAdded();
|
||||||
|
%Docstring
|
||||||
|
Emitted when a result is added
|
||||||
|
%End
|
||||||
|
|
||||||
|
void isRunningChanged();
|
||||||
|
%Docstring
|
||||||
|
Emitted when the running status changes
|
||||||
|
%End
|
||||||
|
|
||||||
|
void resultsCleared();
|
||||||
|
%Docstring
|
||||||
|
Emitted when the results are cleared
|
||||||
|
%End
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void invalidateResults();
|
||||||
|
%Docstring
|
||||||
|
This will invalidate current search results
|
||||||
|
%End
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* This file has been generated automatically from *
|
||||||
|
* *
|
||||||
|
* src/core/locator/qgslocatorwidgetcore.h *
|
||||||
|
* *
|
||||||
|
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
|
||||||
|
************************************************************************/
|
||||||
@ -383,6 +383,7 @@
|
|||||||
%Include auto_generated/locator/qgslocator.sip
|
%Include auto_generated/locator/qgslocator.sip
|
||||||
%Include auto_generated/locator/qgslocatorfilter.sip
|
%Include auto_generated/locator/qgslocatorfilter.sip
|
||||||
%Include auto_generated/locator/qgslocatormodel.sip
|
%Include auto_generated/locator/qgslocatormodel.sip
|
||||||
|
%Include auto_generated/locator/qgslocatorwidgetcore.sip
|
||||||
%Include auto_generated/processing/qgsprocessingalgrunnertask.sip
|
%Include auto_generated/processing/qgsprocessingalgrunnertask.sip
|
||||||
%Include auto_generated/processing/qgsprocessingfeedback.sip
|
%Include auto_generated/processing/qgsprocessingfeedback.sip
|
||||||
%Include auto_generated/processing/qgsprocessingprovider.sip
|
%Include auto_generated/processing/qgsprocessingprovider.sip
|
||||||
|
|||||||
@ -64,7 +64,6 @@ Emitted when the configure option is triggered in the widget.
|
|||||||
%End
|
%End
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual bool eventFilter( QObject *obj, QEvent *event );
|
virtual bool eventFilter( QObject *obj, QEvent *event );
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -109,6 +109,7 @@ SET(QGIS_CORE_SRCS
|
|||||||
locator/qgslocator.cpp
|
locator/qgslocator.cpp
|
||||||
locator/qgslocatorfilter.cpp
|
locator/qgslocatorfilter.cpp
|
||||||
locator/qgslocatormodel.cpp
|
locator/qgslocatormodel.cpp
|
||||||
|
locator/qgslocatorwidgetcore.cpp
|
||||||
|
|
||||||
processing/qgsprocessingalgorithm.cpp
|
processing/qgsprocessingalgorithm.cpp
|
||||||
processing/qgsprocessingalgrunnertask.cpp
|
processing/qgsprocessingalgrunnertask.cpp
|
||||||
@ -681,6 +682,7 @@ SET(QGIS_CORE_MOC_HDRS
|
|||||||
locator/qgslocator.h
|
locator/qgslocator.h
|
||||||
locator/qgslocatorfilter.h
|
locator/qgslocatorfilter.h
|
||||||
locator/qgslocatormodel.h
|
locator/qgslocatormodel.h
|
||||||
|
locator/qgslocatorwidgetcore.h
|
||||||
|
|
||||||
processing/qgsprocessingalgrunnertask.h
|
processing/qgsprocessingalgrunnertask.h
|
||||||
processing/qgsprocessingfeedback.h
|
processing/qgsprocessingfeedback.h
|
||||||
|
|||||||
130
src/core/locator/qgslocatorwidgetcore.cpp
Normal file
130
src/core/locator/qgslocatorwidgetcore.cpp
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
qgslocatorwidgetcore.cpp
|
||||||
|
------------------
|
||||||
|
begin : November 2018
|
||||||
|
copyright : (C) 2018 by Denis Rouzaud
|
||||||
|
email : denis@opengis.ch
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* *
|
||||||
|
* 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 "qgslocatorwidgetcore.h"
|
||||||
|
#include "qgslocator.h"
|
||||||
|
#include "qgslocatormodel.h"
|
||||||
|
#include "qgsmapcanvasinterface.h"
|
||||||
|
#include "qgsmapsettings.h"
|
||||||
|
|
||||||
|
QgsLocatorWidgetCore::QgsLocatorWidgetCore( QObject *parent )
|
||||||
|
: QObject( parent )
|
||||||
|
, mLocator( new QgsLocator( this ) )
|
||||||
|
, mLocatorModel( new QgsLocatorModel( this ) )
|
||||||
|
{
|
||||||
|
mProxyModel = new QgsLocatorProxyModel( mLocatorModel );
|
||||||
|
mProxyModel->setSourceModel( mLocatorModel );
|
||||||
|
|
||||||
|
connect( mLocator, &QgsLocator::foundResult, this, &QgsLocatorWidgetCore::addResult );
|
||||||
|
connect( mLocator, &QgsLocator::finished, this, &QgsLocatorWidgetCore::searchFinished );
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsLocatorWidgetCore::setMapCanvasInterface( QgsMapCanvasInterface *canvasInterface )
|
||||||
|
{
|
||||||
|
mCanvasInterface = canvasInterface;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QgsLocatorWidgetCore::isRunning() const
|
||||||
|
{
|
||||||
|
return mIsRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsLocatorWidgetCore::setIsRunning( bool isRunning )
|
||||||
|
{
|
||||||
|
if ( mIsRunning == isRunning )
|
||||||
|
return;
|
||||||
|
|
||||||
|
mIsRunning = isRunning;
|
||||||
|
emit isRunningChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsLocatorWidgetCore::invalidateResults()
|
||||||
|
{
|
||||||
|
mLocator->cancelWithoutBlocking();
|
||||||
|
mLocatorModel->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsLocatorWidgetCore::addResult( const QgsLocatorResult &result )
|
||||||
|
{
|
||||||
|
mLocatorModel->addResult( result );
|
||||||
|
emit resultAdded();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void QgsLocatorWidgetCore::searchFinished()
|
||||||
|
{
|
||||||
|
if ( mHasQueuedRequest )
|
||||||
|
{
|
||||||
|
// a queued request was waiting for this - run the queued search now
|
||||||
|
QString nextSearch = mNextRequestedString;
|
||||||
|
mNextRequestedString.clear();
|
||||||
|
mHasQueuedRequest = false;
|
||||||
|
performSearch( nextSearch );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( !mLocator->isRunning() )
|
||||||
|
setIsRunning( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsLocatorWidgetCore::performSearch( const QString &text )
|
||||||
|
{
|
||||||
|
setIsRunning( true );
|
||||||
|
if ( mLocator->isRunning() )
|
||||||
|
{
|
||||||
|
// can't do anything while a query is running, and can't block
|
||||||
|
// here waiting for the current query to cancel
|
||||||
|
// so we queue up this string until cancel has happened
|
||||||
|
mLocator->cancelWithoutBlocking();
|
||||||
|
mNextRequestedString = text;
|
||||||
|
mHasQueuedRequest = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
emit resultsCleared();
|
||||||
|
mLocatorModel->deferredClear();
|
||||||
|
mLocator->fetchResults( text, createContext() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QgsLocator *QgsLocatorWidgetCore::locator() const
|
||||||
|
{
|
||||||
|
return mLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
QgsLocatorProxyModel *QgsLocatorWidgetCore::proxyModel() const
|
||||||
|
{
|
||||||
|
return mProxyModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QgsLocatorWidgetCore::hasQueueRequested() const
|
||||||
|
{
|
||||||
|
return mHasQueuedRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
QgsLocatorContext QgsLocatorWidgetCore::createContext()
|
||||||
|
{
|
||||||
|
QgsLocatorContext context;
|
||||||
|
if ( mCanvasInterface )
|
||||||
|
{
|
||||||
|
context.targetExtent = mCanvasInterface->mapSettings().visibleExtent();
|
||||||
|
context.targetExtentCrs = mCanvasInterface->mapSettings().destinationCrs();
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
97
src/core/locator/qgslocatorwidgetcore.h
Normal file
97
src/core/locator/qgslocatorwidgetcore.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
qgslocatorwidgetcore.h
|
||||||
|
------------------
|
||||||
|
begin : November 2018
|
||||||
|
copyright : (C) 2018 by Denis Rouzaud
|
||||||
|
email : denis@opengis.ch
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* *
|
||||||
|
* 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 QGSLOCATORWIDGETCORE_H
|
||||||
|
#define QGSLOCATORWIDGETCORE_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "qgis_core.h"
|
||||||
|
|
||||||
|
class QgsLocatorResult;
|
||||||
|
class QgsLocator;
|
||||||
|
class QgsLocatorContext;
|
||||||
|
class QgsLocatorModel;
|
||||||
|
class QgsLocatorProxyModel;
|
||||||
|
class QgsMapCanvasInterface;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup core
|
||||||
|
* The QgsLocatorWidgetCore class provides the core functionality
|
||||||
|
* to be used in a locator widget.
|
||||||
|
* \since QGIS 3.6
|
||||||
|
*/
|
||||||
|
class CORE_EXPORT QgsLocatorWidgetCore : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY( bool isRunning READ isRunning NOTIFY isRunningChanged )
|
||||||
|
public:
|
||||||
|
//! Constructor of QgsLocatorWidgetCore
|
||||||
|
explicit QgsLocatorWidgetCore( QObject *parent = nullptr );
|
||||||
|
|
||||||
|
//! Set the map canvas interface
|
||||||
|
void setMapCanvasInterface( QgsMapCanvasInterface *canvasInterface );
|
||||||
|
|
||||||
|
//! Perform a search
|
||||||
|
Q_INVOKABLE void performSearch( const QString &text );
|
||||||
|
|
||||||
|
//! Returns the locator
|
||||||
|
QgsLocator *locator() const;
|
||||||
|
|
||||||
|
//! Returns the proxy model
|
||||||
|
QgsLocatorProxyModel *proxyModel() const;
|
||||||
|
|
||||||
|
//! Returns true if some text to be search is pending in the queue
|
||||||
|
bool hasQueueRequested() const;
|
||||||
|
|
||||||
|
//! Returns true if the a search is currently running
|
||||||
|
bool isRunning() const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
//! Emitted when a result is added
|
||||||
|
void resultAdded();
|
||||||
|
|
||||||
|
//! Emitted when the running status changes
|
||||||
|
void isRunningChanged();
|
||||||
|
|
||||||
|
//! Emitted when the results are cleared
|
||||||
|
void resultsCleared();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
//! This will invalidate current search results
|
||||||
|
void invalidateResults();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void searchFinished();
|
||||||
|
void addResult( const QgsLocatorResult &result );
|
||||||
|
|
||||||
|
private:
|
||||||
|
QgsLocatorContext createContext();
|
||||||
|
void setIsRunning( bool isRunning );
|
||||||
|
|
||||||
|
QgsLocator *mLocator = nullptr;
|
||||||
|
QgsLocatorModel *mLocatorModel = nullptr;
|
||||||
|
QgsLocatorProxyModel *mProxyModel = nullptr;
|
||||||
|
QgsMapCanvasInterface *mCanvasInterface = nullptr;
|
||||||
|
|
||||||
|
QString mNextRequestedString;
|
||||||
|
bool mHasQueuedRequest = false;
|
||||||
|
bool mIsRunning = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // QGSLOCATORWIDGETCORE_H
|
||||||
@ -15,10 +15,10 @@
|
|||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#include "qgslocatorwidget.h"
|
|
||||||
#include "qgslocator.h"
|
#include "qgslocator.h"
|
||||||
#include "qgslocatormodel.h"
|
#include "qgslocatormodel.h"
|
||||||
|
#include "qgslocatorwidget.h"
|
||||||
|
#include "qgslocatorwidgetcore.h"
|
||||||
#include "qgsfilterlineedit.h"
|
#include "qgsfilterlineedit.h"
|
||||||
#include "qgsmapcanvas.h"
|
#include "qgsmapcanvas.h"
|
||||||
#include "qgsapplication.h"
|
#include "qgsapplication.h"
|
||||||
@ -29,9 +29,8 @@
|
|||||||
|
|
||||||
QgsLocatorWidget::QgsLocatorWidget( QWidget *parent )
|
QgsLocatorWidget::QgsLocatorWidget( QWidget *parent )
|
||||||
: QWidget( parent )
|
: QWidget( parent )
|
||||||
, mLocator( new QgsLocator( this ) )
|
, mWidgetCore( new QgsLocatorWidgetCore( this ) )
|
||||||
, mLineEdit( new QgsFilterLineEdit() )
|
, mLineEdit( new QgsFilterLineEdit() )
|
||||||
, mLocatorModel( new QgsLocatorModel( this ) )
|
|
||||||
, mResultsView( new QgsLocatorResultsView() )
|
, mResultsView( new QgsLocatorResultsView() )
|
||||||
{
|
{
|
||||||
mLineEdit->setShowClearButton( true );
|
mLineEdit->setShowClearButton( true );
|
||||||
@ -71,17 +70,16 @@ QgsLocatorWidget::QgsLocatorWidget( QWidget *parent )
|
|||||||
mResultsContainer->setLayout( containerLayout );
|
mResultsContainer->setLayout( containerLayout );
|
||||||
mResultsContainer->hide();
|
mResultsContainer->hide();
|
||||||
|
|
||||||
mProxyModel = new QgsLocatorProxyModel( mLocatorModel );
|
mResultsView->setModel( mWidgetCore->proxyModel() );
|
||||||
mProxyModel->setSourceModel( mLocatorModel );
|
|
||||||
mResultsView->setModel( mProxyModel );
|
|
||||||
mResultsView->setUniformRowHeights( true );
|
mResultsView->setUniformRowHeights( true );
|
||||||
mResultsView->setIconSize( QSize( 16, 16 ) );
|
mResultsView->setIconSize( QSize( 16, 16 ) );
|
||||||
mResultsView->recalculateSize();
|
mResultsView->recalculateSize();
|
||||||
|
|
||||||
connect( mLocator, &QgsLocator::foundResult, this, &QgsLocatorWidget::addResult );
|
|
||||||
connect( mLocator, &QgsLocator::finished, this, &QgsLocatorWidget::searchFinished );
|
|
||||||
connect( mLineEdit, &QLineEdit::textChanged, this, &QgsLocatorWidget::scheduleDelayedPopup );
|
connect( mLineEdit, &QLineEdit::textChanged, this, &QgsLocatorWidget::scheduleDelayedPopup );
|
||||||
connect( mResultsView, &QAbstractItemView::activated, this, &QgsLocatorWidget::acceptCurrentEntry );
|
connect( mResultsView, &QAbstractItemView::activated, this, &QgsLocatorWidget::acceptCurrentEntry );
|
||||||
|
connect( mWidgetCore, &QgsLocatorWidgetCore::resultAdded, this, &QgsLocatorWidget::resultAdded );
|
||||||
|
connect( mWidgetCore, &QgsLocatorWidgetCore::isRunningChanged, this, [ = ]() {mLineEdit->setShowSpinner( mWidgetCore->isRunning() );} );
|
||||||
|
connect( mWidgetCore, & QgsLocatorWidgetCore::resultsCleared, this, [ = ]() {mHasSelectedResult = false;} );
|
||||||
|
|
||||||
// have a tiny delay between typing text in line edit and showing the window
|
// have a tiny delay between typing text in line edit and showing the window
|
||||||
mPopupTimer.setInterval( 100 );
|
mPopupTimer.setInterval( 100 );
|
||||||
@ -97,7 +95,7 @@ QgsLocatorWidget::QgsLocatorWidget( QWidget *parent )
|
|||||||
installEventFilter( this );
|
installEventFilter( this );
|
||||||
window()->installEventFilter( this );
|
window()->installEventFilter( this );
|
||||||
|
|
||||||
mLocator->registerFilter( new QgsLocatorFilterFilter( this, this ) );
|
mWidgetCore->locator()->registerFilter( new QgsLocatorFilterFilter( this, this ) );
|
||||||
|
|
||||||
mMenu = new QMenu( this );
|
mMenu = new QMenu( this );
|
||||||
QAction *menuAction = mLineEdit->addAction( QgsApplication::getThemeIcon( QStringLiteral( "/search.svg" ) ), QLineEdit::LeadingPosition );
|
QAction *menuAction = mLineEdit->addAction( QgsApplication::getThemeIcon( QStringLiteral( "/search.svg" ) ), QLineEdit::LeadingPosition );
|
||||||
@ -113,12 +111,12 @@ QgsLocatorWidget::QgsLocatorWidget( QWidget *parent )
|
|||||||
|
|
||||||
QgsLocator *QgsLocatorWidget::locator()
|
QgsLocator *QgsLocatorWidget::locator()
|
||||||
{
|
{
|
||||||
return mLocator;
|
return mWidgetCore->locator();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsLocatorWidget::setMapCanvas( QgsMapCanvas *canvas )
|
void QgsLocatorWidget::setMapCanvas( QgsMapCanvas *canvas )
|
||||||
{
|
{
|
||||||
mMapCanvas = canvas;
|
mWidgetCore->setMapCanvasInterface( canvas );
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsLocatorWidget::search( const QString &string )
|
void QgsLocatorWidget::search( const QString &string )
|
||||||
@ -131,8 +129,7 @@ void QgsLocatorWidget::search( const QString &string )
|
|||||||
|
|
||||||
void QgsLocatorWidget::invalidateResults()
|
void QgsLocatorWidget::invalidateResults()
|
||||||
{
|
{
|
||||||
mLocator->cancelWithoutBlocking();
|
mWidgetCore->invalidateResults();
|
||||||
mLocatorModel->clear();
|
|
||||||
mResultsContainer->hide();
|
mResultsContainer->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,10 +138,27 @@ void QgsLocatorWidget::scheduleDelayedPopup()
|
|||||||
mPopupTimer.start();
|
mPopupTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsLocatorWidget::resultAdded()
|
||||||
|
{
|
||||||
|
bool selectFirst = !mHasSelectedResult || mWidgetCore->proxyModel()->rowCount() == 0;
|
||||||
|
if ( selectFirst )
|
||||||
|
{
|
||||||
|
int row = -1;
|
||||||
|
bool selectable = false;
|
||||||
|
while ( !selectable && row < mWidgetCore->proxyModel()->rowCount() )
|
||||||
|
{
|
||||||
|
row++;
|
||||||
|
selectable = mWidgetCore->proxyModel()->flags( mWidgetCore->proxyModel()->index( row, 0 ) ).testFlag( Qt::ItemIsSelectable );
|
||||||
|
}
|
||||||
|
if ( selectable )
|
||||||
|
mResultsView->setCurrentIndex( mWidgetCore->proxyModel()->index( row, 0 ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QgsLocatorWidget::performSearch()
|
void QgsLocatorWidget::performSearch()
|
||||||
{
|
{
|
||||||
mPopupTimer.stop();
|
mPopupTimer.stop();
|
||||||
updateResults( mLineEdit->text() );
|
mWidgetCore->performSearch( mLineEdit->text() );
|
||||||
showList();
|
showList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,29 +170,12 @@ void QgsLocatorWidget::showList()
|
|||||||
|
|
||||||
void QgsLocatorWidget::triggerSearchAndShowList()
|
void QgsLocatorWidget::triggerSearchAndShowList()
|
||||||
{
|
{
|
||||||
if ( mProxyModel->rowCount() == 0 )
|
if ( mWidgetCore->proxyModel()->rowCount() == 0 )
|
||||||
performSearch();
|
performSearch();
|
||||||
else
|
else
|
||||||
showList();
|
showList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsLocatorWidget::searchFinished()
|
|
||||||
{
|
|
||||||
if ( mHasQueuedRequest )
|
|
||||||
{
|
|
||||||
// a queued request was waiting for this - run the queued search now
|
|
||||||
QString nextSearch = mNextRequestedString;
|
|
||||||
mNextRequestedString.clear();
|
|
||||||
mHasQueuedRequest = false;
|
|
||||||
updateResults( nextSearch );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( !mLocator->isRunning() )
|
|
||||||
mLineEdit->setShowSpinner( false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QgsLocatorWidget::eventFilter( QObject *obj, QEvent *event )
|
bool QgsLocatorWidget::eventFilter( QObject *obj, QEvent *event )
|
||||||
{
|
{
|
||||||
if ( obj == mLineEdit && event->type() == QEvent::KeyPress )
|
if ( obj == mLineEdit && event->type() == QEvent::KeyPress )
|
||||||
@ -246,28 +243,10 @@ bool QgsLocatorWidget::eventFilter( QObject *obj, QEvent *event )
|
|||||||
return QWidget::eventFilter( obj, event );
|
return QWidget::eventFilter( obj, event );
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsLocatorWidget::addResult( const QgsLocatorResult &result )
|
|
||||||
{
|
|
||||||
bool selectFirst = !mHasSelectedResult || mProxyModel->rowCount() == 0;
|
|
||||||
mLocatorModel->addResult( result );
|
|
||||||
if ( selectFirst )
|
|
||||||
{
|
|
||||||
int row = -1;
|
|
||||||
bool selectable = false;
|
|
||||||
while ( !selectable && row < mProxyModel->rowCount() )
|
|
||||||
{
|
|
||||||
row++;
|
|
||||||
selectable = mProxyModel->flags( mProxyModel->index( row, 0 ) ).testFlag( Qt::ItemIsSelectable );
|
|
||||||
}
|
|
||||||
if ( selectable )
|
|
||||||
mResultsView->setCurrentIndex( mProxyModel->index( row, 0 ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QgsLocatorWidget::configMenuAboutToShow()
|
void QgsLocatorWidget::configMenuAboutToShow()
|
||||||
{
|
{
|
||||||
mMenu->clear();
|
mMenu->clear();
|
||||||
for ( QgsLocatorFilter *filter : mLocator->filters() )
|
for ( QgsLocatorFilter *filter : mWidgetCore->locator()->filters() )
|
||||||
{
|
{
|
||||||
if ( !filter->enabled() )
|
if ( !filter->enabled() )
|
||||||
continue;
|
continue;
|
||||||
@ -281,7 +260,7 @@ void QgsLocatorWidget::configMenuAboutToShow()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
QStringList parts = currentText.split( ' ' );
|
QStringList parts = currentText.split( ' ' );
|
||||||
if ( parts.count() > 1 && mLocator->filters( parts.at( 0 ) ).count() > 0 )
|
if ( parts.count() > 1 && mWidgetCore->locator()->filters( parts.at( 0 ) ).count() > 0 )
|
||||||
{
|
{
|
||||||
parts.pop_front();
|
parts.pop_front();
|
||||||
currentText = parts.join( ' ' );
|
currentText = parts.join( ' ' );
|
||||||
@ -297,33 +276,13 @@ void QgsLocatorWidget::configMenuAboutToShow()
|
|||||||
QAction *configAction = new QAction( tr( "Configure…" ), mMenu );
|
QAction *configAction = new QAction( tr( "Configure…" ), mMenu );
|
||||||
connect( configAction, &QAction::triggered, this, &QgsLocatorWidget::configTriggered );
|
connect( configAction, &QAction::triggered, this, &QgsLocatorWidget::configTriggered );
|
||||||
mMenu->addAction( configAction );
|
mMenu->addAction( configAction );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsLocatorWidget::updateResults( const QString &text )
|
|
||||||
{
|
|
||||||
mLineEdit->setShowSpinner( true );
|
|
||||||
if ( mLocator->isRunning() )
|
|
||||||
{
|
|
||||||
// can't do anything while a query is running, and can't block
|
|
||||||
// here waiting for the current query to cancel
|
|
||||||
// so we queue up this string until cancel has happened
|
|
||||||
mLocator->cancelWithoutBlocking();
|
|
||||||
mNextRequestedString = text;
|
|
||||||
mHasQueuedRequest = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mHasSelectedResult = false;
|
|
||||||
mLocatorModel->deferredClear();
|
|
||||||
mLocator->fetchResults( text, createContext() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QgsLocatorWidget::acceptCurrentEntry()
|
void QgsLocatorWidget::acceptCurrentEntry()
|
||||||
{
|
{
|
||||||
if ( mHasQueuedRequest )
|
if ( mWidgetCore->hasQueueRequested() )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -336,24 +295,15 @@ void QgsLocatorWidget::acceptCurrentEntry()
|
|||||||
if ( !index.isValid() )
|
if ( !index.isValid() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QgsLocatorResult result = mProxyModel->data( index, QgsLocatorModel::ResultDataRole ).value< QgsLocatorResult >();
|
QgsLocatorResult result = mWidgetCore->proxyModel()->data( index, QgsLocatorModel::ResultDataRole ).value< QgsLocatorResult >();
|
||||||
mResultsContainer->hide();
|
mResultsContainer->hide();
|
||||||
mLineEdit->clearFocus();
|
mLineEdit->clearFocus();
|
||||||
mLocator->clearPreviousResults();
|
mWidgetCore->locator()->clearPreviousResults();
|
||||||
result.filter->triggerResult( result );
|
result.filter->triggerResult( result );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsLocatorContext QgsLocatorWidget::createContext()
|
|
||||||
{
|
|
||||||
QgsLocatorContext context;
|
|
||||||
if ( mMapCanvas )
|
|
||||||
{
|
|
||||||
context.targetExtent = mMapCanvas->mapSettings().visibleExtent();
|
|
||||||
context.targetExtentCrs = mMapCanvas->mapSettings().destinationCrs();
|
|
||||||
}
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
///@cond PRIVATE
|
///@cond PRIVATE
|
||||||
|
|
||||||
|
|||||||
@ -29,10 +29,9 @@
|
|||||||
|
|
||||||
class QgsLocator;
|
class QgsLocator;
|
||||||
class QgsFilterLineEdit;
|
class QgsFilterLineEdit;
|
||||||
class QgsLocatorModel;
|
|
||||||
class QgsLocatorResultsView;
|
class QgsLocatorResultsView;
|
||||||
class QgsMapCanvas;
|
class QgsMapCanvas;
|
||||||
class QgsLocatorProxyModel;
|
class QgsLocatorWidgetCore;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \class QgsLocatorWidget
|
* \class QgsLocatorWidget
|
||||||
@ -86,40 +85,29 @@ class GUI_EXPORT QgsLocatorWidget : public QWidget
|
|||||||
void configTriggered();
|
void configTriggered();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
bool eventFilter( QObject *obj, QEvent *event ) override;
|
bool eventFilter( QObject *obj, QEvent *event ) override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void scheduleDelayedPopup();
|
|
||||||
void performSearch();
|
void performSearch();
|
||||||
void showList();
|
void showList();
|
||||||
void triggerSearchAndShowList();
|
void triggerSearchAndShowList();
|
||||||
void searchFinished();
|
|
||||||
void addResult( const QgsLocatorResult &result );
|
|
||||||
void configMenuAboutToShow();
|
void configMenuAboutToShow();
|
||||||
|
void scheduleDelayedPopup();
|
||||||
|
void resultAdded();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QgsLocatorWidgetCore *mWidgetCore = nullptr;
|
||||||
QgsLocator *mLocator = nullptr;
|
|
||||||
QgsFilterLineEdit *mLineEdit = nullptr;
|
QgsFilterLineEdit *mLineEdit = nullptr;
|
||||||
QgsLocatorModel *mLocatorModel = nullptr;
|
|
||||||
QgsLocatorProxyModel *mProxyModel = nullptr;
|
|
||||||
QgsFloatingWidget *mResultsContainer = nullptr;
|
QgsFloatingWidget *mResultsContainer = nullptr;
|
||||||
QgsLocatorResultsView *mResultsView = nullptr;
|
QgsLocatorResultsView *mResultsView = nullptr;
|
||||||
QgsMapCanvas *mMapCanvas = nullptr;
|
QgsMapCanvas *mMapCanvas = nullptr;
|
||||||
QMenu *mMenu = nullptr;
|
QMenu *mMenu = nullptr;
|
||||||
|
|
||||||
QString mNextRequestedString;
|
|
||||||
bool mHasQueuedRequest = false;
|
|
||||||
bool mHasSelectedResult = false;
|
|
||||||
QTimer mPopupTimer;
|
|
||||||
QTimer mFocusTimer;
|
QTimer mFocusTimer;
|
||||||
|
QTimer mPopupTimer;
|
||||||
|
bool mHasSelectedResult = false;
|
||||||
|
|
||||||
void updateResults( const QString &text );
|
|
||||||
void acceptCurrentEntry();
|
void acceptCurrentEntry();
|
||||||
QgsLocatorContext createContext();
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef SIP_RUN
|
#ifndef SIP_RUN
|
||||||
@ -144,7 +132,6 @@ class QgsLocatorFilterFilter : public QgsLocatorFilter
|
|||||||
void triggerResult( const QgsLocatorResult &result ) override;
|
void triggerResult( const QgsLocatorResult &result ) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
QgsLocatorWidget *mLocator = nullptr;
|
QgsLocatorWidget *mLocator = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user