Marble

PlacemarkEditHeader.cpp
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2014 Mikhail Ivchenko <[email protected]>
4 
5 
6 #include "PlacemarkEditHeader.h"
7 #include "ui_PlacemarkEditHeader.h"
8 
9 #include <QFileDialog>
10 #include "MarbleDebug.h"
11 
12 
13 
14 namespace Marble
15 {
16 
17 class PlacemarkEditHeaderPrivate : public Ui::PlacemarkEditHeaderPrivate
18 {
19 
20 public:
21  explicit PlacemarkEditHeaderPrivate(PlacemarkEditHeader *_q);
22  ~PlacemarkEditHeaderPrivate();
23  void init(QWidget* parent);
24  void setNotation(GeoDataCoordinates::Notation notation);
25  GeoDataCoordinates::Notation notation() const;
26  void setName(const QString &name);
27  QString name() const;
28  void setIconLink(const QString &iconLink);
29  QString iconLink() const;
30  qreal longitude() const;
31  void setLongitude(qreal longitude);
32  qreal latitude() const;
33  void setLatitude(qreal latitude);
34  QString id() const;
35  QString setId( const QString &id, bool isNew = false );
36  QStringList idFilter() const;
37  void setIdFilter( const QStringList &filter );
38  bool isIdVisible() const;
39  void setIdVisible( bool visible );
40  bool isIdValid() const;
41  void loadIconFile();
42  bool positionVisible() const;
43  void setPositionVisible( bool visible );
44  QString targetId() const;
45  void setTargetId( const QString &targetId );
46  QStringList targetIdList() const;
47  void setTargetIdList( const QStringList &targetIdList );
48  bool isTargetIdVisible() const;
49  void setTargetIdVisible( bool visible );
50  void updateValues();
51  void selectAll();
52 private:
53  PlacemarkEditHeader* const q;
54  bool m_positionVisible;
55  QStringList m_idFilter;
56  bool m_idWasEdited;
57  bool m_idValid;
58  QString m_idString;
59  QString m_targetIdString;
60 };
61 
62 PlacemarkEditHeaderPrivate::PlacemarkEditHeaderPrivate(PlacemarkEditHeader* _q)
63  :q(_q),
64  m_positionVisible(true),
65  m_idWasEdited( false )
66 {}
67 
68 PlacemarkEditHeaderPrivate::~PlacemarkEditHeaderPrivate()
69 {}
70 
71 void PlacemarkEditHeaderPrivate::init(QWidget* parent)
72 {
73  setupUi(parent);
74  m_longitude->setDimension(LatLonEdit::Longitude);
75  m_latitude->setDimension(LatLonEdit::Latitude);
76  m_targetId->setVisible(false);
77  targetIdLabel->setVisible(false);
78  setNotation(GeoDataCoordinates::DMS);
79  QObject::connect( iconLinkButton, SIGNAL(clicked()), q, SLOT(loadIconFile()) );
80 }
81 
82 void PlacemarkEditHeaderPrivate::setNotation(GeoDataCoordinates::Notation notation)
83 {
84  m_longitude->setNotation(notation);
85  m_latitude->setNotation(notation);
86 }
87 
88 GeoDataCoordinates::Notation PlacemarkEditHeaderPrivate::notation() const
89 {
90  return m_longitude->notation();
91 }
92 
93 void PlacemarkEditHeaderPrivate::setName(const QString &name)
94 {
95  m_name->setText(name);
96  if( !m_idWasEdited ) {
97  setId( name );
98  }
99 }
100 
101 QString PlacemarkEditHeaderPrivate::name() const
102 {
103  return m_name->text();
104 }
105 
106 void PlacemarkEditHeaderPrivate::setIconLink(const QString &iconLink)
107 {
108  QPixmap pixmap(iconLink);
109  if( !pixmap.isNull() ) {
110  QIcon icon(pixmap);
111  m_iconLink->setText(iconLink);
112  iconLinkButton->setText(QString());
113  iconLinkButton->setIcon( icon );
114  }
115 }
116 
117 QString PlacemarkEditHeaderPrivate::iconLink() const
118 {
119  return m_iconLink->text();
120 }
121 
122 qreal PlacemarkEditHeaderPrivate::longitude() const
123 {
124  return m_longitude->value();
125 }
126 
127 void PlacemarkEditHeaderPrivate::setLongitude(qreal longitude)
128 {
129  m_longitude->setValue(longitude);
130 }
131 
132 qreal PlacemarkEditHeaderPrivate::latitude() const
133 {
134  return m_latitude->value();
135 }
136 
137 void PlacemarkEditHeaderPrivate::setLatitude(qreal latitude)
138 {
139  m_latitude->setValue(latitude);
140 }
141 
142 QString PlacemarkEditHeaderPrivate::id() const
143 {
144  return m_id->text();
145 }
146 
147 QString PlacemarkEditHeaderPrivate::setId( const QString &id, bool isNew )
148 {
149  QString newId = id.toLower().replace(QLatin1Char(' '), QLatin1Char('_'));
150  if( newId == m_idString && !isNew ) {
151  return newId;
152  }
153  if( !isNew ) {
154  m_idFilter.removeOne( m_idString );
155  }
156  if( m_idFilter.contains( newId ) && m_id->hasFocus() ) {
157  m_idValid = false;
158  } else {
159  m_idValid = true;
160  if ( m_idFilter.contains( newId ) ) {
162  for ( const QString &filterString : m_idFilter ) {
163  if( filterString.startsWith( newId ) ) {
164  filter.append( filterString );
165  }
166  }
167  int i = 2;
168  while( filter.contains( newId + QString::number( i ) ) ) {
169  i++;
170  }
171  newId += QString::number( i );
172  }
173  }
174  m_idString = newId;
175  m_idFilter.append( newId );
176  m_id->setText( newId );
177  return newId;
178 }
179 
180 QStringList PlacemarkEditHeaderPrivate::idFilter() const
181 {
182  return m_idFilter;
183 }
184 
185 void PlacemarkEditHeaderPrivate::setIdFilter(const QStringList &filter)
186 {
187  m_idFilter = filter;
188  setId( id(), true );
189 }
190 
191 bool PlacemarkEditHeaderPrivate::isIdVisible() const
192 {
193  return m_id->isVisible() && idLabel->isVisible();
194 }
195 
196 void PlacemarkEditHeaderPrivate::setIdVisible(bool visible)
197 {
198  m_id->setVisible( visible );
199  idLabel->setVisible( visible );
200 }
201 
202 bool PlacemarkEditHeaderPrivate::isIdValid() const
203 {
204  return m_idValid;
205 }
206 
207 void PlacemarkEditHeaderPrivate::loadIconFile()
208 {
209  const QString filename = QFileDialog::getOpenFileName( q,
210  QObject::tr( "Open File" ),
211  QString(),
212  QObject::tr( "All Supported Files (*.png)" ) );
213  if ( filename.isNull() ) {
214  return;
215  }
216 
217  setIconLink(filename);
218  iconLinkButton->setIcon( QIcon(filename) );
219 }
220 
221 bool PlacemarkEditHeaderPrivate::positionVisible() const
222 {
223  return m_positionVisible;
224 }
225 
226 void PlacemarkEditHeaderPrivate::setPositionVisible(bool visible)
227 {
228  m_longitude->setVisible(visible);
229  m_latitude->setVisible(visible);
230  positionLabel->setVisible(visible);
231  m_positionVisible = visible;
232 }
233 
234 QString PlacemarkEditHeaderPrivate::targetId() const
235 {
236  return m_targetId->currentText();
237 }
238 
239 void PlacemarkEditHeaderPrivate::setTargetId(const QString &targetId)
240 {
241  m_targetId->setCurrentIndex( m_targetId->findText( targetId ) );
242  m_targetIdString = targetId;
243 }
244 
245 QStringList PlacemarkEditHeaderPrivate::targetIdList() const
246 {
247  QStringList result;
248  for( int i = 0; i < m_targetId->count(); ++i ) {
249  result.append( m_targetId->itemText( i ) );
250  }
251  return result;
252 }
253 
254 void PlacemarkEditHeaderPrivate::setTargetIdList(const QStringList &targetIdList)
255 {
256  QString current;
257  if( m_targetId->currentIndex() != -1 ) {
258  current = m_targetId->currentText();
259  } else {
260  current = m_targetIdString;
261  }
262  m_targetId->clear();
263  m_targetId->addItems( targetIdList );
264  setTargetId( current );
265 }
266 
267 bool PlacemarkEditHeaderPrivate::isTargetIdVisible() const
268 {
269  return m_targetId->isVisible() && targetIdLabel->isVisible();
270 }
271 
272 void PlacemarkEditHeaderPrivate::setTargetIdVisible(bool visible)
273 {
274  m_targetId->setVisible( visible );
275  targetIdLabel->setVisible( visible );
276 }
277 
278 void PlacemarkEditHeaderPrivate::updateValues()
279 {
280  if( m_idString != id() ) {
281  setId( id() );
282  m_idWasEdited = true;
283  } else if( !m_idWasEdited && isIdVisible() ){
284  setId( name() );
285  }
286 }
287 
288 void PlacemarkEditHeaderPrivate::selectAll()
289 {
290  m_name->selectAll();
291 }
292 
293 }
294 
295 
296 using namespace Marble;
297 
298 PlacemarkEditHeader::PlacemarkEditHeader(QWidget *parent, GeoDataCoordinates::Notation notation,
299  const QString& name,
300  const QString& iconLink,
301  const QString& id,
302  const QStringList &idFilter)
303  : QWidget( parent ), d(new PlacemarkEditHeaderPrivate(this))
304 {
305  d->init(this);
306  d->setNotation(notation);
307  d->setName(name);
308  d->setIconLink(iconLink);
309  d->setIdFilter(idFilter);
310  d->setId( id.isEmpty() ? d->name() : id );
311  connect(d->m_longitude, SIGNAL(valueChanged(qreal)), this, SLOT(updateValues()));
312  connect(d->m_latitude, SIGNAL(valueChanged(qreal)), this, SLOT(updateValues()));
313  connect(d->m_name, SIGNAL(textChanged(QString)), this, SLOT(updateValues()));
314  connect(d->m_iconLink, SIGNAL(textChanged(QString)), this, SLOT(updateValues()));
315  connect(d->m_id, SIGNAL(textChanged(QString)), this, SLOT(updateValues()));
316 }
317 
318 PlacemarkEditHeader::~PlacemarkEditHeader()
319 {
320  delete d;
321 }
322 
323 QString PlacemarkEditHeader::name() const
324 {
325  return d->name();
326 }
327 
328 QString PlacemarkEditHeader::iconLink() const
329 {
330  return d->iconLink();
331 }
332 
333 qreal PlacemarkEditHeader::latitude() const
334 {
335  return d->latitude();
336 }
337 
338 qreal PlacemarkEditHeader::longitude() const
339 {
340  return d->longitude();
341 }
342 
343 GeoDataCoordinates::Notation PlacemarkEditHeader::notation() const
344 {
345  return d->notation();
346 }
347 
348 bool PlacemarkEditHeader::positionVisible() const
349 {
350  return d->positionVisible();
351 }
352 
353 QString PlacemarkEditHeader::id() const
354 {
355  return d->id();
356 }
357 
358 QStringList PlacemarkEditHeader::idFilter() const
359 {
360  return d->idFilter();
361 }
362 
363 bool PlacemarkEditHeader::isIdVisible() const
364 {
365  return d->isIdVisible();
366 }
367 
368 bool PlacemarkEditHeader::isIdValid() const
369 {
370  return d->isIdValid();
371 }
372 
373 QString PlacemarkEditHeader::targetId() const
374 {
375  return d->targetId();
376 }
377 
378 QStringList PlacemarkEditHeader::targetIdList() const
379 {
380  return d->targetIdList();
381 }
382 
383 bool PlacemarkEditHeader::isTargetIdVisible() const
384 {
385  return d->isTargetIdVisible();
386 }
387 
388 void PlacemarkEditHeader::setName(const QString &name)
389 {
390  d->setName(name);
391 }
392 
393 void PlacemarkEditHeader::setIconLink(const QString &iconLink)
394 {
395  d->setIconLink(iconLink);
396 }
397 
398 void PlacemarkEditHeader::setLatitude(qreal latitude)
399 {
400  d->setLatitude(latitude);
401 }
402 
403 void PlacemarkEditHeader::setLongitude(qreal longitude)
404 {
405  d->setLongitude(longitude);
406 }
407 
408 void PlacemarkEditHeader::setNotation(GeoDataCoordinates::Notation notation)
409 {
410  d->setNotation(notation);
411 }
412 
413 void PlacemarkEditHeader::setPositionVisible(bool visible)
414 {
415  d->setPositionVisible(visible);
416 }
417 
418 QString PlacemarkEditHeader::setId( const QString &id)
419 {
420  return d->setId( id );
421 }
422 
423 void PlacemarkEditHeader::setIdFilter( const QStringList &filter )
424 {
425  d->setIdFilter( filter );
426 }
427 
428 void PlacemarkEditHeader::setIdVisible(bool visible)
429 {
430  d->setIdVisible( visible );
431 }
432 
433 void PlacemarkEditHeader::setTargetId(const QString &targetId)
434 {
435  d->setTargetId( targetId );
436 }
437 
438 void PlacemarkEditHeader::setTargetIdList(const QStringList &targetIdList)
439 {
440  d->setTargetIdList( targetIdList );
441 }
442 
443 void PlacemarkEditHeader::setTargetIdVisible(bool visible)
444 {
445  d->setTargetIdVisible( visible );
446 }
447 
448 void PlacemarkEditHeader::selectAll()
449 {
450  d->selectAll();
451 }
452 
453 void PlacemarkEditHeader::setReadOnly(bool state)
454 {
455  d->m_longitude->setDisabled(state);
456  d->m_latitude->setDisabled(state);
457  d->m_name->setReadOnly(state);
458  d->m_iconLink->setReadOnly(state);
459  d->iconLinkButton->setDisabled(state);
460  d->m_id->setReadOnly(state);
461  d->m_targetId->setDisabled(state);
462  d->m_iconLink->setReadOnly(state);
463 
464  d->idLabel->setVisible(!state);
465  d->m_id->setVisible(!state);
466 }
467 
468 void PlacemarkEditHeader::updateValues()
469 {
470  disconnect(d->m_id, SIGNAL(textChanged(QString)), this, SLOT(updateValues()));
471  d->updateValues();
472  connect(d->m_id, SIGNAL(textChanged(QString)), this, SLOT(updateValues()));
473  emit valueChanged();
474 }
475 
476 
477 
478 #include "moc_PlacemarkEditHeader.cpp"
void append(const T &value)
const QList< QKeySequence > & selectAll()
bool isNull() const const
QString number(int n, int base)
QCA_EXPORT void init()
void clear()
@ DMS
"Sexagesimal DMS" notation (base-60)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QFuture< void > filter(Sequence &sequence, KeepFunctor filterFunction)
Binds a QML item to a specific geodetic location in screen coordinates.
QString & replace(int position, int n, QChar after)
QString toLower() const const
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
QString name(StandardShortcut id)
QString tr(const char *sourceText, const char *disambiguation, int n)
QString & append(QChar ch)
Notation
enum used to specify the notation / numerical system
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Oct 2 2023 03:52:09 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.