aboutsummaryrefslogtreecommitdiffhomepage
path: root/qt/ScintillaEditBase
diff options
context:
space:
mode:
Diffstat (limited to 'qt/ScintillaEditBase')
-rw-r--r--qt/ScintillaEditBase/PlatQt.cpp58
-rw-r--r--qt/ScintillaEditBase/PlatQt.h1
2 files changed, 59 insertions, 0 deletions
diff --git a/qt/ScintillaEditBase/PlatQt.cpp b/qt/ScintillaEditBase/PlatQt.cpp
index fa4c062d8..7e2fd3e98 100644
--- a/qt/ScintillaEditBase/PlatQt.cpp
+++ b/qt/ScintillaEditBase/PlatQt.cpp
@@ -524,6 +524,64 @@ void SurfaceImpl::Ellipse(PRectangle rc, FillStroke fillStroke)
GetPainter()->drawEllipse(rect);
}
+void SurfaceImpl::Stadium(PRectangle rc, FillStroke fillStroke, Ends ends) {
+ const XYPOSITION halfStroke = fillStroke.stroke.width / 2.0f;
+ const XYPOSITION radius = rc.Height() / 2.0f - halfStroke;
+ PRectangle rcInner = rc;
+ rcInner.left += radius;
+ rcInner.right -= radius;
+ const XYPOSITION arcHeight = rc.Height() - fillStroke.stroke.width;
+
+ PenColourWidth(fillStroke.stroke.colour, fillStroke.stroke.width);
+ BrushColour(fillStroke.fill.colour);
+
+ QPainterPath path;
+
+ const Ends leftSide = static_cast<Ends>(static_cast<int>(ends) & 0xf);
+ const Ends rightSide = static_cast<Ends>(static_cast<int>(ends) & 0xf0);
+ switch (leftSide) {
+ case Ends::leftFlat:
+ path.moveTo(rc.left + halfStroke, rc.top + halfStroke);
+ path.lineTo(rc.left + halfStroke, rc.bottom - halfStroke);
+ break;
+ case Ends::leftAngle:
+ path.moveTo(rcInner.left + halfStroke, rc.top + halfStroke);
+ path.lineTo(rc.left + halfStroke, rc.Centre().y);
+ path.lineTo(rcInner.left + halfStroke, rc.bottom - halfStroke);
+ break;
+ case Ends::semiCircles:
+ default:
+ path.moveTo(rcInner.left + halfStroke, rc.top + halfStroke);
+ QRectF rectangleArc(rc.left + halfStroke, rc.top + halfStroke,
+ arcHeight, arcHeight);
+ path.arcTo(rectangleArc, 90, 180);
+ break;
+ }
+
+ switch (rightSide) {
+ case Ends::rightFlat:
+ path.lineTo(rc.right - halfStroke, rc.bottom - halfStroke);
+ path.lineTo(rc.right - halfStroke, rc.top + halfStroke);
+ break;
+ case Ends::rightAngle:
+ path.lineTo(rcInner.right - halfStroke, rc.bottom - halfStroke);
+ path.lineTo(rc.right - halfStroke, rc.Centre().y);
+ path.lineTo(rcInner.right - halfStroke, rc.top + halfStroke);
+ break;
+ case Ends::semiCircles:
+ default:
+ path.lineTo(rcInner.right - halfStroke, rc.bottom - halfStroke);
+ QRectF rectangleArc(rc.right - arcHeight - halfStroke, rc.top + halfStroke,
+ arcHeight, arcHeight);
+ path.arcTo(rectangleArc, 270, 180);
+ break;
+ }
+
+ // Close the path to enclose it for stroking and for filling, then draw it
+ path.closeSubpath();
+ GetPainter()->drawPath(path);
+}
+
void SurfaceImpl::Copy(PRectangle rc, Point from, Surface &surfaceSource)
{
SurfaceImpl *source = dynamic_cast<SurfaceImpl *>(&surfaceSource);
diff --git a/qt/ScintillaEditBase/PlatQt.h b/qt/ScintillaEditBase/PlatQt.h
index 2ca31da2d..a95e1bd88 100644
--- a/qt/ScintillaEditBase/PlatQt.h
+++ b/qt/ScintillaEditBase/PlatQt.h
@@ -126,6 +126,7 @@ public:
void Ellipse(PRectangle rc, ColourDesired fore,
ColourDesired back) override;
void Ellipse(PRectangle rc, FillStroke fillStroke) override;
+ void Stadium(PRectangle rc, FillStroke fillStroke, Ends ends) override;
void Copy(PRectangle rc, Point from, Surface &surfaceSource) override;
std::unique_ptr<IScreenLineLayout> Layout(const IScreenLine *screenLine) override;