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

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • plugins
  • declarative
Search.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 2011 Dennis Nienhüser <earthwings@gentoo.org>
9 //
10 
11 #include "Search.h"
12 
13 #include "MarbleDeclarativeWidget.h"
14 #include "MarbleModel.h"
15 #include "MarblePlacemarkModel.h"
16 #include "SearchRunnerManager.h"
17 #include "ViewportParams.h"
18 
19 #if QT_VERSION < 0x050000
20  #include <QDeclarativeContext>
21  typedef QDeclarativeItem QQuickItem;
22  typedef QDeclarativeContext QQmlContext;
23  typedef QDeclarativeComponent QQmlComponent;
24 #else
25  #include <QQmlContext>
26 #endif
27 
28 Search::Search( QObject* parent ) : QObject( parent ),
29  m_marbleWidget( 0 ), m_runnerManager( 0 ),
30  m_searchResult( 0 ), m_placemarkDelegate( 0 )
31 {
32  // nothing to do
33 }
34 
35 MarbleWidget *Search::map()
36 {
37  return m_marbleWidget;
38 }
39 
40 void Search::setMap( MarbleWidget* widget )
41 {
42  m_marbleWidget = widget;
43  connect( m_marbleWidget, SIGNAL(visibleLatLonAltBoxChanged()),
44  this, SLOT(updatePlacemarks()) );
45  connect( m_marbleWidget, SIGNAL(mapThemeChanged()),
46  this, SLOT(updatePlacemarks()) );
47  emit mapChanged();
48 }
49 
50 QQmlComponent* Search::placemarkDelegate()
51 {
52  return m_placemarkDelegate;
53 }
54 
55 void Search::setPlacemarkDelegate( QQmlComponent* delegate )
56 {
57  m_placemarkDelegate = delegate;
58  emit placemarkDelegateChanged();
59 }
60 
61 void Search::find( const QString &searchTerm )
62 {
63  if ( !m_runnerManager && m_marbleWidget ) {
64  m_runnerManager = new Marble::SearchRunnerManager( m_marbleWidget->model(), this );
65  connect( m_runnerManager, SIGNAL(searchFinished(QString)),
66  this, SLOT(handleSearchResult()) );
67  connect( m_runnerManager, SIGNAL(searchResultChanged(QAbstractItemModel*)),
68  this, SLOT(updateSearchModel(QAbstractItemModel*)) );
69  }
70 
71  if ( m_runnerManager ) {
72  m_runnerManager->findPlacemarks( searchTerm );
73  }
74 }
75 
76 QObject* Search::searchResultModel()
77 {
78  return m_searchResult;
79 }
80 
81 void Search::updateSearchModel( QAbstractItemModel *model )
82 {
83  m_searchResult = static_cast<Marble::MarblePlacemarkModel*>( model );
84  qDeleteAll( m_placemarks.values() );
85  m_placemarks.clear();
86 
87  if ( !m_placemarkDelegate ) {
88  return;
89  }
90 
91  QHash<int,QByteArray> const roles = model->roleNames();
92  for ( int i=0; i<m_searchResult->rowCount(); ++i ) {
93  QQmlContext *context = new QQmlContext( qmlContext( m_placemarkDelegate ) );
94  QModelIndex const index = m_searchResult->index( i );
95  QHash<int,QByteArray>::const_iterator iter = roles.constBegin();
96  context->setContextProperty( "index", i );
97  for ( ; iter != roles.constEnd(); ++iter ) {
98  context->setContextProperty( iter.value(), m_searchResult->data( index, iter.key() ) );
99  }
100  QObject* component = m_placemarkDelegate->create( context );
101  QGraphicsItem* graphicsItem = qobject_cast<QGraphicsItem*>( component );
102  QQuickItem* item = qobject_cast<QQuickItem*>( component );
103  if ( graphicsItem && item ) {
104  graphicsItem->setParentItem( m_marbleWidget );
105  m_placemarks[i] = item;
106  } else {
107  delete component;
108  }
109  }
110  updatePlacemarks();
111 }
112 
113 void Search::updatePlacemarks()
114 {
115  if ( m_marbleWidget ) {
116  bool const onEarth = m_marbleWidget->model()->planetId() == "earth";
117  QMap<int, QQuickItem*>::const_iterator iter = m_placemarks.constBegin();
118  while ( iter != m_placemarks.constEnd() ) {
119  qreal x(0), y(0);
120  QVariant position = m_searchResult->data( m_searchResult->index( iter.key() ), Marble::MarblePlacemarkModel::CoordinateRole );
121  Marble::GeoDataCoordinates const coordinates = position.value<Marble::GeoDataCoordinates>();
122  bool const visible = onEarth && m_marbleWidget->viewport()->screenCoordinates( coordinates.longitude( Marble::GeoDataCoordinates::Radian ),
123  coordinates.latitude( Marble::GeoDataCoordinates::Radian), x, y );
124  QQuickItem* item = iter.value();
125  if ( item ) {
126  item->setVisible( visible );
127  if ( visible ) {
128  int shiftX( 0 ), shiftY( 0 );
129  switch( item->transformOrigin() ) {
130  case QQuickItem::TopLeft:
131  case QQuickItem::Top:
132  case QQuickItem::TopRight:
133  break;
134  case QQuickItem::Left:
135  case QQuickItem::Center:
136  case QQuickItem::Right:
137  shiftY = item->height() / 2;
138  break;
139  case QQuickItem::BottomLeft:
140  case QQuickItem::Bottom:
141  case QQuickItem::BottomRight:
142  shiftY = item->height();
143  break;
144  }
145 
146  switch( item->transformOrigin() ) {
147  case QQuickItem::TopLeft:
148  case QQuickItem::Left:
149  case QQuickItem::BottomLeft:
150  break;
151  case QQuickItem::Top:
152  case QQuickItem::Center:
153  case QQuickItem::Bottom:
154  shiftX = item->width() / 2;
155  break;
156  case QQuickItem::TopRight:
157  case QQuickItem::Right:
158  case QQuickItem::BottomRight:
159  shiftX = item->width();
160  break;
161  }
162 
163  item->setX( x - shiftX );
164  item->setY( y - shiftY );
165  }
166  }
167  ++iter;
168  }
169  }
170 }
171 
172 void Search::handleSearchResult()
173 {
174  Q_ASSERT( m_marbleWidget ); // search wouldn't be started without
175  Q_ASSERT( m_searchResult ); // search wouldn't be finished without
176 
177  Marble::GeoDataLineString placemarks;
178  for ( int i = 0; i < m_searchResult->rowCount(); ++i ) {
179  QVariant data = m_searchResult->index( i, 0 ).data( Marble::MarblePlacemarkModel::CoordinateRole );
180  if ( !data.isNull() ) {
181  placemarks << data.value<Marble::GeoDataCoordinates>();
182  }
183  }
184 
185  if ( placemarks.size() > 1 ) {
186  m_marbleWidget->centerOn( Marble::GeoDataLatLonBox::fromLineString( placemarks ) );
187  }
188 
189  emit searchFinished();
190 }
191 
192 #include "Search.moc"
QDeclarativeContext::setContextProperty
void setContextProperty(const QString &name, QObject *value)
QModelIndex
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
Marble::MarblePlacemarkModel
This class represents a model of all place marks which are currently available through a given Placem...
Definition: MarblePlacemarkModel.h:37
Marble::GeoDataCoordinates::Radian
Definition: GeoDataCoordinates.h:65
Search::placemarkDelegateChanged
void placemarkDelegateChanged()
Marble::SearchRunnerManager::findPlacemarks
void findPlacemarks(const QString &searchTerm, const GeoDataLatLonBox &preferred=GeoDataLatLonBox())
Search for placemarks matching the given search term.
Definition: SearchRunnerManager.cpp:157
QMap::values
QList< T > values() const
QGraphicsItem::setParentItem
void setParentItem(QGraphicsItem *newParent)
MarbleDeclarativeWidget.h
Search.h
MarbleModel.h
This file contains the headers for MarbleModel.
MarbleWidget::viewport
const Marble::ViewportParams * viewport() const
Definition: MarbleDeclarativeWidget.cpp:91
Marble::GeoDataLineString::size
int size() const
Returns the number of nodes in a LineString.
Definition: GeoDataLineString.cpp:138
Search::placemarkDelegate
QDeclarativeComponent * placemarkDelegate()
QAbstractItemModel::roleNames
const QHash< int, QByteArray > & roleNames() const
QMap::constBegin
const_iterator constBegin() const
Marble::MarbleModel::planetId
QString planetId() const
Definition: MarbleModel.cpp:532
Search::setPlacemarkDelegate
void setPlacemarkDelegate(QDeclarativeComponent *delegate)
Definition: Search.cpp:55
QVariant::value
T value() const
QQmlComponent
QDeclarativeComponent QQmlComponent
Definition: Search.cpp:23
QGraphicsItem
QQmlContext
QDeclarativeContext QQmlContext
Definition: Search.cpp:22
MarbleWidget::centerOn
void centerOn(const Marble::GeoDataLatLonBox &bbox)
Definition: MarbleDeclarativeWidget.cpp:262
Marble::GeoDataCoordinates::latitude
qreal latitude(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
retrieves the latitude of the GeoDataCoordinates object use the unit parameter to switch between Radi...
Definition: GeoDataCoordinates.cpp:751
QMap::clear
void clear()
Marble::SearchRunnerManager
Definition: SearchRunnerManager.h:33
Search::searchResultModel
QObject * searchResultModel()
Definition: Search.cpp:76
Search::map
MarbleWidget * map()
QQuickItem
QDeclarativeItem QQuickItem
Definition: Search.cpp:21
QHash::constEnd
const_iterator constEnd() const
QVariant::isNull
bool isNull() const
Search::mapChanged
void mapChanged()
QHash
QDeclarativeComponent::create
virtual QObject * create(QDeclarativeContext *context)
QObject
QAbstractListModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
QMap::constEnd
const_iterator constEnd() const
Marble::MarblePlacemarkModel::data
QVariant data(const QModelIndex &index, int role) const
Return the data according to the index.
Definition: MarblePlacemarkModel.cpp:97
QDeclarativeContext
QMap::const_iterator
Marble::ViewportParams::screenCoordinates
bool screenCoordinates(const qreal lon, const qreal lat, qreal &x, qreal &y) const
Get the screen coordinates corresponding to geographical coordinates in the map.
Definition: ViewportParams.cpp:357
Search::find
void find(const QString &searchTerm)
Definition: Search.cpp:61
QString
MarblePlacemarkModel.h
Marble::GeoDataLatLonBox::fromLineString
static GeoDataLatLonBox fromLineString(const GeoDataLineString &lineString)
Create the smallest bounding box from a line string.
Definition: GeoDataLatLonBox.cpp:620
Marble::GeoDataLineString
A LineString that allows to store a contiguous set of line segments.
Definition: GeoDataLineString.h:75
Marble::MarblePlacemarkModel::rowCount
int rowCount(const QModelIndex &parent=QModelIndex()) const
Return the number of Placemarks in the Model.
Definition: MarblePlacemarkModel.cpp:74
QDeclarativeComponent
Marble::GeoDataCoordinates::longitude
qreal longitude(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
retrieves the longitude of the GeoDataCoordinates object use the unit parameter to switch between Rad...
Definition: GeoDataCoordinates.cpp:739
ViewportParams.h
This file contains the headers for ViewportParams.
Marble::MarblePlacemarkModel::CoordinateRole
The GeoDataCoordinates coordinate.
Definition: MarblePlacemarkModel.h:53
QHash::const_iterator
QHash::constBegin
const_iterator constBegin() const
QModelIndex::data
QVariant data(int role) const
Search::Search
Search(QObject *parent=0)
Definition: Search.cpp:28
SearchRunnerManager.h
QAbstractItemModel
QGraphicsItem::setX
void setX(qreal x)
QGraphicsItem::setY
void setY(qreal y)
QGraphicsItem::setVisible
void setVisible(bool visible)
QDeclarativeItem
Search::searchFinished
void searchFinished()
The last search triggered by search() is finished and can be retrieved using.
MarbleWidget
Wraps a Marble::MarbleWidget, providing access to important properties and methods.
Definition: MarbleDeclarativeWidget.h:50
Search::setMap
void setMap(MarbleWidget *widget)
Definition: Search.cpp:40
QDeclarativeItem::transformOrigin
TransformOrigin transformOrigin() const
MarbleWidget::model
Marble::MarbleModel * model()
Definition: MarbleDeclarativeWidget.cpp:86
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QVariant
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 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
  • 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