From 81cfe1584e275bcfac365d6829a425ac421a5e2e Mon Sep 17 00:00:00 2001 From: ArsenArsen Date: Wed, 9 May 2018 20:40:57 +0200 Subject: [PATCH] Add uploading indicator. Fix #73 --- src/icon.qrc | 1 + src/icons/infinity.png | Bin 0 -> 48354 bytes src/io/ioutils.cpp | 24 +++++++++- src/logs/requestlogging.cpp | 6 +++ src/logs/requestlogging.hpp | 4 ++ src/mainwindow.cpp | 4 ++ src/mainwindow.hpp | 3 +- src/src.pro | 2 - src/uploaders/default/imgplusuploader.cpp | 53 ---------------------- src/uploaders/default/imgplusuploader.hpp | 21 --------- src/uploaders/uploadersingleton.cpp | 2 - src/utils.cpp | 27 +++++++++++ src/utils.hpp | 2 + 13 files changed, 69 insertions(+), 80 deletions(-) create mode 100644 src/icons/infinity.png delete mode 100644 src/uploaders/default/imgplusuploader.cpp delete mode 100644 src/uploaders/default/imgplusuploader.hpp diff --git a/src/icon.qrc b/src/icon.qrc index 23c098b..62e7d4e 100644 --- a/src/icon.qrc +++ b/src/icon.qrc @@ -18,5 +18,6 @@ icons/crop.png icons/circle.png icons/highlighter.png + icons/infinity.png diff --git a/src/icons/infinity.png b/src/icons/infinity.png new file mode 100644 index 0000000000000000000000000000000000000000..a4097505c188e41215beae57c1b1f24accd54d80 GIT binary patch literal 48354 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 #include #include +#include #include QNetworkAccessManager ioutils::networkManager; @@ -16,6 +17,16 @@ void addLogEntry(QNetworkReply *reply, QByteArray data) { requestlogging::addEntry(ctx); } +int tasks = 0; + +void addTask() { + requestlogging::indicator::show(++tasks); +} + +void removeTask() { + requestlogging::indicator::show(--tasks); +} + void ioutils::postMultipart(QUrl target, QList> headers, QHttpMultiPart *body, @@ -25,7 +36,9 @@ void ioutils::postMultipart(QUrl target, if (header.first.toLower() != "content-type") req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); } QNetworkReply *reply = networkManager.post(req, body); + addTask(); QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { + removeTask(); QByteArray data = reply->readAll(); addLogEntry(reply, data); callback(QJsonDocument::fromJson(data), data, reply); @@ -42,7 +55,9 @@ void ioutils::postMultipartData(QUrl target, if (header.first.toLower() != "content-type") req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); } QNetworkReply *reply = networkManager.post(req, body); + addTask(); QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { + removeTask(); QByteArray data = reply->readAll(); addLogEntry(reply, data); callback(data, reply); @@ -58,7 +73,9 @@ void ioutils::getJson(QUrl target, req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); } QNetworkReply *reply = networkManager.get(req); + addTask(); QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { + removeTask(); QByteArray data = reply->readAll(); addLogEntry(reply, data); callback(QJsonDocument::fromJson(data), data, reply); @@ -75,7 +92,9 @@ void ioutils::postJson(QUrl target, req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); } QNetworkReply *reply = networkManager.post(req, body); + addTask(); QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { + removeTask(); QByteArray data = reply->readAll(); addLogEntry(reply, data); callback(QJsonDocument::fromJson(data), data, reply); @@ -89,7 +108,9 @@ void ioutils::getData(QUrl target, QList> headers, std:: req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); } QNetworkReply *reply = networkManager.get(req); + addTask(); QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { + removeTask(); QByteArray data = reply->readAll(); addLogEntry(reply, data); callback(data, reply); @@ -106,7 +127,9 @@ void ioutils::postData(QUrl target, req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); } QNetworkReply *reply = networkManager.post(req, body); + addTask(); QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { + removeTask(); QByteArray data = reply->readAll(); addLogEntry(reply, data); callback(data, reply); @@ -128,7 +151,6 @@ QString ioutils::methodString(QNetworkAccessManager::Operation operation) { case QNetworkAccessManager::HeadOperation: return "HEAD"; default: - // return "Dunno"; return "Unknown"; } } diff --git a/src/logs/requestlogging.cpp b/src/logs/requestlogging.cpp index 0f9ad52..b1e4d97 100644 --- a/src/logs/requestlogging.cpp +++ b/src/logs/requestlogging.cpp @@ -1,6 +1,8 @@ #include "requestlogging.hpp" #include +#include #include +#include // $type $url $status $time // $type = GET POST PATCH DELETE etc @@ -63,3 +65,7 @@ QList requestlogging::getRequests() { return ret; } + +void requestlogging::indicator::show(int count) { + MainWindow::inst()->setTrayIcon(utils::getTrayIcon(count)); +} diff --git a/src/logs/requestlogging.hpp b/src/logs/requestlogging.hpp index 73ca70b..63381e7 100644 --- a/src/logs/requestlogging.hpp +++ b/src/logs/requestlogging.hpp @@ -41,6 +41,10 @@ namespace requestlogging { QList getRequests(); void addEntry(RequestContext context); + + namespace indicator { + void show(int count); + } // namespace indicator } // namespace requestlogging #endif // REQUESTLOGGING_HPP diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ea2184d..09217cd 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -187,3 +187,7 @@ void MainWindow::on_history_clicked() { HistoryDialog *dialog = new HistoryDialog; dialog->show(); } + +void MainWindow::setTrayIcon(QIcon icon) { + tray->setIcon(icon); +} diff --git a/src/mainwindow.hpp b/src/mainwindow.hpp index 49b4a98..f60a364 100644 --- a/src/mainwindow.hpp +++ b/src/mainwindow.hpp @@ -37,10 +37,11 @@ public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); bool valid(); - Ui::MainWindow *ui; + void setTrayIcon(QIcon icon); RecordingController *controller = new RecordingController; QSystemTrayIcon *tray; + Ui::MainWindow *ui; public slots: void rec(); diff --git a/src/src.pro b/src/src.pro index 83f37be..8a3e680 100644 --- a/src/src.pro +++ b/src/src.pro @@ -65,7 +65,6 @@ SOURCES += main.cpp\ hotkeyinputdialog.cpp \ cropeditor/drawing/arrowitem.cpp \ uploaders/default/imgursettingsdialog.cpp \ - uploaders/default/imgplusuploader.cpp \ filenamevalidator.cpp \ logs/requestlogging.cpp \ logs/historydialog.cpp \ @@ -118,7 +117,6 @@ HEADERS += mainwindow.hpp \ hotkeyinputdialog.hpp \ cropeditor/drawing/arrowitem.hpp \ uploaders/default/imgursettingsdialog.hpp \ - uploaders/default/imgplusuploader.hpp \ filenamevalidator.hpp \ logs/requestlogging.hpp \ logs/historydialog.hpp \ diff --git a/src/uploaders/default/imgplusuploader.cpp b/src/uploaders/default/imgplusuploader.cpp deleted file mode 100644 index 32a0a17..0000000 --- a/src/uploaders/default/imgplusuploader.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "imgplusuploader.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void ImgplusUploader::doUpload(QByteArray byteArray, QString format) { - QString mime; - if (formats::normalFormatFromName(format) != formats::Normal::None) - mime = formats::normalFormatMIME(formats::normalFormatFromName(format)); - else - mime = formats::recordingFormatMIME(formats::recordingFormatFromName(format)); - QHttpMultiPart *multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType); - QHttpPart imagePart; - imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"file\"; filename=\"image." + format + "\""); - imagePart.setHeader(QNetworkRequest::ContentTypeHeader, mime); - QByteArray *data = new QByteArray; - data->swap(byteArray); - QBuffer *buff = new QBuffer(data); - buff->open(QIODevice::ReadOnly); - imagePart.setBodyDevice(buff); - multipart->append(imagePart); - - QHttpPart keyPart; - keyPart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"api_key\""); - keyPart.setBody(settings::settings().value("imgplus/apikey").toString().toUtf8()); - multipart->append(keyPart); - - ioutils::postMultipartData(QUrl("http://imgpl.us/api/upload"), { QPair("Accept", "application/json") }, - multipart, [](QByteArray link, QNetworkReply *) { - QApplication::clipboard()->setText(QString::fromUtf8(link)); - if (!link.startsWith("http")) - qCritical() << QObject::tr("Failed to upload! Copied the response to clipboard"); - else - notifications::notify(QObject::tr("KShare imgplus Uploader"), - QObject::tr("Uploaded to ImagePlus!")); - }); -} - -void ImgplusUploader::showSettings() { - QString text = QInputDialog::getText(0, tr("imgplus API key"), tr("Enter the imgpl.us API key (Found in Settings)"), - QLineEdit::Normal, settings::settings().value("imgplus/apikey").toString()); - if (!text.isNull()) settings::settings().setValue("imgplus/apikey", text); -} - -bool ImgplusUploader::validate() { - return settings::settings().value("imgplus/apikey").userType() == QMetaType::QString; -} diff --git a/src/uploaders/default/imgplusuploader.hpp b/src/uploaders/default/imgplusuploader.hpp deleted file mode 100644 index 7ef3836..0000000 --- a/src/uploaders/default/imgplusuploader.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef IMGPLUSUPLOADER_HPP -#define IMGPLUSUPLOADER_HPP - -#include -#include - -class ImgplusUploader : public Uploader { - Q_DECLARE_TR_FUNCTIONS(ImgplusUploader) -public: - QString name() override { - return "ImagePlus"; - } - QString description() override { - return "imgpl.us uploader"; - } - void doUpload(QByteArray byteArray, QString format) override; - void showSettings() override; - bool validate() override; -}; - -#endif // IMGPLUSUPLOADER_HPP diff --git a/src/uploaders/uploadersingleton.cpp b/src/uploaders/uploadersingleton.cpp index 5bf2f71..0b4426a 100644 --- a/src/uploaders/uploadersingleton.cpp +++ b/src/uploaders/uploadersingleton.cpp @@ -12,7 +12,6 @@ #include #include #include -#include UploaderSingleton::UploaderSingleton() : QObject() { updateSaveSettings(); @@ -31,7 +30,6 @@ UploaderSingleton::UploaderSingleton() : QObject() { // UPLOADERS registerUploader(new ImgurUploader); - registerUploader(new ImgplusUploader); registerUploader(new ClipboardUploader); // --------- diff --git a/src/utils.cpp b/src/utils.cpp index 65ae96b..a340e33 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -183,3 +183,30 @@ void utils::externalScreenshotActive(std::function callback) { }); process->start(args.takeFirst(), args); } + +QIcon defaultIcon() { + static QIcon icon = QIcon(":/icons/icon.png"); + return icon; +} + +QIcon infinity() { + static QIcon icon = QIcon(":/icons/infinity.png"); + return icon; +} + +QIcon utils::getTrayIcon(int num) { + if (!num) { + return defaultIcon(); + } else if (num < 100) { + QPixmap unscaled = utils::renderText(QString::number(num), 0, Qt::lightGray, Qt::black); + int dim = qMax(unscaled.width(), unscaled.height()); + QPixmap scaled(dim, dim); + scaled.fill(Qt::lightGray); + QPainter *painter = new QPainter(&scaled); + painter->drawPixmap((dim / 2) - (unscaled.width() / 2), 0, unscaled); + delete painter; + return scaled; + } else { + return infinity(); + } +} diff --git a/src/utils.hpp b/src/utils.hpp index f4c42a1..b563ca3 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,7 @@ namespace utils { void externalScreenshot(std::function callback); void externalScreenshotActive(std::function callback); QString randomString(int length); + QIcon getTrayIcon(int num); } // namespace utils #endif // UTILS_HPP