File indexing completed on 2024-04-28 04:55:41

0001 /*
0002     This file is part of Choqok, the KDE micro-blogging client
0003 
0004     SPDX-FileCopyrightText: 2010-2012 Mehrdad Momeny <mehrdad.momeny@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 */
0008 
0009 #include "uploadmediadialog.h"
0010 #include "ui_uploadmedia_base.h"
0011 
0012 #include <QComboBox>
0013 #include <QPointer>
0014 #include <QProgressBar>
0015 #include <QTabWidget>
0016 #include <KCMultiDialog>
0017 
0018 #include <KAboutData>
0019 #include <KAboutApplicationDialog>
0020 #include <KCModuleProxy>
0021 #include <KLocalizedString>
0022 #include <KMessageBox>
0023 
0024 #include "choqokbehaviorsettings.h"
0025 #include "choqokuiglobal.h"
0026 #include "libchoqokdebug.h"
0027 #include "pluginmanager.h"
0028 #include "mediamanager.h"
0029 #include "quickpost.h"
0030 #include "uploader.h"
0031 
0032 using namespace Choqok::UI;
0033 
0034 class UploadMediaDialog::Private
0035 {
0036 public:
0037     Ui::UploadMediaBase ui;
0038     QMap <QString, KPluginMetaData> availablePlugins;
0039     QList<KCModuleProxy *> moduleProxyList;
0040     QUrl localUrl;
0041     QPointer<QProgressBar> progress;
0042 };
0043 
0044 UploadMediaDialog::UploadMediaDialog(QWidget *parent, const QString &url)
0045     : QDialog(parent), d(new Private)
0046 {
0047     setAttribute(Qt::WA_DeleteOnClose);
0048     setWindowTitle(i18n("Upload Medium"));
0049 
0050     d->ui.setupUi(this);
0051 
0052     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
0053     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
0054     okButton->setDefault(true);
0055     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0056     okButton->setText(i18n("Upload"));
0057     connect(buttonBox, &QDialogButtonBox::accepted, this, &UploadMediaDialog::accept);
0058     connect(buttonBox, &QDialogButtonBox::rejected, this, &UploadMediaDialog::reject);
0059     d->ui.verticalLayout->addWidget(buttonBox);
0060 
0061     adjustSize();
0062 
0063     connect(d->ui.imageUrl, &KUrlRequester::textChanged,
0064             this, &UploadMediaDialog::slotMediumChanged);
0065     load();
0066     if (url.isEmpty()) {
0067         d->ui.imageUrl->button()->click();
0068     } else {
0069         d->ui.imageUrl->setUrl(QUrl(url));
0070     }
0071     connect(d->ui.uploaderPlugin, (void (QComboBox::*)(int))&QComboBox::currentIndexChanged,
0072             this, &UploadMediaDialog::currentPluginChanged);
0073     d->ui.aboutPlugin->setIcon(QIcon::fromTheme(QLatin1String("help-about")));
0074     d->ui.configPlugin->setIcon(QIcon::fromTheme(QLatin1String("configure")));
0075     connect(d->ui.aboutPlugin, &QPushButton::clicked, this, &UploadMediaDialog::slotAboutClicked);
0076     connect(d->ui.configPlugin, &QPushButton::clicked, this, &UploadMediaDialog::slotConfigureClicked);
0077     connect(Choqok::MediaManager::self(), &MediaManager::mediumUploaded,
0078             this, &UploadMediaDialog::slotMediumUploaded);
0079     connect(Choqok::MediaManager::self(), &MediaManager::mediumUploadFailed,
0080             this, &UploadMediaDialog::slotMediumUploadFailed);
0081 }
0082 
0083 UploadMediaDialog::~UploadMediaDialog()
0084 {
0085     delete d;
0086 }
0087 
0088 void UploadMediaDialog::load()
0089 {
0090     QVector<KPluginMetaData> plugins = Choqok::PluginManager::self()->availablePlugins(QLatin1String("Uploaders"));
0091     qCDebug(CHOQOK) << plugins.count();
0092 
0093     for (const KPluginMetaData &plugin: plugins) {
0094         d->ui.uploaderPlugin->addItem(QIcon::fromTheme(plugin.iconName()), plugin.name(), plugin.name());
0095         d->availablePlugins.insert(plugin.pluginId(), plugin);
0096     }
0097     d->ui.uploaderPlugin->setCurrentIndex(d->ui.uploaderPlugin->findData(Choqok::BehaviorSettings::lastUsedUploaderPlugin()));
0098     if (d->ui.uploaderPlugin->currentIndex() == -1 && d->ui.uploaderPlugin->count() > 0) {
0099         d->ui.uploaderPlugin->setCurrentIndex(0);
0100     }
0101 }
0102 
0103 void UploadMediaDialog::accept()
0104 {
0105     if (d->ui.uploaderPlugin->currentIndex() == -1 ||
0106             !QFile::exists(d->ui.imageUrl->url().toLocalFile()) ||
0107             !QFile(d->ui.imageUrl->url().toLocalFile()).size()) {
0108         return;
0109     }
0110     if (d->progress) {
0111         d->progress->deleteLater();
0112     }
0113     d->progress = new QProgressBar(this);
0114     d->progress->setRange(0, 0);
0115     d->progress->setFormat(i18n("Uploading..."));
0116     d->ui.verticalLayout->addWidget(d->progress);
0117     Choqok::BehaviorSettings::setLastUsedUploaderPlugin(d->ui.uploaderPlugin->itemData(d->ui.uploaderPlugin->currentIndex()).toString());
0118     d->localUrl = d->ui.imageUrl->url();
0119     QString plugin = d->ui.uploaderPlugin->itemData(d->ui.uploaderPlugin->currentIndex()).toString();
0120     showed = true;
0121     winSize = size();
0122     Choqok::MediaManager::self()->uploadMedium(d->localUrl, plugin);
0123 }
0124 
0125 void Choqok::UI::UploadMediaDialog::currentPluginChanged(int index)
0126 {
0127     QString key = d->ui.uploaderPlugin->itemData(index).toString();
0128     d->ui.configPlugin->setEnabled(!key.isEmpty() && d->availablePlugins.value(key).value(QStringLiteral("X-KDE-ConfigModule"), QString()) != QString());
0129 }
0130 
0131 void Choqok::UI::UploadMediaDialog::slotAboutClicked()
0132 {
0133     const QString shorten = d->ui.uploaderPlugin->itemData(d->ui.uploaderPlugin->currentIndex()).toString();
0134     if (shorten.isEmpty()) {
0135         return;
0136     }
0137     auto info = d->availablePlugins.value(shorten);
0138 
0139     KAboutData aboutData(info.name(), info.name(), info.version(), info.description(),
0140                          KAboutLicense::byKeyword(info.license()).key(), QString(),
0141                          QString(), info.website());
0142     aboutData.addAuthor(info.authors()[0].name(), info.authors()[0].task(), info.authors()[0].emailAddress());
0143 
0144     KAboutApplicationDialog aboutPlugin(aboutData, this);
0145     aboutPlugin.setWindowIcon(QIcon::fromTheme(info.iconName()));
0146     aboutPlugin.exec();
0147 }
0148 
0149 void Choqok::UI::UploadMediaDialog::slotConfigureClicked()
0150 {
0151     auto dialog = new KCMultiDialog(this);
0152     QString id = d->availablePlugins.value(d->ui.uploaderPlugin->itemData(d->ui.uploaderPlugin->currentIndex()).toString()).value(QStringLiteral("X-KDE-ConfigModule"), QString());
0153     KPluginMetaData md(id);
0154     dialog->addModule(md);
0155     dialog->setAttribute(Qt::WA_DeleteOnClose);
0156     dialog->show();
0157 }
0158 
0159 void Choqok::UI::UploadMediaDialog::slotMediumUploaded(const QUrl &localUrl, const QString &remoteUrl)
0160 {
0161     if (d->localUrl == localUrl && showed) {
0162         qCDebug(CHOQOK);
0163         Global::quickPostWidget()->appendText(remoteUrl);
0164         showed = false;
0165         close();
0166     }
0167 }
0168 
0169 void Choqok::UI::UploadMediaDialog::slotMediumUploadFailed(const QUrl &localUrl, const QString &errorMessage)
0170 {
0171     if (d->localUrl == localUrl && showed) {
0172         showed = false;
0173         KMessageBox::detailedError(Global::mainWindow(),
0174                                    i18n("Medium uploading failed."),
0175                                    errorMessage);
0176         show();
0177         d->progress->deleteLater();
0178     }
0179     resize(winSize);
0180 }
0181 
0182 void Choqok::UI::UploadMediaDialog::slotMediumChanged(const QString &url)
0183 {
0184     d->ui.previewer->showPreview(QUrl::fromLocalFile(url));
0185 }
0186 
0187 #include "moc_uploadmediadialog.cpp"