Files
flameshot/src/tools/abstractpathtool.cpp
Haris Gušić 534f05b238 Refactor tool size handling (#1969)
* Add ConfigHandler::toolSize and setToolSize

* Refactor thickness (now toolSize) in CaptureWidget

Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com>

* Fix update of tool size while object is drawn

Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com>

* Rename thickness to tool size across the board

Tool size is the generic term. Depending on the selected tool,
different specialized names are used. This has always been the case
in the config.

Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com>

* Reorder circle count tool

Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com>

* clang-format

Signed-off-by: Haris Gušić <harisgusic.dev@gmail.com>
2021-10-20 00:01:35 +02:00

154 lines
3.4 KiB
C++

// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors
#include "abstractpathtool.h"
#include <cmath>
AbstractPathTool::AbstractPathTool(QObject* parent)
: CaptureTool(parent)
, m_thickness(1)
, m_padding(0)
{}
void AbstractPathTool::copyParams(const AbstractPathTool* from,
AbstractPathTool* to)
{
to->m_color = from->m_color;
to->m_thickness = from->m_thickness;
to->m_padding = from->m_padding;
to->m_pos = from->m_pos;
to->m_points.clear();
for (auto point : from->m_points) {
to->m_points.append(point);
}
}
bool AbstractPathTool::isValid() const
{
return m_points.length() > 1;
}
bool AbstractPathTool::closeOnButtonPressed() const
{
return false;
}
bool AbstractPathTool::isSelectable() const
{
return true;
}
bool AbstractPathTool::showMousePreview() const
{
return true;
}
QRect AbstractPathTool::mousePreviewRect(const CaptureContext& context) const
{
QRect rect(0, 0, context.toolSize + 2, context.toolSize + 2);
rect.moveCenter(context.mousePos);
return rect;
}
QRect AbstractPathTool::boundingRect() const
{
if (m_points.isEmpty()) {
return {};
}
int min_x = m_points.at(0).x();
int min_y = m_points.at(0).y();
int max_x = m_points.at(0).x();
int max_y = m_points.at(0).y();
for (auto point : m_points) {
if (point.x() < min_x) {
min_x = point.x();
}
if (point.y() < min_y) {
min_y = point.y();
}
if (point.x() > max_x) {
max_x = point.x();
}
if (point.y() > max_y) {
max_y = point.y();
}
}
int offset =
m_thickness <= 1 ? 1 : static_cast<int>(round(m_thickness * 0.7 + 0.5));
return QRect(min_x - offset,
min_y - offset,
std::abs(min_x - max_x) + offset * 2,
std::abs(min_y - max_y) + offset * 2)
.normalized();
}
void AbstractPathTool::drawEnd(const QPoint& p)
{
Q_UNUSED(p)
}
void AbstractPathTool::drawMove(const QPoint& p)
{
addPoint(p);
}
void AbstractPathTool::onColorChanged(const QColor& c)
{
m_color = c;
}
void AbstractPathTool::onSizeChanged(int size)
{
m_thickness = size;
}
void AbstractPathTool::addPoint(const QPoint& point)
{
if (m_pathArea.left() > point.x()) {
m_pathArea.setLeft(point.x());
} else if (m_pathArea.right() < point.x()) {
m_pathArea.setRight(point.x());
}
if (m_pathArea.top() > point.y()) {
m_pathArea.setTop(point.y());
} else if (m_pathArea.bottom() < point.y()) {
m_pathArea.setBottom(point.y());
}
m_points.append(point);
}
void AbstractPathTool::move(const QPoint& mousePos)
{
if (m_points.empty()) {
return;
}
QPoint basePos = *pos();
QPoint offset = mousePos - basePos;
for (int index = 0; index < m_points.size(); ++index) {
m_points[index] += offset;
}
}
const QPoint* AbstractPathTool::pos()
{
if (m_points.empty()) {
m_pos = QPoint();
return &m_pos;
}
int x = m_points.at(0).x();
int y = m_points.at(0).y();
for (auto point : m_points) {
if (point.x() < x) {
x = point.x();
}
if (point.y() < y) {
y = point.y();
}
}
m_pos.setX(x);
m_pos.setY(y);
return &m_pos;
}