• 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
SearchRunnerManager.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 2008 Henry de Valence <hdevalence@gmail.com>
9 // Copyright 2010 Dennis Nienhüser <earthwings@gentoo.org>
10 // Copyright 2010-2013 Bernhard Beschow <bbeschow@cs.tu-berlin.de>
11 // Copyright 2011 Thibaut Gridel <tgridel@free.fr>
12 
13 #include "SearchRunnerManager.h"
14 
15 #include "MarblePlacemarkModel.h"
16 #include "MarbleDebug.h"
17 #include "MarbleModel.h"
18 #include "MarbleMath.h"
19 #include "Planet.h"
20 #include "GeoDataDocument.h"
21 #include "GeoDataPlacemark.h"
22 #include "PluginManager.h"
23 #include "ParseRunnerPlugin.h"
24 #include "ReverseGeocodingRunnerPlugin.h"
25 #include "RoutingRunnerPlugin.h"
26 #include "SearchRunnerPlugin.h"
27 #include "RunnerTask.h"
28 #include "routing/RouteRequest.h"
29 #include "routing/RoutingProfilesModel.h"
30 
31 #include <QObject>
32 #include <QString>
33 #include <QVector>
34 #include <QThreadPool>
35 #include <QTimer>
36 #include <QFileInfo>
37 #include <QMutex>
38 
39 namespace Marble
40 {
41 
42 class MarbleModel;
43 
44 class SearchRunnerManager::Private
45 {
46 public:
47  Private( SearchRunnerManager *parent, const MarbleModel *marbleModel );
48 
49  template<typename T>
50  QList<T*> plugins( const QList<T*> &plugins );
51 
52  void addSearchResult( const QVector<GeoDataPlacemark *> &result );
53  void cleanupSearchTask( SearchTask *task );
54 
55  SearchRunnerManager *const q;
56  const MarbleModel *const m_marbleModel;
57  const PluginManager* m_pluginManager;
58  QString m_lastSearchTerm;
59  GeoDataLatLonAltBox m_lastPreferredBox;
60  QMutex m_modelMutex;
61  MarblePlacemarkModel m_model;
62  QList<SearchTask *> m_searchTasks;
63  QVector<GeoDataPlacemark *> m_placemarkContainer;
64 };
65 
66 SearchRunnerManager::Private::Private( SearchRunnerManager *parent, const MarbleModel *marbleModel ) :
67  q( parent ),
68  m_marbleModel( marbleModel ),
69  m_pluginManager( marbleModel->pluginManager() ),
70  m_model( new MarblePlacemarkModel( parent ) )
71 {
72  m_model.setPlacemarkContainer( &m_placemarkContainer );
73  qRegisterMetaType<QVector<GeoDataPlacemark *> >( "QVector<GeoDataPlacemark*>" );
74 }
75 
76 template<typename T>
77 QList<T*> SearchRunnerManager::Private::plugins( const QList<T*> &plugins )
78 {
79  QList<T*> result;
80  foreach( T* plugin, plugins ) {
81  if ( ( m_marbleModel && m_marbleModel->workOffline() && !plugin->canWorkOffline() ) ) {
82  continue;
83  }
84 
85  if ( !plugin->canWork() ) {
86  continue;
87  }
88 
89  if ( m_marbleModel && !plugin->supportsCelestialBody( m_marbleModel->planet()->id() ) )
90  {
91  continue;
92  }
93 
94  result << plugin;
95  }
96 
97  return result;
98 }
99 
100 void SearchRunnerManager::Private::addSearchResult( const QVector<GeoDataPlacemark *> &result )
101 {
102  mDebug() << "Runner reports" << result.size() << " search results";
103  if( result.isEmpty() )
104  return;
105 
106  m_modelMutex.lock();
107  int start = m_placemarkContainer.size();
108  bool distanceCompare = m_marbleModel->planet() != 0;
109  for( int i=0; i<result.size(); ++i ) {
110  bool same = false;
111  for ( int j=0; j<m_placemarkContainer.size(); ++j ) {
112  if ( distanceCompare &&
113  ( distanceSphere( result[i]->coordinate(),
114  m_placemarkContainer[j]->coordinate() )
115  * m_marbleModel->planet()->radius() < 1 ) ) {
116  same = true;
117  }
118  }
119  if ( !same ) {
120  m_placemarkContainer.append( result[i] );
121  }
122  }
123  m_model.addPlacemarks( start, result.size() );
124  m_modelMutex.unlock();
125  emit q->searchResultChanged( &m_model );
126  emit q->searchResultChanged( m_placemarkContainer );
127 }
128 
129 void SearchRunnerManager::Private::cleanupSearchTask( SearchTask *task )
130 {
131  m_searchTasks.removeAll( task );
132  mDebug() << "removing search task" << m_searchTasks.size() << (quintptr)task;
133  if ( m_searchTasks.isEmpty() ) {
134  if( m_placemarkContainer.isEmpty() ) {
135  emit q->searchResultChanged( &m_model );
136  emit q->searchResultChanged( m_placemarkContainer );
137  }
138  emit q->searchFinished( m_lastSearchTerm );
139  emit q->placemarkSearchFinished();
140  }
141 }
142 
143 SearchRunnerManager::SearchRunnerManager( const MarbleModel *marbleModel, QObject *parent ) :
144  QObject( parent ),
145  d( new Private( this, marbleModel ) )
146 {
147  if ( QThreadPool::globalInstance()->maxThreadCount() < 4 ) {
148  QThreadPool::globalInstance()->setMaxThreadCount( 4 );
149  }
150 }
151 
152 SearchRunnerManager::~SearchRunnerManager()
153 {
154  delete d;
155 }
156 
157 void SearchRunnerManager::findPlacemarks( const QString &searchTerm, const GeoDataLatLonAltBox &preferred )
158 {
159  if ( searchTerm == d->m_lastSearchTerm && preferred == d->m_lastPreferredBox ) {
160  emit searchResultChanged( &d->m_model );
161  emit searchResultChanged( d->m_placemarkContainer );
162  emit searchFinished( searchTerm );
163  emit placemarkSearchFinished();
164  return;
165  }
166 
167  d->m_lastSearchTerm = searchTerm;
168 
169  d->m_searchTasks.clear();
170 
171  d->m_modelMutex.lock();
172  d->m_model.removePlacemarks( "PlacemarkRunnerManager", 0, d->m_placemarkContainer.size() );
173  qDeleteAll( d->m_placemarkContainer );
174  d->m_placemarkContainer.clear();
175  d->m_modelMutex.unlock();
176  emit searchResultChanged( &d->m_model );
177 
178  if ( searchTerm.trimmed().isEmpty() ) {
179  emit searchFinished( searchTerm );
180  emit placemarkSearchFinished();
181  return;
182  }
183 
184  QList<const SearchRunnerPlugin *> plugins = d->plugins( d->m_pluginManager->searchRunnerPlugins() );
185  foreach( const SearchRunnerPlugin *plugin, plugins ) {
186  SearchTask *task = new SearchTask( plugin->newRunner(), this, d->m_marbleModel, searchTerm, preferred );
187  connect( task, SIGNAL(finished(SearchTask*)), this, SLOT(cleanupSearchTask(SearchTask*)) );
188  d->m_searchTasks << task;
189  mDebug() << "search task " << plugin->nameId() << " " << (quintptr)task;
190  }
191 
192  foreach( SearchTask *task, d->m_searchTasks ) {
193  QThreadPool::globalInstance()->start( task );
194  }
195 
196  if ( plugins.isEmpty() ) {
197  d->cleanupSearchTask( 0 );
198  }
199 }
200 
201 QVector<GeoDataPlacemark *> SearchRunnerManager::searchPlacemarks( const QString &searchTerm, const GeoDataLatLonAltBox &preferred, int timeout )
202 {
203  QEventLoop localEventLoop;
204  QTimer watchdog;
205  watchdog.setSingleShot(true);
206  connect( &watchdog, SIGNAL(timeout()),
207  &localEventLoop, SLOT(quit()));
208  connect(this, SIGNAL(placemarkSearchFinished()),
209  &localEventLoop, SLOT(quit()), Qt::QueuedConnection );
210 
211  watchdog.start( timeout );
212  findPlacemarks( searchTerm, preferred );
213  localEventLoop.exec();
214  return d->m_placemarkContainer;
215 }
216 
217 }
218 
219 #include "SearchRunnerManager.moc"
GeoDataDocument.h
SearchRunnerPlugin.h
MarbleMath.h
Marble::SearchTask
A RunnerTask that executes a placemark search.
Definition: RunnerTask.h:36
RunnerTask.h
MarbleModel.h
This file contains the headers for MarbleModel.
Marble::SearchRunnerManager::searchPlacemarks
QVector< GeoDataPlacemark * > searchPlacemarks(const QString &searchTerm, const GeoDataLatLonAltBox &preferred=GeoDataLatLonAltBox(), int timeout=30000)
Definition: SearchRunnerManager.cpp:201
Marble::SearchRunnerManager::searchResultChanged
void searchResultChanged(QAbstractItemModel *model)
Placemarks were added to or removed from the model.
Marble::distanceSphere
qreal distanceSphere(qreal lon1, qreal lat1, qreal lon2, qreal lat2)
This method calculates the shortest distance between two points on a sphere.
Definition: MarbleMath.h:52
Marble::SearchRunnerManager::searchFinished
void searchFinished(const QString &searchTerm)
The search request for the given search term has finished, i.e.
Planet.h
QObject
MarbleDebug.h
Marble::SearchRunnerManager::findPlacemarks
void findPlacemarks(const QString &searchTerm, const GeoDataLatLonAltBox &preferred=GeoDataLatLonAltBox())
Search for placemarks matching the given search term.
Definition: SearchRunnerManager.cpp:157
RoutingRunnerPlugin.h
Marble::SearchRunnerManager::placemarkSearchFinished
void placemarkSearchFinished()
Emitted whenever all runners are finished for the query.
Marble::SearchRunnerPlugin
A plugin for Marble to execute a placemark search.
Definition: SearchRunnerPlugin.h:25
MarblePlacemarkModel.h
GeoDataPlacemark.h
Marble::PluginInterface::nameId
virtual QString nameId() const =0
Returns the unique name of the plugin.
ParseRunnerPlugin.h
Marble::MarbleModel
The data model (not based on QAbstractModel) for a MarbleWidget.
Definition: MarbleModel.h:96
Marble::SearchRunnerManager::~SearchRunnerManager
~SearchRunnerManager()
Definition: SearchRunnerManager.cpp:152
Marble::SearchRunnerManager::SearchRunnerManager
SearchRunnerManager(const MarbleModel *marbleModel, QObject *parent=0)
Constructor.
Definition: SearchRunnerManager.cpp:143
PluginManager.h
SearchRunnerManager.h
Marble::SearchRunnerPlugin::newRunner
virtual SearchRunner * newRunner() const =0
Plugin factory method to create a new runner instance.
Marble::SearchRunnerManager::Private
friend class Private
Definition: SearchRunnerManager.h:81
RouteRequest.h
ReverseGeocodingRunnerPlugin.h
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:31
Marble::GeoDataLatLonAltBox
A class that defines a 3D bounding box for geographic data.
Definition: GeoDataLatLonAltBox.h:49
RoutingProfilesModel.h
coordinate
Coordinate coordinate
Definition: tools/osm-addresses/OsmParser.cpp:38
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