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"