Great reformat of 2k17

This commit is contained in:
ArsenArsen 2017-05-06 13:21:12 +02:00
parent b601b958c9
commit 7737b77671
47 changed files with 1174 additions and 1343 deletions

View File

@ -8,34 +8,29 @@
#include <QTimer> #include <QTimer>
#include <settings.hpp> #include <settings.hpp>
CropEditor::CropEditor(QPixmap *image, QObject *parent) : QObject(parent) CropEditor::CropEditor(QPixmap *image, QObject *parent) : QObject(parent) {
{ scene = new CropScene(parent, image);
scene = new CropScene(parent, image); view = new CropView(scene);
view = new CropView(scene); QPixmap *scaled = new QPixmap();
QPixmap *scaled = new QPixmap(); image->scaled(view->width(), view->height()).swap(*scaled);
image->scaled(view->width(), view->height()).swap(*scaled); pixmapItem = new QGraphicsPixmapItem(*image);
pixmapItem = new QGraphicsPixmapItem(*image); pixmapItem->setZValue(-1);
pixmapItem->setZValue(-1); scene->addItem(pixmapItem);
scene->addItem(pixmapItem); scene->setSceneRect(image->rect());
scene->setSceneRect(image->rect()); view->setGeometry(0, 0, image->width(), image->height());
view->setGeometry(0, 0, image->width(), image->height()); view->showFullScreen();
view->showFullScreen();
QTimer::singleShot(0, [&] { view->showFullScreen(); }); QTimer::singleShot(0, [&] { view->showFullScreen(); });
connect(scene, &CropScene::closedWithRect, this, &CropEditor::crop); connect(scene, &CropScene::closedWithRect, this, &CropEditor::crop);
} }
CropEditor::~CropEditor() CropEditor::~CropEditor() { delete scene; }
{
delete scene;
}
void CropEditor::crop(QRect rect) void CropEditor::crop(QRect rect) {
{ QPixmap map = view->grab(rect);
QPixmap map = view->grab(rect); QPixmap *cropp = new QPixmap;
QPixmap *cropp = new QPixmap; map.swap(*cropp);
map.swap(*cropp); delete view;
delete view; emit cropped(cropp);
emit cropped(cropp);
} }

View File

@ -8,20 +8,19 @@
#include <QObject> #include <QObject>
#include <QPixmap> #include <QPixmap>
class CropEditor : public QObject class CropEditor : public QObject {
{ Q_OBJECT
Q_OBJECT public:
public: CropEditor(QPixmap *image, QObject *parent = 0);
CropEditor(QPixmap *image, QObject *parent = 0); ~CropEditor();
~CropEditor(); signals:
signals: QPixmap *cropped(QPixmap *pixmap);
QPixmap *cropped(QPixmap *pixmap);
private: private:
void crop(QRect rect); void crop(QRect rect);
CropScene *scene = nullptr; CropScene *scene = nullptr;
CropView *view = nullptr; CropView *view = nullptr;
QGraphicsPixmapItem *pixmapItem = nullptr; QGraphicsPixmapItem *pixmapItem = nullptr;
}; };
#endif // CROPEDITOR_HPP #endif // CROPEDITOR_HPP

View File

@ -17,152 +17,162 @@
#include <settings.hpp> #include <settings.hpp>
CropScene::CropScene(QObject *parent, QPixmap *pixmap) CropScene::CropScene(QObject *parent, QPixmap *pixmap)
: QGraphicsScene(parent), prevButtons(Qt::NoButton), drawingSelectionMaker([] { return nullptr; }), : QGraphicsScene(parent), prevButtons(Qt::NoButton),
_font(settings::settings().value("font", QFont()).value<QFont>()) { drawingSelectionMaker([] { return nullptr; }),
pen().setColor(settings::settings().value("penColor", pen().color()).value<QColor>()); _font(settings::settings().value("font", QFont()).value<QFont>()) {
pen().setCosmetic(settings::settings().value("penCosmetic", pen().isCosmetic()).toBool()); pen().setColor(
pen().setWidthF(settings::settings().value("penWidth", pen().widthF()).toFloat()); settings::settings().value("penColor", pen().color()).value<QColor>());
brush().setColor(settings::settings().value("brushColor", brush().color()).value<QColor>()); pen().setCosmetic(
settings::settings().value("penCosmetic", pen().isCosmetic()).toBool());
pen().setWidthF(
settings::settings().value("penWidth", pen().widthF()).toFloat());
brush().setColor(settings::settings()
.value("brushColor", brush().color())
.value<QColor>());
addDrawingAction(menu, "Dot", [] { return new DotItem; }); addDrawingAction(menu, "Dot", [] { return new DotItem; });
addDrawingAction(menu, "Path", [] { return new PathItem; }); addDrawingAction(menu, "Path", [] { return new PathItem; });
addDrawingAction(menu, "Blur", [] { return new BlurItem; }); addDrawingAction(menu, "Blur", [] { return new BlurItem; });
addDrawingAction(menu, "Straight line", [] { return new LineItem; }); addDrawingAction(menu, "Straight line", [] { return new LineItem; });
addDrawingAction(menu, "Text", [] { return new TextItem; }); addDrawingAction(menu, "Text", [] { return new TextItem; });
QAction *reset = menu.addAction("Reset"); QAction *reset = menu.addAction("Reset");
connect(reset, &QAction::triggered, [&] { setDrawingSelection("None", [] { return nullptr; }); }); connect(reset, &QAction::triggered,
[&] { setDrawingSelection("None", [] { return nullptr; }); });
menu.addSeparator(); menu.addSeparator();
QAction *settings = new QAction; QAction *settings = new QAction;
settings->setText("Settings"); settings->setText("Settings");
menu.addSeparator(); menu.addSeparator();
display = menu.addAction(drawingName); display = menu.addAction(drawingName);
display->setDisabled(true); display->setDisabled(true);
connect(settings, &QAction::triggered, [&] { BrushPenSelection(this).exec(); }); connect(settings, &QAction::triggered,
menu.addAction(settings); [&] { BrushPenSelection(this).exec(); });
menu.addAction(settings);
connect(menu.addAction("Set Font"), &QAction::triggered, this, &CropScene::fontAsk); connect(menu.addAction("Set Font"), &QAction::triggered, this,
&CropScene::fontAsk);
_pixmap = pixmap; _pixmap = pixmap;
QTimer::singleShot(0, [&] { QTimer::singleShot(0, [&] {
QPolygonF poly; QPolygonF poly;
poly.append(sceneRect().topLeft()); poly.append(sceneRect().topLeft());
poly.append(sceneRect().topRight()); poly.append(sceneRect().topRight());
poly.append(sceneRect().bottomRight()); poly.append(sceneRect().bottomRight());
poly.append(sceneRect().bottomLeft()); poly.append(sceneRect().bottomLeft());
polyItem = new QGraphicsPolygonItem(poly); polyItem = new QGraphicsPolygonItem(poly);
polyItem->setBrush(QBrush(QColor(0, 0, 0, 191))); polyItem->setBrush(QBrush(QColor(0, 0, 0, 191)));
polyItem->setPen(QPen(Qt::NoPen)); polyItem->setPen(QPen(Qt::NoPen));
addItem(polyItem); addItem(polyItem);
}); });
} }
CropScene::~CropScene() { CropScene::~CropScene() { delete drawingSelection; }
delete drawingSelection;
}
QPen &CropScene::pen() { QPen &CropScene::pen() { return _pen; }
return _pen;
}
QBrush &CropScene::brush() { QBrush &CropScene::brush() { return _brush; }
return _brush;
}
QFont &CropScene::font() { QFont &CropScene::font() { return _font; }
return _font;
}
void CropScene::setDrawingSelection(QString name, std::function<DrawItem *()> drawAction) { void CropScene::setDrawingSelection(QString name,
drawingSelectionMaker = drawAction; std::function<DrawItem *()> drawAction) {
drawingSelection = drawAction(); drawingSelectionMaker = drawAction;
drawingName = name; drawingSelection = drawAction();
if (drawingSelection) drawingSelection->init(this); drawingName = name;
if (drawingSelection)
drawingSelection->init(this);
} }
void CropScene::fontAsk() { void CropScene::fontAsk() {
bool ok = false; bool ok = false;
QFont font = QFontDialog::getFont(&ok, this->font(), nullptr, "Font to use"); QFont font = QFontDialog::getFont(&ok, this->font(), nullptr, "Font to use");
if (ok) _font = font; if (ok)
_font = font;
} }
void CropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { void CropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
auto buttons = e->buttons(); auto buttons = e->buttons();
if (buttons == Qt::LeftButton || prevButtons == Qt::NoButton) { if (buttons == Qt::LeftButton || prevButtons == Qt::NoButton) {
if (drawingSelection) { if (drawingSelection) {
drawingSelection->mouseDragEvent(e, this); drawingSelection->mouseDragEvent(e, this);
} else {
QPointF p = e->scenePos();
if (rect == nullptr) {
rect = new QGraphicsRectItem(p.x(), p.y(), 1, 1);
initPos = p;
QPen pen(Qt::NoBrush, 1);
pen.setColor(Qt::cyan);
rect->setPen(pen);
addItem(rect);
} else {
if (prevButtons == Qt::NoButton) {
initPos = p;
rect->setRect(p.x(), p.y(), 1, 1);
} else { } else {
QPointF p = e->scenePos(); rect->setRect(
if (rect == nullptr) { QRect(qMin(initPos.x(), p.x()), qMin(initPos.y(), p.y()),
rect = new QGraphicsRectItem(p.x(), p.y(), 1, 1); qAbs(initPos.x() - p.x()), qAbs(initPos.y() - p.y())));
initPos = p;
QPen pen(Qt::NoBrush, 1);
pen.setColor(Qt::cyan);
rect->setPen(pen);
addItem(rect);
} else {
if (prevButtons == Qt::NoButton) {
initPos = p;
rect->setRect(p.x(), p.y(), 1, 1);
} else {
rect->setRect(QRect(qMin(initPos.x(), p.x()), qMin(initPos.y(), p.y()), qAbs(initPos.x() - p.x()),
qAbs(initPos.y() - p.y())));
}
}
QPolygonF poly;
QPointF theMagicWikipediaPoint(rect->rect().right(), sceneRect().bottom());
poly << sceneRect().topLeft();
poly << sceneRect().topRight();
poly << sceneRect().bottomRight();
poly << theMagicWikipediaPoint;
poly << rect->rect().bottomRight();
poly << rect->rect().topRight();
poly << rect->rect().topLeft();
poly << rect->rect().bottomLeft();
poly << rect->rect().bottomRight();
poly << theMagicWikipediaPoint;
poly << sceneRect().bottomLeft();
poly << sceneRect().topLeft();
this->polyItem->setPolygon(poly);
e->accept();
} }
}
QPolygonF poly;
QPointF theMagicWikipediaPoint(rect->rect().right(),
sceneRect().bottom());
poly << sceneRect().topLeft();
poly << sceneRect().topRight();
poly << sceneRect().bottomRight();
poly << theMagicWikipediaPoint;
poly << rect->rect().bottomRight();
poly << rect->rect().topRight();
poly << rect->rect().topLeft();
poly << rect->rect().bottomLeft();
poly << rect->rect().bottomRight();
poly << theMagicWikipediaPoint;
poly << sceneRect().bottomLeft();
poly << sceneRect().topLeft();
this->polyItem->setPolygon(poly);
e->accept();
} }
prevButtons = buttons; }
prevButtons = buttons;
} }
void CropScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { void CropScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
qDebug() << "release"; qDebug() << "release";
if (drawingSelection) { if (drawingSelection) {
drawingSelection->mouseDragEndEvent(e, this); drawingSelection->mouseDragEndEvent(e, this);
delete drawingSelection; delete drawingSelection;
drawingSelection = drawingSelectionMaker(); drawingSelection = drawingSelectionMaker();
if (drawingSelection) drawingSelection->init(this); if (drawingSelection)
} drawingSelection->init(this);
prevButtons = Qt::NoButton; }
prevButtons = Qt::NoButton;
} }
void CropScene::addDrawingAction(QMenu &menu, QString name, std::function<DrawItem *()> item) { void CropScene::addDrawingAction(QMenu &menu, QString name,
QAction *action = new QAction; std::function<DrawItem *()> item) {
action->setText(name); QAction *action = new QAction;
connect(action, &QAction::triggered, [this, item, name](bool) { setDrawingSelection(name, item); }); action->setText(name);
menu.addAction(action); connect(action, &QAction::triggered,
[this, item, name](bool) { setDrawingSelection(name, item); });
menu.addAction(action);
} }
void CropScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *e) { void CropScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *e) {
display->setText(drawingName); display->setText(drawingName);
menu.exec(e->screenPos()); menu.exec(e->screenPos());
e->accept(); e->accept();
} }
void CropScene::keyReleaseEvent(QKeyEvent *event) { void CropScene::keyReleaseEvent(QKeyEvent *event) {
if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) done(); // Segfault if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)
done(); // Segfault
} }
void CropScene::done() { void CropScene::done() {
if (rect) { if (rect) {
rect->setPen(QPen(Qt::NoPen)); rect->setPen(QPen(Qt::NoPen));
emit closedWithRect(rect->rect().toRect()); emit closedWithRect(rect->rect().toRect());
} }
} }

