diff --git a/KShare.pro b/KShare.pro index 02c0ae5..3cbef22 100644 --- a/KShare.pro +++ b/KShare.pro @@ -50,7 +50,8 @@ SOURCES += main.cpp\ worker/worker.cpp \ screenareaselector/screenareaselector.cpp \ recording/recordingpreview.cpp \ - recording/recordingcontroller.cpp + recording/recordingcontroller.cpp \ + recording/recordingformats.cpp HEADERS += mainwindow.hpp \ cropeditor/cropeditor.hpp \ @@ -82,7 +83,8 @@ HEADERS += mainwindow.hpp \ worker/worker.hpp \ screenareaselector/screenareaselector.hpp \ recording/recordingpreview.hpp \ - recording/recordingcontroller.hpp + recording/recordingcontroller.hpp \ + recording/recordingformats.hpp mac { SOURCES += $$PWD/platformspecifics/mac/macbackend.cpp diff --git a/hotkeying.cpp b/hotkeying.cpp index 8bef764..6c25411 100644 --- a/hotkeying.cpp +++ b/hotkeying.cpp @@ -37,5 +37,7 @@ bool hotkeying::valid(QString seq) { } QString hotkeying::sequence(QString seqName) { - return hotkeys.contains(seqName) ? hotkeys.value(seqName)->shortcut().toString() : ""; + return hotkeys.contains(seqName) ? + hotkeys.value(seqName)->isRegistered() ? hotkeys.value(seqName)->shortcut().toString() : "" : + ""; } diff --git a/mainwindow.ui b/mainwindow.ui index 1da644f..515738e 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 512 - 399 + 410 @@ -25,6 +25,18 @@ + + + + 0 + + + + Recording disabled + + + + @@ -63,7 +75,7 @@ - + <a href="https://github.com/ArsenArsen/KShare">Source code available free for everyone. Forever.</a> @@ -92,13 +104,6 @@ - - - - Pressing <X> hides to tray - - - @@ -112,13 +117,27 @@ - + Capture cursor + + + + Pressing <X> hides to tray + + + + + + + Recording format + + + @@ -127,7 +146,7 @@ 0 0 512 - 24 + 25 diff --git a/recording/recordingcontroller.cpp b/recording/recordingcontroller.cpp index 15a6df8..65bde7e 100644 --- a/recording/recordingcontroller.cpp +++ b/recording/recordingcontroller.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include RecordingController::RecordingController() : timer(this) { @@ -33,7 +34,7 @@ bool RecordingController::end() { area = QRect(); preview->close(); preview = 0; - _context->finalizer(); + UploaderSingleton::inst().upload(_context->finalizer()); frame = 0; time = 0; return true; diff --git a/recording/recordingcontroller.hpp b/recording/recordingcontroller.hpp index 08ecc9d..254dbfb 100644 --- a/recording/recordingcontroller.hpp +++ b/recording/recordingcontroller.hpp @@ -3,6 +3,7 @@ #include "recordingpreview.hpp" +#include #include #include #include @@ -13,7 +14,7 @@ class RecordingContext { public: QImage::Format format; std::function consumer; - std::function finalizer; + std::function finalizer; }; class RecordingController : public QObject { diff --git a/recording/recordingformats.cpp b/recording/recordingformats.cpp new file mode 100644 index 0000000..2fa9b97 --- /dev/null +++ b/recording/recordingformats.cpp @@ -0,0 +1,35 @@ +#include "recordingformats.hpp" + +#include + +RecordingFormats::RecordingFormats(RecordingFormats::Format f) { + switch (f) { + case GIF: + // TODO + break; + default: + break; + } +} + +std::function RecordingFormats::getConsumer() { + return consumer; +} + +std::function RecordingFormats::getFinalizer() { + return finalizer; +} + +QString RecordingFormats::getPrettyName(RecordingFormats::Format f) { + switch (f) { + case None: + return "None"; + break; + case GIF: + return "gif"; + break; + default: + return QString(); + break; + } +} diff --git a/recording/recordingformats.hpp b/recording/recordingformats.hpp new file mode 100644 index 0000000..9a4e787 --- /dev/null +++ b/recording/recordingformats.hpp @@ -0,0 +1,23 @@ +#ifndef RECORDINGFORMATS_HPP +#define RECORDINGFORMATS_HPP + +#include +#include +#include +#include + +class RecordingFormats { +public: + enum Format { None, GIF }; + RecordingFormats(Format f); + std::function getConsumer(); + std::function getFinalizer(); + + static QString getPrettyName(Format f); + +private: + std::function consumer; + std::function finalizer; +}; + +#endif // RECORDINGFORMATS_HPP diff --git a/uploaders/customuploader.cpp b/uploaders/customuploader.cpp index e785004..29dbf2f 100644 --- a/uploaders/customuploader.cpp +++ b/uploaders/customuploader.cpp @@ -64,11 +64,11 @@ CustomUploader::CustomUploader(QString absFilePath) { if (formatValue.isString()) { QString formatString = formatValue.toString().toLower(); if (formatString == "x-www-form-urlencoded") - format = RequestFormat::X_WWW_FORM_URLENCODED; + rFormat = RequestFormat::X_WWW_FORM_URLENCODED; else if (formatString == "json") - format = RequestFormat::JSON; + rFormat = RequestFormat::JSON; else if (formatString == "plain") - format = RequestFormat::PLAIN; + rFormat = RequestFormat::PLAIN; else error(absFilePath, "format invalid"); } @@ -85,7 +85,7 @@ CustomUploader::CustomUploader(QString absFilePath) { } else error(absFilePath, "imageformat invalid"); QJsonValue bodyValue = obj["body"]; - if (format != RequestFormat::PLAIN) { + if (rFormat != RequestFormat::PLAIN) { if (bodyValue.isUndefined()) error(absFilePath, "body not set"); if (bodyValue.isObject()) body = bodyValue; @@ -123,6 +123,10 @@ QString CustomUploader::description() { return desc; } +std::tuple CustomUploader::format() { + return std::tuple(getFormatString(false), getFormatString(true)); +} + QString getCType(RequestFormat format, QString plainType) { switch (format) { case RequestFormat::X_WWW_FORM_URLENCODED: @@ -149,14 +153,6 @@ QList> getHeaders(QJsonObject h, QString imageFormat, QM return headers; } -QByteArray imageBytes(QPixmap *pixmap, QString format) { - QByteArray returnVal; - QBuffer buff(&returnVal); - buff.open(QIODevice::WriteOnly); - pixmap->save(&buff, format.toUpper().toLocal8Bit().constData()); - return returnVal; -} - QString CustomUploader::getFormatString(bool animated) { if (iFormat == "base64") return animated ? "GIF" : "PNG"; @@ -238,13 +234,12 @@ void parseResult(QJsonDocument result, QByteArray data, QString returnPathspec, } } -void CustomUploader::doUpload(QPixmap *pixmap) { - auto h = getHeaders(headers, getFormatString(false), types, this->format); +void CustomUploader::doUpload(QByteArray imgData) { + auto h = getHeaders(headers, getFormatString(false), types, this->rFormat); QString format = getFormatString(false); // Soon:tm: QByteArray data; - QByteArray imgData = imageBytes(pixmap, format); if (iFormat == "base64" || QRegExp("base64\\([^+]\\+[^+]\\)").exactMatch(iFormat)) imgData = imgData.toBase64(); - switch (this->format) { + switch (this->rFormat) { case RequestFormat::PLAIN: { data = imgData; } break; diff --git a/uploaders/customuploader.hpp b/uploaders/customuploader.hpp index b4d7275..6e65f9e 100644 --- a/uploaders/customuploader.hpp +++ b/uploaders/customuploader.hpp @@ -11,19 +11,20 @@ enum class HttpMethod { POST }; enum class RequestFormat { X_WWW_FORM_URLENCODED, JSON, PLAIN }; class CustomUploader : public Uploader { - public: +public: CustomUploader(QString absFilePath); QString name(); QString description(); - void doUpload(QPixmap *pixmap); + std::tuple format(); + void doUpload(QByteArray imgData); QString getFormatString(bool animated); QMap types; - private: +private: double limit = -1; QString desc; QString uName; - RequestFormat format = RequestFormat::JSON; + RequestFormat rFormat = RequestFormat::JSON; HttpMethod method = HttpMethod::POST; QUrl target; QJsonValue body; diff --git a/uploaders/default/clipboarduploader.cpp b/uploaders/default/clipboarduploader.cpp index 0bc5ad1..20bb17e 100644 --- a/uploaders/default/clipboarduploader.cpp +++ b/uploaders/default/clipboarduploader.cpp @@ -4,7 +4,7 @@ #include #include -void ClipboardUploader::doUpload(QPixmap *pixmap) { - QApplication::clipboard()->setImage(pixmap->toImage()); +void ClipboardUploader::doUpload(QByteArray imgData) { + QApplication::clipboard()->setImage(QImage::fromData(imgData, std::get<0>(format()).toLocal8Bit().constData())); notifications::notify("KShare", "Copied to clipboard!"); } diff --git a/uploaders/default/clipboarduploader.hpp b/uploaders/default/clipboarduploader.hpp index 340043d..c157230 100644 --- a/uploaders/default/clipboarduploader.hpp +++ b/uploaders/default/clipboarduploader.hpp @@ -5,14 +5,18 @@ #include class ClipboardUploader : public Uploader { - public: +public: QString name() { return "clipboard"; } QString description() { return "Copies the image to clipboard"; } - void doUpload(QPixmap *pixmap); + std::tuple format() { + return std::tuple("PNG", "MP4"); + } + + void doUpload(QByteArray imgData); }; #endif // CLIPBOARDUPLOADER_HPP diff --git a/uploaders/default/imguruploader.cpp b/uploaders/default/imguruploader.cpp index b0fd5a9..98071de 100644 --- a/uploaders/default/imguruploader.cpp +++ b/uploaders/default/imguruploader.cpp @@ -7,20 +7,19 @@ #include #include -void ImgurUploader::doUpload(QPixmap *pixmap) { - QByteArray byteArray; - QBuffer buffer(&byteArray); - pixmap->save(&buffer, "PNG"); - if (buffer.size() > 1e+7) { +void ImgurUploader::doUpload(QByteArray byteArray) { + if (byteArray.size() > 1e+7) { notifications::notify("KShare imgur Uploader ", "Failed upload! Image too big"); return; } ioutils::postJson(QUrl("https://api.imgur.com/3/image"), - QList>() << QPair("Content-Type", "application/x-www-form-urlencoded") - << QPair("Authorization", "Client-ID 8a98f183fc895da"), + QList>() + << QPair("Content-Type", "application/x-www-form-urlencoded") + << QPair("Authorization", "Client-ID 8a98f183fc895da"), byteArray, [](QJsonDocument res, QByteArray, QNetworkReply *) { QString result = res.object()["data"].toObject()["link"].toString(); screenshotutil::toClipboard(result); - notifications::notify("KShare imgur Uploader ", result.isEmpty() ? "Failed upload!" : "Uploaded to imgur!"); + notifications::notify("KShare imgur Uploader ", + result.isEmpty() ? "Failed upload!" : "Uploaded to imgur!"); }); } diff --git a/uploaders/default/imguruploader.hpp b/uploaders/default/imguruploader.hpp index 6eee86e..ec13a09 100644 --- a/uploaders/default/imguruploader.hpp +++ b/uploaders/default/imguruploader.hpp @@ -4,14 +4,17 @@ #include "../uploader.hpp" class ImgurUploader : public Uploader { - public: +public: QString name() { return "imgur"; } QString description() { return "imgur.com uploader"; } - void doUpload(QPixmap *pixmap); + std::tuple format() { + return std::tuple("PNG", "MP4"); + } + void doUpload(QByteArray byteArray); }; #endif // IMGURUPLOADER_HPP diff --git a/uploaders/uploader.hpp b/uploaders/uploader.hpp index 8295717..5509d3f 100644 --- a/uploaders/uploader.hpp +++ b/uploaders/uploader.hpp @@ -5,10 +5,11 @@ #include class Uploader { - public: - virtual void doUpload(QPixmap *pixmap) = 0; +public: + virtual void doUpload(QByteArray imgData) = 0; virtual QString name() = 0; virtual QString description() = 0; + virtual std::tuple format() = 0; }; #endif // UPLOADER_HPP diff --git a/uploaders/uploadersingleton.cpp b/uploaders/uploadersingleton.cpp index 278a321..be2026b 100644 --- a/uploaders/uploadersingleton.cpp +++ b/uploaders/uploadersingleton.cpp @@ -2,13 +2,15 @@ #include "customuploader.hpp" #include "default/clipboarduploader.hpp" #include "default/imguruploader.hpp" +#include #include #include #include #include #include -UploaderSingleton::UploaderSingleton() : QObject(), saveDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)) { +UploaderSingleton::UploaderSingleton() +: QObject(), saveDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)) { if (QStandardPaths::writableLocation(QStandardPaths::PicturesLocation).isEmpty()) { qFatal("Cannot determine location for pictures"); } @@ -54,16 +56,30 @@ void UploaderSingleton::registerUploader(Uploader *uploader) { } void UploaderSingleton::upload(QPixmap *pixmap) { - if (settings::settings().contains("fileFormat")) { - QString format = settings::settings().value("fileFormat").toString(); - if (!format.isEmpty()) { - pixmap->save(saveDir.absoluteFilePath(formatter::format(format) + ".png"), "PNG"); - } - } - uploaders.value(uploader)->doUpload(pixmap); + auto u = uploaders.value(uploader); + QByteArray arr; + QBuffer data(&arr); + pixmap->save(&data, std::get<0>(u->format()).toLocal8Bit().constData()); + u->doUpload(arr); + data.close(); delete pixmap; } +void UploaderSingleton::upload(QByteArray img) { + uploaders.value(uploader)->doUpload(img); +} + +void UploaderSingleton::upload(QFile img) { + if (img.open(QIODevice::ReadOnly)) { + uploaders.value(uploader)->doUpload(img.readAll()); + img.close(); + } +} + +std::tuple UploaderSingleton::format() { + return uploaders.value(uploader)->format(); +} + QList UploaderSingleton::uploaderList() { return uploaders.values(); } diff --git a/uploaders/uploadersingleton.hpp b/uploaders/uploadersingleton.hpp index 704b26b..a16b918 100644 --- a/uploaders/uploadersingleton.hpp +++ b/uploaders/uploadersingleton.hpp @@ -7,21 +7,24 @@ class UploaderSingleton : public QObject { Q_OBJECT - public: +public: static UploaderSingleton &inst() { static UploaderSingleton inst; return inst; } void registerUploader(Uploader *uploader); void upload(QPixmap *pixmap); + void upload(QByteArray img); + void upload(QFile img); + virtual std::tuple format(); QList uploaderList(); void set(QString uploader); QString selectedUploader(); QList errors(); - signals: +signals: void newUploader(Uploader *u); - private: +private: QDir saveDir; UploaderSingleton(); QMap uploaders;