src/tools/drawtool.cpp

changeset 109
40a1cf2f38f5
parent 108
94c92c923713
child 111
1f42c03fafca
equal deleted inserted replaced
108:94c92c923713 109:40a1cf2f38f5
1 #include <QMessageBox> 1 #include <QMessageBox>
2 #include "drawtool.h" 2 #include "drawtool.h"
3 3
4 static const QBrush brush = {Qt::white}; 4 static const QBrush pointBrush = {Qt::white};
5 static const QPen pen = {Qt::black}; 5 static const QPen polygonPen = {QBrush{Qt::black}, 2.0, Qt::DashLine};
6 static const QBrush polygonBrush = {QColor{64, 255, 128}}; 6 static const QPen pointPen = {QBrush{Qt::black}, 2.0};
7 static const QBrush polygonBrush = {QColor{64, 255, 128, 192}};
7 8
8 DrawTool::DrawTool(QObject* parent) : 9 DrawTool::DrawTool(QObject* parent) :
9 BaseTool{parent} {} 10 BaseTool{parent} {}
10 11
11 QString DrawTool::name() const 12 QString DrawTool::name() const
26 { 27 {
27 const glm::vec3& pos = info.worldPosition.value(); 28 const glm::vec3& pos = info.worldPosition.value();
28 const auto isCloseToPos = [&](const glm::vec3& x){return geom::isclose(x, pos);}; 29 const auto isCloseToPos = [&](const glm::vec3& x){return geom::isclose(x, pos);};
29 if (any(this->polygon, isCloseToPos)) 30 if (any(this->polygon, isCloseToPos))
30 { 31 {
31 QMessageBox::information(nullptr, "test", "close the polygon"); 32 this->closeShape();
32 } 33 }
33 else 34 else
34 { 35 {
35 this->polygon.push_back(pos); 36 this->polygon.push_back(pos);
36 auto& previewLayer = info.invoker->modifyPreviewLayer(Canvas::DrawToolPreview);
37 previewLayer.points.resize(this->polygon.size());
38 previewLayer.points.back() = {pos, brush, pen};
39 previewLayer.polygons.clear();
40 previewLayer.polygons.push_back({geom::NPolygon{this->polygon}, polygonBrush, pen});
41 if (this->polygon.size() == 4) 37 if (this->polygon.size() == 4)
42 { 38 {
43 QMessageBox::information(nullptr, "test", "close the polygon"); 39 this->closeShape();
44 } 40 }
45 } 41 }
46 } 42 }
43 this->previewPolygon = this->polygon;
47 return true; 44 return true;
48 } 45 }
49 46
50 bool DrawTool::mouseMove(const Canvas::MouseMoveInfo& info) 47 bool DrawTool::mouseMove(const Canvas::MouseMoveInfo& info)
51 { 48 {
52 if (this->polygon.size() < 4 and info.worldPosition.has_value()) 49 if (info.worldPosition.has_value())
53 { 50 {
54 auto& previewLayer = info.invoker->modifyPreviewLayer(Canvas::DrawToolPreview); 51 this->previewPoint = info.worldPosition.value();
55 previewLayer.points.resize(this->polygon.size() + 1); 52 if (this->polygon.size() < 4)
56 previewLayer.points.back() = {info.worldPosition.value(), brush, pen};
57 if (previewLayer.polygons.size() > 0)
58 { 53 {
59 auto& polygon = previewLayer.polygons.back(); 54 this->previewPolygon.resize(this->polygon.size() + 1);
60 polygon.geometry.points.resize(this->polygon.size() + 1); 55 this->previewPolygon.back() = this->previewPoint;
61 polygon.geometry.points.back() = info.worldPosition.value();
62 } 56 }
63 return true;
64 } 57 }
65 else 58 return false;
66 {
67 return false;
68 }
69 } 59 }
70 60
71 void DrawTool::reset() 61 void DrawTool::reset()
72 { 62 {
73 this->polygon.clear(); 63 this->polygon.clear();
74 } 64 }
65
66 void DrawTool::overpaint(Canvas* canvas, QPainter* painter) const
67 {
68 painter->setBrush(::polygonBrush);
69 painter->setPen(::polygonPen);
70 canvas->drawWorldPolygon(painter, this->previewPolygon);
71 painter->setBrush(::pointBrush);
72 painter->setPen(::pointPen);
73 for (const glm::vec3& point : this->polygon)
74 {
75 canvas->drawWorldPoint(painter, point);
76 }
77 if (this->polygon.size() < 4)
78 {
79 canvas->drawWorldPoint(painter, this->previewPoint);
80 }
81 }
82
83 void DrawTool::closeShape()
84 {
85 QMessageBox::information(nullptr, "test", "close the polygon");
86 }

mercurial