View File

@ -14,47 +14,47 @@ class CropScene;
#include <cropeditor/drawing/drawitem.hpp> #include <cropeditor/drawing/drawitem.hpp>
class CropScene : public QGraphicsScene { class CropScene : public QGraphicsScene {
Q_OBJECT Q_OBJECT
public: public:
CropScene(QObject *parent, QPixmap *pixmap); CropScene(QObject *parent, QPixmap *pixmap);
~CropScene(); ~CropScene();
QPen &pen(); QPen &pen();
QBrush &brush(); QBrush &brush();
QFont &font(); QFont &font();
void setDrawingSelection(QString name, std::function<DrawItem *()> drawAction); void setDrawingSelection(QString name,
QPixmap *pixmap() { std::function<DrawItem *()> drawAction);
return _pixmap; QPixmap *pixmap() { return _pixmap; }
}
public slots: public slots:
void fontAsk(); void fontAsk();
signals: signals:
void closedWithRect(QRect rect); void closedWithRect(QRect rect);
protected: protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent *e) override; void mouseMoveEvent(QGraphicsSceneMouseEvent *e) override;
void mouseReleaseEvent(QGraphicsSceneMouseEvent *e) override; void mouseReleaseEvent(QGraphicsSceneMouseEvent *e) override;
void contextMenuEvent(QGraphicsSceneContextMenuEvent *e) override; void contextMenuEvent(QGraphicsSceneContextMenuEvent *e) override;
void keyReleaseEvent(QKeyEvent *e) override; void keyReleaseEvent(QKeyEvent *e) override;
private: private:
void addDrawingAction(QMenu &menu, QString name, std::function<DrawItem *()> item); void addDrawingAction(QMenu &menu, QString name,
void done(); std::function<DrawItem *()> item);
std::function<DrawItem *()> drawingSelectionMaker; void done();
QFlags<Qt::MouseButton> prevButtons; std::function<DrawItem *()> drawingSelectionMaker;
QPixmap *_pixmap; QFlags<Qt::MouseButton> prevButtons;
QGraphicsRectItem *rect = nullptr; QPixmap *_pixmap;
QPointF initPos; QGraphicsRectItem *rect = nullptr;
QPen _pen; QPointF initPos;
QBrush _brush; QPen _pen;
QFont _font; QBrush _brush;
QGraphicsPolygonItem *polyItem = nullptr; QFont _font;
DrawItem *drawingSelection = nullptr; QGraphicsPolygonItem *polyItem = nullptr;
QMenu menu; DrawItem *drawingSelection = nullptr;
QString drawingName = "None"; QMenu menu;
QAction *display; QString drawingName = "None";
QAction *display;
}; };
#endif // CROPSCENE_HPP #endif // CROPSCENE_HPP

View File

@ -1,22 +1,21 @@
#include "cropview.hpp" #include "cropview.hpp"
CropView::CropView(QGraphicsScene *scene) : QGraphicsView(scene) CropView::CropView(QGraphicsScene *scene) : QGraphicsView(scene) {
{ setFrameShape(
setFrameShape(QFrame::NoFrame); // Time taken to solve: A george99g and 38 minutes. QFrame::NoFrame); // Time taken to solve: A george99g and 38 minutes.
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint); setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::HighQualityAntialiasing); setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform |
setCursor(QCursor(Qt::CrossCursor)); QPainter::HighQualityAntialiasing);
setCursor(QCursor(Qt::CrossCursor));
} }
void CropView::keyPressEvent(QKeyEvent *e) void CropView::keyPressEvent(QKeyEvent *e) {
{ if (e->key() == Qt::Key_Escape) {
if (e->key() == Qt::Key_Escape) close();
{ e->accept();
close(); return;
e->accept(); }
return; QGraphicsView::keyPressEvent(e);
}
QGraphicsView::keyPressEvent(e);
} }

View File

@ -4,13 +4,12 @@
#include <QGraphicsView> #include <QGraphicsView>
#include <QKeyEvent> #include <QKeyEvent>
class CropView : public QGraphicsView class CropView : public QGraphicsView {
{ public:
public: CropView(QGraphicsScene *scene);
CropView(QGraphicsScene *scene);
protected: protected:
void keyPressEvent(QKeyEvent *e) override; void keyPressEvent(QKeyEvent *e) override;
}; };
#endif // CROPVIEW_HPP #endif // CROPVIEW_HPP

View File

@ -3,33 +3,30 @@
#include <QDebug> #include <QDebug>
#include <cropeditor/settings/blurdialog.hpp> #include <cropeditor/settings/blurdialog.hpp>
void BlurItem::init(CropScene *) void BlurItem::init(CropScene *) {
{ effect = new QGraphicsBlurEffect;
effect = new QGraphicsBlurEffect; BlurDialog(effect).exec();
BlurDialog(effect).exec();
} }
void BlurItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) void BlurItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) {
{ if (pos.isNull()) {
if (pos.isNull()) pos = e->scenePos();
{ rect = scene->addRect(QRect(e->scenePos().toPoint(), QSize(1, 1)),
pos = e->scenePos(); QPen(Qt::cyan), Qt::NoBrush);
rect = scene->addRect(QRect(e->scenePos().toPoint(), QSize(1, 1)), QPen(Qt::cyan), Qt::NoBrush); pixmap = scene->addPixmap(scene->pixmap()->copy(rect->rect().toRect()));
pixmap = scene->addPixmap(scene->pixmap()->copy(rect->rect().toRect())); pixmap->setPos(e->scenePos());
pixmap->setPos(e->scenePos()); pixmap->setZValue(rect->zValue() - 0.1);
pixmap->setZValue(rect->zValue() - 0.1); pixmap->setGraphicsEffect(effect);
pixmap->setGraphicsEffect(effect); } else {
} QPointF p = e->scenePos();
else rect->setRect(QRect(qMin(pos.x(), p.x()), qMin(pos.y(), p.y()),
{ qAbs(pos.x() - p.x()), qAbs(pos.y() - p.y())));
QPointF p = e->scenePos(); pixmap->setPixmap(scene->pixmap()->copy(rect->rect().toRect()));
rect->setRect(QRect(qMin(pos.x(), p.x()), qMin(pos.y(), p.y()), qAbs(pos.x() - p.x()), qAbs(pos.y() - p.y()))); pixmap->setPos(rect->rect().topLeft());
pixmap->setPixmap(scene->pixmap()->copy(rect->rect().toRect())); }
pixmap->setPos(rect->rect().topLeft());
}
} }
void BlurItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) void BlurItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) {
{ if (rect != nullptr)
if (rect != nullptr) rect->setPen(Qt::NoPen); rect->setPen(Qt::NoPen);
} }

View File

@ -5,26 +5,20 @@
#include <QGraphicsEffect> #include <QGraphicsEffect>
class BlurItem : public DrawItem class BlurItem : public DrawItem {
{ public:
public: QString name() { return "Blur"; }
QString name() ~BlurItem() {}
{
return "Blur";
}
~BlurItem()
{
}
void init(CropScene *) override; void init(CropScene *) override;
void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) override; void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) override;
void mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) override; void mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) override;
private: private:
QGraphicsBlurEffect *effect; QGraphicsBlurEffect *effect;
QPointF pos; QPointF pos;
QGraphicsRectItem *rect; QGraphicsRectItem *rect;
QGraphicsPixmapItem *pixmap; QGraphicsPixmapItem *pixmap;
}; };
#endif // BLURITEM_HPP #endif // BLURITEM_HPP

View File

@ -1,18 +1,14 @@
#include "dotitem.hpp" #include "dotitem.hpp"
DotItem::DotItem() DotItem::DotItem() {}
{
DotItem::~DotItem() {}
void DotItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) {
scene
->addEllipse(e->pos().x() - 1.5, e->pos().y() - 1.5, 3, 3, scene->pen(),
scene->brush())
->setPos(e->scenePos());
} }
DotItem::~DotItem() void DotItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) {}
{
}
void DotItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene)
{
scene->addEllipse(e->pos().x() - 1.5, e->pos().y() - 1.5, 3, 3, scene->pen(), scene->brush())->setPos(e->scenePos());
}
void DotItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *)
{
}

View File

@ -4,17 +4,13 @@
#include "../cropscene.hpp" #include "../cropscene.hpp"
#include "drawitem.hpp" #include "drawitem.hpp"
class DotItem : public DrawItem class DotItem : public DrawItem {
{ public:
public: DotItem();
DotItem(); ~DotItem();
~DotItem(); QString name() { return "Dots (drag to add)"; }
QString name() void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene);
{ void mouseDragEndEvent(QGraphicsSceneMouseEvent *e, CropScene *scene);
return "Dots (drag to add)";
}
void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene);
void mouseDragEndEvent(QGraphicsSceneMouseEvent *e, CropScene *scene);
}; };
#endif // DOTITEM_HPP #endif // DOTITEM_HPP

View File

@ -6,19 +6,15 @@ class DrawItem;
#include <QString> #include <QString>
#include <cropeditor/cropscene.hpp> #include <cropeditor/cropscene.hpp>
class DrawItem class DrawItem {
{ public:
public: virtual ~DrawItem() {}
virtual ~DrawItem() virtual QString name() = 0;
{ virtual void init(CropScene *scene) { Q_UNUSED(scene) }
} virtual void mouseDragEvent(QGraphicsSceneMouseEvent *e,
virtual QString name() = 0; CropScene *scene) = 0;
virtual void init(CropScene *scene) virtual void mouseDragEndEvent(QGraphicsSceneMouseEvent *e,
{ CropScene *scene) = 0;
Q_UNUSED(scene)
}
virtual void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) = 0;
virtual void mouseDragEndEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) = 0;
}; };
#endif // DRAWITEM_HPP #endif // DRAWITEM_HPP

View File

@ -1,22 +1,14 @@
#include "lineitem.hpp" #include "lineitem.hpp"
LineItem::LineItem() LineItem::LineItem() {}
{
void LineItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) {
if (init.isNull()) {
init = e->scenePos();
line = scene->addLine(QLineF(init, init), scene->pen());
} else {
line->setLine(QLineF(init, e->scenePos()));
}
} }
void LineItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) void LineItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) {}
{
if (init.isNull())
{
init = e->scenePos();
line = scene->addLine(QLineF(init, init), scene->pen());
}
else
{
line->setLine(QLineF(init, e->scenePos()));
}
}
void LineItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *)
{
}

View File

@ -3,20 +3,16 @@
#include "drawitem.hpp" #include "drawitem.hpp"
class LineItem : public DrawItem class LineItem : public DrawItem {
{ public:
public: LineItem();
LineItem(); QString name() override { return "Straight line"; }
QString name() override void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) override;
{ void mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) override;
return "Straight line";
}
void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) override;
void mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) override;
private: private:
QPointF init; QPointF init;
QGraphicsLineItem *line; QGraphicsLineItem *line;
}; };
#endif // LINEITEM_HPP #endif // LINEITEM_HPP

