Marble

PlacemarkEditHeader.cpp
1// SPDX-License-Identifier: LGPL-2.1-or-later
2//
3// SPDX-FileCopyrightText: 2014 Mikhail Ivchenko <ematirov@gmail.com>
4
5
6#include "PlacemarkEditHeader.h"
7#include "ui_PlacemarkEditHeader.h"
8
9#include <QFileDialog>
10#include "MarbleDebug.h"
11
12
13
14namespace Marble
15{
16
17class PlacemarkEditHeaderPrivate : public Ui::PlacemarkEditHeaderPrivate
18{
19
20public:
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();
52private:
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
62PlacemarkEditHeaderPrivate::PlacemarkEditHeaderPrivate(PlacemarkEditHeader* _q)
63 :q(_q),
64 m_positionVisible(true),
65 m_idWasEdited( false )
66{}
67
68PlacemarkEditHeaderPrivate::~PlacemarkEditHeaderPrivate()
69{}
70
71void 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
82void PlacemarkEditHeaderPrivate::setNotation(GeoDataCoordinates::Notation notation)
83{
84 m_longitude->setNotation(notation);
85 m_latitude->setNotation(notation);
86}
87
88GeoDataCoordinates::Notation PlacemarkEditHeaderPrivate::notation() const
89{
90 return m_longitude->notation();
91}
92
93void PlacemarkEditHeaderPrivate::setName(const QString &name)
94{
95 m_name->setText(name);
96 if( !m_idWasEdited ) {
97 setId( name );
98 }
99}
100
101QString PlacemarkEditHeaderPrivate::name() const
102{
103 return m_name->text();
104}
105
106void 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
117QString PlacemarkEditHeaderPrivate::iconLink() const
118{
119 return m_iconLink->text();
120}
121
122qreal PlacemarkEditHeaderPrivate::longitude() const
123{
124 return m_longitude->value();
125}
126
127void PlacemarkEditHeaderPrivate::setLongitude(qreal longitude)
128{
129 m_longitude->setValue(longitude);
130}
131
132qreal PlacemarkEditHeaderPrivate::latitude() const
133{
134 return m_latitude->value();
135}
136
137void PlacemarkEditHeaderPrivate::setLatitude(qreal latitude)
138{
139 m_latitude->setValue(latitude);
140}
141
142QString PlacemarkEditHeaderPrivate::id() const
143{
144 return m_id->text();
145}
146
147QString 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
180QStringList PlacemarkEditHeaderPrivate::idFilter() const
181{
182 return m_idFilter;
183}
184
185void PlacemarkEditHeaderPrivate::setIdFilter(const QStringList &filter)
186{
187 m_idFilter = filter;
188 setId( id(), true );
189}
190
191bool PlacemarkEditHeaderPrivate::isIdVisible() const
192{
193 return m_id->isVisible() && idLabel->isVisible();
194}
195
196void PlacemarkEditHeaderPrivate::setIdVisible(bool visible)
197{
198 m_id->setVisible( visible );
199 idLabel->setVisible( visible );
200}
201
202bool PlacemarkEditHeaderPrivate::isIdValid() const
203{
204 return m_idValid;
205}
206
207void 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
221bool PlacemarkEditHeaderPrivate::positionVisible() const
222{
223 return m_positionVisible;
224}
225
226void 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
234QString PlacemarkEditHeaderPrivate::targetId() const
235{
236 return m_targetId->currentText();
237}
238
239void PlacemarkEditHeaderPrivate::setTargetId(const QString &targetId)
240{
241 m_targetId->setCurrentIndex( m_targetId->findText( targetId ) );
242 m_targetIdString = targetId;
243}
244
245QStringList 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
254void 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
267bool PlacemarkEditHeaderPrivate::isTargetIdVisible() const
268{
269 return m_targetId->isVisible() && targetIdLabel->isVisible();
270}
271
272void PlacemarkEditHeaderPrivate::setTargetIdVisible(bool visible)
273{
274 m_targetId->setVisible( visible );
275 targetIdLabel->setVisible( visible );
276}
277
278void 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
288void PlacemarkEditHeaderPrivate::selectAll()
289{
290 m_name->selectAll();
291}
292
293}
294
295
296using namespace Marble;
297
298PlacemarkEditHeader::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
318PlacemarkEditHeader::~PlacemarkEditHeader()
319{
320 delete d;
321}
322
323QString PlacemarkEditHeader::name() const
324{
325 return d->name();
326}
327
328QString PlacemarkEditHeader::iconLink() const
329{
330 return d->iconLink();
331}
332
333qreal PlacemarkEditHeader::latitude() const
334{
335 return d->latitude();
336}
337
338qreal PlacemarkEditHeader::longitude() const
339{
340 return d->longitude();
341}
342
343GeoDataCoordinates::Notation PlacemarkEditHeader::notation() const
344{
345 return d->notation();
346}
347
348bool PlacemarkEditHeader::positionVisible() const
349{
350 return d->positionVisible();
351}
352
353QString PlacemarkEditHeader::id() const
354{
355 return d->id();
356}
357
358QStringList PlacemarkEditHeader::idFilter() const
359{
360 return d->idFilter();
361}
362
363bool PlacemarkEditHeader::isIdVisible() const
364{
365 return d->isIdVisible();
366}
367
368bool PlacemarkEditHeader::isIdValid() const
369{
370 return d->isIdValid();
371}
372
373QString PlacemarkEditHeader::targetId() const
374{
375 return d->targetId();
376}
377
378QStringList PlacemarkEditHeader::targetIdList() const
379{
380 return d->targetIdList();
381}
382
383bool PlacemarkEditHeader::isTargetIdVisible() const
384{
385 return d->isTargetIdVisible();
386}
387
388void PlacemarkEditHeader::setName(const QString &name)
389{
390 d->setName(name);
391}
392
393void PlacemarkEditHeader::setIconLink(const QString &iconLink)
394{
395 d->setIconLink(iconLink);
396}
397
398void PlacemarkEditHeader::setLatitude(qreal latitude)
399{
400 d->setLatitude(latitude);
401}
402
403void PlacemarkEditHeader::setLongitude(qreal longitude)
404{
405 d->setLongitude(longitude);
406}
407
408void PlacemarkEditHeader::setNotation(GeoDataCoordinates::Notation notation)
409{
410 d->setNotation(notation);
411}
412
413void PlacemarkEditHeader::setPositionVisible(bool visible)
414{
415 d->setPositionVisible(visible);
416}
417
418QString PlacemarkEditHeader::setId( const QString &id)
419{
420 return d->setId( id );
421}
422
423void PlacemarkEditHeader::setIdFilter( const QStringList &filter )
424{
425 d->setIdFilter( filter );
426}
427
428void PlacemarkEditHeader::setIdVisible(bool visible)
429{
430 d->setIdVisible( visible );
431}
432
433void PlacemarkEditHeader::setTargetId(const QString &targetId)
434{
435 d->setTargetId( targetId );
436}
437
438void PlacemarkEditHeader::setTargetIdList(const QStringList &targetIdList)
439{
440 d->setTargetIdList( targetIdList );
441}
442
443void PlacemarkEditHeader::setTargetIdVisible(bool visible)
444{
445 d->setTargetIdVisible( visible );
446}
447
448void PlacemarkEditHeader::selectAll()
449{
450 d->selectAll();
451}
452
453void 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
468void 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"
Notation
enum used to specify the notation / numerical system
@ DMS
"Sexagesimal DMS" notation (base-60)
QString name(StandardShortcut id)
Binds a QML item to a specific geodetic location in screen coordinates.
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, Options options)
void append(QList< T > &&value)
bool removeOne(const AT &t)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool disconnect(const QMetaObject::Connection &connection)
T qobject_cast(QObject *object)
QString tr(const char *sourceText, const char *disambiguation, int n)
void clear()
bool isNull() const const
QString number(double n, char format, int precision)
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
QString toLower() const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QFuture< void > filter(QThreadPool *pool, Sequence &sequence, KeepFunctor &&filterFunction)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:18:17 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.