// Copyright 2017 Alejandro Sirgo Rica
//
// This file is part of Flameshot.
//
// Flameshot is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Flameshot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Flameshot. If not, see .
#include "arrowtool.h"
#include
namespace {
const int ArrowWidth = 10;
const int ArrowHeight = 18;
QPainterPath getArrowHead(QPoint p1, QPoint p2, const int thickness) {
QLineF body(p1, p2);
int originalLength = body.length();
body.setLength(ArrowWidth + thickness*2);
// move across the line up to the head
QLineF temp(QPoint(0,0), p2-p1);
temp.setLength(originalLength - ArrowHeight - thickness*2);
QPointF bottonTranslation(temp.p2());
// generates the transformation to center of the arrowhead
body.setAngle(body.angle()+90);
QPointF temp2 = p1-body.p2();
QPointF centerTranslation((temp2.x()/2), (temp2.y()/2));
body.translate(bottonTranslation);
body.translate(centerTranslation);
QPainterPath path;
path.moveTo(p2);
path.lineTo(body.p1());
path.lineTo(body.p2());
path.lineTo(p2);
return path;
}
// gets a shorter line to prevent overlap in the point of the arrow
QLine getShorterLine(QPoint p1, QPoint p2, const int thickness) {
QLineF l(p1, p2);
l.setLength(l.length() - ArrowHeight - thickness*2);
return l.toLine();
}
} // unnamed namespace
ArrowTool::ArrowTool(QObject *parent) : CaptureTool(parent) {
}
int ArrowTool::id() const {
return 0;
}
bool ArrowTool::isSelectable() const {
return true;
}
QString ArrowTool::iconName() const {
return "arrow-bottom-left.png";
}
QString ArrowTool::name() const {
return tr("Arrow");
}
QString ArrowTool::description() const {
return tr("Sets the Arrow as the paint tool");
}
CaptureTool::ToolWorkType ArrowTool::toolType() const {
return TYPE_LINE_DRAWER;
}
void ArrowTool::processImage(
QPainter &painter,
const QVector &points,
const QColor &color,
const int thickness)
{
painter.setPen(QPen(color, 2 + thickness));
painter.drawLine(getShorterLine(points[0], points[1], thickness));
painter.fillPath(getArrowHead(points[0], points[1], thickness), QBrush(color));
}
void ArrowTool::onPressed() {
}