View File

@ -1,28 +1,17 @@
#include "pathitem.hpp" #include "pathitem.hpp"
PathItem::PathItem() PathItem::PathItem() {}
{
PathItem::~PathItem() { delete path; }
void PathItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) {
if (path == nullptr) {
path = new QPainterPath(e->scenePos());
pathItem = scene->addPath(*path, scene->pen(), scene->brush());
} else {
path->quadTo(path->currentPosition(), e->scenePos());
pathItem->setPath(*path);
}
} }
PathItem::~PathItem() void PathItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) {}
{
delete path;
}
void PathItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene)
{
if (path == nullptr)
{
path = new QPainterPath(e->scenePos());
pathItem = scene->addPath(*path, scene->pen(), scene->brush());
}
else
{
path->quadTo(path->currentPosition(), e->scenePos());
pathItem->setPath(*path);
}
}
void PathItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *)
{
}

View File

@ -4,21 +4,17 @@
#include "../cropscene.hpp" #include "../cropscene.hpp"
#include "drawitem.hpp" #include "drawitem.hpp"
class PathItem : public DrawItem class PathItem : public DrawItem {
{ public:
public: PathItem();
PathItem(); ~PathItem();
~PathItem(); QString name() { return "Path"; }
QString name() void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene);
{ void mouseDragEndEvent(QGraphicsSceneMouseEvent *e, CropScene *scene);
return "Path";
}
void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene);
void mouseDragEndEvent(QGraphicsSceneMouseEvent *e, CropScene *scene);
private: private:
QPainterPath *path = nullptr; QPainterPath *path = nullptr;
QGraphicsPathItem *pathItem = nullptr; QGraphicsPathItem *pathItem = nullptr;
}; };
#endif // PATHITEM_HPP #endif // PATHITEM_HPP

View File

@ -3,25 +3,23 @@
#include <QtMath> #include <QtMath>
void TextItem::init(CropScene *) { void TextItem::init(CropScene *) {
text = QInputDialog::getText(nullptr, "Text to add", "Input"); text = QInputDialog::getText(nullptr, "Text to add", "Input");
} }
void TextItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) { void TextItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) {
if (!textItem) { if (!textItem) {
textItem = scene->addSimpleText(text, scene->font()); textItem = scene->addSimpleText(text, scene->font());
textItem->setPos(e->scenePos()); textItem->setPos(e->scenePos());
textItem->setPen(scene->pen()); textItem->setPen(scene->pen());
textItem->setBrush(scene->brush()); textItem->setBrush(scene->brush());
} else { } else {
auto ee auto ee = 180 + qRadiansToDegrees(
= 180 + qRadiansToDegrees(qAtan2((textItem->pos().y() - e->scenePos().y()), (textItem->pos().x() - e->scenePos().x()))); qAtan2((textItem->pos().y() - e->scenePos().y()),
textItem->setRotation(ee); (textItem->pos().x() - e->scenePos().x())));
} textItem->setRotation(ee);
}
} }
void TextItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) { void TextItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) {}
}
QString TextItem::name() { QString TextItem::name() { return "Text"; }
return "Text";
}

View File

@ -5,15 +5,15 @@
#include <QGraphicsSimpleTextItem> #include <QGraphicsSimpleTextItem>
class TextItem : public DrawItem { class TextItem : public DrawItem {
public: public:
QString name() override; QString name() override;
void init(CropScene *) override; void init(CropScene *) override;
void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) override; void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) override;
void mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) override; void mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) override;
private: private:
QGraphicsSimpleTextItem *textItem = nullptr; QGraphicsSimpleTextItem *textItem = nullptr;
QString text; QString text;
}; };
#endif // TEXTITEM_HPP #endif // TEXTITEM_HPP

View File

@ -6,38 +6,38 @@
#include <QDoubleSpinBox> #include <QDoubleSpinBox>
#include <QSlider> #include <QSlider>
BlurDialog::BlurDialog(QGraphicsBlurEffect *e, QWidget *parent) : QDialog(parent), ui(new Ui::BlurDialog) BlurDialog::BlurDialog(QGraphicsBlurEffect *e, QWidget *parent)
{ : QDialog(parent), ui(new Ui::BlurDialog) {
effect = e; effect = e;
ui->setupUi(this); ui->setupUi(this);
ui->animated->setChecked(effect->blurHints().testFlag(QGraphicsBlurEffect::AnimationHint)); ui->animated->setChecked(
ui->performance->setChecked(effect->blurHints().testFlag(QGraphicsBlurEffect::PerformanceHint)); effect->blurHints().testFlag(QGraphicsBlurEffect::AnimationHint));
ui->quality->setChecked(effect->blurHints().testFlag(QGraphicsBlurEffect::QualityHint)); ui->performance->setChecked(
ui->radSlider->setValue(effect->blurRadius() * 100); effect->blurHints().testFlag(QGraphicsBlurEffect::PerformanceHint));
ui->radSpinner->setValue(effect->blurRadius()); ui->quality->setChecked(
connect(ui->buttonBox, &QDialogButtonBox::accepted, [&] { effect->blurHints().testFlag(QGraphicsBlurEffect::QualityHint));
QFlags<QGraphicsBlurEffect::BlurHint> hints; ui->radSlider->setValue(effect->blurRadius() * 100);
hints.setFlag(QGraphicsBlurEffect::AnimationHint, ui->animated->isChecked()); ui->radSpinner->setValue(effect->blurRadius());
hints.setFlag(QGraphicsBlurEffect::PerformanceHint, ui->performance->isChecked()); connect(ui->buttonBox, &QDialogButtonBox::accepted, [&] {
hints.setFlag(QGraphicsBlurEffect::QualityHint, ui->quality->isChecked()); QFlags<QGraphicsBlurEffect::BlurHint> hints;
effect->setBlurHints(hints); hints.setFlag(QGraphicsBlurEffect::AnimationHint,
effect->setBlurRadius(ui->radSpinner->value()); ui->animated->isChecked());
close(); hints.setFlag(QGraphicsBlurEffect::PerformanceHint,
}); ui->performance->isChecked());
connect(ui->buttonBox, &QDialogButtonBox::rejected, [&] { close(); }); hints.setFlag(QGraphicsBlurEffect::QualityHint, ui->quality->isChecked());
effect->setBlurHints(hints);
effect->setBlurRadius(ui->radSpinner->value());
close();
});
connect(ui->buttonBox, &QDialogButtonBox::rejected, [&] { close(); });
} }
BlurDialog::~BlurDialog() BlurDialog::~BlurDialog() { delete ui; }
{
delete ui; void BlurDialog::on_radSpinner_valueChanged(double arg1) {
ui->radSlider->setValue(arg1 * 100);
} }
void BlurDialog::on_radSpinner_valueChanged(double arg1) void BlurDialog::on_radSlider_sliderMoved(int position) {
{ ui->radSpinner->setValue(position / 100.);
ui->radSlider->setValue(arg1 * 100);
}
void BlurDialog::on_radSlider_sliderMoved(int position)
{
ui->radSpinner->setValue(position / 100.);
} }

View File

@ -4,26 +4,24 @@
#include <QDialog> #include <QDialog>
#include <QGraphicsBlurEffect> #include <QGraphicsBlurEffect>
namespace Ui namespace Ui {
{
class BlurDialog; class BlurDialog;
} }
class BlurDialog : public QDialog class BlurDialog : public QDialog {
{ Q_OBJECT
Q_OBJECT
public: public:
explicit BlurDialog(QGraphicsBlurEffect *effect, QWidget *parent = 0); explicit BlurDialog(QGraphicsBlurEffect *effect, QWidget *parent = 0);
~BlurDialog(); ~BlurDialog();
private slots: private slots:
void on_radSpinner_valueChanged(double arg1); void on_radSpinner_valueChanged(double arg1);
void on_radSlider_sliderMoved(int position); void on_radSlider_sliderMoved(int position);
private: private:
Ui::BlurDialog *ui; Ui::BlurDialog *ui;
QGraphicsBlurEffect *effect; QGraphicsBlurEffect *effect;
}; };
#endif // BLURDIALOG_HPP #endif // BLURDIALOG_HPP

View File

@ -9,56 +9,45 @@
#include <cropeditor/cropview.hpp> #include <cropeditor/cropview.hpp>
#include <settings.hpp> #include <settings.hpp>
BrushPenSelection::BrushPenSelection(CropScene *scene) : QDialog(), ui(new Ui::BrushPenSelection) BrushPenSelection::BrushPenSelection(CropScene *scene)
{ : QDialog(), ui(new Ui::BrushPenSelection) {
ui->setupUi(this); ui->setupUi(this);
ui->cosmetic->setChecked(scene->pen().isCosmetic()); ui->cosmetic->setChecked(scene->pen().isCosmetic());
ui->widthSlider->setValue(scene->pen().width()); ui->widthSlider->setValue(scene->pen().width());
ui->widthSpinner->setValue(scene->pen().widthF()); ui->widthSpinner->setValue(scene->pen().widthF());
pen = scene->pen().color(); pen = scene->pen().color();
brush = scene->brush().color(); brush = scene->brush().color();
this->scene = scene; this->scene = scene;
} }
BrushPenSelection::~BrushPenSelection() BrushPenSelection::~BrushPenSelection() { delete ui; }
{
delete ui; void BrushPenSelection::on_penColor_clicked(bool) {
pen = QColorDialog::getColor(pen, this, "Pen Color");
} }
void BrushPenSelection::on_penColor_clicked(bool) void BrushPenSelection::on_brushColor_clicked(bool) {
{ brush = QColorDialog::getColor(brush, this, "Brush Color");
pen = QColorDialog::getColor(pen, this, "Pen Color");
} }
void BrushPenSelection::on_brushColor_clicked(bool) void BrushPenSelection::on_buttonBox_accepted() {
{ scene->pen().setColor(pen);
brush = QColorDialog::getColor(brush, this, "Brush Color"); scene->pen().setCosmetic(ui->cosmetic->isChecked());
scene->pen().setWidthF(ui->widthSpinner->value());
scene->brush().setColor(brush);
settings::settings().setValue("penColor", scene->pen().color());
settings::settings().setValue("penCosmetic", scene->pen().isCosmetic());
settings::settings().setValue("penWidth", scene->pen().widthF());
settings::settings().setValue("brushColor", scene->brush().color());
close();
} }
void BrushPenSelection::on_buttonBox_accepted() void BrushPenSelection::on_buttonBox_rejected() { close(); }
{
scene->pen().setColor(pen); void BrushPenSelection::on_widthSlider_sliderMoved(int position) {
scene->pen().setCosmetic(ui->cosmetic->isChecked()); ui->widthSpinner->setValue(position / 100.);
scene->pen().setWidthF(ui->widthSpinner->value());
scene->brush().setColor(brush);
settings::settings().setValue("penColor", scene->pen().color());
settings::settings().setValue("penCosmetic", scene->pen().isCosmetic());
settings::settings().setValue("penWidth", scene->pen().widthF());
settings::settings().setValue("brushColor", scene->brush().color());
close();
} }
void BrushPenSelection::on_buttonBox_rejected() void BrushPenSelection::on_widthSpinner_valueChanged(double arg) {
{ ui->widthSlider->setValue(arg * 100);
close();
}
void BrushPenSelection::on_widthSlider_sliderMoved(int position)
{
ui->widthSpinner->setValue(position / 100.);
}
void BrushPenSelection::on_widthSpinner_valueChanged(double arg)
{
ui->widthSlider->setValue(arg * 100);
} }

View File

