From 905f9b27d11dbd2d4f232d9015f7da16b99589e3 Mon Sep 17 00:00:00 2001 From: ArsenArsen Date: Fri, 5 May 2017 23:59:39 +0200 Subject: [PATCH] Text widget --- KShare.pro | 6 ++- cropeditor/cropscene.cpp | 79 +++++++++++++++------------------ cropeditor/cropscene.hpp | 16 ++++--- cropeditor/drawing/textitem.cpp | 29 ++++++++++++ cropeditor/drawing/textitem.hpp | 19 ++++++++ 5 files changed, 98 insertions(+), 51 deletions(-) create mode 100644 cropeditor/drawing/textitem.cpp create mode 100644 cropeditor/drawing/textitem.hpp diff --git a/KShare.pro b/KShare.pro index 819d55f..e5e7388 100644 --- a/KShare.pro +++ b/KShare.pro @@ -44,7 +44,8 @@ SOURCES += main.cpp\ cropeditor/drawing/bluritem.cpp \ cropeditor/settings/blurdialog.cpp \ cropeditor/drawing/pathitem.cpp \ - cropeditor/drawing/lineitem.cpp + cropeditor/drawing/lineitem.cpp \ + cropeditor/drawing/textitem.cpp HEADERS += mainwindow.hpp \ cropeditor/cropeditor.hpp \ @@ -68,7 +69,8 @@ HEADERS += mainwindow.hpp \ cropeditor/drawing/bluritem.hpp \ cropeditor/settings/blurdialog.hpp \ cropeditor/drawing/pathitem.hpp \ - cropeditor/drawing/lineitem.hpp + cropeditor/drawing/lineitem.hpp \ + cropeditor/drawing/textitem.hpp FORMS += mainwindow.ui \ cropeditor/settings/brushpenselection.ui \ diff --git a/cropeditor/cropscene.cpp b/cropeditor/cropscene.cpp index e71ef4e..4795e4f 100644 --- a/cropeditor/cropscene.cpp +++ b/cropeditor/cropscene.cpp @@ -1,6 +1,7 @@ #include "cropscene.hpp" #include #include +#include #include #include #include @@ -10,13 +11,14 @@ #include #include #include +#include #include #include #include CropScene::CropScene(QObject *parent, QPixmap *pixmap) -: QGraphicsScene(parent), prevButtons(Qt::NoButton), drawingSelectionMaker([] { return nullptr; }) -{ +: QGraphicsScene(parent), prevButtons(Qt::NoButton), drawingSelectionMaker([] { return nullptr; }), + _font(settings::settings().value("font", QFont()).value()) { pen().setColor(settings::settings().value("penColor", pen().color()).value()); pen().setCosmetic(settings::settings().value("penCosmetic", pen().isCosmetic()).toBool()); pen().setWidthF(settings::settings().value("penWidth", pen().widthF()).toFloat()); @@ -26,6 +28,7 @@ CropScene::CropScene(QObject *parent, QPixmap *pixmap) addDrawingAction(menu, "Path", [] { return new PathItem; }); addDrawingAction(menu, "Blur", [] { return new BlurItem; }); addDrawingAction(menu, "Straight line", [] { return new LineItem; }); + addDrawingAction(menu, "Text", [] { return new TextItem; }); QAction *reset = menu.addAction("Reset"); connect(reset, &QAction::triggered, [&] { setDrawingSelection("None", [] { return nullptr; }); }); @@ -39,6 +42,8 @@ CropScene::CropScene(QObject *parent, QPixmap *pixmap) connect(settings, &QAction::triggered, [&] { BrushPenSelection(this).exec(); }); menu.addAction(settings); + connect(menu.addAction("Set Font"), &QAction::triggered, this, &CropScene::fontAsk); + _pixmap = pixmap; QTimer::singleShot(0, [&] { QPolygonF poly; @@ -53,59 +58,54 @@ CropScene::CropScene(QObject *parent, QPixmap *pixmap) }); } -CropScene::~CropScene() -{ +CropScene::~CropScene() { delete drawingSelection; } -QPen &CropScene::pen() -{ +QPen &CropScene::pen() { return _pen; } -QBrush &CropScene::brush() -{ +QBrush &CropScene::brush() { return _brush; } -void CropScene::setDrawingSelection(QString name, std::function drawAction) -{ +QFont &CropScene::font() { + return _font; +} + +void CropScene::setDrawingSelection(QString name, std::function drawAction) { drawingSelectionMaker = drawAction; drawingSelection = drawAction(); drawingName = name; if (drawingSelection) drawingSelection->init(this); } -void CropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) -{ +void CropScene::fontAsk() { + bool ok = false; + QFont font = QFontDialog::getFont(&ok, this->font(), nullptr, "Font to use"); + if (ok) _font = font; +} + +void CropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { auto buttons = e->buttons(); - if (buttons == Qt::LeftButton || prevButtons == Qt::NoButton) - { - if (drawingSelection) - { + if (buttons == Qt::LeftButton || prevButtons == Qt::NoButton) { + if (drawingSelection) { drawingSelection->mouseDragEvent(e, this); - } - else - { + } else { QPointF p = e->scenePos(); - if (rect == nullptr) - { + 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) - { + } else { + if (prevButtons == Qt::NoButton) { initPos = p; rect->setRect(p.x(), p.y(), 1, 1); - } - else - { + } else { rect->setRect(QRect(qMin(initPos.x(), p.x()), qMin(initPos.y(), p.y()), qAbs(initPos.x() - p.x()), qAbs(initPos.y() - p.y()))); } @@ -132,11 +132,9 @@ void CropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) prevButtons = buttons; } -void CropScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) -{ +void CropScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { qDebug() << "release"; - if (drawingSelection) - { + if (drawingSelection) { drawingSelection->mouseDragEndEvent(e, this); delete drawingSelection; drawingSelection = drawingSelectionMaker(); @@ -145,30 +143,25 @@ void CropScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) prevButtons = Qt::NoButton; } -void CropScene::addDrawingAction(QMenu &menu, QString name, std::function item) -{ +void CropScene::addDrawingAction(QMenu &menu, QString name, std::function item) { QAction *action = new QAction; action->setText(name); 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); menu.exec(e->screenPos()); 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 } -void CropScene::done() -{ - if (rect) - { +void CropScene::done() { + if (rect) { rect->setPen(QPen(Qt::NoPen)); emit closedWithRect(rect->rect().toRect()); } diff --git a/cropeditor/cropscene.hpp b/cropeditor/cropscene.hpp index 504046d..0f8d531 100644 --- a/cropeditor/cropscene.hpp +++ b/cropeditor/cropscene.hpp @@ -1,6 +1,7 @@ #ifndef CROPSCENE_HPP #define CROPSCENE_HPP +#include #include #include #include @@ -12,20 +13,22 @@ class CropScene; #include -class CropScene : public QGraphicsScene -{ +class CropScene : public QGraphicsScene { Q_OBJECT public: CropScene(QObject *parent, QPixmap *pixmap); ~CropScene(); QPen &pen(); QBrush &brush(); + QFont &font(); void setDrawingSelection(QString name, std::function drawAction); - QPixmap *pixmap() - { + QPixmap *pixmap() { return _pixmap; } + public slots: + void fontAsk(); + signals: void closedWithRect(QRect rect); @@ -39,14 +42,15 @@ class CropScene : public QGraphicsScene private: void addDrawingAction(QMenu &menu, QString name, std::function item); void done(); - QPixmap *_pixmap; + std::function drawingSelectionMaker; QFlags prevButtons; + QPixmap *_pixmap; QGraphicsRectItem *rect = nullptr; QPointF initPos; QPen _pen; QBrush _brush; + QFont _font; QGraphicsPolygonItem *polyItem = nullptr; - std::function drawingSelectionMaker; DrawItem *drawingSelection = nullptr; QMenu menu; QString drawingName = "None"; diff --git a/cropeditor/drawing/textitem.cpp b/cropeditor/drawing/textitem.cpp new file mode 100644 index 0000000..e659d5d --- /dev/null +++ b/cropeditor/drawing/textitem.cpp @@ -0,0 +1,29 @@ +#include "textitem.hpp" +#include +#include +#include + +void TextItem::init(CropScene *) { + text = QInputDialog::getText(nullptr, "Text to add", "Input"); +} + +void TextItem::mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) { + if (!textItem) { + textItem = scene->addSimpleText(text, scene->font()); + textItem->setPos(e->scenePos()); + textItem->setPen(scene->pen()); + textItem->setBrush(scene->brush()); + } else { + auto ee + = 180 + qRadiansToDegrees(qAtan2((textItem->pos().y() - e->scenePos().y()), (textItem->pos().x() - e->scenePos().x()))); + textItem->setRotation(ee); + qDebug() << ee; + } +} + +void TextItem::mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) { +} + +QString TextItem::name() { + return "Text"; +} diff --git a/cropeditor/drawing/textitem.hpp b/cropeditor/drawing/textitem.hpp new file mode 100644 index 0000000..a2882ad --- /dev/null +++ b/cropeditor/drawing/textitem.hpp @@ -0,0 +1,19 @@ +#ifndef TEXTITEM_HPP +#define TEXTITEM_HPP + +#include "drawitem.hpp" +#include + +class TextItem : public DrawItem { + public: + QString name() override; + void init(CropScene *) override; + void mouseDragEvent(QGraphicsSceneMouseEvent *e, CropScene *scene) override; + void mouseDragEndEvent(QGraphicsSceneMouseEvent *, CropScene *) override; + + private: + QGraphicsSimpleTextItem *textItem = nullptr; + QString text; +}; + +#endif // TEXTITEM_HPP