• 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
  • lib
  • marble
EditBookmarkDialog.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 2010 Gaurav Gupta <1989.gaurav@googlemail.com>
9 // Copyright 2011 Friedrich W. H. Kossebau <kossebau@kde.org>
10 // Copyright 2012 Thibaut Gridel <tgridel@free.fr>
11 //
12 
13 #include "EditBookmarkDialog.h"
14 #include "ui_EditBookmarkDialog.h"
15 
16 #include "BookmarkManager.h"
17 #include "GeoDataDocument.h"
18 #include "GeoDataPlacemark.h"
19 #include "GeoDataPoint.h"
20 #include "GeoDataFolder.h"
21 #include "GeoDataCoordinates.h"
22 #include "GeoDataExtendedData.h"
23 #include "MarbleModel.h"
24 #include "MarbleWidget.h"
25 #include "NewBookmarkFolderDialog.h"
26 #include "ReverseGeocodingRunnerManager.h"
27 
28 #include <QPointer>
29 
30 namespace Marble {
31 
32 class EditBookmarkDialogPrivate {
33 public:
34  MarbleWidget *m_widget;
35  ReverseGeocodingRunnerManager* m_manager;
36  BookmarkManager* m_bookmarkManager;
37  GeoDataCoordinates m_bookmarkCoordinates;
38  qreal m_range;
39  Ui::UiEditBookmarkDialog m_ui;
40 
41  EditBookmarkDialogPrivate( EditBookmarkDialog* q, BookmarkManager *bookmarkManager );
42 
43  void initComboBox( const GeoDataContainer* const container );
44 
45  void initialize();
46 
47  void setFolderName( const QString &name );
48 
49  static QString append( const QString &bookmark, const QString &text);
50 
51  void openNewFolderDialog();
52 
53  void retrieveGeocodeResult( const GeoDataCoordinates &coordinates, const GeoDataPlacemark &placemark);
54 
55  void updateCoordinates();
56 
57 private:
58  EditBookmarkDialog* const q;
59 };
60 
61 EditBookmarkDialogPrivate::EditBookmarkDialogPrivate( EditBookmarkDialog* q_, BookmarkManager *bookmarkManager ) :
62  m_widget( 0 ), m_manager( 0 ), m_bookmarkManager( bookmarkManager ), m_range( 0 ), q( q_ )
63 {
64  // nothing to do
65 }
66 
67 void EditBookmarkDialogPrivate::initialize()
68 {
69  m_ui.setupUi( q );
70  m_ui.m_longitude->setDimension( Longitude );
71  m_ui.m_latitude->setDimension( Latitude );
72  bool const smallScreen = MarbleGlobal::getInstance()->profiles() & MarbleGlobal::SmallScreen;
73  m_ui.position_lbl->setVisible( !smallScreen );
74  m_ui.m_latitude->setVisible( !smallScreen );
75  m_ui.m_longitude->setVisible( !smallScreen );
76  QObject::connect( m_ui.m_newFolderButton, SIGNAL(clicked()), q, SLOT(openNewFolderDialog()) );
77  QObject::connect( m_ui.m_longitude, SIGNAL(valueChanged(qreal)), q, SLOT(updateCoordinates()) );
78  QObject::connect( m_ui.m_latitude, SIGNAL(valueChanged(qreal)), q, SLOT(updateCoordinates()) );
79 
80  m_ui.m_folders->clear();
81  initComboBox( m_bookmarkManager->document() );
82 }
83 
84 void EditBookmarkDialogPrivate::initComboBox( const GeoDataContainer* const container )
85 {
86  m_bookmarkManager->ensureDefaultFolder();
87  foreach( GeoDataFolder *folder, container->folderList() ) {
88  QVariant folderVariant;
89  folderVariant.setValue(folder);
90  m_ui.m_folders->addItem( folder->name(), folderVariant );
91  if( !folder->folderList().isEmpty() ) {
92  initComboBox( folder );
93  }
94  }
95 }
96 
97 void EditBookmarkDialogPrivate::setFolderName( const QString &name )
98 {
99  for ( int i=0; i<m_ui.m_folders->count(); ++i ) {
100  if ( m_ui.m_folders->itemText( i ) == name ) {
101  m_ui.m_folders->setCurrentIndex( i );
102  return;
103  }
104  }
105 }
106 
107 EditBookmarkDialog::EditBookmarkDialog( BookmarkManager *bookmarkManager, QWidget *parent )
108  : QDialog( parent ), d( new EditBookmarkDialogPrivate( this, bookmarkManager ) )
109 {
110  d->initialize();
111 }
112 
113 void EditBookmarkDialog::setCoordinates( const GeoDataCoordinates &coordinates )
114 {
115  d->m_bookmarkCoordinates = coordinates;
116 
117  if ( d->m_ui.m_name->text().isEmpty() ) {
118  d->m_ui.m_name->setText( coordinates.toString() );
119  d->m_ui.m_name->selectAll();
120  }
121 
122  d->m_ui.m_longitude->setValue( coordinates.longitude(GeoDataCoordinates::Degree) );
123  d->m_ui.m_latitude->setValue( coordinates.latitude(GeoDataCoordinates::Degree) );
124 }
125 
126 void EditBookmarkDialog::setRange( qreal range ) {
127  d->m_range = range;
128 }
129 
130 void EditBookmarkDialog::setName( const QString &text )
131 {
132  d->m_ui.m_name->setText( text );
133 }
134 
135 void EditBookmarkDialog::setDescription( const QString &text )
136 {
137  d->m_ui.m_description->setText( text );
138 }
139 
140 void EditBookmarkDialog::setFolderName( const QString &name )
141 {
142  d->setFolderName( name );
143 }
144 
145 void EditBookmarkDialog::setMarbleWidget( MarbleWidget* widget )
146 {
147  d->m_widget = widget;
148  const AngleUnit defaultAngleUnit = d->m_widget->defaultAngleUnit();
149  const GeoDataCoordinates::Notation notation =
150  (defaultAngleUnit == DecimalDegree) ? GeoDataCoordinates::Decimal :
151  (defaultAngleUnit == DMSDegree) ? GeoDataCoordinates::DMS :
152  /* else, UTM */ GeoDataCoordinates::DMS;
153  d->m_ui.m_longitude->setNotation( notation );
154  d->m_ui.m_latitude->setNotation( notation );
155 
156  d->m_manager = new ReverseGeocodingRunnerManager( d->m_widget->model(), this );
157  QObject::connect( d->m_manager, SIGNAL(reverseGeocodingFinished(GeoDataCoordinates,GeoDataPlacemark)),
158  this, SLOT(retrieveGeocodeResult(GeoDataCoordinates,GeoDataPlacemark)) );
159 }
160 
161 void EditBookmarkDialog::setReverseGeocodeName()
162 {
163  if ( !d->m_manager ) {
164  return;
165  }
166  //reverse geocode the bookmark point for better user experience
167  d->m_manager->reverseGeocoding( d->m_bookmarkCoordinates );
168 }
169 
170 EditBookmarkDialog::~EditBookmarkDialog()
171 {
172  delete d;
173 }
174 
175 void EditBookmarkDialogPrivate::retrieveGeocodeResult( const GeoDataCoordinates &coordinates, const GeoDataPlacemark &placemark)
176 {
177  Q_UNUSED(coordinates)
178  GeoDataExtendedData data = placemark.extendedData();
179  QString bookmarkName;
180  qreal distance = m_widget->distance() * KM2METER;
181  //FIXME : Optimal logic for suggestion with distance consideration is required
182 
183  if( distance >= 3500 ) {
184  bookmarkName = data.value("country").value().toString() ;
185  }
186  else if( distance >= 200 ) {
187  bookmarkName = append( data.value("city").value().toString()
188  , data.value("state").value().toString() );
189  bookmarkName = append( bookmarkName, data.value("country").value().toString() ) ;
190  }
191  else {
192  bookmarkName = append( data.value("road").value().toString()
193  , data.value("city").value().toString());
194  bookmarkName = append( bookmarkName, data.value("country").value().toString() ) ;
195  }
196 
197  if( bookmarkName.isEmpty() ) {
198  bookmarkName = placemark.address();
199  }
200 
201  m_ui.m_name->setText( bookmarkName );
202  m_ui.m_name->selectAll();
203 }
204 
205 QString EditBookmarkDialogPrivate::append( const QString &bookmark, const QString &text)
206 {
207  if( bookmark.isEmpty() && text.isEmpty() ) {
208  return "";
209  }
210  else if( bookmark.isEmpty() ) {
211  return text;
212  }
213  else if( text.isEmpty() ) {
214  return bookmark;
215  }
216  return bookmark + ", " + text;
217 }
218 
219 void EditBookmarkDialogPrivate::openNewFolderDialog()
220 {
221  QPointer<NewBookmarkFolderDialog> dialog = new NewBookmarkFolderDialog( q );
222  if ( dialog->exec() == QDialog::Accepted ) {
223  m_bookmarkManager->addNewBookmarkFolder( m_bookmarkManager->document(), dialog->folderName() );
224  m_ui.m_folders->clear();
225  initComboBox( m_bookmarkManager->document() );
226  setFolderName( dialog->folderName() );
227  }
228  delete dialog;
229 }
230 
231 void EditBookmarkDialogPrivate::updateCoordinates()
232 {
233  m_bookmarkCoordinates.setLongitude( m_ui.m_longitude->value(), GeoDataCoordinates::Degree );
234  m_bookmarkCoordinates.setLatitude( m_ui.m_latitude->value(), GeoDataCoordinates::Degree );
235 }
236 
237 GeoDataPlacemark EditBookmarkDialog::bookmark() const
238 {
239  //Create a bookmark object
240  GeoDataPlacemark bookmark;
241  bookmark.setName( name() );
242  bookmark.setDescription( description() );
243  //allow for HTML in the description
244  bookmark.setDescriptionCDATA( true );
245  bookmark.setCoordinate( coordinates() );
246  if ( d->m_range ) {
247  GeoDataLookAt *lookat = new GeoDataLookAt;
248  lookat->setCoordinates( coordinates() );
249  lookat->setRange( range() );
250  bookmark.setAbstractView( lookat );
251  }
252 
253  bookmark.extendedData().addValue( GeoDataData( "isBookmark", true ) );
254 
255  if(d->m_widget != 0) {
256  const QString celestialName = d->m_widget->model()->planetId();
257  if(celestialName != "earth") {
258  bookmark.extendedData().addValue( GeoDataData( "celestialBody", celestialName ) );
259  }
260  }
261 
262  return bookmark;
263 }
264 
265 QString EditBookmarkDialog::name() const
266 {
267  return d->m_ui.m_name->text();
268 }
269 
270 GeoDataFolder *EditBookmarkDialog::folder() const
271 {
272  return qvariant_cast<GeoDataFolder*>(d->m_ui.m_folders->itemData(d->m_ui.m_folders->currentIndex()));
273 }
274 
275 QString EditBookmarkDialog::description() const
276 {
277  return d->m_ui.m_description->toPlainText();
278 }
279 
280 GeoDataCoordinates EditBookmarkDialog::coordinates() const
281 {
282  return d->m_bookmarkCoordinates;
283 }
284 
285 qreal EditBookmarkDialog::range() const {
286  return d->m_range;
287 }
288 
289 }
290 
291 #include "EditBookmarkDialog.moc"
GeoDataDocument.h
GeoDataCoordinates.h
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
QWidget
Marble::EditBookmarkDialog::coordinates
GeoDataCoordinates coordinates() const
Definition: EditBookmarkDialog.cpp:280
MarbleModel.h
This file contains the headers for MarbleModel.
Marble::KM2METER
const qreal KM2METER
Definition: MarbleGlobal.h:223
Marble::GeoDataFeature::setDescription
void setDescription(const QString &value)
Set the description of this feature to value.
Definition: GeoDataFeature.cpp:593
Marble::EditBookmarkDialog::setCoordinates
void setCoordinates(const GeoDataCoordinates &coordinates)
Definition: EditBookmarkDialog.cpp:113
Marble::EditBookmarkDialog::~EditBookmarkDialog
~EditBookmarkDialog()
Destructor.
Definition: EditBookmarkDialog.cpp:170
QPointer
Marble::EditBookmarkDialog::folder
GeoDataFolder * folder() const
Definition: EditBookmarkDialog.cpp:270
Marble::EditBookmarkDialog::setFolderName
void setFolderName(const QString &name)
Definition: EditBookmarkDialog.cpp:140
Marble::DecimalDegree
Degrees in decimal notation.
Definition: MarbleGlobal.h:67
Marble::GeoDataCoordinates::Decimal
"Decimal" notation (base-10)
Definition: GeoDataCoordinates.h:80
Marble::EditBookmarkDialog::range
qreal range() const
Definition: EditBookmarkDialog.cpp:285
Marble::EditBookmarkDialog::name
QString name() const
Definition: EditBookmarkDialog.cpp:265
Marble::EditBookmarkDialog::setMarbleWidget
void setMarbleWidget(MarbleWidget *widget)
Definition: EditBookmarkDialog.cpp:145
GeoDataExtendedData.h
Marble::GeoDataPlacemark::setCoordinate
void setCoordinate(qreal longitude, qreal latitude, qreal altitude=0, GeoDataCoordinates::Unit _unit=GeoDataCoordinates::Radian)
Set the coordinate of the placemark in longitude and latitude.
Definition: GeoDataPlacemark.cpp:215
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
Marble::EditBookmarkDialog::description
QString description() const
Definition: EditBookmarkDialog.cpp:275
Marble::GeoDataCoordinates::Degree
Definition: GeoDataCoordinates.h:66
Marble::GeoDataExtendedData
a class which allows to add custom data to KML Feature.
Definition: GeoDataExtendedData.h:35
BookmarkManager.h
Marble::MarbleWidget
A widget class that displays a view of the earth.
Definition: MarbleWidget.h:104
Marble::EditBookmarkDialog::setName
void setName(const QString &name)
Definition: EditBookmarkDialog.cpp:130
Marble::Latitude
Latitude.
Definition: MarbleGlobal.h:56
Marble::EditBookmarkDialog::setDescription
void setDescription(const QString &text)
Definition: EditBookmarkDialog.cpp:135
Marble::BookmarkManager
This class is responsible for loading the book mark objects from the files and various book mark oper...
Definition: BookmarkManager.h:35
Marble::GeoDataFeature::setName
void setName(const QString &value)
Set a new name for this feature.
Definition: GeoDataFeature.cpp:549
NewBookmarkFolderDialog.h
Marble::GeoDataLookAt::setRange
void setRange(qreal range)
Change the distance (in meters) between the camera and the object looked at.
Definition: GeoDataLookAt.cpp:114
QString::isEmpty
bool isEmpty() const
Marble::ReverseGeocodingRunnerManager
Definition: ReverseGeocodingRunnerManager.h:30
ReverseGeocodingRunnerManager.h
QString
Marble::GeoDataFolder
Definition: GeoDataFolder.h:50
GeoDataPlacemark.h
EditBookmarkDialog.h
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
QVariant::setValue
void setValue(const T &value)
Marble::EditBookmarkDialog::bookmark
GeoDataPlacemark bookmark() const
Definition: EditBookmarkDialog.cpp:237
Marble::GeoDataLookAt
Definition: GeoDataLookAt.h:23
GeoDataFolder.h
Marble::GeoDataData
Definition: GeoDataData.h:26
Marble::Longitude
Longitude.
Definition: MarbleGlobal.h:57
Marble::GeoDataCoordinates::Notation
Notation
enum used to specify the notation / numerical system
Definition: GeoDataCoordinates.h:79
GeoDataPoint.h
Marble::EditBookmarkDialog::setRange
void setRange(qreal range)
Definition: EditBookmarkDialog.cpp:126
Marble::DMSDegree
Degrees in DMS notation.
Definition: MarbleGlobal.h:66
Marble::GeoDataFeature::address
QString address() const
Return the address of the feature.
Definition: GeoDataFeature.cpp:566
Marble::GeoDataFeature::setDescriptionCDATA
void setDescriptionCDATA(bool cdata)
Set the description to be CDATA See:
Definition: GeoDataFeature.cpp:604
Marble::GeoDataExtendedData::addValue
void addValue(const GeoDataData &data)
add a data object to the GeoDataExtendedData with the key
Definition: GeoDataExtendedData.cpp:71
Marble::AngleUnit
AngleUnit
This enum is used to choose the unit chosen to measure angles.
Definition: MarbleGlobal.h:65
Marble::GeoDataCoordinates::toString
QString toString() const
return a string representation of the coordinate this is a convenience function which uses the defaul...
Definition: GeoDataCoordinates.cpp:921
Marble::EditBookmarkDialog::setReverseGeocodeName
void setReverseGeocodeName()
Definition: EditBookmarkDialog.cpp:161
QDialog
MarbleWidget.h
This file contains the headers for MarbleWidget.
MarbleWidget
Wraps a Marble::MarbleWidget, providing access to important properties and methods.
Definition: MarbleDeclarativeWidget.h:50
Marble::GeoDataFeature::extendedData
GeoDataExtendedData & extendedData() const
Return the ExtendedData assigned to the feature.
Definition: GeoDataFeature.cpp:743
Marble::GeoDataFeature::setAbstractView
void setAbstractView(GeoDataAbstractView *abstractView)
Set the abstract view of the feature.
Definition: GeoDataFeature.cpp:620
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Marble::GeoDataCoordinates::DMS
"Sexagesimal DMS" notation (base-60)
Definition: GeoDataCoordinates.h:81
Marble::GeoDataPlacemark
a class representing a point of interest on the map
Definition: GeoDataPlacemark.h:54
Marble::GeoDataLookAt::setCoordinates
void setCoordinates(const GeoDataCoordinates &coordinates)
set the GeoDataCoordinates object
Definition: GeoDataLookAt.cpp:66
QVariant
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:39 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