@ -4,33 +4,31 @@
#include <QDialog> #include <QDialog>
#include <cropeditor/cropscene.hpp> #include <cropeditor/cropscene.hpp>
namespace Ui namespace Ui {
{
class BrushPenSelection; class BrushPenSelection;
} }
class BrushPenSelection : public QDialog class BrushPenSelection : public QDialog {
{ Q_OBJECT
Q_OBJECT
public: public:
explicit BrushPenSelection(CropScene *scene); explicit BrushPenSelection(CropScene *scene);
~BrushPenSelection(); ~BrushPenSelection();
private slots: private slots:
void on_penColor_clicked(bool); void on_penColor_clicked(bool);
void on_brushColor_clicked(bool); void on_brushColor_clicked(bool);
void on_buttonBox_accepted(); void on_buttonBox_accepted();
void on_buttonBox_rejected(); void on_buttonBox_rejected();
void on_widthSlider_sliderMoved(int position); void on_widthSlider_sliderMoved(int position);
void on_widthSpinner_valueChanged(double arg1); void on_widthSpinner_valueChanged(double arg1);
private: private:
Ui::BrushPenSelection *ui; Ui::BrushPenSelection *ui;
CropScene *scene; CropScene *scene;
QColor brush, pen; QColor brush, pen;
}; };
#endif // BRUSHPENSELECTION_HPP #endif // BRUSHPENSELECTION_HPP

View File

@ -3,16 +3,15 @@
#include <QDateTime> #include <QDateTime>
#include <QStringList> #include <QStringList>
QString formatter::format(QString toFormat) QString formatter::format(QString toFormat) {
{ QRegExp dateRegex("%\\((.+)\\)date");
QRegExp dateRegex("%\\((.+)\\)date"); dateRegex.indexIn(toFormat);
dateRegex.indexIn(toFormat); QStringList capturedTexts(dateRegex.capturedTexts());
QStringList capturedTexts(dateRegex.capturedTexts()); QString formatted(toFormat);
QString formatted(toFormat); QDateTime date = QDateTime::currentDateTime();
QDateTime date = QDateTime::currentDateTime(); for (int i = 0; i < capturedTexts.length(); i += 2) {
for (int i = 0; i < capturedTexts.length(); i += 2) formatted = formatted.replace(capturedTexts.at(i),
{ date.toString(capturedTexts.at(i + 1)));
formatted = formatted.replace(capturedTexts.at(i), date.toString(capturedTexts.at(i + 1))); }
} return formatted;
return formatted;
} }

View File

@ -4,8 +4,7 @@
#include <QRegExp> #include <QRegExp>
#include <QString> #include <QString>
namespace formatter namespace formatter {
{
QString format(QString toFormat); QString format(QString toFormat);
} }

View File

@ -8,39 +8,38 @@
QMap<QString, QHotkey *> hotkeys; QMap<QString, QHotkey *> hotkeys;
// func gets bound only on first set, or load // func gets bound only on first set, or load
void hotkeying::hotkey(QString seqName, QKeySequence seq, std::function<void()> func) void hotkeying::hotkey(QString seqName, QKeySequence seq,
{ std::function<void()> func) {
if (hotkeys.contains(seqName)) if (hotkeys.contains(seqName))
hotkeys.value(seqName)->setShortcut(seq, true); hotkeys.value(seqName)->setShortcut(seq, true);
else else {
{ QHotkey *hotkey = new QHotkey(seq, true);
QHotkey *hotkey = new QHotkey(seq, true); QObject::connect(hotkey, &QHotkey::activated, func);
QObject::connect(hotkey, &QHotkey::activated, func); hotkeys.insert(seqName, hotkey);
hotkeys.insert(seqName, hotkey); }
} settings::settings().setValue(seqName.prepend("hotkey_"), seq.toString());
settings::settings().setValue(seqName.prepend("hotkey_"), seq.toString());
} }
// forces the hotkey from settings // forces the hotkey from settings
void hotkeying::load(QString seqName, std::function<void()> func) void hotkeying::load(QString seqName, std::function<void()> func) {
{ QHotkey *h;
QHotkey *h; QString name = seqName;
QString name = seqName; name.prepend("hotkey_");
name.prepend("hotkey_"); if (settings::settings().contains(name))
if (settings::settings().contains(name)) h = new QHotkey(QKeySequence(settings::settings().value(name).toString()),
h = new QHotkey(QKeySequence(settings::settings().value(name).toString()), true); true);
else else
h = new QHotkey; h = new QHotkey;
QObject::connect(h, &QHotkey::activated, func); QObject::connect(h, &QHotkey::activated, func);
hotkeys.insert(seqName, h); hotkeys.insert(seqName, h);
} }
bool hotkeying::valid(QString seq) bool hotkeying::valid(QString seq) {
{ return seq.isEmpty() || !QKeySequence(seq).toString().isEmpty();
return seq.isEmpty() || !QKeySequence(seq).toString().isEmpty();
} }
QString hotkeying::sequence(QString seqName) QString hotkeying::sequence(QString seqName) {
{ return hotkeys.contains(seqName)
return hotkeys.contains(seqName) ? hotkeys.value(seqName)->shortcut().toString() : ""; ? hotkeys.value(seqName)->shortcut().toString()
: "";
} }

View File

@ -5,8 +5,7 @@
#include <QString> #include <QString>
#include <functional> #include <functional>
namespace hotkeying namespace hotkeying {
{
void hotkey(QString seqName, QKeySequence seq, std::function<void()> func); void hotkey(QString seqName, QKeySequence seq, std::function<void()> func);
bool valid(QString seq); bool valid(QString seq);
void load(QString seqName, std::function<void()> func); void load(QString seqName, std::function<void()> func);

View File

@ -4,69 +4,62 @@
#include <QNetworkReply> #include <QNetworkReply>
#include <QNetworkRequest> #include <QNetworkRequest>
namespace ioutils namespace ioutils {
{
QNetworkAccessManager networkManager; QNetworkAccessManager networkManager;
} }
void ioutils::getJson(QUrl target, QList<QPair<QString, QString>> headers, std::function<void(QJsonDocument, QNetworkReply *)> callback) void ioutils::getJson(
{ QUrl target, QList<QPair<QString, QString>> headers,
QNetworkRequest req(target); std::function<void(QJsonDocument, QNetworkReply *)> callback) {
for (auto header : headers) QNetworkRequest req(target);
{ for (auto header : headers) {
req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); req.setRawHeader(header.first.toUtf8(), header.second.toUtf8());
} }
QNetworkReply *reply = networkManager.get(req); QNetworkReply *reply = networkManager.get(req);
QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { QObject::connect(reply, &QNetworkReply::finished, [reply, callback] {
callback(QJsonDocument::fromJson(reply->readAll()), reply); callback(QJsonDocument::fromJson(reply->readAll()), reply);
reply->deleteLater(); reply->deleteLater();
}); });
} }
void ioutils::postJson(QUrl target, void ioutils::postJson(
QList<QPair<QString, QString>> headers, QUrl target, QList<QPair<QString, QString>> headers, QByteArray body,
QByteArray body, std::function<void(QJsonDocument, QNetworkReply *)> callback) {
std::function<void(QJsonDocument, QNetworkReply *)> callback) QNetworkRequest req(target);
{ for (auto header : headers) {
QNetworkRequest req(target); req.setRawHeader(header.first.toUtf8(), header.second.toUtf8());
for (auto header : headers) }
{ QNetworkReply *reply = networkManager.post(req, body);
req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); QObject::connect(reply, &QNetworkReply::finished, [reply, callback] {
} callback(QJsonDocument::fromJson(reply->readAll()), reply);
QNetworkReply *reply = networkManager.post(req, body); delete reply;
QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { });
callback(QJsonDocument::fromJson(reply->readAll()), reply);
delete reply;
});
} }
void ioutils::getData(QUrl target, QList<QPair<QString, QString>> headers, std::function<void(QByteArray, QNetworkReply *)> callback) void ioutils::getData(
{ QUrl target, QList<QPair<QString, QString>> headers,
QNetworkRequest req(target); std::function<void(QByteArray, QNetworkReply *)> callback) {
for (auto header : headers) QNetworkRequest req(target);
{ for (auto header : headers) {
req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); req.setRawHeader(header.first.toUtf8(), header.second.toUtf8());
} }
QNetworkReply *reply = networkManager.get(req); QNetworkReply *reply = networkManager.get(req);
QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { QObject::connect(reply, &QNetworkReply::finished, [reply, callback] {
callback(reply->readAll(), reply); callback(reply->readAll(), reply);
delete reply; delete reply;
}); });
} }
void ioutils::postData(QUrl target, void ioutils::postData(
QList<QPair<QString, QString>> headers, QUrl target, QList<QPair<QString, QString>> headers, QByteArray body,
QByteArray body, std::function<void(QByteArray, QNetworkReply *)> callback) {
std::function<void(QByteArray, QNetworkReply *)> callback) QNetworkRequest req(target);
{ for (auto header : headers) {
QNetworkRequest req(target); req.setRawHeader(header.first.toUtf8(), header.second.toUtf8());
for (auto header : headers) }
{ QNetworkReply *reply = networkManager.post(req, body);
req.setRawHeader(header.first.toUtf8(), header.second.toUtf8()); QObject::connect(reply, &QNetworkReply::finished, [reply, callback] {
} callback(reply->readAll(), reply);
QNetworkReply *reply = networkManager.post(req, body); delete reply;
QObject::connect(reply, &QNetworkReply::finished, [reply, callback] { });
callback(reply->readAll(), reply);
delete reply;
});
} }

View File

@ -7,13 +7,18 @@
#include <QUrl> #include <QUrl>
#include <functional> #include <functional>
namespace ioutils namespace ioutils {
{
extern QNetworkAccessManager networkManager; extern QNetworkAccessManager networkManager;
void getJson(QUrl target, QList<QPair<QString, QString>> headers, std::function<void(QJsonDocument, QNetworkReply *)> callback); void getJson(QUrl target, QList<QPair<QString, QString>> headers,
void postJson(QUrl target, QList<QPair<QString, QString>> headers, QByteArray body, std::function<void(QJsonDocument, QNetworkReply *)> callback); std::function<void(QJsonDocument, QNetworkReply *)> callback);
void getData(QUrl target, QList<QPair<QString, QString>> headers, std::function<void(QByteArray, QNetworkReply *)> callback); void postJson(QUrl target, QList<QPair<QString, QString>> headers,
void postData(QUrl target, QList<QPair<QString, QString>> headers, QByteArray body, std::function<void(QByteArray, QNetworkReply *)> callback); QByteArray body,
std::function<void(QJsonDocument, QNetworkReply *)> callback);
void getData(QUrl target, QList<QPair<QString, QString>> headers,
std::function<void(QByteArray, QNetworkReply *)> callback);
void postData(QUrl target, QList<QPair<QString, QString>> headers,
QByteArray body,
std::function<void(QByteArray, QNetworkReply *)> callback);
} }
#endif // IOUTILS_HPP #endif // IOUTILS_HPP

View File

