Add hotspots to the selection rectangle

This commit is contained in:
ArsenArsen 2017-09-06 23:50:54 +02:00
parent c6864de782
commit 6120138523
6 changed files with 103 additions and 9 deletions

View File

@ -1,4 +1,5 @@
#include "cropscene.hpp"
#include "selectionrectangle.hpp"
#include <QApplication>
#include <QColorDialog>
#include <QDebug>
@ -193,7 +194,7 @@ void CropScene::setDrawingSelection(QString name, std::function<DrawItem *()> dr
drawingName = name;
display->setText(drawingName);
if (drawingSelection)
if (!drawingSelection->init(this)) setDrawingSelection("None", [] { return nullptr; });
if (!drawingSelection->init(this)) setDrawingSelection(tr("None"), [] { return nullptr; });
}
QGraphicsItem *CropScene::whichItem(QPointF scenePos) {
@ -245,6 +246,40 @@ void CropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
cursorItem->setPos(cursorPos);
updateMag();
if (rect) {
// qAbs(e->scenePos().<axis>() - rect->rect().<edge>()) < 10
bool close = false;
QRectF newRect = rect->rect();
if (qAbs(e->scenePos().x() - rect->rect().right()) < 10) {
if (qAbs(e->scenePos().y() - rect->rect().bottom()) < 10) {
close = true;
views()[0]->setCursor(Qt::SizeFDiagCursor);
if (e->buttons() & Qt::LeftButton && prevButtons != e->buttons()) newRect.setBottomLeft(cursorPos);
} else if (qAbs(e->scenePos().y() - rect->rect().top()) < 10) {
close = true;
views()[0]->setCursor(Qt::SizeBDiagCursor);
if (e->buttons() & Qt::LeftButton && prevButtons != e->buttons()) newRect.setTopRight(cursorPos);
}
} else if (qAbs(e->scenePos().x() - rect->rect().left()) < 10) {
if (qAbs(e->scenePos().y() - rect->rect().top()) < 10) {
close = true;
views()[0]->setCursor(Qt::SizeFDiagCursor);
if (e->buttons() & Qt::LeftButton && prevButtons != e->buttons()) newRect.setTopLeft(cursorPos);
} else if (qAbs(e->scenePos().y() - rect->rect().bottom()) < 10) {
close = true;
views()[0]->setCursor(Qt::SizeBDiagCursor);
if (e->buttons() & Qt::LeftButton && prevButtons != e->buttons()) newRect.setBottomLeft(cursorPos);
}
}
if (!close)
views()[0]->setCursor(Qt::BlankCursor);
else {
rect->setRect(newRect);
prevButtons = e->buttons();
return;
}
}
auto buttons = e->buttons();
if (e->modifiers() & Qt::ControlModifier && buttons == Qt::LeftButton) {
auto item = whichItem(cursorPos);
@ -257,7 +292,7 @@ void CropScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
} else {
QPointF p = cursorPos;
if (rect == nullptr) {
rect = new QGraphicsRectItem(p.x(), p.y(), 1, 1);
rect = new SelectionRectangle(p.x(), p.y(), 1, 1);
initPos = p;
QPen pen(Qt::NoBrush, 1);
pen.setColor(_highlight);
@ -303,7 +338,7 @@ void CropScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
delete drawingSelection;
drawingSelection = drawingSelectionMaker();
if (drawingSelection)
if (!drawingSelection->init(this)) setDrawingSelection("None", [] { return nullptr; });
if (!drawingSelection->init(this)) setDrawingSelection(tr("None"), [] { return nullptr; });
} else if (settings::settings().value("quickMode", false).toBool())
done(true);
prevButtons = Qt::NoButton;
@ -414,15 +449,16 @@ void CropScene::initMagnifierGrid() {
void CropScene::done(bool notEsc) {
if (notEsc && rect) {
QRectF rect2 = rect->rect();
hint->setVisible(false);
rect->setPen(QPen(Qt::NoPen));
rect->setRect(QRect(-100, -100, 0, 0));
magnifier->setVisible(false);
proxyMenu->setVisible(false);
cursorItem->setVisible(false);
magnifierBox->setVisible(false);
magnifierHint->setVisible(false);
magnifierHintBox->setVisible(false);
emit closedWithRect(rect->rect().toRect());
emit closedWithRect(rect2.toRect());
} else
emit closedWithRect(QRect());
}

View File

@ -2,13 +2,13 @@
#define CROPSCENE_HPP
#include <QFont>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QGraphicsSceneContextMenuEvent>
#include <QGraphicsSceneMouseEvent>
#include <QKeyEvent>
#include <QMenu>
#include <QMenuBar>
#include <cropeditor/selectionrectangle.hpp>
#include <functional>
#include <screenoverlayview.hpp>
#include <screenshotutil.hpp>
@ -84,7 +84,7 @@ private:
std::function<DrawItem *()> drawingSelectionMaker;
QFlags<Qt::MouseButton> prevButtons;
QPixmap _pixmap;
QGraphicsRectItem *rect = nullptr;
SelectionRectangle *rect = nullptr;
QGraphicsPixmapItem *magnifier = nullptr;
QGraphicsRectItem *magnifierBox = nullptr;
QGraphicsTextItem *magnifierHint = nullptr;

View File

@ -11,6 +11,7 @@ public:
return "Blur";
}
~BlurItem() {
return;
}
bool init(CropScene *) override;

View File

@ -0,0 +1,39 @@
#include "selectionrectangle.hpp"
#include <QDebug>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
SelectionRectangle::SelectionRectangle() {
}
SelectionRectangle::SelectionRectangle(qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent)
: QGraphicsRectItem(x, y, w, h, parent) {
}
void SelectionRectangle::paint(QPainter *painter, const QStyleOptionGraphicsItem *options, QWidget *widget) {
QRect rect = this->rect().toRect();
if (rect.height() > 30 && rect.width() > 30) {
painter->setPen(Qt::NoPen);
painter->setBrush(pen().color());
// Before you panick, the <angle> * 16 things are needed because here angles are 1/16th of their value
// The <x/y> - 10 is accounting for sizes.
// Trail and error ftw
// Bottom left
painter->drawPie(rect.left() - 10, rect.bottom() - 10, 20, 20, 0, 90 * 16);
// Top right
painter->drawPie(rect.right() - 10, rect.bottom() - 10, 20, 20, 90 * 16, 90 * 16);
// Top left
painter->drawPie(rect.left() - 10, rect.top() - 10, 20, 20, 270 * 16, 90 * 16);
// Top right
painter->drawPie(rect.right() - 10, rect.top() - 10, 20, 20, 180 * 16, 90 * 16);
}
painter->setBrush(brush());
painter->setPen(pen());
QGraphicsRectItem::paint(painter, options, widget);
}

View File

@ -0,0 +1,16 @@
#ifndef SELECTIONRECTANGLE_HPP
#define SELECTIONRECTANGLE_HPP
#include <QGraphicsRectItem>
#include <QPainter>
class SelectionRectangle : public QGraphicsRectItem {
public:
SelectionRectangle();
explicit SelectionRectangle(qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent = nullptr);
protected:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *options, QWidget *widget) override;
};
#endif // SELECTIONRECTANGLE_HPP

View File

@ -67,7 +67,8 @@ SOURCES += main.cpp\
logs/requestlogging.cpp \
logs/historydialog.cpp \
monospacetextdialog.cpp \
screenoverlayview.cpp
screenoverlayview.cpp \
cropeditor/selectionrectangle.cpp
HEADERS += mainwindow.hpp \
cropeditor/cropeditor.hpp \
@ -116,7 +117,8 @@ HEADERS += mainwindow.hpp \
logs/historydialog.hpp \
screenoverlayview.hpp \
screenoverlayview.hpp \
monospacetextdialog.hpp
monospacetextdialog.hpp \
cropeditor/selectionrectangle.hpp
nopkg {
# win32 {