206 lines
6.9 KiB
C++
206 lines
6.9 KiB
C++
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors
|
|
|
|
#pragma once
|
|
|
|
#include "src/tools/capturecontext.h"
|
|
#include "src/utils/colorutils.h"
|
|
#include "src/utils/pathinfo.h"
|
|
#include <QIcon>
|
|
#include <QPainter>
|
|
|
|
class CaptureTool : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
// IMPORTANT:
|
|
// Add new entries to the BOTTOM so existing user configurations don't get
|
|
// messed up.
|
|
// ALSO NOTE:
|
|
// When adding new types, don't forget to update:
|
|
// - CaptureToolButton::iterableButtonTypes
|
|
// - CaptureToolButton::buttonTypeOrder
|
|
enum Type
|
|
{
|
|
NONE = -1,
|
|
TYPE_PENCIL = 0,
|
|
TYPE_DRAWER = 1,
|
|
TYPE_ARROW = 2,
|
|
TYPE_SELECTION = 3,
|
|
TYPE_RECTANGLE = 4,
|
|
TYPE_CIRCLE = 5,
|
|
TYPE_MARKER = 6,
|
|
TYPE_SELECTIONINDICATOR = 7,
|
|
TYPE_MOVESELECTION = 8,
|
|
TYPE_UNDO = 9,
|
|
TYPE_COPY = 10,
|
|
TYPE_SAVE = 11,
|
|
TYPE_EXIT = 12,
|
|
TYPE_IMAGEUPLOADER = 13,
|
|
TYPE_OPEN_APP = 14,
|
|
TYPE_PIXELATE = 15,
|
|
TYPE_REDO = 16,
|
|
TYPE_PIN = 17,
|
|
TYPE_TEXT = 18,
|
|
TYPE_CIRCLECOUNT = 19,
|
|
TYPE_SIZEINCREASE = 20,
|
|
TYPE_SIZEDECREASE = 21,
|
|
TYPE_INVERT = 22,
|
|
TYPE_ACCEPT = 23,
|
|
};
|
|
Q_ENUM(Type);
|
|
|
|
// Request actions on the main widget
|
|
enum Request
|
|
{
|
|
// Call close() in the editor.
|
|
REQ_CLOSE_GUI,
|
|
// Call hide() in the editor.
|
|
REQ_HIDE_GUI,
|
|
// Undo the last active modification in the stack.
|
|
REQ_UNDO_MODIFICATION,
|
|
// Redo the next modification in the stack.
|
|
REQ_REDO_MODIFICATION,
|
|
// Open the color picker under the mouse.
|
|
REQ_SHOW_COLOR_PICKER,
|
|
// Notify is the screenshot has been saved.
|
|
REQ_CAPTURE_DONE_OK,
|
|
// Notify to redraw screenshot with tools without object selection.
|
|
REQ_CLEAR_SELECTION,
|
|
// Instance this->widget()'s widget inside the editor under the mouse.
|
|
REQ_ADD_CHILD_WIDGET,
|
|
// Instance this->widget()'s widget which handles its own lifetime.
|
|
REQ_ADD_EXTERNAL_WIDGETS,
|
|
// increase tool size for all tools
|
|
REQ_INCREASE_TOOL_SIZE,
|
|
// decrease tool size for all tools
|
|
REQ_DECREASE_TOOL_SIZE
|
|
};
|
|
|
|
explicit CaptureTool(QObject* parent = nullptr)
|
|
: QObject(parent)
|
|
, m_count(0)
|
|
, m_editMode(false)
|
|
{}
|
|
|
|
// TODO unused
|
|
virtual void setCapture(const QPixmap& pixmap){};
|
|
|
|
// Returns false when the tool is in an inconsistent state and shouldn't
|
|
// be included in the tool undo/redo stack.
|
|
virtual bool isValid() const = 0;
|
|
// Close the capture after the process() call if the tool was activated
|
|
// from a button press. TODO remove this function
|
|
virtual bool closeOnButtonPressed() const = 0;
|
|
// If the tool keeps active after the selection.
|
|
virtual bool isSelectable() const = 0;
|
|
// Enable mouse preview.
|
|
virtual bool showMousePreview() const = 0;
|
|
virtual QRect mousePreviewRect(const CaptureContext& context) const
|
|
{
|
|
return {};
|
|
};
|
|
virtual QRect boundingRect() const = 0;
|
|
|
|
// The icon of the tool.
|
|
// inEditor is true when the icon is requested inside the editor
|
|
// and false otherwise.
|
|
virtual QIcon icon(const QColor& background, bool inEditor) const = 0;
|
|
// Name displayed for the tool, this could be translated with tr()
|
|
virtual QString name() const = 0;
|
|
// Codename for the tool, this shouldn't change as it is used as ID
|
|
// for the tool in the internals of Flameshot
|
|
virtual CaptureTool::Type type() const = 0;
|
|
// Short description of the tool.
|
|
virtual QString description() const = 0;
|
|
// Short tool item info
|
|
virtual QString info() { return name(); };
|
|
|
|
// if the type is TYPE_WIDGET the widget is loaded in the main widget.
|
|
// If the type is TYPE_EXTERNAL_WIDGET it is created outside as an
|
|
// individual widget.
|
|
virtual QWidget* widget() { return nullptr; }
|
|
// When the tool is selected this method is called and the widget is added
|
|
// to the configuration panel inside the main widget.
|
|
virtual QWidget* configurationWidget() { return nullptr; }
|
|
// Return a copy of the tool
|
|
virtual CaptureTool* copy(QObject* parent = nullptr) = 0;
|
|
|
|
virtual void setEditMode(bool b) { m_editMode = b; };
|
|
virtual bool editMode() { return m_editMode; };
|
|
|
|
// return true if object was change after editMode
|
|
virtual bool isChanged() { return true; };
|
|
|
|
// Counter for all object types (currently is used for the CircleCounter
|
|
// only)
|
|
virtual void setCount(int count) { m_count = count; };
|
|
virtual int count() const { return m_count; };
|
|
|
|
// Called every time the tool has to draw
|
|
virtual void process(QPainter& painter, const QPixmap& pixmap) = 0;
|
|
virtual void drawSearchArea(QPainter& painter, const QPixmap& pixmap)
|
|
{
|
|
process(painter, pixmap);
|
|
};
|
|
virtual void drawObjectSelection(QPainter& painter)
|
|
{
|
|
drawObjectSelectionRect(painter, boundingRect());
|
|
};
|
|
// When the tool is selected, this is called when the mouse moves
|
|
virtual void paintMousePreview(QPainter& painter,
|
|
const CaptureContext& context) = 0;
|
|
|
|
// Move tool objects
|
|
virtual void move(const QPoint& pos) { Q_UNUSED(pos) };
|
|
virtual const QPoint* pos() { return nullptr; };
|
|
|
|
signals:
|
|
void requestAction(Request r);
|
|
|
|
protected:
|
|
void copyParams(const CaptureTool* from, CaptureTool* to)
|
|
{
|
|
to->m_count = from->m_count;
|
|
}
|
|
|
|
QString iconPath(const QColor& c) const
|
|
{
|
|
return ColorUtils::colorIsDark(c) ? PathInfo::whiteIconPath()
|
|
: PathInfo::blackIconPath();
|
|
}
|
|
|
|
void drawObjectSelectionRect(QPainter& painter, QRect rect)
|
|
{
|
|
QPen orig_pen = painter.pen();
|
|
painter.setPen(QPen(Qt::black, 3));
|
|
painter.drawRect(rect);
|
|
painter.setPen(QPen(Qt::white, 1, Qt::DotLine));
|
|
painter.drawRect(rect);
|
|
painter.setPen(orig_pen);
|
|
}
|
|
|
|
public slots:
|
|
// On mouse release.
|
|
virtual void drawEnd(const QPoint& p) = 0;
|
|
// Mouse pressed and moving, called once a pixel.
|
|
virtual void drawMove(const QPoint& p) = 0;
|
|
// Called when drawMove is needed with an adjustment;
|
|
// should be overridden in case an adjustment is applicable.
|
|
virtual void drawMoveWithAdjustment(const QPoint& p) { drawMove(p); }
|
|
// Called when the tool is activated.
|
|
virtual void drawStart(const CaptureContext& context) = 0;
|
|
// Called right after pressign the button which activates the tool.
|
|
virtual void pressed(CaptureContext& context) = 0;
|
|
// Called when the color is changed in the editor.
|
|
virtual void onColorChanged(const QColor& c) = 0;
|
|
// Called when the size the tool size is changed by the user.
|
|
virtual void onSizeChanged(int size) = 0;
|
|
virtual int size() const { return -1; };
|
|
|
|
private:
|
|
unsigned int m_count;
|
|
bool m_editMode;
|
|
};
|