@ -7,51 +7,51 @@
bool verbose = false; bool verbose = false;
void handler(QtMsgType type, const QMessageLogContext &, const QString &msg) void handler(QtMsgType type, const QMessageLogContext &, const QString &msg) {
{ QByteArray localMsg = msg.toLocal8Bit();
QByteArray localMsg = msg.toLocal8Bit(); switch (type) {
switch (type) case QtDebugMsg:
{ if (verbose)
case QtDebugMsg: fprintf(stderr, "DEBUG: %s\n", localMsg.constData());
if (verbose) fprintf(stderr, "DEBUG: %s\n", localMsg.constData()); break;
break; case QtInfoMsg:
case QtInfoMsg: fprintf(stderr, "INFO: %s\n", localMsg.constData());
fprintf(stderr, "INFO: %s\n", localMsg.constData()); break;
break; case QtWarningMsg:
case QtWarningMsg: fprintf(stderr, "WARN: %s\n", localMsg.constData());
fprintf(stderr, "WARN: %s\n", localMsg.constData()); break;
break; case QtCriticalMsg:
case QtCriticalMsg: fprintf(stderr, "CRIT: %s\n", localMsg.constData());
fprintf(stderr, "CRIT: %s\n", localMsg.constData()); break;
break; case QtFatalMsg:
case QtFatalMsg: fprintf(stderr, "FATAL: %s\n", localMsg.constData());
fprintf(stderr, "FATAL: %s\n", localMsg.constData()); break;
break; }
}
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[]) {
{ qInstallMessageHandler(handler);
qInstallMessageHandler(handler); QApplication a(argc, argv);
QApplication a(argc, argv); a.setApplicationName("KShare");
a.setApplicationName("KShare"); a.setOrganizationName("ArsenArsen");
a.setOrganizationName("ArsenArsen"); a.setApplicationVersion("1.1");
a.setApplicationVersion("1.1");
QCommandLineParser parser; QCommandLineParser parser;
parser.addHelpOption(); parser.addHelpOption();
QCommandLineOption h({ "b", "background" }, "Does not show the main window, starts in tray."); QCommandLineOption h({"b", "background"},
QCommandLineOption v({ "v", "verbose" }, "Enables QtDebugMsg outputs"); "Does not show the main window, starts in tray.");
parser.addOption(h); QCommandLineOption v({"v", "verbose"}, "Enables QtDebugMsg outputs");
parser.addOption(v); parser.addOption(h);
parser.process(a); parser.addOption(v);
verbose = parser.isSet(v); parser.process(a);
verbose = parser.isSet(v);
MainWindow w; MainWindow w;
w.show(); w.show();
QTimer::singleShot(0, [&] { QTimer::singleShot(0, [&] {
if (parser.isSet(h)) w.hide(); if (parser.isSet(h))
}); w.hide();
return a.exec(); });
return a.exec();
} }

View File

@ -19,162 +19,143 @@
MainWindow *MainWindow::instance; MainWindow *MainWindow::instance;
void addHotkeyItem(QString text, QString name, std::function<void()> *func) void addHotkeyItem(QString text, QString name, std::function<void()> *func) {
{ QListWidgetItem *item =
QListWidgetItem *item = new QListWidgetItem(text, MainWindow::inst()->ui->hotkeys); new QListWidgetItem(text, MainWindow::inst()->ui->hotkeys);
item->setData(Qt::UserRole + 1, name); item->setData(Qt::UserRole + 1, name);
MainWindow::inst()->fncs.insert(name, func); MainWindow::inst()->fncs.insert(name, func);
hotkeying::load(name, *func); hotkeying::load(name, *func);
} }
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
instance = this;
ui->setupUi(this);
setWindowIcon(QIcon(":/icons/icon.png"));
tray = new QSystemTrayIcon(windowIcon(), this);
tray->setToolTip("KShare");
tray->setVisible(true);
QMenu *menu = new QMenu(this);
QAction *quit = new QAction("Quit", this);
QAction *shtoggle = new QAction("Show/Hide", this);
QAction *fullscreen = new QAction("Take fullscreen shot", this);
QAction *area = new QAction("Take area shot", this);
menu->addActions({quit, shtoggle});
menu->addSeparator();
menu->addActions({fullscreen, area});
connect(quit, &QAction::triggered, this, &MainWindow::quit);
connect(shtoggle, &QAction::triggered, this, &MainWindow::toggleVisible);
connect(tray, &QSystemTrayIcon::messageClicked, this,
&MainWindow::toggleVisible);
connect(tray, &QSystemTrayIcon::activated, this,
[this](QSystemTrayIcon::ActivationReason reason) {
if (reason == QSystemTrayIcon::DoubleClick)
toggleVisible();
});
connect(fullscreen, &QAction::triggered, this,
[] { screenshotter::fullscreenDelayed(); });
connect(area, &QAction::triggered, this,
[] { screenshotter::areaDelayed(); });
tray->setContextMenu(menu);
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) ui->uploaderList->setSelectionBehavior(QAbstractItemView::SelectRows);
{ ui->uploaderList->setSelectionMode(QAbstractItemView::SingleSelection);
instance = this;
ui->setupUi(this);
setWindowIcon(QIcon(":/icons/icon.png"));
tray = new QSystemTrayIcon(windowIcon(), this);
tray->setToolTip("KShare");
tray->setVisible(true);
QMenu *menu = new QMenu(this);
QAction *quit = new QAction("Quit", this);
QAction *shtoggle = new QAction("Show/Hide", this);
QAction *fullscreen = new QAction("Take fullscreen shot", this);
QAction *area = new QAction("Take area shot", this);
menu->addActions({ quit, shtoggle });
menu->addSeparator();
menu->addActions({ fullscreen, area });
connect(quit, &QAction::triggered, this, &MainWindow::quit);
connect(shtoggle, &QAction::triggered, this, &MainWindow::toggleVisible);
connect(tray, &QSystemTrayIcon::messageClicked, this, &MainWindow::toggleVisible);
connect(tray, &QSystemTrayIcon::activated, this, [this](QSystemTrayIcon::ActivationReason reason) {
if (reason == QSystemTrayIcon::DoubleClick) toggleVisible();
});
connect(fullscreen, &QAction::triggered, this, [] { screenshotter::fullscreenDelayed(); });
connect(area, &QAction::triggered, this, [] { screenshotter::areaDelayed(); });
tray->setContextMenu(menu);
ui->uploaderList->setSelectionBehavior(QAbstractItemView::SelectRows); // Add items to uploader selection
ui->uploaderList->setSelectionMode(QAbstractItemView::SingleSelection); for (Uploader *u : UploaderSingleton::inst().uploaderList())
newUploader(u);
connect(&UploaderSingleton::inst(), &UploaderSingleton::newUploader, this,
&MainWindow::newUploader);
// Add items to uploader selection // Set filename scheme
for (Uploader *u : UploaderSingleton::inst().uploaderList()) newUploader(u); if ((settings::settings().contains("fileFormat")))
connect(&UploaderSingleton::inst(), &UploaderSingleton::newUploader, this, &MainWindow::newUploader); setScheme(settings::settings().value("fileFormat").toString());
else
setScheme("Screenshot %(yyyy-MM-dd HH:mm:ss)date");
// Set filename scheme auto errors = UploaderSingleton::inst().errors();
if ((settings::settings().contains("fileFormat"))) if (errors.length() == 1)
setScheme(settings::settings().value("fileFormat").toString()); statusBar()->showMessage(errors.at(0).what());
else else
setScheme("Screenshot %(yyyy-MM-dd HH:mm:ss)date"); statusBar()->showMessage(
QString("Errors visible in console (if present). Count: " +
QString::number(errors.size())));
auto errors = UploaderSingleton::inst().errors(); // Set delay
if (errors.length() == 1) if ((settings::settings().contains("delay")))
statusBar()->showMessage(errors.at(0).what()); ui->delay->setValue(settings::settings().value("delay").toDouble());
else else
statusBar()->showMessage(QString("Errors visible in console (if present). Count: " + QString::number(errors.size()))); ui->delay->setValue(0.25);
// Set delay ui->hotkeys->setSelectionMode(QListWidget::SingleSelection);
if ((settings::settings().contains("delay")))
ui->delay->setValue(settings::settings().value("delay").toDouble());
else
ui->delay->setValue(0.25);
ui->hotkeys->setSelectionMode(QListWidget::SingleSelection); addHotkeyItem("Fullscreen image", "fullscreen",
new std::function<void()>([] { screenshotter::fullscreen(); }));
addHotkeyItem("Fullscreen image", "fullscreen", new std::function<void()>([] { screenshotter::fullscreen(); })); addHotkeyItem("Area image", "area",
addHotkeyItem("Area image", "area", new std::function<void()>([] { screenshotter::area(); })); new std::function<void()>([] { screenshotter::area(); }));
} }
MainWindow::~MainWindow() MainWindow::~MainWindow() { delete ui; }
{
delete ui; void MainWindow::setScheme(QString scheme) { ui->nameScheme->setText(scheme); }
QDoubleSpinBox *MainWindow::delay() { return ui->delay; }
MainWindow *MainWindow::inst() { return instance; }
void MainWindow::closeEvent(QCloseEvent *event) {
event->ignore();
QTimer::singleShot(0, this, &MainWindow::hide);
} }
void MainWindow::setScheme(QString scheme) void MainWindow::quit() { QCoreApplication::quit(); }
{
ui->nameScheme->setText(scheme); void MainWindow::toggleVisible() {
this->setVisible(!this->isVisible());
if (this->isVisible()) {
this->raise();
}
} }
QDoubleSpinBox *MainWindow::delay() void MainWindow::newUploader(Uploader *u) {
{ QListWidgetItem *item = new QListWidgetItem(u->name());
return ui->delay; item->setToolTip(u->description());
ui->uploaderList->addItem(item);
if (u->name() == UploaderSingleton::inst().selectedUploader())
item->setSelected(true);
} }
MainWindow *MainWindow::inst() void MainWindow::on_actionQuit_triggered() { quit(); }
{
return instance; void MainWindow::on_actionFullscreen_triggered() {
screenshotter::fullscreenDelayed();
} }
void MainWindow::closeEvent(QCloseEvent *event) void MainWindow::on_actionArea_triggered() { screenshotter::areaDelayed(); }
{
event->ignore(); void MainWindow::on_uploaderList_clicked(const QModelIndex &) {
QTimer::singleShot(0, this, &MainWindow::hide); QList<QListWidgetItem *> index = ui->uploaderList->selectedItems();
if (index.size() == 1) {
UploaderSingleton::inst().set(index.at(0)->text());
}
} }
void MainWindow::quit() void MainWindow::on_nameScheme_textEdited(const QString &arg1) {
{ settings::settings().setValue("fileFormat", arg1);
QCoreApplication::quit();
} }
void MainWindow::toggleVisible() void MainWindow::on_delay_valueChanged(double arg1) {
{ settings::settings().setValue("delay", arg1);
this->setVisible(!this->isVisible());
if (this->isVisible())
{
this->raise();
}
} }
void MainWindow::newUploader(Uploader *u) void MainWindow::on_hotkeys_doubleClicked(const QModelIndex &) {
{ if (ui->hotkeys->selectedItems().length() == 1) {
QListWidgetItem *item = new QListWidgetItem(u->name()); QListWidgetItem *i = ui->hotkeys->selectedItems().at(0);
item->setToolTip(u->description()); QString str = i->data(Qt::UserRole + 1).toString();
ui->uploaderList->addItem(item); QString seq = QInputDialog::getText(ui->centralWidget, "Hotkey Input",
if (u->name() == UploaderSingleton::inst().selectedUploader()) item->setSelected(true); "Insert hotkey:", QLineEdit::Normal,
} hotkeying::sequence(str));
if (hotkeying::valid(seq))
void MainWindow::on_actionQuit_triggered() hotkeying::hotkey(str, QKeySequence(seq), *fncs.value(str));
{ }
quit();
}
void MainWindow::on_actionFullscreen_triggered()
{
screenshotter::fullscreenDelayed();
}
void MainWindow::on_actionArea_triggered()
{
screenshotter::areaDelayed();
}
void MainWindow::on_uploaderList_clicked(const QModelIndex &)
{
QList<QListWidgetItem *> index = ui->uploaderList->selectedItems();
if (index.size() == 1)
{
UploaderSingleton::inst().set(index.at(0)->text());
}
}
void MainWindow::on_nameScheme_textEdited(const QString &arg1)
{
settings::settings().setValue("fileFormat", arg1);
}
void MainWindow::on_delay_valueChanged(double arg1)
{
settings::settings().setValue("delay", arg1);
}
void MainWindow::on_hotkeys_doubleClicked(const QModelIndex &)
{
if (ui->hotkeys->selectedItems().length() == 1)
{
QListWidgetItem *i = ui->hotkeys->selectedItems().at(0);
QString str = i->data(Qt::UserRole + 1).toString();
QString seq = QInputDialog::getText(ui->centralWidget, "Hotkey Input", "Insert hotkey:", QLineEdit::Normal,
hotkeying::sequence(str));
if (hotkeying::valid(seq)) hotkeying::hotkey(str, QKeySequence(seq), *fncs.value(str));
}
} }

View File

