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"