-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDiagramShape.h
More file actions
134 lines (111 loc) · 3.89 KB
/
DiagramShape.h
File metadata and controls
134 lines (111 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#pragma once
#include <QPainter>
#include <QRectF>
#include <QColor>
#include <QFont>
#include <QDataStream>
#include <memory>
#include <QString>
class DiagramShape {
public:
enum Type {
None,
Rectangle,
Ellipse,
Diamond,
Triangle,
Connector,
Text
};
DiagramShape(Type type);
virtual ~DiagramShape() = default;
virtual void paint(QPainter* painter) = 0;
virtual bool contains(const QPointF& point) const = 0;
virtual QRectF boundingRect() const = 0;
virtual void moveBy(const QPointF& delta) = 0;
virtual void setSize(const QSizeF& size) = 0;
virtual QSizeF getSize() const = 0;
virtual QString getText() const { return m_text; }
virtual void setText(const QString& text) { m_text = text; }
virtual void save(QDataStream& out) const;
virtual void load(QDataStream& in);
void setPos(const QPointF& pos) { position = pos; }
QPointF getPos() const { return position; }
void setSelected(bool selected) { isSelected = selected; }
bool getSelected() const { return isSelected; }
void setColor(const QColor& color) { shapeColor = color; }
QColor getColor() const { return shapeColor; }
void setLineColor(const QColor& color) { lineColor = color; }
QColor getLineColor() const { return lineColor; }
void setLineWidth(int width) { lineWidth = width; }
int getLineWidth() const { return lineWidth; }
Type getType() const { return type; }
static std::shared_ptr<DiagramShape> createShape(Type type);
protected:
QPointF position;
QColor shapeColor;
QColor lineColor;
int lineWidth = 1;
bool isSelected = false;
Type type;
QString m_text;
void paintSelectionHandles(QPainter* painter, const QRectF& rect) const;
void paintText(QPainter* painter, const QRectF& rect) const;
};
// 下面的四个形状你可以照这个格式再定义 EllipseShape / DiamondShape / TriangleShape
class RectangleShape : public DiagramShape {
public:
RectangleShape();
void paint(QPainter* painter) override;
bool contains(const QPointF& point) const override;
QRectF boundingRect() const override;
void moveBy(const QPointF& delta) override;
void setSize(const QSizeF& newSize) override;
QSizeF getSize() const override;
void save(QDataStream& out) const override;
void load(QDataStream& in) override;
private:
QSizeF size;
};
class EllipseShape : public DiagramShape {
public:
EllipseShape();
void paint(QPainter* painter) override;
bool contains(const QPointF& point) const override;
QRectF boundingRect() const override;
void moveBy(const QPointF& delta) override;
void setSize(const QSizeF& newSize) override;
QSizeF getSize() const override;
void save(QDataStream& out) const override;
void load(QDataStream& in) override;
private:
QSizeF size;
};
class DiamondShape : public DiagramShape {
public:
DiamondShape();
void paint(QPainter* painter) override;
bool contains(const QPointF& point) const override;
QRectF boundingRect() const override;
void moveBy(const QPointF& delta) override;
void setSize(const QSizeF& newSize) override;
QSizeF getSize() const override;
void save(QDataStream& out) const override;
void load(QDataStream& in) override;
private:
QSizeF size;
};
class TriangleShape : public DiagramShape {
public:
TriangleShape();
void paint(QPainter* painter) override;
bool contains(const QPointF& point) const override;
QRectF boundingRect() const override;
void moveBy(const QPointF& delta) override;
void setSize(const QSizeF& newSize) override;
QSizeF getSize() const override;
void save(QDataStream& out) const override;
void load(QDataStream& in) override;
private:
QSizeF size;
};