@ -9,46 +9,44 @@
#include <uploaders/uploader.hpp> #include <uploaders/uploader.hpp>
namespace Ui namespace Ui {
{
class MainWindow; class MainWindow;
} }
class MainWindow : public QMainWindow class MainWindow : public QMainWindow {
{ Q_OBJECT
Q_OBJECT private slots:
private slots: void quit();
void quit(); void toggleVisible();
void toggleVisible(); void newUploader(Uploader *u);
void newUploader(Uploader *u);
void on_actionQuit_triggered(); void on_actionQuit_triggered();
void on_actionFullscreen_triggered(); void on_actionFullscreen_triggered();
void on_actionArea_triggered(); void on_actionArea_triggered();
void on_uploaderList_clicked(const QModelIndex &); void on_uploaderList_clicked(const QModelIndex &);
void on_nameScheme_textEdited(const QString &arg1); void on_nameScheme_textEdited(const QString &arg1);
void on_delay_valueChanged(double arg1); void on_delay_valueChanged(double arg1);
void on_hotkeys_doubleClicked(const QModelIndex &index); void on_hotkeys_doubleClicked(const QModelIndex &index);
public: public:
explicit MainWindow(QWidget *parent = 0); explicit MainWindow(QWidget *parent = 0);
~MainWindow(); ~MainWindow();
Ui::MainWindow *ui; Ui::MainWindow *ui;
QSystemTrayIcon *tray; QSystemTrayIcon *tray;
void setScheme(QString scheme); void setScheme(QString scheme);
QDoubleSpinBox *delay(); QDoubleSpinBox *delay();
static MainWindow *inst(); static MainWindow *inst();
QMap<QString, std::function<void()> *> fncs; QMap<QString, std::function<void()> *> fncs;
private: private:
static MainWindow *instance; static MainWindow *instance;
protected: protected:
void closeEvent(QCloseEvent *event); void closeEvent(QCloseEvent *event);
}; };
#endif // MAINWINDOW_HPP #endif // MAINWINDOW_HPP

View File

@ -3,8 +3,8 @@
#include "mainwindow.hpp" #include "mainwindow.hpp"
#include <QStatusBar> #include <QStatusBar>
void notifications::notify(QString title, QString body, QSystemTrayIcon::MessageIcon icon) void notifications::notify(QString title, QString body,
{ QSystemTrayIcon::MessageIcon icon) {
MainWindow::inst()->tray->showMessage(title, body, icon, 5000); MainWindow::inst()->tray->showMessage(title, body, icon, 5000);
MainWindow::inst()->statusBar()->showMessage(title + ": " + body); MainWindow::inst()->statusBar()->showMessage(title + ": " + body);
} }

View File

@ -4,9 +4,9 @@
#include <QString> #include <QString>
#include <QSystemTrayIcon> #include <QSystemTrayIcon>
namespace notifications namespace notifications {
{ void notify(QString title, QString body,
void notify(QString title, QString body, QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information); QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information);
} }
#endif // NOTIFICATIONS_HPP #endif // NOTIFICATIONS_HPP

View File

@ -6,23 +6,23 @@
#include <QDoubleSpinBox> #include <QDoubleSpinBox>
#include <QTimer> #include <QTimer>
void screenshotter::area() void screenshotter::area() {
{ CropEditor *editor = new CropEditor(screenshotutil::fullscreen());
CropEditor *editor = new CropEditor(screenshotutil::fullscreen()); QObject::connect(editor, &CropEditor::cropped, [&](QPixmap *pixmap) {
QObject::connect(editor, &CropEditor::cropped, [&](QPixmap *pixmap) { UploaderSingleton::inst().upload(pixmap); }); UploaderSingleton::inst().upload(pixmap);
});
} }
void screenshotter::fullscreen() void screenshotter::fullscreen() {
{ UploaderSingleton::inst().upload(screenshotutil::fullscreen());
UploaderSingleton::inst().upload(screenshotutil::fullscreen());
} }
void screenshotter::areaDelayed() void screenshotter::areaDelayed() {
{ QTimer::singleShot(MainWindow::inst()->delay()->value() * 1000,
QTimer::singleShot(MainWindow::inst()->delay()->value() * 1000, &screenshotter::area); &screenshotter::area);
} }
void screenshotter::fullscreenDelayed() void screenshotter::fullscreenDelayed() {
{ QTimer::singleShot(MainWindow::inst()->delay()->value() * 1000,
QTimer::singleShot(MainWindow::inst()->delay()->value() * 1000, &screenshotter::fullscreen); &screenshotter::fullscreen);
} }

View File

@ -1,8 +1,7 @@
#ifndef SCREENSHOTTER_HPP #ifndef SCREENSHOTTER_HPP
#define SCREENSHOTTER_HPP #define SCREENSHOTTER_HPP
namespace screenshotter namespace screenshotter {
{
void fullscreen(); void fullscreen();
void area(); void area();
void fullscreenDelayed(); void fullscreenDelayed();

View File

@ -5,21 +5,16 @@
#include <QPixmap> #include <QPixmap>
#include <QScreen> #include <QScreen>
QPixmap *screenshotutil::fullscreen() QPixmap *screenshotutil::fullscreen() { return window(0); }
{
return window(0); QPixmap *screenshotutil::window(long wid) {
QScreen *w = QApplication::primaryScreen();
QPixmap screen = w->grabWindow(wid);
QPixmap *pm = new QPixmap(screen.size());
screen.swap(*pm);
return pm;
} }
QPixmap *screenshotutil::window(long wid) void screenshotutil::toClipboard(QString value) {
{ QApplication::clipboard()->setText(value);
QScreen *w = QApplication::primaryScreen();
QPixmap screen = w->grabWindow(wid);
QPixmap *pm = new QPixmap(screen.size());
screen.swap(*pm);
return pm;
}
void screenshotutil::toClipboard(QString value)
{
QApplication::clipboard()->setText(value);
} }

View File

@ -3,8 +3,7 @@
#include <QPixmap> #include <QPixmap>
namespace screenshotutil namespace screenshotutil {
{
QPixmap *fullscreen(); QPixmap *fullscreen();
QPixmap *window(long wid); QPixmap *window(long wid);
void toClipboard(QString value); void toClipboard(QString value);

View File

@ -2,14 +2,15 @@
#include <QStandardPaths> #include <QStandardPaths>
QSettings &settings::settings() QSettings &settings::settings() {
{ static QDir configDir(
static QDir configDir(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)); QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation));
if (configDir.path() == QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)) if (configDir.path() ==
{ QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)) {
configDir.mkdir("KShare"); configDir.mkdir("KShare");
configDir.cd("KShare"); configDir.cd("KShare");
} }
static QSettings settings(configDir.absoluteFilePath("settings.ini"), QSettings::IniFormat); static QSettings settings(configDir.absoluteFilePath("settings.ini"),
return settings; QSettings::IniFormat);
return settings;
} }

View File

@ -4,8 +4,7 @@
#include <QDir> #include <QDir>
#include <QSettings> #include <QSettings>
namespace settings namespace settings {
{
QSettings &settings(); QSettings &settings();
} }

View File

