• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.12
  • kdeedu
  • marble
  • src
  • lib
  • marble
SearchWidget.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2012 Dennis Nienhüser <earthwings@gentoo.org>
9 //
10 
11 #include "SearchWidget.h"
12 
13 #include "GeoDataDocument.h"
14 #include "SearchInputWidget.h"
15 #include "MarbleWidget.h"
16 #include "MarbleModel.h"
17 #include "BranchFilterProxyModel.h"
18 #include "MarblePlacemarkModel.h"
19 #include "SearchRunnerManager.h"
20 #include "ViewportParams.h"
21 #include "MarbleDebug.h"
22 
23 #include <QListView>
24 #include <QVBoxLayout>
25 
26 namespace Marble {
27 
28 class SearchWidgetPrivate
29 {
30 public:
31  SearchRunnerManager* m_runnerManager;
32  SearchInputWidget *m_searchField;
33  QListView *m_searchResultView;
34  MarbleWidget *m_widget;
35  BranchFilterProxyModel m_branchfilter;
36  QSortFilterProxyModel m_sortproxy;
37  GeoDataDocument *m_document;
38 
39  SearchWidgetPrivate();
40  void setSearchResult( QVector<GeoDataPlacemark*> );
41  void search( const QString &searchTerm, SearchMode searchMode );
42  void clearSearch();
43  void centerMapOn( const QModelIndex &index );
44 };
45 
46 SearchWidgetPrivate::SearchWidgetPrivate() :
47  m_runnerManager( 0 ),
48  m_searchField( 0 ),
49  m_searchResultView( 0 ),
50  m_widget( 0 ),
51  m_branchfilter(),
52  m_sortproxy(),
53  m_document( new GeoDataDocument )
54 {
55  m_document->setName( QObject::tr( "Search Results" ) );
56 }
57 
58 void SearchWidgetPrivate::setSearchResult( QVector<GeoDataPlacemark *> locations )
59 {
60  if( locations.isEmpty() ) {
61  return;
62  }
63 
64  QTime timer;
65  timer.start();
66 
67  // fill the local document with results
68  m_widget->model()->placemarkSelectionModel()->clear();
69  GeoDataTreeModel *treeModel = m_widget->model()->treeModel();
70  treeModel->removeDocument( m_document );
71  m_document->clear();
72  m_document->setName( QString( QObject::tr( "Search for '%1'" ) ).arg( m_searchField->text() ) );
73  foreach (GeoDataPlacemark *placemark, locations ) {
74  m_document->append( new GeoDataPlacemark( *placemark ) );
75  }
76  treeModel->addDocument( m_document );
77  m_branchfilter.setBranchIndex( treeModel, treeModel->index( m_document ) );
78  m_searchResultView->setRootIndex(
79  m_sortproxy.mapFromSource(
80  m_branchfilter.mapFromSource( treeModel->index( m_document ) ) ) );
81  m_widget->centerOn( m_document->latLonAltBox() );
82  mDebug() << Q_FUNC_INFO << " Time elapsed:"<< timer.elapsed() << " ms";
83 }
84 
85 SearchWidget::SearchWidget( QWidget *parent, Qt::WindowFlags flags ) :
86  QWidget( parent, flags ),
87  d( new SearchWidgetPrivate )
88 {
89  d->m_sortproxy.setSortRole( MarblePlacemarkModel::PopularityIndexRole );
90  d->m_sortproxy.sort( 0, Qt::AscendingOrder );
91  d->m_sortproxy.setDynamicSortFilter( true );
92  d->m_sortproxy.setSourceModel( &d->m_branchfilter );
93 
94  d->m_searchField = new SearchInputWidget( this );
95  setFocusProxy( d->m_searchField );
96  connect( d->m_searchField, SIGNAL(search(QString,SearchMode)),
97  this, SLOT(search(QString,SearchMode)) );
98 
99  d->m_searchResultView = new QListView( this );
100  d->m_searchResultView->setModel( &d->m_sortproxy );
101  d->m_searchResultView->setMinimumSize( 0, 0 );
102  connect( d->m_searchResultView, SIGNAL(activated(QModelIndex)),
103  this, SLOT(centerMapOn(QModelIndex)) );
104 
105  QVBoxLayout* layout = new QVBoxLayout;
106  layout->addWidget( d->m_searchField );
107  layout->addWidget( d->m_searchResultView );
108  layout->setMargin( 0 );
109  setLayout( layout );
110 }
111 
112 SearchWidget::~SearchWidget()
113 {
114  delete d;
115 }
116 
117 void SearchWidget::setMarbleWidget( MarbleWidget* widget )
118 {
119  if ( d->m_widget ) {
120  return;
121  }
122 
123  d->m_widget = widget;
124 
125  d->m_searchField->setCompletionModel( widget->model()->placemarkModel() );
126  connect( d->m_searchField, SIGNAL(centerOn(GeoDataCoordinates)),
127  widget, SLOT(centerOn(GeoDataCoordinates)) );
128 
129  d->m_runnerManager = new SearchRunnerManager( widget->model(), this );
130  connect( d->m_runnerManager, SIGNAL(searchResultChanged(QVector<GeoDataPlacemark*>)),
131  this, SLOT(setSearchResult(QVector<GeoDataPlacemark*>)) );
132  connect( d->m_runnerManager, SIGNAL(searchFinished(QString)),
133  d->m_searchField, SLOT(disableSearchAnimation()));
134 
135  GeoDataTreeModel* treeModel = d->m_widget->model()->treeModel();
136  treeModel->addDocument( d->m_document );
137 
138  d->m_branchfilter.setSourceModel( treeModel );
139  d->m_branchfilter.setBranchIndex( treeModel, treeModel->index( d->m_document ) );
140 
141  d->m_searchResultView->setRootIndex(
142  d->m_sortproxy.mapFromSource(
143  d->m_branchfilter.mapFromSource( treeModel->index( d->m_document ) ) ) );
144 }
145 
146 void SearchWidgetPrivate::search( const QString &searchTerm, SearchMode searchMode )
147 {
148  if( searchTerm.isEmpty() ) {
149  clearSearch();
150  } else {
151  if ( searchMode == AreaSearch ) {
152  m_runnerManager->findPlacemarks( searchTerm, m_widget->viewport()->viewLatLonAltBox() );
153  } else {
154  m_runnerManager->findPlacemarks( searchTerm );
155  }
156  }
157 }
158 
159 void SearchWidgetPrivate::clearSearch()
160 {
161  m_widget->model()->placemarkSelectionModel()->clear();
162 
163  // clear the local document
164  GeoDataTreeModel *treeModel = m_widget->model()->treeModel();
165  treeModel->removeDocument( m_document );
166  m_document->clear();
167  treeModel->addDocument( m_document );
168  m_branchfilter.setBranchIndex( treeModel, treeModel->index( m_document ) );
169  m_searchResultView->setRootIndex(
170  m_sortproxy.mapFromSource(
171  m_branchfilter.mapFromSource( treeModel->index( m_document ) ) ) );
172 
173  // clear cached search results
174  m_runnerManager->findPlacemarks( QString() );
175 }
176 
177 void SearchWidgetPrivate::centerMapOn( const QModelIndex &index )
178 {
179  if( !index.isValid() ) {
180  return;
181  }
182  GeoDataObject *object
183  = index.model()->data(index, MarblePlacemarkModel::ObjectPointerRole ).value<GeoDataObject*>();
184  GeoDataPlacemark *placemark = dynamic_cast<GeoDataPlacemark*>( object );
185  if ( placemark ) {
186  m_widget->centerOn( *placemark, true );
187  m_widget->model()->placemarkSelectionModel()->select( index, QItemSelectionModel::ClearAndSelect );
188  }
189 }
190 
191 }
192 
193 #include "SearchWidget.moc"
GeoDataDocument.h
Marble::SearchMode
SearchMode
Search mode: Global (worldwide) versus area (local, regional) search.
Definition: MarbleGlobal.h:179
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
Marble::GeoDataTreeModel
The representation of GeoData in a model This class represents all available data given by kml-data f...
Definition: GeoDataTreeModel.h:32
Marble::SearchWidget::SearchWidget
SearchWidget(QWidget *parent=0, Qt::WindowFlags flags=0)
Definition: SearchWidget.cpp:85
MarbleModel.h
This file contains the headers for MarbleModel.
search
Definition: google-search.qml:12
QWidget
Marble::AreaSearch
Search a certain region of a planet (e.g. visible region)
Definition: MarbleGlobal.h:181
Marble::MarblePlacemarkModel::ObjectPointerRole
The pointer to a specific object.
Definition: MarblePlacemarkModel.h:62
Marble::SearchRunnerManager
Definition: SearchRunnerManager.h:33
MarbleDebug.h
Marble::GeoDataTreeModel::addDocument
int addDocument(GeoDataDocument *document)
Definition: GeoDataTreeModel.cpp:595
Marble::MarbleWidget
A widget class that displays a view of the earth.
Definition: MarbleWidget.h:102
SearchWidget.h
Marble::MarbleWidget::model
MarbleModel * model() const
Return the model that this view shows.
Definition: MarbleWidget.cpp:283
Marble::SearchWidget::~SearchWidget
~SearchWidget()
Definition: SearchWidget.cpp:112
MarblePlacemarkModel.h
BranchFilterProxyModel.h
ViewportParams.h
This file contains the headers for ViewportParams.
Marble::MarblePlacemarkModel::PopularityIndexRole
The popularity index.
Definition: MarblePlacemarkModel.h:60
SearchRunnerManager.h
Marble::GeoDataTreeModel::index
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: GeoDataTreeModel.cpp:313
MarbleWidget.h
This file contains the headers for MarbleWidget.
Marble::SearchInputWidget
Definition: SearchInputWidget.h:29
MarbleWidget
Wraps a Marble::MarbleWidget, providing access to important properties and methods.
Definition: MarbleDeclarativeWidget.h:50
SearchInputWidget.h
Marble::SearchWidget::setMarbleWidget
void setMarbleWidget(MarbleWidget *widget)
Definition: SearchWidget.cpp:117
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:31
Marble::MarbleModel::placemarkModel
QAbstractItemModel * placemarkModel()
Definition: MarbleModel.cpp:417
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:52 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal