6#include "SearchWidget.h"
8#include "GeoDataPlacemark.h"
9#include "GeoDataLatLonAltBox.h"
10#include "GeoDataDocument.h"
11#include "GeoDataTreeModel.h"
12#include "SearchInputWidget.h"
15#include "BranchFilterProxyModel.h"
16#include "MarblePlacemarkModel.h"
17#include "SearchRunnerManager.h"
19#include "MarbleDebug.h"
23#include <QElapsedTimer>
27class SearchWidgetPrivate
30 SearchRunnerManager* m_runnerManager;
31 SearchInputWidget *m_searchField;
33 MarbleWidget *m_widget;
34 BranchFilterProxyModel m_branchfilter;
36 GeoDataDocument *m_document;
39 SearchWidgetPrivate();
44 void handlePlanetChange();
47SearchWidgetPrivate::SearchWidgetPrivate() :
48 m_runnerManager( nullptr ),
49 m_searchField( nullptr ),
50 m_searchResultView( nullptr ),
54 m_document( new GeoDataDocument )
56 m_document->setName(
QObject::tr(
"Search Results" ) );
69 m_widget->model()->placemarkSelectionModel()->clear();
70 GeoDataTreeModel *treeModel = m_widget->model()->treeModel();
71 treeModel->removeDocument( m_document );
73 m_document->setName(
QString(
QObject::tr(
"Search for '%1'" ) ).arg( m_searchField->text() ) );
74 for (GeoDataPlacemark *placemark: locations ) {
75 m_document->append(
new GeoDataPlacemark( *placemark ) );
77 treeModel->addDocument( m_document );
78 m_branchfilter.setBranchIndex( treeModel, treeModel->index( m_document ) );
79 m_searchResultView->setRootIndex(
80 m_sortproxy.mapFromSource(
81 m_branchfilter.mapFromSource( treeModel->index( m_document ) ) ) );
82 m_widget->centerOn( m_document->latLonAltBox() );
83 mDebug() <<
" Time elapsed:"<< timer.
elapsed() <<
" ms";
88 d( new SearchWidgetPrivate )
90 d->m_sortproxy.setSortRole( MarblePlacemarkModel::PopularityIndexRole );
92 d->m_sortproxy.setDynamicSortFilter(
true );
93 d->m_sortproxy.setSourceModel( &d->m_branchfilter );
95 d->m_searchField =
new SearchInputWidget(
this );
96 setFocusProxy( d->m_searchField );
98 this, SLOT(search(
QString,SearchMode)) );
100 d->m_searchResultView =
new QListView(
this );
101 d->m_searchResultView->setModel( &d->m_sortproxy );
102 d->m_searchResultView->setMinimumSize( 0, 0 );
108 layout->
addWidget( d->m_searchResultView );
109 layout->setMargin( 0 );
113SearchWidget::~SearchWidget()
118void SearchWidget::setMarbleWidget( MarbleWidget* widget )
124 d->m_widget = widget;
126 d->m_planetId = widget->model()->planetId();
128 this, SLOT(handlePlanetChange()) );
130 d->m_searchField->setCompletionModel( widget->model()->placemarkModel() );
131 connect( d->m_searchField, SIGNAL(centerOn(GeoDataCoordinates)),
132 widget, SLOT(centerOn(GeoDataCoordinates)) );
134 d->m_runnerManager =
new SearchRunnerManager( widget->model(),
this );
138 d->m_searchField, SLOT(disableSearchAnimation()));
140 GeoDataTreeModel* treeModel = d->m_widget->model()->treeModel();
141 treeModel->addDocument( d->m_document );
143 d->m_branchfilter.setSourceModel( treeModel );
144 d->m_branchfilter.setBranchIndex( treeModel, treeModel->index( d->m_document ) );
146 d->m_searchResultView->setRootIndex(
147 d->m_sortproxy.mapFromSource(
148 d->m_branchfilter.mapFromSource( treeModel->index( d->m_document ) ) ) );
151void SearchWidgetPrivate::search(
const QString &searchTerm, SearchMode searchMode )
156 if ( searchMode == AreaSearch ) {
157 m_runnerManager->findPlacemarks( searchTerm, m_widget->viewport()->viewLatLonAltBox() );
159 m_runnerManager->findPlacemarks( searchTerm );
164void SearchWidgetPrivate::clearSearch()
166 m_widget->model()->placemarkSelectionModel()->clear();
169 GeoDataTreeModel *treeModel = m_widget->model()->treeModel();
170 treeModel->removeDocument( m_document );
172 treeModel->addDocument( m_document );
173 m_branchfilter.setBranchIndex( treeModel, treeModel->index( m_document ) );
174 m_searchResultView->setRootIndex(
175 m_sortproxy.mapFromSource(
176 m_branchfilter.mapFromSource( treeModel->index( m_document ) ) ) );
179 m_runnerManager->findPlacemarks(
QString() );
182void SearchWidgetPrivate::centerMapOn(
const QModelIndex &index )
187 GeoDataObject *
object
188 = index.
model()->
data(index, MarblePlacemarkModel::ObjectPointerRole ).
value<GeoDataObject*>();
189 GeoDataPlacemark *placemark =
dynamic_cast<GeoDataPlacemark*
>( object );
191 m_widget->centerOn( *placemark,
true );
196void SearchWidgetPrivate::handlePlanetChange()
198 const QString newPlanetId = m_widget->model()->planetId();
200 if (newPlanetId == m_planetId) {
204 m_planetId = newPlanetId;
210#include "moc_SearchWidget.cpp"
This file contains the headers for MarbleModel.
This file contains the headers for ViewportParams.
Binds a QML item to a specific geodetic location in screen coordinates.
SearchMode
Search mode: Global (worldwide) versus area (local, regional) search.
virtual QVariant data(const QModelIndex &index, int role) const const=0
qint64 elapsed() const const
bool isEmpty() const const
bool isValid() const const
const QAbstractItemModel * model() const const
QString tr(const char *sourceText, const char *disambiguation, int n)
bool isEmpty() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)