@ -12,350 +12,317 @@
using std::runtime_error; using std::runtime_error;
void error(QString absFilePath, QString err) void error(QString absFilePath, QString err) {
{ throw runtime_error(
throw runtime_error((QString("Invalid file: ").append(absFilePath) + ": " + err).toStdString()); (QString("Invalid file: ").append(absFilePath) + ": " + err)
.toStdString());
} }
CustomUploader::CustomUploader(QString absFilePath) CustomUploader::CustomUploader(QString absFilePath) {
{ types.insert("PNG", "image/png"); // This is a list of supported formats, too
types.insert("PNG", "image/png"); // This is a list of supported formats, too types.insert("GIF", "image/gif");
types.insert("GIF", "image/gif"); types.insert("JPG", "image/jpeg");
types.insert("JPG", "image/jpeg"); types.insert("JPEG", "image/jpeg");
types.insert("JPEG", "image/jpeg"); types.insert("WEBM", "video/webm");
types.insert("WEBM", "video/webm"); types.insert("MP4", "video/mp4");
types.insert("MP4", "video/mp4"); // Let's go
// Let's go QFile file(absFilePath);
QFile file(absFilePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) error(absFilePath, file.errorString()); error(absFilePath, file.errorString());
QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
if (!doc.isObject()) if (!doc.isObject()) {
{ error(absFilePath, "Root not an object");
error(absFilePath, "Root not an object"); }
} QJsonObject obj = doc.object();
QJsonObject obj = doc.object(); if (!obj["name"].isString())
if (!obj["name"].isString()) error(absFilePath, "name is not a string");
error(absFilePath, "name is not a string"); else
uName = obj["name"].toString();
if (!obj.contains("desc")) {
if (!obj["desc"].isString())
/*t*/ error(absFilePath, "desc not a string");
else else
uName = obj["name"].toString(); desc = obj["desc"].toString();
if (!obj.contains("desc")) } else
{ desc = absFilePath;
if (!obj["desc"].isString()) QJsonValue m = obj["method"];
/*t*/ error(absFilePath, "desc not a string"); if (!m.isUndefined() && !m.isNull()) {
else if (!m.isString())
desc = obj["desc"].toString(); error(absFilePath, "method not a string");
} QString toCheck = m.toString().toLower();
if (toCheck == "post")
method = HttpMethod::POST;
else else
desc = absFilePath; error(absFilePath, "method invalid");
QJsonValue m = obj["method"]; }
if (!m.isUndefined() && !m.isNull()) QJsonValue url = obj["target"];
{ if (!url.isString()) {
if (!m.isString()) error(absFilePath, "method not a string"); error(absFilePath, "target missing");
QString toCheck = m.toString().toLower(); }
if (toCheck == "post") QUrl target(url.toString());
method = HttpMethod::POST; if (!target.isValid())
else error(absFilePath, "target not URL");
error(absFilePath, "method invalid"); this->target = target;
} QJsonValue formatValue = obj["format"];
QJsonValue url = obj["target"]; if (!formatValue.isUndefined() && !formatValue.isNull()) {
if (!url.isString()) if (formatValue.isString()) {
{ QString formatString = formatValue.toString().toLower();
error(absFilePath, "target missing"); if (formatString == "x-www-form-urlencoded")
} format = RequestFormat::X_WWW_FORM_URLENCODED;
QUrl target(url.toString()); else if (formatString == "json")
if (!target.isValid()) error(absFilePath, "target not URL"); format = RequestFormat::JSON;
this->target = target; else if (formatString == "plain")
QJsonValue formatValue = obj["format"]; format = RequestFormat::PLAIN;
if (!formatValue.isUndefined() && !formatValue.isNull()) else
{ error(absFilePath, "format invalid");
if (formatValue.isString())
{
QString formatString = formatValue.toString().toLower();
if (formatString == "x-www-form-urlencoded")
format = RequestFormat::X_WWW_FORM_URLENCODED;
else if (formatString == "json")
format = RequestFormat::JSON;
else if (formatString == "plain")
format = RequestFormat::PLAIN;
else
error(absFilePath, "format invalid");
}
} }
} else
error(absFilePath, "format provided but not string");
QJsonValue imageValue = obj["imageformat"];
if (!imageValue.isString()) {
error(absFilePath, "imageformat not string");
}
QString imageFormat = imageValue.toString();
if (imageFormat == "base64" ||
QRegExp("base64\\([^+]+\\+[^+]+)").exactMatch(imageFormat) ||
QRegExp("[^+]+\\+[^+]+").exactMatch(imageFormat)) {
this->iFormat = imageFormat;
} else
error(absFilePath, "imageformat invalid");
QJsonValue bodyValue = obj["body"];
if (format != RequestFormat::PLAIN) {
if (bodyValue.isUndefined())
error(absFilePath, "body not set");
if (bodyValue.isObject())
body = bodyValue;
else else
error(absFilePath, "format provided but not string"); error(absFilePath, "body not object");
QJsonValue imageValue = obj["imageformat"]; } else {
if (!imageValue.isString()) if (bodyValue.isString()) {
{ body = bodyValue;
error(absFilePath, "imageformat not string"); } else
} error(absFilePath, "body not string (reason: format: PLAIN)");
QString imageFormat = imageValue.toString(); }
if (imageFormat == "base64" || QRegExp("base64\\([^+]+\\+[^+]+)").exactMatch(imageFormat) QJsonValue headerVal = obj["headers"];
|| QRegExp("[^+]+\\+[^+]+").exactMatch(imageFormat)) if (!(headerVal.isUndefined() || headerVal.isNull())) {
{ if (!headerVal.isObject())
this->iFormat = imageFormat; error(absFilePath, "headers must be object");
} headers = headerVal.toObject();
else } else
error(absFilePath, "imageformat invalid"); headers = QJsonObject();
QJsonValue bodyValue = obj["body"]; QJsonValue returnPsVal = obj["return"];
if (format != RequestFormat::PLAIN) if (returnPsVal.isString()) {
{ returnPathspec = returnPsVal.toString();
if (bodyValue.isUndefined()) error(absFilePath, "body not set"); } else
if (bodyValue.isObject()) error(absFilePath, "return invalid");
body = bodyValue;
else
error(absFilePath, "body not object");
}
else
{
if (bodyValue.isString())
{
body = bodyValue;
}
else
error(absFilePath, "body not string (reason: format: PLAIN)");
}
QJsonValue headerVal = obj["headers"];
if (!(headerVal.isUndefined() || headerVal.isNull()))
{
if (!headerVal.isObject()) error(absFilePath, "headers must be object");
headers = headerVal.toObject();
}
else
headers = QJsonObject();
QJsonValue returnPsVal = obj["return"];
if (returnPsVal.isString())
{
returnPathspec = returnPsVal.toString();
}
else
error(absFilePath, "return invalid");
} }
QString CustomUploader::name() QString CustomUploader::name() { return uName; }
{
return uName;
}
QString CustomUploader::description() QString CustomUploader::description() { return desc; }
{
return desc;
}
QString getCType(RequestFormat format, QString plainType) QString getCType(RequestFormat format, QString plainType) {
{ switch (format) {
switch (format) case RequestFormat::X_WWW_FORM_URLENCODED:
{ return "application/x-www-form-urlencoded";
case RequestFormat::X_WWW_FORM_URLENCODED: case RequestFormat::JSON:
return "application/x-www-form-urlencoded"; return "application/json";
case RequestFormat::JSON: case RequestFormat::PLAIN:
return "application/json";
case RequestFormat::PLAIN:
return plainType;
}
return plainType; return plainType;
}
return plainType;
} }
QList<QPair<QString, QString>> getHeaders(QJsonObject h, QString imageFormat, QMap<QString, QString> types, RequestFormat format) QList<QPair<QString, QString>> getHeaders(QJsonObject h, QString imageFormat,
{ QMap<QString, QString> types,
QList<QPair<QString, QString>> headers; RequestFormat format) {
for (QString s : h.keys()) QList<QPair<QString, QString>> headers;
{ for (QString s : h.keys()) {
if (s.toLower() == "content-type") continue; if (s.toLower() == "content-type")
QJsonValue v = h[s]; continue;
if (!v.isString()) QJsonValue v = h[s];
headers << QPair<QString, QString>(s, QJsonDocument::fromVariant(v.toVariant()).toJson()); if (!v.isString())
else headers << QPair<QString, QString>(
headers << QPair<QString, QString>(s, v.toString()); s, QJsonDocument::fromVariant(v.toVariant()).toJson());
else
headers << QPair<QString, QString>(s, v.toString());
}
headers << QPair<QString, QString>(
"Content-Type", getCType(format, types.value(imageFormat)));
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";
else if (QRegExp("[^+]+\\+[^+]+").exactMatch(iFormat))
return iFormat.split('+')[(int)animated];
else if (QRegExp("base64\\([^+]+\\+[^+]+)").exactMatch(iFormat))
return iFormat.mid(7, iFormat.length() - 8).split('+')[(int)animated];
return "";
}
QJsonObject recurseAndReplace(QJsonObject &body, QByteArray &data,
QString contentType) {
QJsonObject o;
for (QString s : body.keys()) {
QJsonValue v = body[s];
if (v.isObject()) {
QJsonObject vo = v.toObject();
o.insert(s, recurseAndReplace(vo, data, contentType));
} else if (v.isString()) {
QString str = v.toString();
if (str.startsWith("/") && str.endsWith("/")) {
o.insert(
s,
str.replace("%image", data).replace("%contenttype", contentType));
}
} }
headers << QPair<QString, QString>("Content-Type", getCType(format, types.value(imageFormat))); }
return headers; return o;
} }
QByteArray imageBytes(QPixmap *pixmap, QString format) QString parsePathspec(QJsonDocument &response, QString &pathspec) {
{ if (!pathspec.startsWith(".")) {
QByteArray returnVal; // Does not point to anything
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";
else if (QRegExp("[^+]+\\+[^+]+").exactMatch(iFormat))
return iFormat.split('+')[(int)animated];
else if (QRegExp("base64\\([^+]+\\+[^+]+)").exactMatch(iFormat))
return iFormat.mid(7, iFormat.length() - 8).split('+')[(int)animated];
return ""; return "";
} } else {
if (!response.isObject())
QJsonObject recurseAndReplace(QJsonObject &body, QByteArray &data, QString contentType) return "";
{ QStringList fields = pathspec.right(pathspec.length() - 1)
QJsonObject o; .split('.', QString::SkipEmptyParts);
for (QString s : body.keys()) QJsonObject o = response.object();
{ if (pathspec == ".") {
QJsonValue v = body[s]; return QString::fromUtf8(response.toJson());
if (v.isObject())
{
QJsonObject vo = v.toObject();
o.insert(s, recurseAndReplace(vo, data, contentType));
}
else if (v.isString())
{
QString str = v.toString();
if (str.startsWith("/") && str.endsWith("/"))
{
o.insert(s, str.replace("%image", data).replace("%contenttype", contentType));
}
}
} }
return o; QJsonValue val = o[fields.at(0)];
} if (val.isUndefined() || val.isNull())
return "";
QString parsePathspec(QJsonDocument &response, QString &pathspec) else if (val.isString())
{ return val.toString();
if (!pathspec.startsWith(".")) else if (!val.isObject())
{ return QString::fromUtf8(
// Does not point to anything QJsonDocument::fromVariant(val.toVariant()).toJson());
for (int i = 1; i < fields.size(); i++) {
if (val.isUndefined() || val.isNull())
return ""; return "";
else if (val.isString())
return val.toString();
else if (!val.isObject())
return QString::fromUtf8(
QJsonDocument::fromVariant(val.toVariant()).toJson());
else
val = val.toObject()[fields.at(i)];
} }
else if (val.isUndefined() || val.isNull())
{ return "";
if (!response.isObject()) return ""; else if (val.isString())
QStringList fields = pathspec.right(pathspec.length() - 1).split('.', QString::SkipEmptyParts); return val.toString();
QJsonObject o = response.object(); else if (!val.isObject())
if (pathspec == ".") return QString::fromUtf8(
{ QJsonDocument::fromVariant(val.toVariant()).toJson());
return QString::fromUtf8(response.toJson()); }
} return "";
QJsonValue val = o[fields.at(0)];
if (val.isUndefined() || val.isNull())
return "";
else if (val.isString())
return val.toString();
else if (!val.isObject())
return QString::fromUtf8(QJsonDocument::fromVariant(val.toVariant()).toJson());
for (int i = 1; i < fields.size(); i++)
{
if (val.isUndefined() || val.isNull())
return "";
else if (val.isString())
return val.toString();
else if (!val.isObject())
return QString::fromUtf8(QJsonDocument::fromVariant(val.toVariant()).toJson());
else
val = val.toObject()[fields.at(i)];
}
if (val.isUndefined() || val.isNull())
return "";
else if (val.isString())
return val.toString();
else if (!val.isObject())
return QString::fromUtf8(QJsonDocument::fromVariant(val.toVariant()).toJson());
}
return "";
} }
void parseResult(QJsonDocument result, QString returnPathspec, QString name) void parseResult(QJsonDocument result, QString returnPathspec, QString name) {
{ if (result.isObject()) {
if (result.isObject()) qDebug() << result.object()[".url"];
{ QString url = parsePathspec(result, returnPathspec);
qDebug() << result.object()[".url"]; if (!url.isEmpty()) {
QString url = parsePathspec(result, returnPathspec); QApplication::clipboard()->setText(url);
if (!url.isEmpty()) notifications::notify("KShare Custom Uploader " + name,
{ "Copied upload link to clipboard!");
QApplication::clipboard()->setText(url); } else
notifications::notify("KShare Custom Uploader " + name, "Copied upload link to clipboard!"); notifications::notify("KShare Custom Uploader " + name,
} "Upload done, but result empty!");
else } else
notifications::notify("KShare Custom Uploader " + name, "Upload done, but result empty!"); notifications::notify("KShare Custom Uploader " + name,
} "Upload done, but result is not JSON Object!");
else
notifications::notify("KShare Custom Uploader " + name, "Upload done, but result is not JSON Object!");
} }
void CustomUploader::doUpload(QPixmap *pixmap) void CustomUploader::doUpload(QPixmap *pixmap) {
{ auto h = getHeaders(headers, getFormatString(false), types, this->format);
auto h = getHeaders(headers, getFormatString(false), types, this->format); QString format = getFormatString(false); // Soon:tm:
QString format = getFormatString(false); // Soon:tm: QByteArray data;
QByteArray data; QByteArray imgData = imageBytes(pixmap, format);
QByteArray imgData = imageBytes(pixmap, format); if (iFormat == "base64" ||
if (iFormat == "base64" || QRegExp("base64\\([^+]\\+[^+]\\)").exactMatch(iFormat)) imgData = imgData.toBase64(); QRegExp("base64\\([^+]\\+[^+]\\)").exactMatch(iFormat))
switch (this->format) imgData = imgData.toBase64();
{ switch (this->format) {
case RequestFormat::PLAIN: case RequestFormat::PLAIN: {
{ data = imgData;
data = imgData; } break;
case RequestFormat::JSON: {
if (body.isString()) {
QStringList split = body.toString()
.replace("%contenttype", types.value(format))
.split("%imagedata");
for (int i = 0; i < split.size(); i++) {
data.append(split[i]);
if (i < split.size() - 1)
data.append(imgData);
}
} else {
QJsonObject vo = body.toObject();
data = QJsonDocument::fromVariant(
recurseAndReplace(vo, imgData, types.value(format))
.toVariantMap())
.toJson();
}
} break;
case RequestFormat::X_WWW_FORM_URLENCODED: {
QJsonObject body = this->body.toObject();
for (QString key : body.keys()) {
QJsonValue val = body[key];
if (val.isString()) {
QString str = val.toString();
QByteArray strB;
if (str.startsWith("/") && str.endsWith("/")) {
str = str.mid(1, str.length() - 2);
QStringList split = str.replace("%contenttype", types.value(format))
.split("%imagedata");
for (int i = 0; i < split.size(); i++) {
strB.append(split[i]);
if (i < split.size() - 1)
strB.append(imgData);
}
}
data.append(QUrl::toPercentEncoding(key)).append('=').append(strB);
} else {
if (!data.isEmpty())
data.append('&');
data.append(QUrl::toPercentEncoding(key))
.append('=')
.append(QUrl::toPercentEncoding(
QJsonDocument::fromVariant(body[key].toVariant()).toJson()));
}
}
} break;
}
switch (method) {
case HttpMethod::POST:
if (returnPathspec == "|") {
ioutils::postData(
target, h, data, [&](QByteArray result, QNetworkReply *) {
QApplication::clipboard()->setText(QString::fromUtf8(result));
notifications::notify("KShare Custom Uploader " + name(),
"Copied upload result to clipboard!");
});
} else {
ioutils::postJson(target, h, data,
[&](QJsonDocument result, QNetworkReply *) {
parseResult(result, returnPathspec, name());
});
} }
break; break;
case RequestFormat::JSON: }
{
if (body.isString())
{
QStringList split = body.toString().replace("%contenttype", types.value(format)).split("%imagedata");
for (int i = 0; i < split.size(); i++)
{
data.append(split[i]);
if (i < split.size() - 1) data.append(imgData);
}
}
else
{
QJsonObject vo = body.toObject();
data = QJsonDocument::fromVariant(recurseAndReplace(vo, imgData, types.value(format)).toVariantMap()).toJson();
}
}
break;
case RequestFormat::X_WWW_FORM_URLENCODED:
{
QJsonObject body = this->body.toObject();
for (QString key : body.keys())
{
QJsonValue val = body[key];
if (val.isString())
{
QString str = val.toString();
QByteArray strB;
if (str.startsWith("/") && str.endsWith("/"))
{
str = str.mid(1, str.length() - 2);
QStringList split = str.replace("%contenttype", types.value(format)).split("%imagedata");
for (int i = 0; i < split.size(); i++)
{
strB.append(split[i]);
if (i < split.size() - 1) strB.append(imgData);
}
}
data.append(QUrl::toPercentEncoding(key)).append('=').append(strB);
}
else
{
if (!data.isEmpty()) data.append('&');
data.append(QUrl::toPercentEncoding(key))
.append('=')
.append(QUrl::toPercentEncoding(QJsonDocument::fromVariant(body[key].toVariant()).toJson()));
}
}
}
break;
}
switch (method)
{
case HttpMethod::POST:
if (returnPathspec == "|")
{
ioutils::postData(target, h, data, [&](QByteArray result, QNetworkReply *) {
QApplication::clipboard()->setText(QString::fromUtf8(result));
notifications::notify("KShare Custom Uploader " + name(), "Copied upload result to clipboard!");
});
}
else
{
ioutils::postJson(target, h, data,
[&](QJsonDocument result, QNetworkReply *) { parseResult(result, returnPathspec, name()); });
}
break;
}
} }

View File

@ -6,38 +6,29 @@
#include <QMap> #include <QMap>
#include <QUrl> #include <QUrl>
enum class HttpMethod enum class HttpMethod { POST };
{
POST
};
enum class RequestFormat enum class RequestFormat { X_WWW_FORM_URLENCODED, JSON, PLAIN };
{
X_WWW_FORM_URLENCODED,
JSON,
PLAIN
};
class CustomUploader : public Uploader class CustomUploader : public Uploader {
{ public:
public: CustomUploader(QString absFilePath);
CustomUploader(QString absFilePath); QString name();
QString name(); QString description();
QString description(); void doUpload(QPixmap *pixmap);
void doUpload(QPixmap *pixmap); QString getFormatString(bool animated);
QString getFormatString(bool animated); QMap<QString, QString> types;
QMap<QString, QString> types;
private: private:
QString desc; QString desc;
QString uName; QString uName;
RequestFormat format = RequestFormat::JSON; RequestFormat format = RequestFormat::JSON;
HttpMethod method = HttpMethod::POST; HttpMethod method = HttpMethod::POST;
QUrl target; QUrl target;
QJsonValue body; QJsonValue body;
QJsonObject headers; QJsonObject headers;
QString returnPathspec; QString returnPathspec;
QString iFormat; QString iFormat;
}; };
#endif // CUSTOMUPLOADER_HPP #endif // CUSTOMUPLOADER_HPP

View File

@ -4,8 +4,7 @@
#include <QClipboard> #include <QClipboard>
#include <notifications.hpp> #include <notifications.hpp>
void ClipboardUploader::doUpload(QPixmap *pixmap) void ClipboardUploader::doUpload(QPixmap *pixmap) {
{ QApplication::clipboard()->setImage(pixmap->toImage());
QApplication::clipboard()->setImage(pixmap->toImage()); notifications::notify("KShare", "Copied to clipboard!");
notifications::notify("KShare", "Copied to clipboard!");
} }

View File

@ -4,18 +4,11 @@
#include <QPixmap> #include <QPixmap>
#include <uploaders/uploader.hpp> #include <uploaders/uploader.hpp>
class ClipboardUploader : public Uploader class ClipboardUploader : public Uploader {
{ public:
public: QString name() { return "clipboard"; }
QString name() QString description() { return "Copies the image to clipboard"; }
{ void doUpload(QPixmap *pixmap);
return "clipboard";
}
QString description()
{
return "Copies the image to clipboard";
}
void doUpload(QPixmap *pixmap);
}; };
#endif // CLIPBOARDUPLOADER_HPP #endif // CLIPBOARDUPLOADER_HPP

View File

@ -7,19 +7,23 @@
#include <notifications.hpp> #include <notifications.hpp>
#include <screenshotutil.hpp> #include <screenshotutil.hpp>
void ImgurUploader::doUpload(QPixmap *pixmap) void ImgurUploader::doUpload(QPixmap *pixmap) {
{ QByteArray byteArray;
QByteArray byteArray; QBuffer buffer(&byteArray);
QBuffer buffer(&byteArray); pixmap->save(&buffer, "PNG");
pixmap->save(&buffer, "PNG"); ioutils::postJson(
ioutils::postJson(QUrl("https://api.imgur.com/3/image"), QUrl("https://api.imgur.com/3/image"),
QList<QPair<QString, QString>>() QList<QPair<QString, QString>>()
<< QPair<QString, QString>("Content-Type", "application/x-www-form-urlencoded") << QPair<QString, QString>("Content-Type",
<< QPair<QString, QString>("Authorization", "Client-ID 8a98f183fc895da"), "application/x-www-form-urlencoded")
byteArray, [](QJsonDocument res, QNetworkReply *) { << QPair<QString, QString>("Authorization",
QString result = res.object()["data"].toObject()["link"].toString(); "Client-ID 8a98f183fc895da"),
screenshotutil::toClipboard(result); byteArray, [](QJsonDocument res, QNetworkReply *) {
notifications::notify("KShare imgur Uploader ", QString result = res.object()["data"].toObject()["link"].toString();
result.isEmpty() ? "Failed upload!" : "Upload done, but result empty!"); screenshotutil::toClipboard(result);
}); notifications::notify("KShare imgur Uploader ",
result.isEmpty()
? "Failed upload!"
: "Upload done, but result empty!");
});
} }

View File

@ -3,18 +3,11 @@
#include "../uploader.hpp" #include "../uploader.hpp"
class ImgurUploader : public Uploader class ImgurUploader : public Uploader {
{ public:
public: QString name() { return "imgur"; }
QString name() QString description() { return "imgur.com uploader"; }
{ void doUpload(QPixmap *pixmap);
return "imgur";
}
QString description()
{
return "imgur.com uploader";
}
void doUpload(QPixmap *pixmap);
}; };
#endif // IMGURUPLOADER_HPP #endif // IMGURUPLOADER_HPP

View File

@ -4,12 +4,11 @@
#include <QPixmap> #include <QPixmap>
#include <QString> #include <QString>
class Uploader class Uploader {
{ public:
public: virtual void doUpload(QPixmap *pixmap) = 0;
virtual void doUpload(QPixmap *pixmap) = 0; virtual QString name() = 0;
virtual QString name() = 0; virtual QString description() = 0;
virtual QString description() = 0;
}; };
#endif // UPLOADER_HPP #endif // UPLOADER_HPP

View File

@ -8,86 +8,70 @@
#include <formatter.hpp> #include <formatter.hpp>
#include <settings.hpp> #include <settings.hpp>
UploaderSingleton::UploaderSingleton() : QObject() UploaderSingleton::UploaderSingleton() : QObject() {
{ QDir configDir(
QDir configDir(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation)); QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation));
configDir.mkpath("KShare/uploaders"); configDir.mkpath("KShare/uploaders");
configDir.cd("KShare/uploaders"); configDir.cd("KShare/uploaders");
configDir.setNameFilters({ "*.uploader" }); configDir.setNameFilters({"*.uploader"});
for (QString file : configDir.entryList()) for (QString file : configDir.entryList()) {
{ try {
try registerUploader(new CustomUploader(configDir.absoluteFilePath(file)));
{ } catch (std::runtime_error e) {
registerUploader(new CustomUploader(configDir.absoluteFilePath(file))); qWarning() << e.what();
} errs << e;
catch (std::runtime_error e)
{
qWarning() << e.what();
errs << e;
}
} }
}
// UPLOADERS // UPLOADERS
registerUploader(new ImgurUploader); registerUploader(new ImgurUploader);
registerUploader(new ClipboardUploader); registerUploader(new ClipboardUploader);
// --------- // ---------
if (settings::settings().contains("uploader")) if (settings::settings().contains("uploader"))
uploader = settings::settings().value("uploader").toString(); uploader = settings::settings().value("uploader").toString();
else else
settings::settings().setValue("uploader", uploader); settings::settings().setValue("uploader", uploader);
if (!uploaders.contains(uploader)) if (!uploaders.contains(uploader)) {
{ settings::settings().setValue("uploader", uploader);
settings::settings().setValue("uploader", uploader); uploader = "imgur";
uploader = "imgur"; }
}
void UploaderSingleton::registerUploader(Uploader *uploader) {
if (uploaders.contains(uploader->name())) {
throw std::runtime_error(
("Ambigious uploader " + uploader->name()).toStdString());
}
uploaders.insert(uploader->name(), uploader);
emit newUploader(uploader);
}
void UploaderSingleton::upload(QPixmap *pixmap) {
if (settings::settings().contains("fileFormat")) {
QString format = settings::settings().value("fileFormat").toString();
if (!format.isEmpty()) {
pixmap->save(QDir(QStandardPaths::writableLocation(
QStandardPaths::PicturesLocation))
.absoluteFilePath(formatter::format(format) + ".png"),
"PNG");
} }
}
uploaders.value(uploader)->doUpload(pixmap);
delete pixmap;
} }
void UploaderSingleton::registerUploader(Uploader *uploader) QList<Uploader *> UploaderSingleton::uploaderList() {
{ return uploaders.values();
if (uploaders.contains(uploader->name()))
{
throw std::runtime_error(("Ambigious uploader " + uploader->name()).toStdString());
}
uploaders.insert(uploader->name(), uploader);
emit newUploader(uploader);
} }
void UploaderSingleton::upload(QPixmap *pixmap) void UploaderSingleton::set(QString uploader) {
{ if (uploaders.contains(uploader)) {
if (settings::settings().contains("fileFormat")) this->uploader = uploader;
{ settings::settings().setValue("uploader", uploader);
QString format = settings::settings().value("fileFormat").toString(); }
if (!format.isEmpty())
{
pixmap->save(QDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)).absoluteFilePath(formatter::format(format) + ".png"),
"PNG");
}
}
uploaders.value(uploader)->doUpload(pixmap);
delete pixmap;
} }
QList<Uploader *> UploaderSingleton::uploaderList() QString UploaderSingleton::selectedUploader() { return uploader; }
{
return uploaders.values();
}
void UploaderSingleton::set(QString uploader) QList<std::runtime_error> UploaderSingleton::errors() { return errs; }
{
if (uploaders.contains(uploader))
{
this->uploader = uploader;
settings::settings().setValue("uploader", uploader);
}
}
QString UploaderSingleton::selectedUploader()
{
return uploader;
}
QList<std::runtime_error> UploaderSingleton::errors()
{
return errs;
}

