From 7d61df9669d599d2823a98b25b295df9c929083f Mon Sep 17 00:00:00 2001 From: suragch Date: Thu, 13 Jun 2024 09:29:42 +0800 Subject: [PATCH 1/4] add ellipse examples to SwiftUI demo app --- .../project.pbxproj | 4 +++ .../shapes/EllipseExamples.swift | 36 +++++++++++++++++++ .../swift_ui_gallery/shapes/ShapesPage.swift | 6 ++++ 3 files changed, 46 insertions(+) create mode 100644 doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery/shapes/EllipseExamples.swift diff --git a/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery.xcodeproj/project.pbxproj b/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery.xcodeproj/project.pbxproj index 4651f65..24b1cf3 100644 --- a/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery.xcodeproj/project.pbxproj +++ b/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 7179CF852B26DEDD00C5927B /* TextAccessibilityPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7179CF842B26DEDD00C5927B /* TextAccessibilityPage.swift */; }; 7179CF872B26DF0E00C5927B /* TextLocalizationPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7179CF862B26DF0E00C5927B /* TextLocalizationPage.swift */; }; 719116892B216D500007C4DE /* TextPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 719116882B216D500007C4DE /* TextPage.swift */; }; + 71C346EF2C1A7B580087A514 /* EllipseExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71C346EE2C1A7B580087A514 /* EllipseExamples.swift */; }; B3CBD1552B2E18320095DE1F /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B3CBD1542B2E18320095DE1F /* Localizable.xcstrings */; }; B3CBD1572B2E1BE20095DE1F /* LocalizableAlternative.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B3CBD1562B2E1BE20095DE1F /* LocalizableAlternative.xcstrings */; }; B3DD96702B66513800F66E9F /* ImageLocalizationPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3DD966F2B66513800F66E9F /* ImageLocalizationPage.swift */; }; @@ -59,6 +60,7 @@ 7179CF842B26DEDD00C5927B /* TextAccessibilityPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextAccessibilityPage.swift; sourceTree = ""; }; 7179CF862B26DF0E00C5927B /* TextLocalizationPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextLocalizationPage.swift; sourceTree = ""; }; 719116882B216D500007C4DE /* TextPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextPage.swift; sourceTree = ""; }; + 71C346EE2C1A7B580087A514 /* EllipseExamples.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EllipseExamples.swift; sourceTree = ""; }; B3CBD1542B2E18320095DE1F /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; B3CBD1562B2E1BE20095DE1F /* LocalizableAlternative.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = LocalizableAlternative.xcstrings; sourceTree = ""; }; B3DD966F2B66513800F66E9F /* ImageLocalizationPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageLocalizationPage.swift; sourceTree = ""; }; @@ -114,6 +116,7 @@ children = ( 714951442C0EB31C00818B06 /* ShapesPage.swift */, 714951462C0EB52400818B06 /* RectangleExamples.swift */, + 71C346EE2C1A7B580087A514 /* EllipseExamples.swift */, ); path = shapes; sourceTree = ""; @@ -434,6 +437,7 @@ C9FB17582C0C4D25004479AA /* ZStackExamples.swift in Sources */, 714951452C0EB31C00818B06 /* ShapesPage.swift in Sources */, C902DDE72AE3904400242DBA /* TodoPage.swift in Sources */, + 71C346EF2C1A7B580087A514 /* EllipseExamples.swift in Sources */, C9CAE2B32AE1066B0042DBC7 /* MotionPage.swift in Sources */, B3DD96702B66513800F66E9F /* ImageLocalizationPage.swift in Sources */, C9FB17562C0C4AB4004479AA /* HStackExamples.swift in Sources */, diff --git a/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery/shapes/EllipseExamples.swift b/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery/shapes/EllipseExamples.swift new file mode 100644 index 0000000..a4df90e --- /dev/null +++ b/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery/shapes/EllipseExamples.swift @@ -0,0 +1,36 @@ +import SwiftUI + +struct EllipsePage: View { + var body: some View { + ScrollView { + VStack(spacing: 20) { + // Ellipse with solid fill + Ellipse() + .fill(Color.blue) + .frame(width: 200, height: 100) + + // Ellipse with gradient fill + Ellipse() + .fill(LinearGradient(gradient: Gradient(colors: [.yellow, .orange]), startPoint: .leading, endPoint: .trailing)) + .frame(width: 200, height: 100) + + // Ellipse with solid stroke + Ellipse() + .stroke(Color.red, lineWidth: 4) + .frame(width: 200, height: 100) + + // Ellipse with gradient stroke + Ellipse() + .stroke(LinearGradient(gradient: Gradient(colors: [.yellow, .blue]), startPoint: .leading, endPoint: .trailing), lineWidth: 14) + .frame(width: 200, height: 100) + }.frame(width: 300) + } + } +} + +struct EllipsePage_Previews: PreviewProvider { + static var previews: some View { + EllipsePage() + } +} + diff --git a/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery/shapes/ShapesPage.swift b/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery/shapes/ShapesPage.swift index 4fbe5ca..2387126 100644 --- a/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery/shapes/ShapesPage.swift +++ b/doc_swift_ui_gallery/swift_ui_gallery/swift_ui_gallery/shapes/ShapesPage.swift @@ -9,6 +9,12 @@ struct ShapesPage: View { } label: { Text("Rectangle") } + + NavigationLink { + EllipsePage() + } label: { + Text("Ellipse") + } }.navigationTitle("Shapes") } } From 40bd2b8624eb057de59bb637d627d948878e9d32 Mon Sep 17 00:00:00 2001 From: suragch Date: Thu, 13 Jun 2024 09:44:08 +0800 Subject: [PATCH 2/4] Implement Ellipse in Flutter --- lib/src/shapes/ellipse.dart | 139 +++++++++++++++++++++++++++++++++++- 1 file changed, 137 insertions(+), 2 deletions(-) diff --git a/lib/src/shapes/ellipse.dart b/lib/src/shapes/ellipse.dart index 56975ac..78015ef 100644 --- a/lib/src/shapes/ellipse.dart +++ b/lib/src/shapes/ellipse.dart @@ -1,10 +1,145 @@ import 'package:flutter/widgets.dart'; +/// An elliptical shape whose width and height match size of the parent class Ellipse extends StatelessWidget { - const Ellipse({super.key}); + const Ellipse({ + super.key, + this.fillColor, + this.fillGradient, + this.strokeColor, + this.strokeGradient, + this.strokeLineWidth = 1.0, + }); + + /// A color used for painting the interior of the ellipse. + /// + /// This is an alternative to [fillGradient]. + final Color? fillColor; + + /// A gradient used for painting the interior of the ellipse. + /// + /// This is an alternative to [fillColor]. + final Gradient? fillGradient; + + /// A color used for painting the outline of the ellipse. + /// + /// This is an alternative to [strokeGradient]. + final Color? strokeColor; + + /// A gradient used for painting the outline of the ellipse. + /// + /// This is an alternative to [strokeColor]. + final Gradient? strokeGradient; + + /// The width of the stroke used to paint the outline of the ellipse. + /// + /// The stroke line is centered along the edge of the ellipse. Half of + /// [strokeLineWidth] is painted outside of the ellipse and half inside. + /// + /// The default is 1.0. + final double strokeLineWidth; @override Widget build(BuildContext context) { - return const Placeholder(); + return CustomPaint( + size: Size.infinite, + painter: _EllipsePainter( + fillColor: fillColor, + fillGradient: fillGradient, + strokeColor: strokeColor, + strokeGradient: strokeGradient, + strokeLineWidth: strokeLineWidth, + ), + ); + } +} + +class _EllipsePainter extends CustomPainter { + _EllipsePainter({ + required this.fillColor, + required this.fillGradient, + required this.strokeColor, + required this.strokeGradient, + required this.strokeLineWidth, + }); + + final Color? fillColor; + final Gradient? fillGradient; + final Color? strokeColor; + final Gradient? strokeGradient; + final double strokeLineWidth; + + @override + void paint(Canvas canvas, Size size) { + _paintFill(canvas, size); + _paintStroke(canvas, size); + } + + void _paintFill(Canvas canvas, Size size) { + if (fillColor != null) { + _paintSolidFill(canvas, size); + } else if (fillGradient != null) { + _paintGradientFill(canvas, size); + } + } + + void _paintSolidFill(Canvas canvas, Size size) { + final rect = Rect.fromLTWH(0, 0, size.width, size.height); + final paint = Paint() + ..style = PaintingStyle.fill + ..color = fillColor!; + canvas.drawOval(rect, paint); + } + + void _paintGradientFill(Canvas canvas, Size size) { + final rect = Rect.fromLTWH(0, 0, size.width, size.height); + final paint = Paint() + ..style = PaintingStyle.fill + ..shader = fillGradient!.createShader(rect); + canvas.drawOval(rect, paint); + } + + void _paintStroke(Canvas canvas, Size size) { + if (strokeColor != null) { + _paintSolidStroke(canvas, size); + } else if (strokeGradient != null) { + _paintGradientStroke(canvas, size); + } + } + + void _paintSolidStroke(Canvas canvas, Size size) { + final rect = _adjustRectForLineWidth(size); + final paint = Paint() + ..style = PaintingStyle.stroke + ..color = strokeColor! + ..strokeWidth = strokeLineWidth; + canvas.drawOval(rect, paint); + } + + Rect _adjustRectForLineWidth(Size size) { + return Rect.fromLTWH( + strokeLineWidth / 2, + strokeLineWidth / 2, + size.width - strokeLineWidth, + size.height - strokeLineWidth, + ); + } + + void _paintGradientStroke(Canvas canvas, Size size) { + final rect = _adjustRectForLineWidth(size); + final paint = Paint() + ..style = PaintingStyle.stroke + ..shader = strokeGradient!.createShader(rect) + ..strokeWidth = strokeLineWidth; + canvas.drawOval(rect, paint); + } + + @override + bool shouldRepaint(covariant _EllipsePainter oldDelegate) { + return oldDelegate.fillColor != fillColor || + oldDelegate.fillGradient != fillGradient || + oldDelegate.strokeColor != strokeColor || + oldDelegate.strokeGradient != strokeGradient || + oldDelegate.strokeLineWidth != strokeLineWidth; } } From 4378b925151ab6c29e40ff4da35ee1e2350c006b Mon Sep 17 00:00:00 2001 From: suragch Date: Thu, 13 Jun 2024 09:52:30 +0800 Subject: [PATCH 3/4] Add Ellipse examples to the Flutter demo --- example/lib/shapes/ellipse.dart | 58 +++++++++++++++++++++++++ example/lib/shapes/shapes_examples.dart | 6 +++ lib/src/shapes/ellipse.dart | 13 +----- 3 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 example/lib/shapes/ellipse.dart diff --git a/example/lib/shapes/ellipse.dart b/example/lib/shapes/ellipse.dart new file mode 100644 index 0000000..9440043 --- /dev/null +++ b/example/lib/shapes/ellipse.dart @@ -0,0 +1,58 @@ +import 'package:flutter/widgets.dart'; +import 'package:swift_ui/swift_ui.dart'; + +class EllipseDemo extends StatelessWidget { + const EllipseDemo({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return const VStack( + [ + // Ellipse with solid fill + Frame( + width: 200, + height: 100, + child: Ellipse( + fillColor: Colors.blue, + ), + ), + + // Ellipse with gradient fill + Frame( + width: 200, + height: 100, + child: Ellipse( + fillGradient: LinearGradient( + colors: [Colors.yellow, Colors.orange], + ), + ), + ), + + // Ellipse with solid stroke + Frame( + width: 200, + height: 100, + child: Ellipse( + strokeColor: Colors.red, + strokeLineWidth: 4.0, + ), + ), + + // Ellipse with gradient stroke + Frame( + width: 200, + height: 100, + child: Ellipse( + strokeGradient: LinearGradient( + colors: [Colors.yellow, Colors.blue], + ), + strokeLineWidth: 14.0, + ), + ), + ], + spacing: 20, + ); + } +} diff --git a/example/lib/shapes/shapes_examples.dart b/example/lib/shapes/shapes_examples.dart index 658ab10..e907fa7 100644 --- a/example/lib/shapes/shapes_examples.dart +++ b/example/lib/shapes/shapes_examples.dart @@ -3,6 +3,8 @@ import 'package:example/infrastructure/inventory_page.dart'; import 'package:example/shapes/rectangle.dart'; import 'package:flutter/cupertino.dart'; +import 'ellipse.dart'; + class ShapesPage extends StatelessWidget { const ShapesPage({super.key}); @@ -17,6 +19,10 @@ class ShapesPage extends StatelessWidget { label: "Rectangle", pageBuilder: createDemo(const RectangleDemo()), ), + InventoryItem( + label: "Ellipse", + pageBuilder: createDemo(const EllipseDemo()), + ), ], ), ], diff --git a/lib/src/shapes/ellipse.dart b/lib/src/shapes/ellipse.dart index 78015ef..2986494 100644 --- a/lib/src/shapes/ellipse.dart +++ b/lib/src/shapes/ellipse.dart @@ -108,7 +108,7 @@ class _EllipsePainter extends CustomPainter { } void _paintSolidStroke(Canvas canvas, Size size) { - final rect = _adjustRectForLineWidth(size); + final rect = Rect.fromLTWH(0, 0, size.width, size.height); final paint = Paint() ..style = PaintingStyle.stroke ..color = strokeColor! @@ -116,17 +116,8 @@ class _EllipsePainter extends CustomPainter { canvas.drawOval(rect, paint); } - Rect _adjustRectForLineWidth(Size size) { - return Rect.fromLTWH( - strokeLineWidth / 2, - strokeLineWidth / 2, - size.width - strokeLineWidth, - size.height - strokeLineWidth, - ); - } - void _paintGradientStroke(Canvas canvas, Size size) { - final rect = _adjustRectForLineWidth(size); + final rect = Rect.fromLTWH(0, 0, size.width, size.height); final paint = Paint() ..style = PaintingStyle.stroke ..shader = strokeGradient!.createShader(rect) From 90bfd30f3b241d47bf1a262274f44a46b01c33a3 Mon Sep 17 00:00:00 2001 From: suragch Date: Thu, 13 Jun 2024 09:56:12 +0800 Subject: [PATCH 4/4] add smoke test for ellipse --- test/shapes/ellipse_golden_test.dart | 58 +++++++++++++++++++++ test/shapes/goldens/ellipse_smoke-test.png | Bin 0 -> 22914 bytes 2 files changed, 58 insertions(+) create mode 100644 test/shapes/ellipse_golden_test.dart create mode 100644 test/shapes/goldens/ellipse_smoke-test.png diff --git a/test/shapes/ellipse_golden_test.dart b/test/shapes/ellipse_golden_test.dart new file mode 100644 index 0000000..60c959d --- /dev/null +++ b/test/shapes/ellipse_golden_test.dart @@ -0,0 +1,58 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:golden_toolkit/golden_toolkit.dart'; +import 'package:swift_ui/swift_ui.dart'; + +void main() { + group("Shapes > Ellipse >", () { + testGoldens("smoke test", (widgetTester) async { + final builder = GoldenBuilder.grid(columns: 2, widthToHeightRatio: 1) + ..addScenario( + 'Solid fill', + const Frame( + width: 200, + height: 100, + child: Ellipse( + fillColor: Colors.blue, + ), + ), + ) + ..addScenario( + 'Gradient fill', + const Frame( + width: 200, + height: 100, + child: Ellipse( + fillGradient: LinearGradient( + colors: [Colors.yellow, Colors.orange], + ), + ), + ), + ) + ..addScenario( + 'Solid stroke', + const Frame( + width: 200, + height: 100, + child: Ellipse( + strokeColor: Colors.blue, + ), + ), + ) + ..addScenario( + 'Gradient stroke', + const Frame( + width: 200, + height: 100, + child: Ellipse( + strokeGradient: LinearGradient( + colors: [Colors.yellow, Colors.orange], + ), + ), + ), + ); + await widgetTester.pumpWidgetBuilder(builder.build()); + await screenMatchesGolden(widgetTester, 'ellipse_smoke-test'); + }); + }); +} diff --git a/test/shapes/goldens/ellipse_smoke-test.png b/test/shapes/goldens/ellipse_smoke-test.png new file mode 100644 index 0000000000000000000000000000000000000000..4326469ab1954648cee9f7d667e819000c1aa21d GIT binary patch literal 22914 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 literal 0 HcmV?d00001