diff --git a/.clang-format b/.clang-format index d16c5e0..ec84205 100644 --- a/.clang-format +++ b/.clang-format @@ -1,4 +1,4 @@ -AccessModifierOffset: 0 +AccessModifierOffset: -4 AlignEscapedNewlinesLeft: false AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: false @@ -12,7 +12,7 @@ BreakBeforeBinaryOperators: true BreakBeforeBraces: Attach BreakBeforeTernaryOperators: false BreakConstructorInitializersBeforeComma: false -ColumnLimit: 140 +ColumnLimit: 120 CommentPragmas: '' ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 0 diff --git a/KShare.pro b/KShare.pro index 9e50a65..1c9d84f 100644 --- a/KShare.pro +++ b/KShare.pro @@ -46,7 +46,8 @@ SOURCES += main.cpp\ cropeditor/drawing/pathitem.cpp \ cropeditor/drawing/lineitem.cpp \ cropeditor/drawing/textitem.cpp \ - colorpicker/colorpickerscene.cpp + colorpicker/colorpickerscene.cpp \ + worker/worker.cpp HEADERS += mainwindow.hpp \ cropeditor/cropeditor.hpp \ @@ -74,7 +75,8 @@ HEADERS += mainwindow.hpp \ cropeditor/drawing/textitem.hpp \ colorpicker/colorpickerscene.hpp \ platformbackend.hpp \ - gif-h/gif.h + gif-h/gif.h \ + worker/worker.hpp mac { SOURCES += $$PWD/platformspecifics/mac/macbackend.cpp diff --git a/main.cpp b/main.cpp index 0c2a1a6..0a22327 100644 --- a/main.cpp +++ b/main.cpp @@ -3,28 +3,30 @@ #include #include #include +#include #include #include +#include bool verbose = false; void handler(QtMsgType type, const QMessageLogContext &, const QString &msg) { - QByteArray localMsg = msg.toLocal8Bit(); + std::string stdMsg = msg.toStdString(); switch (type) { case QtDebugMsg: - if (verbose) fprintf(stdout, "DEBUG: %s\n", localMsg.constData()); + if (verbose) std::cout << "DEBUG: " << stdMsg << "\n"; break; case QtInfoMsg: - fprintf(stdout, "INFO: %s\n", localMsg.constData()); + std::cout << "INFO: " << stdMsg << "\n"; break; case QtWarningMsg: - fprintf(stderr, "WARN: %s\n", localMsg.constData()); + std::cerr << "WARN: " << stdMsg << "\n"; break; case QtCriticalMsg: - fprintf(stderr, "CRIT: %s\n", localMsg.constData()); + std::cerr << "CRIT: " << stdMsg << "\n"; break; case QtFatalMsg: - fprintf(stderr, "FATAL: %s\n", localMsg.constData()); + std::cerr << "FATAL: " << stdMsg << "\n"; notifications::notify("KShare Fatal Error", msg, QSystemTrayIcon::Critical); break; } @@ -57,6 +59,7 @@ int main(int argc, char *argv[]) { verbose = parser.isSet(v); MainWindow w; + Worker::init(); if (!parser.isSet(h)) w.show(); return a.exec(); } diff --git a/worker/worker.cpp b/worker/worker.cpp new file mode 100644 index 0000000..546aa4d --- /dev/null +++ b/worker/worker.cpp @@ -0,0 +1,54 @@ +#include "worker.hpp" +#include +#include + +Worker *Worker::inst = 0; +QMutex Worker::workerLock; + +void Worker::queue(WorkerContext *context) { + QMutexLocker ml(&lock); + qqueue.enqueue(context); +} + +void Worker::init() { + QMutexLocker ml(&workerLock); + if (!inst) inst = new Worker; +} + +Worker::Worker() : QObject() { + thr = new QThread; + moveToThread(thr); + connect(thr, &QThread::started, this, &Worker::process); + connect(thr, &QThread::finished, thr, &QThread::deleteLater); + connect(this, &Worker::finished, thr, &QThread::quit); + connect(this, &Worker::finished, this, &Worker::deleteLater); + connect(thr, &QThread::finished, thr, &QThread::deleteLater); + thr->start(); +} + +Worker::~Worker() { + end(); +} + +void Worker::end() { + QMutexLocker ml(&endLock); + _ended = true; +} + +bool Worker::ended() { + QMutexLocker ml(&endLock); + return _ended; +} + +void Worker::process() { + while (!ended()) { + lock.lock(); + if (!qqueue.isEmpty()) { + WorkerContext *c = qqueue.dequeue(); + c->consumer(c->pixmap.toImage().convertToFormat(c->targetFormat)); + } + lock.unlock(); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); // STL likes it's scopes + } + emit finished(); +} diff --git a/worker/worker.hpp b/worker/worker.hpp new file mode 100644 index 0000000..ed7dfc5 --- /dev/null +++ b/worker/worker.hpp @@ -0,0 +1,47 @@ +#ifndef WORKER_HPP +#define WORKER_HPP + +#include +#include +#include +#include +#include +#include +#include + +struct WorkerContext { + QPixmap pixmap; + QImage::Format targetFormat; + std::function consumer; +}; + +class Worker : public QObject { + Q_OBJECT +public: + void queue(WorkerContext *context); + static void init(); + +private: + Worker(); + ~Worker(); + QMutex lock; + QMutex endLock; + QThread *thr; + QQueue qqueue; // Say that ten times as fast + bool _ended; + + void _queue(WorkerContext *context); + void end(); + bool ended(); + + static Worker *inst; + static QMutex workerLock; +signals: + void error(QString err); + void finished(); + +public slots: + void process(); +}; + +#endif // WORKER_HPP