Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslocatormodelbridge.cpp 3 : : ------------------ 4 : : begin : November 2018 5 : : copyright : (C) 2018 by Denis Rouzaud 6 : : email : denis@opengis.ch 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgslocatormodelbridge.h" 19 : : #include "qgslocator.h" 20 : : #include "qgslocatormodel.h" 21 : : 22 : : 23 : 0 : QgsLocatorModelBridge::QgsLocatorModelBridge( QObject *parent ) 24 : 0 : : QObject( parent ) 25 : 0 : , mLocator( new QgsLocator( this ) ) 26 : 0 : , mLocatorModel( new QgsLocatorModel( this ) ) 27 : 0 : { 28 : 0 : mProxyModel = new QgsLocatorProxyModel( mLocatorModel ); 29 : 0 : mProxyModel->setSourceModel( mLocatorModel ); 30 : : 31 : 0 : connect( mLocator, &QgsLocator::foundResult, this, &QgsLocatorModelBridge::addResult ); 32 : 0 : connect( mLocator, &QgsLocator::finished, this, &QgsLocatorModelBridge::searchFinished ); 33 : 0 : } 34 : : 35 : 0 : bool QgsLocatorModelBridge::isRunning() const 36 : : { 37 : 0 : return mIsRunning; 38 : : } 39 : : 40 : 0 : void QgsLocatorModelBridge::triggerResult( const QModelIndex &index, const int actionId ) 41 : : { 42 : 0 : mLocator->clearPreviousResults(); 43 : 0 : QgsLocatorResult result = mProxyModel->data( index, QgsLocatorModel::ResultDataRole ).value< QgsLocatorResult >(); 44 : 0 : if ( result.filter ) 45 : : { 46 : 0 : if ( actionId >= 0 ) 47 : 0 : result.filter->triggerResultFromAction( result, actionId ); 48 : : else 49 : 0 : result.filter->triggerResult( result ); 50 : 0 : } 51 : 0 : } 52 : : 53 : 0 : void QgsLocatorModelBridge::setIsRunning( bool isRunning ) 54 : : { 55 : 0 : if ( mIsRunning == isRunning ) 56 : 0 : return; 57 : : 58 : 0 : mIsRunning = isRunning; 59 : 0 : emit isRunningChanged(); 60 : 0 : } 61 : : 62 : 0 : void QgsLocatorModelBridge::invalidateResults() 63 : : { 64 : 0 : mLocator->cancelWithoutBlocking(); 65 : 0 : mLocatorModel->clear(); 66 : 0 : } 67 : : 68 : 0 : void QgsLocatorModelBridge::updateCanvasExtent( const QgsRectangle &extent ) 69 : : { 70 : 0 : mCanvasExtent = extent; 71 : 0 : } 72 : : 73 : 0 : void QgsLocatorModelBridge::updateCanvasCrs( const QgsCoordinateReferenceSystem &crs ) 74 : : { 75 : 0 : mCanvasCrs = crs; 76 : 0 : } 77 : : 78 : 0 : void QgsLocatorModelBridge::addResult( const QgsLocatorResult &result ) 79 : : { 80 : 0 : mLocatorModel->addResult( result ); 81 : 0 : emit resultAdded(); 82 : 0 : } 83 : : 84 : : 85 : 0 : void QgsLocatorModelBridge::searchFinished() 86 : : { 87 : 0 : if ( mHasQueuedRequest ) 88 : : { 89 : : // a queued request was waiting for this - run the queued search now 90 : 0 : QString nextSearch = mNextRequestedString; 91 : 0 : mNextRequestedString.clear(); 92 : 0 : mHasQueuedRequest = false; 93 : 0 : performSearch( nextSearch ); 94 : 0 : } 95 : : else 96 : : { 97 : 0 : if ( !mLocator->isRunning() ) 98 : 0 : setIsRunning( false ); 99 : : } 100 : 0 : } 101 : : 102 : 0 : void QgsLocatorModelBridge::performSearch( const QString &text ) 103 : : { 104 : 0 : setIsRunning( true ); 105 : : 106 : 0 : if ( mLocator->isRunning() ) 107 : : { 108 : : // can't do anything while a query is running, and can't block 109 : : // here waiting for the current query to cancel 110 : : // so we queue up this string until cancel has happened 111 : 0 : mLocator->cancelWithoutBlocking(); 112 : 0 : mNextRequestedString = text; 113 : 0 : mHasQueuedRequest = true; 114 : 0 : return; 115 : : } 116 : : else 117 : : { 118 : 0 : emit resultsCleared(); 119 : 0 : mLocatorModel->deferredClear(); 120 : 0 : mLocator->fetchResults( text, createContext() ); 121 : 0 : } 122 : 0 : } 123 : : 124 : 0 : QgsLocator *QgsLocatorModelBridge::locator() const 125 : : { 126 : 0 : return mLocator; 127 : : } 128 : : 129 : 0 : QgsLocatorProxyModel *QgsLocatorModelBridge::proxyModel() const 130 : : { 131 : 0 : return mProxyModel; 132 : : } 133 : : 134 : 0 : bool QgsLocatorModelBridge::hasQueueRequested() const 135 : : { 136 : 0 : return mHasQueuedRequest; 137 : : } 138 : : 139 : 0 : QgsLocatorContext QgsLocatorModelBridge::createContext() 140 : : { 141 : 0 : QgsLocatorContext context; 142 : 0 : context.targetExtent = mCanvasExtent; 143 : 0 : context.targetExtentCrs = mCanvasCrs; 144 : 0 : context.transformContext = mTransformContext; 145 : 0 : return context; 146 : 0 : }