File indexing completed on 2025-03-09 03:52:14

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2009-09-28
0007  * Description : a tool to export image to a KIO accessible
0008  *               location
0009  *
0010  * SPDX-FileCopyrightText: 2006-2009 by Johannes Wienke <languitar at semipol dot de>
0011  * SPDX-FileCopyrightText: 2011-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0012  *
0013  * SPDX-License-Identifier: GPL-2.0-or-later
0014  *
0015  * ============================================================ */
0016 
0017 #include "ftexportwidget.h"
0018 
0019 // Qt includes
0020 
0021 #include <QApplication>
0022 #include <QPushButton>
0023 #include <QVBoxLayout>
0024 #include <QPointer>
0025 #include <QLabel>
0026 
0027 // KDE includes
0028 
0029 #include <klocalizedstring.h>
0030 #include <kcombobox.h>
0031 #include <kurlrequester.h>
0032 
0033 // Local includes
0034 
0035 #include "digikam_debug.h"
0036 #include "dfiledialog.h"
0037 #include "wstoolutils.h"
0038 #include "dlayoutbox.h"
0039 
0040 namespace DigikamGenericFileTransferPlugin
0041 {
0042 
0043 class Q_DECL_HIDDEN FTExportWidget::Private
0044 {
0045 public:
0046 
0047     explicit Private()
0048       : targetLabel        (nullptr),
0049         targetSearchButton (nullptr),
0050         imageList          (nullptr)
0051     {
0052     }
0053 
0054     KUrlComboRequester* targetLabel;
0055     QPushButton*        targetSearchButton;
0056     QUrl                targetUrl;
0057     DItemsList*         imageList;
0058 };
0059 
0060 FTExportWidget::FTExportWidget(DInfoInterface* const iface, QWidget* const parent)
0061     : QWidget(parent),
0062       d      (new Private)
0063 {
0064     // setup remote target selection
0065 
0066     DHBox* const hbox   = new DHBox(this);
0067     QLabel* const label = new QLabel(hbox);
0068     d->targetLabel      = new KUrlComboRequester(hbox);
0069 
0070     if (d->targetLabel->button())
0071     {
0072         d->targetLabel->button()->hide();
0073     }
0074 
0075     d->targetLabel->comboBox()->setEditable(true);
0076 
0077     label->setText(i18n("Target location: "));
0078     d->targetLabel->setWhatsThis(i18n("Sets the target address to upload the images to. "
0079                                       "This can be any address as used in Dolphin or Konqueror, "
0080                                       "e.g. ftp://my.server.org/sub/folder."));
0081 
0082     d->targetSearchButton = new QPushButton(i18n("Select export location..."), this);
0083     d->targetSearchButton->setIcon(QIcon::fromTheme(QLatin1String("folder-remote")));
0084 
0085     // setup image list
0086 
0087     d->imageList = new DItemsList(this);
0088     d->imageList->setObjectName(QLatin1String("FTExport ImagesList"));
0089     d->imageList->setIface(iface);
0090     d->imageList->loadImagesFromCurrentSelection();
0091     d->imageList->setAllowRAW(true);
0092     d->imageList->listView()->setWhatsThis(i18n("This is the list of images to upload "
0093                                                 "to the specified target."));
0094 
0095     // layout dialog
0096 
0097     QVBoxLayout* const layout = new QVBoxLayout(this);
0098 
0099     layout->addWidget(hbox);
0100     layout->addWidget(d->targetSearchButton);
0101     layout->addWidget(d->imageList);
0102     layout->setSpacing(qMin(QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing),
0103                              QApplication::style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing)));
0104     layout->setContentsMargins(QMargins());
0105 
0106     // ------------------------------------------------------------------------
0107 
0108     connect(d->targetSearchButton, SIGNAL(clicked(bool)),
0109             this, SLOT(slotShowTargetDialogClicked(bool)));
0110 
0111     connect(d->targetLabel, SIGNAL(textChanged(QString)),
0112             this, SLOT(slotLabelUrlChanged()));
0113 
0114     // ------------------------------------------------------------------------
0115 
0116     updateTargetLabel();
0117 }
0118 
0119 FTExportWidget::~FTExportWidget()
0120 {
0121     delete d;
0122 }
0123 
0124 QUrl FTExportWidget::targetUrl() const
0125 {
0126     return d->targetUrl;
0127 }
0128 
0129 QList<QUrl> FTExportWidget::history() const
0130 {
0131     QList<QUrl> urls;
0132 
0133     for (int i = 0 ; i <= d->targetLabel->comboBox()->count() ; ++i)
0134     {
0135         urls << QUrl(d->targetLabel->comboBox()->itemText(i));
0136     }
0137 
0138     return urls;
0139 }
0140 
0141 void FTExportWidget::setHistory(const QList<QUrl>& urls)
0142 {
0143     d->targetLabel->comboBox()->clear();
0144 
0145     Q_FOREACH (const QUrl& url, urls)
0146     {
0147         d->targetLabel->comboBox()->addUrl(url);
0148     }
0149 }
0150 
0151 void FTExportWidget::setTargetUrl(const QUrl& url)
0152 {
0153     d->targetUrl = url;
0154     updateTargetLabel();
0155 }
0156 
0157 void FTExportWidget::slotShowTargetDialogClicked(bool checked)
0158 {
0159     Q_UNUSED(checked);
0160 
0161     QPointer<DFileDialog> targetDialog = new DFileDialog(this, i18nc("@title:window", "Select Target..."),
0162                                                          d->targetUrl.toString(), i18n("All Files (*)"));
0163     targetDialog->setAcceptMode(QFileDialog::AcceptSave);
0164     targetDialog->setFileMode(QFileDialog::Directory);
0165     targetDialog->setOptions(QFileDialog::ShowDirsOnly);
0166     targetDialog->exec();
0167 
0168     if (targetDialog->hasAcceptedUrls())
0169     {
0170         d->targetUrl = targetDialog->selectedUrls().first();
0171         updateTargetLabel();
0172 
0173         Q_EMIT signalTargetUrlChanged(d->targetUrl);
0174     }
0175 
0176     delete targetDialog;
0177 }
0178 
0179 void FTExportWidget::updateTargetLabel()
0180 {
0181     qCDebug(DIGIKAM_WEBSERVICES_LOG) << "Call for url "
0182                                      << d->targetUrl.toDisplayString()
0183                                      << ", valid = "
0184                                      << d->targetUrl.isValid();
0185 
0186     QString urlString = i18n("<i>not selected</i>");
0187 
0188     if (d->targetUrl.isValid())
0189     {
0190         urlString = d->targetUrl.toDisplayString();
0191         d->targetLabel->setUrl(QUrl(urlString));
0192     }
0193 }
0194 
0195 DItemsList* FTExportWidget::imagesList() const
0196 {
0197     return d->imageList;
0198 }
0199 
0200 void FTExportWidget::slotLabelUrlChanged()
0201 {
0202     d->targetUrl = d->targetLabel->url();
0203 
0204     Q_EMIT signalTargetUrlChanged(d->targetUrl);
0205 }
0206 
0207 } // namespace DigikamGenericFileTransferPlugin
0208 
0209 #include "moc_ftexportwidget.cpp"