Files
z-bar-qt/Plugins/ZShell/Internal/strokecanvasitem.hpp
T
zach 566b71d386
C++ / fmt (pull_request) Failing after 6s
C++ / build (pull_request) Failing after 12s
C++ / clang-tidy (pull_request) Failing after 10s
JS/TS / fmt (pull_request) Successful in 9s
JS/TS / lint (pull_request) Successful in 9s
Python / static (pull_request) Successful in 28s
Python / verify (pull_request) Failing after 1m41s
Rust / build (pull_request) Successful in 1m15s
Rust / fmt (pull_request) Successful in 42s
Rust / clippy (pull_request) Successful in 1m6s
feat: drawing popout now clips strokes again + add redo + add undo and redo keybinds
2026-10-30 14:16:19 +01:00

96 lines
2.4 KiB
C++

#pragma once
#include <QCanvasPainterItem>
#include <QColor>
#include <QPointF>
#include <QRectF>
#include <QVector>
#include <qcolor.h>
#include <qcontainerfwd.h>
#include "stroke.hpp"
namespace ZShell::internal {
class StrokeCanvasRenderer;
class StrokeCanvasItem : public QCanvasPainterItem {
Q_OBJECT
QML_NAMED_ELEMENT(StrokeCanvas)
Q_PROPERTY(
QColor penColor READ penColor WRITE setPenColor NOTIFY penColorChanged)
Q_PROPERTY(
bool hoverVisible READ hoverVisible WRITE setHoverVisible NOTIFY
hoverVisibleChanged)
Q_PROPERTY(
QPointF hoverPoint READ hoverPoint WRITE setHoverPoint NOTIFY
hoverPointChanged)
Q_PROPERTY(
qreal penWidth READ penWidth WRITE setPenWidth NOTIFY penWidthChanged)
Q_PROPERTY(QRectF hole READ hole WRITE setHole NOTIFY holeChanged)
Q_PROPERTY(
qreal holeRadius READ holeRadius WRITE setHoleRadius NOTIFY
holeRadiusChanged)
public:
explicit StrokeCanvasItem(QQuickItem* parent = nullptr);
[[nodiscard]] bool hoverVisible() const { return m_hoverVisible; }
[[nodiscard]] QPointF hoverPoint() const { return m_hoverPoint; }
void setHoverVisible(bool visible);
void setHoverPoint(const QPointF& point);
Q_INVOKABLE void showHover();
Q_INVOKABLE void hideHover();
Q_INVOKABLE void undoLastGroup();
Q_INVOKABLE void redo();
[[nodiscard]] QColor penColor() const { return m_penColor; }
[[nodiscard]] qreal penWidth() const { return m_penWidth; }
[[nodiscard]] QRectF hole() const { return m_hole; }
[[nodiscard]] qreal holeRadius() const { return m_holeRadius; }
void setPenColor(const QColor& color);
void setPenWidth(qreal width);
void setHole(const QRectF& hole);
void setHoleRadius(qreal radius);
Q_INVOKABLE void clear();
Q_INVOKABLE void beginStroke(qreal x, qreal y, bool polyline = false);
Q_INVOKABLE void appendPoint(qreal x, qreal y);
Q_INVOKABLE void endStroke();
signals:
void penColorChanged();
void penWidthChanged();
void holeChanged();
void holeRadiusChanged();
void hoverVisibleChanged();
void hoverPointChanged();
protected:
[[nodiscard]] QCanvasPainterItemRenderer* createItemRenderer()
const override;
private:
friend class StrokeCanvasRenderer;
bool m_hoverVisible = false;
QPointF m_hoverPoint;
QColor m_penColor = Qt::white;
qreal m_penWidth = 4.0;
bool m_isDrawing = false;
QRectF m_hole;
qreal m_holeRadius = 0.0;
int m_nextGroupId = 0;
QVector<Stroke> m_strokes;
Stroke m_currentStroke;
QVector<QVector<Stroke>> m_redoStack;
};
}; // namespace ZShell::internal