File indexing completed on 2024-04-14 03:47:59

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2014 Mikhail Ivchenko <ematirov@gmail.com>
0004 
0005 
0006 #include "PlacemarkEditHeader.h"
0007 #include "ui_PlacemarkEditHeader.h"
0008 
0009 #include <QFileDialog>
0010 #include "MarbleDebug.h"
0011 
0012 
0013 
0014 namespace Marble
0015 {
0016 
0017 class PlacemarkEditHeaderPrivate : public Ui::PlacemarkEditHeaderPrivate
0018 {
0019 
0020 public:
0021     explicit PlacemarkEditHeaderPrivate(PlacemarkEditHeader *_q);
0022     ~PlacemarkEditHeaderPrivate();
0023     void init(QWidget* parent);
0024     void setNotation(GeoDataCoordinates::Notation notation);
0025     GeoDataCoordinates::Notation notation() const;
0026     void setName(const QString &name);
0027     QString name() const;
0028     void setIconLink(const QString &iconLink);
0029     QString iconLink() const;
0030     qreal longitude() const;
0031     void setLongitude(qreal longitude);
0032     qreal latitude() const;
0033     void setLatitude(qreal latitude);
0034     QString id() const;
0035     QString setId( const QString &id, bool isNew = false );
0036     QStringList idFilter() const;
0037     void setIdFilter( const QStringList &filter );
0038     bool isIdVisible() const;
0039     void setIdVisible( bool visible );
0040     bool isIdValid() const;
0041     void loadIconFile();
0042     bool positionVisible() const;
0043     void setPositionVisible( bool visible );
0044     QString targetId() const;
0045     void setTargetId( const QString &targetId );
0046     QStringList targetIdList() const;
0047     void setTargetIdList( const QStringList &targetIdList );
0048     bool isTargetIdVisible() const;
0049     void setTargetIdVisible( bool visible );
0050     void updateValues();
0051     void selectAll();
0052 private:
0053     PlacemarkEditHeader* const q;
0054     bool m_positionVisible;
0055     QStringList m_idFilter;
0056     bool m_idWasEdited;
0057     bool m_idValid;
0058     QString m_idString;
0059     QString m_targetIdString;
0060 };
0061 
0062 PlacemarkEditHeaderPrivate::PlacemarkEditHeaderPrivate(PlacemarkEditHeader* _q)
0063     :q(_q),
0064     m_positionVisible(true),
0065     m_idWasEdited( false )
0066 {}
0067 
0068 PlacemarkEditHeaderPrivate::~PlacemarkEditHeaderPrivate()
0069 {}
0070 
0071 void PlacemarkEditHeaderPrivate::init(QWidget* parent)
0072 {
0073     setupUi(parent);
0074     m_longitude->setDimension(LatLonEdit::Longitude);
0075     m_latitude->setDimension(LatLonEdit::Latitude);
0076     m_targetId->setVisible(false);
0077     targetIdLabel->setVisible(false);
0078     setNotation(GeoDataCoordinates::DMS);
0079     QObject::connect( iconLinkButton, SIGNAL(clicked()), q, SLOT(loadIconFile()) );
0080 }
0081 
0082 void PlacemarkEditHeaderPrivate::setNotation(GeoDataCoordinates::Notation notation)
0083 {
0084     m_longitude->setNotation(notation);
0085     m_latitude->setNotation(notation);
0086 }
0087 
0088 GeoDataCoordinates::Notation PlacemarkEditHeaderPrivate::notation() const
0089 {
0090     return m_longitude->notation();
0091 }
0092 
0093 void PlacemarkEditHeaderPrivate::setName(const QString &name)
0094 {
0095     m_name->setText(name);
0096     if( !m_idWasEdited ) {
0097         setId( name );
0098     }
0099 }
0100 
0101 QString PlacemarkEditHeaderPrivate::name() const
0102 {
0103     return m_name->text();
0104 }
0105 
0106 void PlacemarkEditHeaderPrivate::setIconLink(const QString &iconLink)
0107 {
0108     QPixmap pixmap(iconLink);
0109     if( !pixmap.isNull() ) {
0110         QIcon icon(pixmap);
0111         m_iconLink->setText(iconLink);
0112         iconLinkButton->setText(QString());
0113         iconLinkButton->setIcon( icon );
0114     }
0115 }
0116 
0117 QString PlacemarkEditHeaderPrivate::iconLink() const
0118 {
0119     return m_iconLink->text();
0120 }
0121 
0122 qreal PlacemarkEditHeaderPrivate::longitude() const
0123 {
0124     return m_longitude->value();
0125 }
0126 
0127 void PlacemarkEditHeaderPrivate::setLongitude(qreal longitude)
0128 {
0129     m_longitude->setValue(longitude);
0130 }
0131 
0132 qreal PlacemarkEditHeaderPrivate::latitude() const
0133 {
0134     return m_latitude->value();
0135 }
0136 
0137 void PlacemarkEditHeaderPrivate::setLatitude(qreal latitude)
0138 {
0139     m_latitude->setValue(latitude);
0140 }
0141 
0142 QString PlacemarkEditHeaderPrivate::id() const
0143 {
0144     return m_id->text();
0145 }
0146 
0147 QString PlacemarkEditHeaderPrivate::setId( const QString &id, bool isNew )
0148 {
0149     QString newId = id.toLower().replace(QLatin1Char(' '), QLatin1Char('_'));
0150     if( newId == m_idString && !isNew ) {
0151         return newId;
0152     }
0153     if( !isNew ) {
0154         m_idFilter.removeOne( m_idString );
0155     }
0156     if( m_idFilter.contains( newId ) && m_id->hasFocus() ) {
0157         m_idValid = false;
0158     } else {
0159         m_idValid = true;
0160         if ( m_idFilter.contains( newId ) ) {
0161             QStringList filter;
0162             for ( const QString &filterString : m_idFilter ) {
0163                 if( filterString.startsWith( newId ) ) {
0164                     filter.append( filterString );
0165                 }
0166             }
0167             int i = 2;
0168             while( filter.contains( newId + QString::number( i ) ) ) {
0169                 i++;
0170             }
0171             newId += QString::number( i );
0172         }
0173     }
0174     m_idString = newId;
0175     m_idFilter.append( newId );
0176     m_id->setText( newId );
0177     return newId;
0178 }
0179 
0180 QStringList PlacemarkEditHeaderPrivate::idFilter() const
0181 {
0182     return m_idFilter;
0183 }
0184 
0185 void PlacemarkEditHeaderPrivate::setIdFilter(const QStringList &filter)
0186 {
0187     m_idFilter = filter;
0188     setId( id(), true );
0189 }
0190 
0191 bool PlacemarkEditHeaderPrivate::isIdVisible() const
0192 {
0193     return m_id->isVisible() && idLabel->isVisible();
0194 }
0195 
0196 void PlacemarkEditHeaderPrivate::setIdVisible(bool visible)
0197 {
0198     m_id->setVisible( visible );
0199     idLabel->setVisible( visible );
0200 }
0201 
0202 bool PlacemarkEditHeaderPrivate::isIdValid() const
0203 {
0204     return m_idValid;
0205 }
0206 
0207 void PlacemarkEditHeaderPrivate::loadIconFile()
0208 {
0209     const QString filename = QFileDialog::getOpenFileName( q,
0210                                                            QObject::tr( "Open File" ),
0211                                                            QString(),
0212                                                            QObject::tr( "All Supported Files (*.png)" ) );
0213     if ( filename.isNull() ) {
0214         return;
0215     }
0216 
0217     setIconLink(filename);
0218     iconLinkButton->setIcon( QIcon(filename) );
0219 }
0220 
0221 bool PlacemarkEditHeaderPrivate::positionVisible() const
0222 {
0223     return m_positionVisible;
0224 }
0225 
0226 void PlacemarkEditHeaderPrivate::setPositionVisible(bool visible)
0227 {
0228     m_longitude->setVisible(visible);
0229     m_latitude->setVisible(visible);
0230     positionLabel->setVisible(visible);
0231     m_positionVisible = visible;
0232 }
0233 
0234 QString PlacemarkEditHeaderPrivate::targetId() const
0235 {
0236     return m_targetId->currentText();
0237 }
0238 
0239 void PlacemarkEditHeaderPrivate::setTargetId(const QString &targetId)
0240 {
0241     m_targetId->setCurrentIndex( m_targetId->findText( targetId ) );
0242     m_targetIdString = targetId;
0243 }
0244 
0245 QStringList PlacemarkEditHeaderPrivate::targetIdList() const
0246 {
0247     QStringList result;
0248     for( int i = 0; i < m_targetId->count(); ++i ) {
0249         result.append( m_targetId->itemText( i ) );
0250     }
0251     return result;
0252 }
0253 
0254 void PlacemarkEditHeaderPrivate::setTargetIdList(const QStringList &targetIdList)
0255 {
0256     QString current;
0257     if( m_targetId->currentIndex() != -1 ) {
0258         current = m_targetId->currentText();
0259     } else {
0260         current = m_targetIdString;
0261     }
0262     m_targetId->clear();
0263     m_targetId->addItems( targetIdList );
0264     setTargetId( current );
0265 }
0266 
0267 bool PlacemarkEditHeaderPrivate::isTargetIdVisible() const
0268 {
0269     return m_targetId->isVisible() && targetIdLabel->isVisible();
0270 }
0271 
0272 void PlacemarkEditHeaderPrivate::setTargetIdVisible(bool visible)
0273 {
0274     m_targetId->setVisible( visible );
0275     targetIdLabel->setVisible( visible );
0276 }
0277 
0278 void PlacemarkEditHeaderPrivate::updateValues()
0279 {
0280     if( m_idString != id() ) {
0281         setId( id() );
0282         m_idWasEdited = true;
0283     } else if( !m_idWasEdited && isIdVisible() ){
0284         setId( name() );
0285     }
0286 }
0287 
0288 void PlacemarkEditHeaderPrivate::selectAll()
0289 {
0290     m_name->selectAll();
0291 }
0292 
0293 }
0294 
0295 
0296 using namespace Marble;
0297 
0298 PlacemarkEditHeader::PlacemarkEditHeader(QWidget *parent, GeoDataCoordinates::Notation notation,
0299                                          const QString& name,
0300                                          const QString& iconLink,
0301                                          const QString& id,
0302                                          const QStringList &idFilter)
0303     : QWidget( parent ), d(new PlacemarkEditHeaderPrivate(this))
0304 {
0305     d->init(this);
0306     d->setNotation(notation);
0307     d->setName(name);
0308     d->setIconLink(iconLink);
0309     d->setIdFilter(idFilter);
0310     d->setId( id.isEmpty() ? d->name() : id );
0311     connect(d->m_longitude,   SIGNAL(valueChanged(qreal)),    this, SLOT(updateValues()));
0312     connect(d->m_latitude,  SIGNAL(valueChanged(qreal)),    this, SLOT(updateValues()));
0313     connect(d->m_name,  SIGNAL(textChanged(QString)),    this, SLOT(updateValues()));
0314     connect(d->m_iconLink,  SIGNAL(textChanged(QString)),    this, SLOT(updateValues()));
0315     connect(d->m_id,  SIGNAL(textChanged(QString)),    this, SLOT(updateValues()));
0316 }
0317 
0318 PlacemarkEditHeader::~PlacemarkEditHeader()
0319 {
0320     delete d;
0321 }
0322 
0323 QString PlacemarkEditHeader::name() const
0324 {
0325     return d->name();
0326 }
0327 
0328 QString PlacemarkEditHeader::iconLink() const
0329 {
0330     return d->iconLink();
0331 }
0332 
0333 qreal PlacemarkEditHeader::latitude() const
0334 {
0335     return d->latitude();
0336 }
0337 
0338 qreal PlacemarkEditHeader::longitude() const
0339 {
0340     return d->longitude();
0341 }
0342 
0343 GeoDataCoordinates::Notation PlacemarkEditHeader::notation() const
0344 {
0345     return d->notation();
0346 }
0347 
0348 bool PlacemarkEditHeader::positionVisible() const
0349 {
0350     return d->positionVisible();
0351 }
0352 
0353 QString PlacemarkEditHeader::id() const
0354 {
0355     return d->id();
0356 }
0357 
0358 QStringList PlacemarkEditHeader::idFilter() const
0359 {
0360     return d->idFilter();
0361 }
0362 
0363 bool PlacemarkEditHeader::isIdVisible() const
0364 {
0365     return d->isIdVisible();
0366 }
0367 
0368 bool PlacemarkEditHeader::isIdValid() const
0369 {
0370     return d->isIdValid();
0371 }
0372 
0373 QString PlacemarkEditHeader::targetId() const
0374 {
0375     return d->targetId();
0376 }
0377 
0378 QStringList PlacemarkEditHeader::targetIdList() const
0379 {
0380     return d->targetIdList();
0381 }
0382 
0383 bool PlacemarkEditHeader::isTargetIdVisible() const
0384 {
0385     return d->isTargetIdVisible();
0386 }
0387 
0388 void PlacemarkEditHeader::setName(const QString &name)
0389 {
0390     d->setName(name);
0391 }
0392 
0393 void PlacemarkEditHeader::setIconLink(const QString &iconLink)
0394 {
0395     d->setIconLink(iconLink);
0396 }
0397 
0398 void PlacemarkEditHeader::setLatitude(qreal latitude)
0399 {
0400     d->setLatitude(latitude);
0401 }
0402 
0403 void PlacemarkEditHeader::setLongitude(qreal longitude)
0404 {
0405     d->setLongitude(longitude);
0406 }
0407 
0408 void PlacemarkEditHeader::setNotation(GeoDataCoordinates::Notation notation)
0409 {
0410     d->setNotation(notation);
0411 }
0412 
0413 void PlacemarkEditHeader::setPositionVisible(bool visible)
0414 {
0415     d->setPositionVisible(visible);
0416 }
0417 
0418 QString PlacemarkEditHeader::setId( const QString &id)
0419 {
0420     return d->setId( id );
0421 }
0422 
0423 void PlacemarkEditHeader::setIdFilter( const QStringList &filter )
0424 {
0425     d->setIdFilter( filter );
0426 }
0427 
0428 void PlacemarkEditHeader::setIdVisible(bool visible)
0429 {
0430     d->setIdVisible( visible );
0431 }
0432 
0433 void PlacemarkEditHeader::setTargetId(const QString &targetId)
0434 {
0435     d->setTargetId( targetId );
0436 }
0437 
0438 void PlacemarkEditHeader::setTargetIdList(const QStringList &targetIdList)
0439 {
0440     d->setTargetIdList( targetIdList );
0441 }
0442 
0443 void PlacemarkEditHeader::setTargetIdVisible(bool visible)
0444 {
0445     d->setTargetIdVisible( visible );
0446 }
0447 
0448 void PlacemarkEditHeader::selectAll()
0449 {
0450     d->selectAll();
0451 }
0452 
0453 void PlacemarkEditHeader::setReadOnly(bool state)
0454 {
0455     d->m_longitude->setDisabled(state);
0456     d->m_latitude->setDisabled(state);
0457     d->m_name->setReadOnly(state);
0458     d->m_iconLink->setReadOnly(state);
0459     d->iconLinkButton->setDisabled(state);
0460     d->m_id->setReadOnly(state);
0461     d->m_targetId->setDisabled(state);
0462     d->m_iconLink->setReadOnly(state);
0463 
0464     d->idLabel->setVisible(!state);
0465     d->m_id->setVisible(!state);
0466 }
0467 
0468 void PlacemarkEditHeader::updateValues()
0469 {
0470     disconnect(d->m_id,  SIGNAL(textChanged(QString)),    this, SLOT(updateValues()));
0471     d->updateValues();
0472     connect(d->m_id,  SIGNAL(textChanged(QString)),    this, SLOT(updateValues()));
0473     emit valueChanged();
0474 }
0475 
0476 
0477 
0478 #include "moc_PlacemarkEditHeader.cpp"