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"