File indexing completed on 2025-03-09 03:50:40

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2006-05-16
0007  * Description : a tool to export GPS data to KML file.
0008  *
0009  * SPDX-FileCopyrightText: 2006-2007 by Stephane Pontier <shadow dot walker at free dot fr>
0010  * SPDX-FileCopyrightText: 2008-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "kmlwidget.h"
0017 
0018 // Qt includes
0019 
0020 #include <QApplication>
0021 #include <QWindow>
0022 #include <QButtonGroup>
0023 #include <QCheckBox>
0024 #include <QGroupBox>
0025 #include <QLabel>
0026 #include <QGridLayout>
0027 #include <QPushButton>
0028 #include <QRadioButton>
0029 #include <QComboBox>
0030 #include <QLineEdit>
0031 #include <QCloseEvent>
0032 #include <QSpinBox>
0033 
0034 // KDE includes
0035 
0036 #include <ksharedconfig.h>
0037 #include <kconfiggroup.h>
0038 #include <klocalizedstring.h>
0039 
0040 namespace DigikamGenericGeolocationEditPlugin
0041 {
0042 
0043 KmlWidget::KmlWidget(GeolocationEdit* const dlg,
0044                      GPSItemModel* const imageModel,
0045                      DInfoInterface* const iface)
0046     : QWidget    (dlg),
0047       m_model    (imageModel),
0048       m_dlg      (dlg),
0049       m_kmlExport(iface)
0050 {
0051     KMLExportConfigLayout = new QGridLayout(this);
0052 
0053     const int spacing     = qMin(QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing),
0054                              QApplication::style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing));
0055 
0056     // --------------------------------------------------------------
0057     // Target preferences
0058 
0059     TargetPreferenceGroupBox       = new QGroupBox(i18n("Target Preferences"), this);
0060     TargetPreferenceGroupBoxLayout = new QGridLayout(TargetPreferenceGroupBox);
0061 
0062     // target type
0063 
0064     TargetTypeGroupBox             = new QGroupBox(i18n("Target Type"), this);
0065     buttonGroupTargetTypeLayout    = new QGridLayout(TargetTypeGroupBox);
0066     buttonGroupTargetType          = new QButtonGroup(TargetTypeGroupBox);
0067     LocalTargetRadioButton_        = new QRadioButton(i18n("&Local or web target used by GoogleEarth"), TargetTypeGroupBox);
0068     LocalTargetRadioButton_->setChecked(true);
0069 
0070     GoogleMapTargetRadioButton_    = new QRadioButton(i18n("Web target used by GoogleMaps"), TargetTypeGroupBox);
0071     GoogleMapTargetRadioButton_->setToolTip(i18n("When using GoogleMaps, all images must have complete URLs, icons are "
0072                                                  "squared, and when drawing a track, only line track is exported."));
0073 
0074     buttonGroupTargetTypeLayout->addWidget(LocalTargetRadioButton_,     0, 0, 1, 1);
0075     buttonGroupTargetTypeLayout->addWidget(GoogleMapTargetRadioButton_, 1, 0, 1, 1);
0076     buttonGroupTargetTypeLayout->setContentsMargins(spacing, spacing, spacing, spacing);
0077     buttonGroupTargetTypeLayout->setAlignment(Qt::AlignTop);
0078 
0079     // --------------------------------------------------------------
0080     // target preference, suite
0081 
0082     QLabel* const AltitudeLabel_ = new QLabel(i18n("Picture Altitude:"), TargetPreferenceGroupBox);
0083     AltitudeCB_                  = new QComboBox(TargetPreferenceGroupBox);
0084     AltitudeCB_->addItem(i18n("clamp to ground"));
0085     AltitudeCB_->addItem(i18n("relative to ground"));
0086     AltitudeCB_->addItem(i18n("absolute"));
0087     AltitudeCB_->setWhatsThis(i18n("<p>Specifies how pictures are displayed"
0088                                        "<dl>"
0089                                            "<dt>clamp to ground (default)</dt>"
0090                                                "<dd>Indicates to ignore an altitude specification</dd>"
0091                                            "<dt>relative to ground</dt>"
0092                                                "<dd>Sets the altitude of the element relative to the actual ground "
0093                                                "elevation of a particular location.</dd>"
0094                                            "<dt>absolute</dt>"
0095                                                "<dd>Sets the altitude of the coordinate relative to sea level, regardless "
0096                                                "of the actual elevation of the terrain beneath the element.</dd>"
0097                                        "</dl>"
0098                                    "</p>"));
0099 
0100     destinationDirectoryLabel_ = new QLabel(i18n("Destination Directory:"), TargetPreferenceGroupBox);
0101 
0102     DestinationDirectory_      = new DFileSelector(TargetPreferenceGroupBox);
0103     DestinationDirectory_->setFileDlgMode(QFileDialog::Directory);
0104     DestinationDirectory_->setFileDlgOptions(QFileDialog::ShowDirsOnly);
0105     DestinationDirectory_->setFileDlgTitle(i18nc("@title:window", "Select a Directory in Which to Save the KML File and Pictures"));
0106 
0107     DestinationUrlLabel_       = new QLabel(i18n("Destination Path:"), TargetPreferenceGroupBox);
0108     DestinationUrl_            = new QLineEdit(TargetPreferenceGroupBox);
0109     FileNameLabel_             = new QLabel(i18n("Filename:"), TargetPreferenceGroupBox);
0110     FileName_                  = new QLineEdit(TargetPreferenceGroupBox);
0111 
0112     TargetPreferenceGroupBoxLayout->addWidget(TargetTypeGroupBox,         0, 0, 2, 5);
0113     TargetPreferenceGroupBoxLayout->addWidget(AltitudeLabel_,             2, 0, 1, 1);
0114     TargetPreferenceGroupBoxLayout->addWidget(AltitudeCB_,                2, 1, 1, 4);
0115     TargetPreferenceGroupBoxLayout->addWidget(destinationDirectoryLabel_, 3, 0, 1, 1);
0116     TargetPreferenceGroupBoxLayout->addWidget(DestinationDirectory_,      3, 1, 1, 4);
0117     TargetPreferenceGroupBoxLayout->addWidget(DestinationUrlLabel_,       4, 0, 1, 1);
0118     TargetPreferenceGroupBoxLayout->addWidget(DestinationUrl_,            4, 1, 1, 4);
0119     TargetPreferenceGroupBoxLayout->addWidget(FileNameLabel_,             5, 0, 1, 1);
0120     TargetPreferenceGroupBoxLayout->addWidget(FileName_,                  5, 1, 1, 4);
0121     TargetPreferenceGroupBoxLayout->setContentsMargins(spacing, spacing, spacing, spacing);
0122     TargetPreferenceGroupBoxLayout->setAlignment(Qt::AlignTop);
0123 
0124     // --------------------------------------------------------------
0125     // Sizes
0126 
0127     QGroupBox* const SizeGroupBox = new QGroupBox(i18n("Sizes"), this);
0128     SizeGroupBoxLayout            = new QGridLayout(SizeGroupBox);
0129     IconSizeLabel                 = new QLabel(i18n("Icon Size:"), SizeGroupBox);
0130     IconSizeInput_                = new QSpinBox(SizeGroupBox);
0131     IconSizeInput_->setRange(1, 100);
0132     IconSizeInput_->setValue(33);
0133 
0134     ImageSizeLabel  = new QLabel(i18n("Image Size:"), SizeGroupBox);
0135     ImageSizeInput_ = new QSpinBox(SizeGroupBox);
0136     ImageSizeInput_->setRange(1, 10000);
0137     ImageSizeInput_->setValue(320);
0138 
0139     SizeGroupBoxLayout->addWidget(IconSizeLabel,   0, 0, 1, 1);
0140     SizeGroupBoxLayout->addWidget(IconSizeInput_,  0, 1, 1, 1);
0141     SizeGroupBoxLayout->addWidget(ImageSizeLabel,  0, 2, 1, 1);
0142     SizeGroupBoxLayout->addWidget(ImageSizeInput_, 0, 3, 1, 1);
0143     SizeGroupBoxLayout->setContentsMargins(spacing, spacing, spacing, spacing);
0144     SizeGroupBoxLayout->setAlignment(Qt::AlignTop);
0145 
0146     // --------------------------------------------------------------
0147     // GPX Tracks
0148 
0149     QGroupBox* const GPXTracksGroupBox         = new QGroupBox(i18n("GPX Tracks"), this);
0150     QGridLayout* const GPXTracksGroupBoxLayout = new QGridLayout(GPXTracksGroupBox);
0151 
0152     // add a gpx track checkbox
0153 
0154     GPXTracksCheckBox_   = new QCheckBox(i18n("Draw GPX Track"), GPXTracksGroupBox);
0155 
0156     // file selector
0157 
0158     GPXFileLabel_ = new QLabel(i18n("GPX file:"), GPXTracksGroupBox);
0159 
0160     GPXFileUrlRequester_ = new DFileSelector(GPXTracksGroupBox);
0161     GPXFileUrlRequester_->setFileDlgFilter(i18n("GPS Exchange Format (*.gpx)"));
0162     GPXFileUrlRequester_->setFileDlgTitle(i18nc("@title:window", "Select GPX File to Load"));
0163     GPXFileUrlRequester_->setFileDlgMode(QFileDialog::ExistingFile);
0164 
0165     timeZoneLabel_ = new QLabel(i18n("Time Zone:"), GPXTracksGroupBox);
0166     timeZoneCB     = new QComboBox(GPXTracksGroupBox);
0167     timeZoneCB->addItem(i18n("GMT-12:00"), 0);
0168     timeZoneCB->addItem(i18n("GMT-11:00"), 1);
0169     timeZoneCB->addItem(i18n("GMT-10:00"), 2);
0170     timeZoneCB->addItem(i18n("GMT-09:00"), 3);
0171     timeZoneCB->addItem(i18n("GMT-08:00"), 4);
0172     timeZoneCB->addItem(i18n("GMT-07:00"), 5);
0173     timeZoneCB->addItem(i18n("GMT-06:00"), 6);
0174     timeZoneCB->addItem(i18n("GMT-05:00"), 7);
0175     timeZoneCB->addItem(i18n("GMT-04:00"), 8);
0176     timeZoneCB->addItem(i18n("GMT-03:00"), 9);
0177     timeZoneCB->addItem(i18n("GMT-02:00"), 10);
0178     timeZoneCB->addItem(i18n("GMT-01:00"), 11);
0179     timeZoneCB->addItem(i18n("GMT"),       12);
0180     timeZoneCB->addItem(i18n("GMT+01:00"), 13);
0181     timeZoneCB->addItem(i18n("GMT+02:00"), 14);
0182     timeZoneCB->addItem(i18n("GMT+03:00"), 15);
0183     timeZoneCB->addItem(i18n("GMT+04:00"), 16);
0184     timeZoneCB->addItem(i18n("GMT+05:00"), 17);
0185     timeZoneCB->addItem(i18n("GMT+06:00"), 18);
0186     timeZoneCB->addItem(i18n("GMT+07:00"), 19);
0187     timeZoneCB->addItem(i18n("GMT+08:00"), 20);
0188     timeZoneCB->addItem(i18n("GMT+09:00"), 21);
0189     timeZoneCB->addItem(i18n("GMT+10:00"), 22);
0190     timeZoneCB->addItem(i18n("GMT+11:00"), 23);
0191     timeZoneCB->addItem(i18n("GMT+12:00"), 24);
0192     timeZoneCB->addItem(i18n("GMT+13:00"), 25);
0193     timeZoneCB->addItem(i18n("GMT+14:00"), 26);
0194     timeZoneCB->setWhatsThis(i18n("Sets the time zone of the camera during "
0195                                   "picture shooting, so that the time stamps of the GPS "
0196                                   "can be converted to match the local time"));
0197 
0198     GPXLineWidthLabel_     = new QLabel(i18n("Track Width:"), GPXTracksGroupBox);
0199     GPXLineWidthInput_     = new QSpinBox(GPXTracksGroupBox);
0200     GPXLineWidthInput_->setValue(4);
0201 
0202     GPXColorLabel_         = new QLabel(i18n("Track Color:"), GPXTracksGroupBox);
0203     GPXTrackColor_         = new DColorSelector(GPXTracksGroupBox);
0204     GPXTrackColor_->setColor(QColor(0xff, 0xff, 0xff));
0205 
0206     GPXTracksOpacityLabel_ = new QLabel(i18n("Opacity (%):"), GPXTracksGroupBox);
0207     GPXTracksOpacityInput_ = new QSpinBox(GPXTracksGroupBox);
0208     GPXTracksOpacityInput_->setRange(0, 100);
0209     GPXTracksOpacityInput_->setSingleStep(1);
0210     GPXTracksOpacityInput_->setValue(100);
0211 
0212     GPXAltitudeLabel_      = new QLabel(i18n("Track Altitude:"), GPXTracksGroupBox);
0213     GPXAltitudeCB_         = new QComboBox(GPXTracksGroupBox);
0214     GPXAltitudeCB_->addItem(i18n("clamp to ground"));
0215     GPXAltitudeCB_->addItem(i18n("relative to ground"));
0216     GPXAltitudeCB_->addItem(i18n("absolute"));
0217     GPXAltitudeCB_->setWhatsThis(i18n("<p>Specifies how the points are displayed"
0218                                           "<dl>"
0219                                               "<dt>clamp to ground (default)</dt>"
0220                                                   "<dd>Indicates to ignore an altitude specification</dd>"
0221                                               "<dt>relative to ground</dt>"
0222                                                   "<dd>Sets the altitude of the element relative to the actual ground "
0223                                                   "elevation of a particular location.</dd>"
0224                                               "<dt>absolute</dt>"
0225                                                   "<dd>Sets the altitude of the coordinate relative to sea level, "
0226                                                   "regardless of the actual elevation of the terrain beneath "
0227                                                   "the element.</dd>"
0228                                           "</dl>"
0229                                       "</p>"));
0230 
0231     GPXTracksGroupBoxLayout->addWidget(GPXTracksCheckBox_,     0, 0, 1, 4);
0232     GPXTracksGroupBoxLayout->addWidget(GPXFileLabel_,          1, 0, 1, 1);
0233     GPXTracksGroupBoxLayout->addWidget(GPXFileUrlRequester_,   1, 1, 1, 3);
0234     GPXTracksGroupBoxLayout->addWidget(timeZoneLabel_,         2, 0, 1, 1);
0235     GPXTracksGroupBoxLayout->addWidget(timeZoneCB,             2, 1, 1, 3);
0236     GPXTracksGroupBoxLayout->addWidget(GPXLineWidthLabel_,     3, 0, 1, 1);
0237     GPXTracksGroupBoxLayout->addWidget(GPXLineWidthInput_,     3, 1, 1, 3);
0238     GPXTracksGroupBoxLayout->addWidget(GPXColorLabel_,         4, 0, 1, 1);
0239     GPXTracksGroupBoxLayout->addWidget(GPXTrackColor_,         4, 1, 1, 1);
0240     GPXTracksGroupBoxLayout->addWidget(GPXTracksOpacityLabel_, 4, 2, 1, 1);
0241     GPXTracksGroupBoxLayout->addWidget(GPXTracksOpacityInput_, 4, 3, 1, 1);
0242     GPXTracksGroupBoxLayout->addWidget(GPXAltitudeLabel_,      5, 0, 1, 1);
0243     GPXTracksGroupBoxLayout->addWidget(GPXAltitudeCB_,         5, 1, 1, 3);
0244     GPXTracksGroupBoxLayout->setContentsMargins(spacing, spacing, spacing, spacing);
0245     GPXTracksGroupBoxLayout->setAlignment(Qt::AlignTop);
0246 
0247     // --------------------------------------------------------------
0248 
0249     m_geneBtn = new QPushButton(i18n("Generate KML file"), this);
0250 
0251     KMLExportConfigLayout->addWidget(TargetPreferenceGroupBox, 0, 0);
0252     KMLExportConfigLayout->addWidget(SizeGroupBox,             1, 0);
0253     KMLExportConfigLayout->addWidget(GPXTracksGroupBox,        2, 0);
0254     KMLExportConfigLayout->addWidget(m_geneBtn,                3, 0);
0255     KMLExportConfigLayout->setContentsMargins(spacing, spacing, spacing, spacing);
0256 
0257     // --------------------------------------------------------------
0258 
0259     connect(m_geneBtn, SIGNAL(clicked()),
0260             this, SLOT(slotKMLGenerate()));
0261 
0262     connect(GoogleMapTargetRadioButton_, SIGNAL(toggled(bool)),
0263             this, SLOT(slotGoogleMapTargetRadioButtonToggled(bool)));
0264 
0265     connect(GPXTracksCheckBox_, SIGNAL(toggled(bool)),
0266             this, SLOT(slotKMLTracksCheckButtonToggled(bool)));
0267 
0268     connect(this, SIGNAL(signalSetUIEnabled(bool)),
0269             m_dlg, SLOT(slotSetUIEnabled(bool)));
0270 
0271     connect(this, SIGNAL(signalProgressSetup(int,QString)),
0272             m_dlg, SLOT(slotProgressSetup(int,QString)));
0273 
0274     connect(&m_kmlExport, SIGNAL(signalProgressChanged(int)),
0275             m_dlg, SLOT(slotProgressChanged(int)));
0276 
0277     // --------------------------------------------------------------
0278 
0279     readSettings();
0280     slotGoogleMapTargetRadioButtonToggled(true);
0281     slotKMLTracksCheckButtonToggled(false);
0282 }
0283 
0284 KmlWidget::~KmlWidget()
0285 {
0286     saveSettings();
0287 }
0288 
0289 void KmlWidget::slotKMLGenerate()
0290 {
0291     Q_EMIT signalSetUIEnabled(false);
0292     m_geneBtn->setEnabled(false);
0293     Q_EMIT signalProgressSetup(m_model->rowCount(), i18n("Generate KML file"));
0294 
0295     saveSettings();
0296 
0297     QList<QUrl> urls;
0298 
0299     for (int i = 0 ; i < m_model->rowCount() ; ++i)
0300     {
0301         GPSItemContainer* const item = m_model->itemFromIndex(m_model->index(i, 0));
0302 
0303         if (item)
0304         {
0305             urls << item->url();
0306         }
0307     }
0308 
0309     m_kmlExport.setUrls(urls);
0310     m_kmlExport.generate();
0311 
0312     m_geneBtn->setEnabled(true);
0313     Q_EMIT signalSetUIEnabled(true);
0314 }
0315 
0316 void KmlWidget::slotGoogleMapTargetRadioButtonToggled(bool)
0317 {
0318     if (GoogleMapTargetRadioButton_->isChecked())
0319     {
0320         DestinationUrlLabel_->setEnabled(true);
0321         DestinationUrl_->setEnabled(true);
0322         IconSizeLabel->setEnabled(false);
0323         IconSizeInput_->setEnabled(false);
0324     }
0325     else
0326     {
0327         DestinationUrlLabel_->setEnabled(false);
0328         DestinationUrl_->setEnabled(false);
0329         IconSizeLabel->setEnabled(true);
0330         IconSizeInput_->setEnabled(true);
0331     }
0332 }
0333 
0334 void KmlWidget::slotKMLTracksCheckButtonToggled(bool)
0335 {
0336     if (GPXTracksCheckBox_->isChecked())
0337     {
0338         GPXFileUrlRequester_->setEnabled(true);
0339         GPXFileLabel_->setEnabled(true);
0340         timeZoneCB->setEnabled(true);
0341         GPXColorLabel_->setEnabled(true);
0342         GPXAltitudeLabel_->setEnabled(true);
0343         timeZoneLabel_->setEnabled(true);
0344         GPXAltitudeCB_->setEnabled(true);
0345         GPXTrackColor_->setEnabled(true);
0346         GPXLineWidthLabel_->setEnabled(true);
0347         GPXLineWidthInput_->setEnabled(true);
0348         GPXTracksOpacityInput_->setEnabled(true);
0349     }
0350     else
0351     {
0352         GPXFileUrlRequester_->setEnabled(false);
0353         GPXFileLabel_->setEnabled(false);
0354         timeZoneCB->setEnabled(false);
0355         GPXColorLabel_->setEnabled(false);
0356         GPXAltitudeLabel_->setEnabled(false);
0357         timeZoneLabel_->setEnabled(false);
0358         GPXAltitudeCB_->setEnabled(false);
0359         GPXTrackColor_->setEnabled(false);
0360         GPXLineWidthLabel_->setEnabled(false);
0361         GPXLineWidthInput_->setEnabled(false);
0362         GPXTracksOpacityInput_->setEnabled(false);
0363     }
0364 }
0365 
0366 void KmlWidget::readSettings()
0367 {
0368     bool    localTarget;
0369     bool    optimize_googlemap;
0370     int     iconSize;
0371 
0372     /// int googlemapSize;
0373     int     size;
0374     QString UrlDestDir;
0375     QString baseDestDir;
0376     QString KMLFileName;
0377     int     AltitudeMode;
0378 
0379     bool    GPXtracks;
0380     QString GPXFile;
0381     int     TimeZone;
0382     int     LineWidth;
0383     QString GPXColor;
0384     int     GPXOpacity;
0385     int     GPXAltitudeMode;
0386 
0387     KSharedConfig::Ptr config = KSharedConfig::openConfig();
0388     KConfigGroup group        = config->group(QLatin1String("KMLExport Settings"));
0389 
0390     localTarget         = group.readEntry(QLatin1String("localTarget"), true);
0391     optimize_googlemap  = group.readEntry(QLatin1String("optimize_googlemap"), false);
0392     iconSize            = group.readEntry(QLatin1String("iconSize"), 33);
0393 
0394     // not saving this size as it should not change
0395     // googlemapSize = group.readNumEntry("googlemapSize", 32);
0396 
0397     size                = group.readEntry(QLatin1String("size"), 320);
0398 
0399     /// UrlDestDir have to have the trailing /
0400     baseDestDir         = group.readEntry(QLatin1String("baseDestDir"), QString::fromUtf8("/tmp/"));
0401     UrlDestDir          = group.readEntry(QLatin1String("UrlDestDir"),  QString::fromUtf8("https://www.example.com/"));
0402     KMLFileName         = group.readEntry(QLatin1String("KMLFileName"), QString::fromUtf8("kmldocument"));
0403     AltitudeMode        = group.readEntry(QLatin1String("Altitude Mode"), 0);
0404 
0405     GPXtracks           = group.readEntry(QLatin1String("UseGPXTracks"), false);
0406     GPXFile             = group.readEntry(QLatin1String("GPXFile"), QString());
0407     TimeZone            = group.readEntry(QLatin1String("Time Zone"), 12);
0408     LineWidth           = group.readEntry(QLatin1String("Line Width"), 4);
0409     GPXColor            = group.readEntry(QLatin1String("Track Color"), QString::fromUtf8("#17eeee"));
0410     GPXOpacity          = group.readEntry(QLatin1String("Track Opacity"), 64);
0411     GPXAltitudeMode     = group.readEntry(QLatin1String("GPX Altitude Mode"), 0);
0412 
0413     // -- Apply Settings to widgets ------------------------------
0414 
0415     LocalTargetRadioButton_->setChecked(localTarget);
0416     GoogleMapTargetRadioButton_->setChecked(optimize_googlemap);
0417 
0418     IconSizeInput_->setValue(iconSize);
0419     ImageSizeInput_->setValue(size);
0420 
0421     AltitudeCB_->setCurrentIndex(AltitudeMode);
0422     DestinationDirectory_->lineEdit()->setText(baseDestDir);
0423     DestinationUrl_->setText(UrlDestDir);
0424     FileName_->setText(KMLFileName);
0425 
0426     GPXTracksCheckBox_->setChecked(GPXtracks);
0427     timeZoneCB->setCurrentIndex(TimeZone);
0428     GPXLineWidthInput_->setValue(LineWidth);
0429     GPXTrackColor_->setColor(GPXColor);
0430     GPXTracksOpacityInput_->setValue(GPXOpacity);
0431     GPXAltitudeCB_->setCurrentIndex(GPXAltitudeMode);
0432 }
0433 
0434 void KmlWidget::saveSettings()
0435 {
0436     KSharedConfig::Ptr config = KSharedConfig::openConfig();
0437     KConfigGroup group        = config->group(QLatin1String("KMLExport Settings"));
0438 
0439     group.writeEntry(QLatin1String("localTarget"),        LocalTargetRadioButton_->isChecked());
0440     group.writeEntry(QLatin1String("optimize_googlemap"), GoogleMapTargetRadioButton_->isChecked());
0441     group.writeEntry(QLatin1String("iconSize"),           IconSizeInput_->value());
0442     group.writeEntry(QLatin1String("size"),               ImageSizeInput_->value());
0443 
0444     QString destination = DestinationDirectory_->lineEdit()->text();
0445 
0446     if (!destination.endsWith(QLatin1Char('/')))
0447     {
0448         destination.append(QLatin1Char('/'));
0449     }
0450 
0451     group.writeEntry(QLatin1String("baseDestDir"), destination);
0452     QString url = DestinationUrl_->text();
0453 
0454     if (!url.endsWith(QLatin1Char('/')))
0455     {
0456         url.append(QLatin1Char('/'));
0457     }
0458 
0459     group.writeEntry(QLatin1String("UrlDestDir"),        url);
0460     group.writeEntry(QLatin1String("KMLFileName"),       FileName_->text());
0461     group.writeEntry(QLatin1String("Altitude Mode"),     AltitudeCB_->currentIndex());
0462     group.writeEntry(QLatin1String("UseGPXTracks"),      GPXTracksCheckBox_->isChecked());
0463     group.writeEntry(QLatin1String("GPXFile"),           GPXFileUrlRequester_->lineEdit()->text());
0464     group.writeEntry(QLatin1String("Time Zone"),         timeZoneCB->currentIndex());
0465     group.writeEntry(QLatin1String("Line Width"),        GPXLineWidthInput_->value());
0466     group.writeEntry(QLatin1String("Track Color"),       GPXTrackColor_->color().name());
0467     group.writeEntry(QLatin1String("Track Opacity"),     GPXTracksOpacityInput_->value());
0468     group.writeEntry(QLatin1String("GPX Altitude Mode"), GPXAltitudeCB_->currentIndex());
0469 
0470     config->sync();
0471 }
0472 
0473 } // namespace DigikamGenericGeolocationEditPlugin
0474 
0475 #include "moc_kmlwidget.cpp"