View File

@ -4,29 +4,27 @@
#include "uploader.hpp" #include "uploader.hpp"
#include <QMap> #include <QMap>
class UploaderSingleton : public QObject class UploaderSingleton : public QObject {
{ Q_OBJECT
Q_OBJECT public:
public: static UploaderSingleton &inst() {
static UploaderSingleton &inst() static UploaderSingleton inst;
{ return inst;
static UploaderSingleton inst; }
return inst; void registerUploader(Uploader *uploader);
} void upload(QPixmap *pixmap);
void registerUploader(Uploader *uploader); QList<Uploader *> uploaderList();
void upload(QPixmap *pixmap); void set(QString uploader);
QList<Uploader *> uploaderList(); QString selectedUploader();
void set(QString uploader); QList<std::runtime_error> errors();
QString selectedUploader(); signals:
QList<std::runtime_error> errors(); void newUploader(Uploader *u);
signals:
void newUploader(Uploader *u);
private: private:
UploaderSingleton(); UploaderSingleton();
QMap<QString, Uploader *> uploaders; QMap<QString, Uploader *> uploaders;
QString uploader = "imgur"; QString uploader = "imgur";
QList<std::runtime_error> errs; QList<std::runtime_error> errs;
}; };
#endif // UPLOADERSINGLETON_HPP #endif // UPLOADERSINGLETON_HPP