From 4bdd50ae2e825c9dee74eb8ea3e6963899e66a59 Mon Sep 17 00:00:00 2001 From: Scott Hyndman Date: Tue, 9 Feb 2021 22:09:16 -0500 Subject: [PATCH 01/10] Remove upper bound on Flutter constraint --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index d4ee9f4..9afaef8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.11.0 homepage: https://github.com/madewithfelt/flutter_layout_grid environment: - flutter: '>=1.14.0 <2.0.0' + flutter: '>=1.14.0' sdk: ">=2.6.0 <3.0.0" dependencies: From 4822ce5534e1ad0d98e112b4c1f0f37efebd5d21 Mon Sep 17 00:00:00 2001 From: Scott Hyndman Date: Tue, 9 Feb 2021 22:13:24 -0500 Subject: [PATCH 02/10] Fix screenshot links --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5d60d39..12ca0be 100644 --- a/README.md +++ b/README.md @@ -8,21 +8,21 @@ design. Piet painting recreated using Flutter Layout Grid   Periodic table rendered using Flutter Layout Grid   Scrabble board rendered using Flutter Layout Grid @@ -85,7 +85,7 @@ dependencies: Desktop app layout rendered using Flutter Layout Grid From 9d2a07a80c3e31314cc1eabf66f0d95a6255cbd0 Mon Sep 17 00:00:00 2001 From: Scott Hyndman Date: Tue, 9 Feb 2021 22:13:26 -0500 Subject: [PATCH 03/10] Bump to v0.11.1 --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54688de..e18702d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [0.11.1] +* Fix screenshots for pub.dev + ## [0.11.0] * Tons of bug fixes in track sizing * Documentation overhaul diff --git a/pubspec.yaml b/pubspec.yaml index 9afaef8..7385352 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_layout_grid description: A powerful grid layout system for Flutter, optimized for complex user interface design. -version: 0.11.0 +version: 0.11.1 homepage: https://github.com/madewithfelt/flutter_layout_grid environment: From adfe507543cb7be6d5a337ab5594b08722490b31 Mon Sep 17 00:00:00 2001 From: Scott Hyndman Date: Tue, 9 Feb 2021 22:29:40 -0500 Subject: [PATCH 04/10] Add hashCode to TrackSize subclasses --- lib/src/rendering/track_size.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/src/rendering/track_size.dart b/lib/src/rendering/track_size.dart index aee31f6..94cae94 100644 --- a/lib/src/rendering/track_size.dart +++ b/lib/src/rendering/track_size.dart @@ -172,6 +172,9 @@ class FixedTrackSize extends TrackSize { return sizeInPx; } + @override + int get hashCode => hashValues(sizeInPx, debugLabel); + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -242,6 +245,9 @@ class FlexibleTrackSize extends TrackSize { properties.add(DoubleProperty('flex', flex)); } + @override + int get hashCode => hashValues(flex, debugLabel); + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; @@ -298,6 +304,9 @@ class IntrinsicContentTrackSize extends TrackSize { return max(maxContentContributions); } + @override + int get hashCode => debugLabel.hashCode; + @override bool operator ==(dynamic other) { if (identical(this, other)) return true; From 6bbff773ace91d2bc8e9d03af8002076c817e7f8 Mon Sep 17 00:00:00 2001 From: Scott Hyndman Date: Tue, 9 Feb 2021 22:30:54 -0500 Subject: [PATCH 05/10] Bump version to v0.11.2 --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e18702d..e22421e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [0.11.2] +* Add hashCode to TrackSize subclasses + ## [0.11.1] * Fix screenshots for pub.dev diff --git a/pubspec.yaml b/pubspec.yaml index 7385352..fc2707e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_layout_grid description: A powerful grid layout system for Flutter, optimized for complex user interface design. -version: 0.11.1 +version: 0.11.2 homepage: https://github.com/madewithfelt/flutter_layout_grid environment: From 9861a0ab125caa809bd431d02866210e3cf0d241 Mon Sep 17 00:00:00 2001 From: Scott Hyndman Date: Wed, 10 Feb 2021 06:07:45 -0500 Subject: [PATCH 06/10] Update Scrabble image You have to play the middle square. --- doc/images/scrabble.png | Bin 69589 -> 68891 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/scrabble.png b/doc/images/scrabble.png index 604aa11352517fb72211db712d29c8d9ae6141ad..cfb4eb4b0efd2760eb498503ef81efe0bc0d3be2 100644 GIT binary patch literal 68891 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ĝ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 OyL0RQ&D Date: Wed, 10 Feb 2021 06:09:00 -0500 Subject: [PATCH 07/10] Bump version to 0.11.3 --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e22421e..7bf3954 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [0.11.3] +* Update Scrabble screenshot to follow game rules (middle square must be + occupied) + ## [0.11.2] * Add hashCode to TrackSize subclasses diff --git a/pubspec.yaml b/pubspec.yaml index fc2707e..308d39f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_layout_grid description: A powerful grid layout system for Flutter, optimized for complex user interface design. -version: 0.11.2 +version: 0.11.3 homepage: https://github.com/madewithfelt/flutter_layout_grid environment: From d2bcfe91ad127b52e9bb271d74370ae9b663f5f3 Mon Sep 17 00:00:00 2001 From: Scott Hyndman Date: Fri, 12 Feb 2021 21:21:32 -0500 Subject: [PATCH 08/10] Improve layout speed of periodic table The periodic table's performance was being heavily impacted by text layout. By wrapping the `AtomicElementWidget`s in `AspectRatio` widgets (and expecting a touch of overflow), performance has been drastically improved. We're still impacted by text layout performance, but to a much lesser degree. This could probably be resolved by scaling the table through a Transform, but for now this is a big improvement. Fixes #33 --- example/periodic_table.dart | 80 +++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 31 deletions(-) diff --git a/example/periodic_table.dart b/example/periodic_table.dart index e8c13f6..ceb1759 100644 --- a/example/periodic_table.dart +++ b/example/periodic_table.dart @@ -73,9 +73,12 @@ class _PeriodicTableWidgetState extends State { rowGap: 0.4.vw, children: [ for (final e in table.elements) - AtomicElementWidget( - key: ValueKey(e.symbol), - element: e, + AspectRatio( + aspectRatio: 40.1 / 42.4, + child: AtomicElementWidget( + key: ValueKey(e.symbol), + element: e, + ), ).withGridPlacement(columnStart: e.x, rowStart: e.y), ], ); @@ -115,39 +118,54 @@ class AtomicElementWidget extends StatelessWidget { color: elementColor, ), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, + // Some viewport sizes give us slight overflows, which can be attributed + // to rounding errors. So we use a stack and allow overflow on the bottom + // edge. + child: Stack( + clipBehavior: Clip.hardEdge, children: [ - Padding( - padding: EdgeInsets.fromLTRB(0.3.vw, 0.15.vw, 0, 0), - child: Text( - element.number.toString(), - style: elementTextStyle.copyWith(fontSize: 0.5.vw), - textAlign: TextAlign.left, - ), + Positioned.fill( + bottom: null, + child: _buildElementDetails(elementTextStyle), ), - Text( - element.symbol, - style: elementTextStyle.copyWith(fontSize: 1.9.vw), - textAlign: TextAlign.center, - softWrap: false, + ], + ), + ); + } + + Column _buildElementDetails(TextStyle elementTextStyle) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: EdgeInsets.fromLTRB(0.3.vw, 0.15.vw, 0, 0), + child: Text( + element.number.toString(), + style: elementTextStyle.copyWith(fontSize: 0.5.vw), + textAlign: TextAlign.left, ), - Text( - element.name, - style: elementTextStyle.copyWith(fontSize: 0.65.vw), + ), + Text( + element.symbol, + style: elementTextStyle.copyWith(fontSize: 1.9.vw), + textAlign: TextAlign.center, + softWrap: false, + ), + Text( + element.name, + style: elementTextStyle.copyWith(fontSize: 0.65.vw), + textAlign: TextAlign.center, + softWrap: false, + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 0.2.vw, 0.0, 0.3.vw), + child: Text( + element.formattedMass, + style: elementTextStyle.copyWith(fontSize: 0.5.vw), textAlign: TextAlign.center, - softWrap: false, - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 0.2.vw, 0.0, 0.3.vw), - child: Text( - element.formattedMass, - style: elementTextStyle.copyWith(fontSize: 0.5.vw), - textAlign: TextAlign.center, - ), ), - ], - ), + ), + ], ); } } From 3c8ac02a42af3c51bc85bf5c5185d160c0edf2f5 Mon Sep 17 00:00:00 2001 From: Scott Hyndman Date: Fri, 12 Feb 2021 21:29:01 -0500 Subject: [PATCH 09/10] Bump version to 0.11.4 --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bf3954..4c685f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [0.11.4] +* Improve performance of periodic table example + ## [0.11.3] * Update Scrabble screenshot to follow game rules (middle square must be occupied) diff --git a/pubspec.yaml b/pubspec.yaml index 308d39f..d7c7e51 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_layout_grid description: A powerful grid layout system for Flutter, optimized for complex user interface design. -version: 0.11.3 +version: 0.11.4 homepage: https://github.com/madewithfelt/flutter_layout_grid environment: From 2db7c2a378499753b8469d5ee802ece7e8511df9 Mon Sep 17 00:00:00 2001 From: Scott Hyndman Date: Sun, 31 Jan 2021 19:43:35 -0500 Subject: [PATCH 10/10] Add a Scantron example --- .vscode/launch.json | 6 + README.md | 2 +- example/example_helpers.dart | 33 + example/macos/Podfile.lock | 6 + .../macos/Runner.xcodeproj/project.pbxproj | 2 + example/periodic_table.dart | 41 +- example/pubspec.yaml | 2 + example/scantron_answer_sheet.dart | 1236 +++++++++++++++++ example/support/decoration.dart | 29 + example/support/link.dart | 36 + lib/src/foundation/collections.dart | 2 +- pubspec.yaml | 2 +- 12 files changed, 1367 insertions(+), 30 deletions(-) create mode 100644 example/example_helpers.dart create mode 100644 example/scantron_answer_sheet.dart create mode 100644 example/support/decoration.dart create mode 100644 example/support/link.dart diff --git a/.vscode/launch.json b/.vscode/launch.json index 0be6f8c..d60d9d1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -23,6 +23,12 @@ "type": "dart", "request": "launch", }, + { + "name": "Scantron", + "program": "example/scantron_answer_sheet.dart", + "type": "dart", + "request": "launch", + }, { "name": "Basic", "program": "example/basic.dart", diff --git a/README.md b/README.md index 12ca0be..30570e5 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ There are currently three way to size rows and columns: | Class Name | Description | Usage | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- | | `FixedTrackSize` | Occupies a specific number of pixels on an axis | `FixedTrackSize(64)`
`fixed(64)`
`64.px` | -| `FlexibleSizeTrack` | Fills remaining space after the initial layout has completed | `FlexibleTrackSize(1.5)`
`flexible(1.5)`
`1.5.fr` | +| `FlexibleSizeTrack` | Fills remaining space after the initial layout has completed | `FlexibleTrackSize(1.5)`
`flex(1.5)`
`1.5.fr` | | `IntrinsicContentTrackSize` | Sized to contain its itemsʼ contents. Will also expand to fill available space, once `FlexibleTrackSize` tracks have been given the opportunity. | `IntrinsicContentTrackSize()`
`intrinsic()`
`auto` | Technically, you can also define your own, but probably shouldnʼt as the API diff --git a/example/example_helpers.dart b/example/example_helpers.dart new file mode 100644 index 0000000..9bd9de3 --- /dev/null +++ b/example/example_helpers.dart @@ -0,0 +1,33 @@ +import 'dart:ui'; + +// Responsiveness + +Size viewportSize = Size.zero; + +extension ViewportUnits on num { + double get vw => viewportSize.width * (this / 100.0); +} + +// Formatting + +extension DoubleFormatting on double { + /// Formats a double with a maximum precision of [maxFractionDigits]. Any + /// trailing zeroes will be trimmed from the returned string. + String toStringAsMaxFixed([int maxFractionDigits = 2]) { + return this + .toStringAsFixed(maxFractionDigits) + .replaceAll(RegExp(r'\.?0+$'), ''); + } +} + +// Iterables + +extension ListExt on List { + List operator *(int times) => generate(times).expand((e) => this).toList(); +} + +Iterable generate(int times) sync* { + for (int i = 0; i < times; i++) { + yield 0; + } +} diff --git a/example/macos/Podfile.lock b/example/macos/Podfile.lock index 5c30a0b..9b901f6 100644 --- a/example/macos/Podfile.lock +++ b/example/macos/Podfile.lock @@ -2,20 +2,26 @@ PODS: - FlutterMacOS (1.0.0) - path_provider_macos (0.0.1): - FlutterMacOS + - url_launcher_macos (0.0.1): + - FlutterMacOS DEPENDENCIES: - FlutterMacOS (from `Flutter/ephemeral`) - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) EXTERNAL SOURCES: FlutterMacOS: :path: Flutter/ephemeral path_provider_macos: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos SPEC CHECKSUMS: FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424 path_provider_macos: a0a3fd666cb7cd0448e936fb4abad4052961002b + url_launcher_macos: 45af3d61de06997666568a7149c1be98b41c95d4 PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c diff --git a/example/macos/Runner.xcodeproj/project.pbxproj b/example/macos/Runner.xcodeproj/project.pbxproj index 93c495f..a2e9f40 100644 --- a/example/macos/Runner.xcodeproj/project.pbxproj +++ b/example/macos/Runner.xcodeproj/project.pbxproj @@ -321,10 +321,12 @@ inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", "${BUILT_PRODUCTS_DIR}/path_provider_macos/path_provider_macos.framework", + "${BUILT_PRODUCTS_DIR}/url_launcher_macos/url_launcher_macos.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_macos.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_macos.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/example/periodic_table.dart b/example/periodic_table.dart index ceb1759..7caee2a 100644 --- a/example/periodic_table.dart +++ b/example/periodic_table.dart @@ -11,6 +11,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_layout_grid/flutter_layout_grid.dart'; +import 'example_helpers.dart'; + void main() { runApp(PeriodicTableApp()); } @@ -28,7 +30,7 @@ class PeriodicTableApp extends StatelessWidget { debugShowCheckedModeBanner: false, builder: (_, __) { return LayoutBuilder(builder: (_, constraints) { - _viewportSize = constraints.biggest; + viewportSize = constraints.biggest; return SingleChildScrollView(child: PeriodicTableWidget()); }); }, @@ -37,6 +39,7 @@ class PeriodicTableApp extends StatelessWidget { } } +/// Renders a periodic table. class PeriodicTableWidget extends StatefulWidget { @override _PeriodicTableWidgetState createState() => _PeriodicTableWidgetState(); @@ -65,6 +68,10 @@ class _PeriodicTableWidgetState extends State { } Widget _buildGrid(PeriodicTable table) { + // !!! This is the grid behind the periodic table! !!! + // + // The rest of the code is just details (what goes where, how things should + // look, etc). return LayoutGrid( gridFit: GridFit.loose, columnSizes: repeat(table.numColumns, [1.fr]), @@ -85,6 +92,7 @@ class _PeriodicTableWidgetState extends State { } } +// Mappings between atomic categories and their associated colors. const categoryColorMapping = { AtomicElementCategory.actinide: Color(0xffc686cc), AtomicElementCategory.alkaliMetal: Color(0xffecbe59), @@ -98,6 +106,7 @@ const categoryColorMapping = { AtomicElementCategory.unknown: Color(0xffcccccc), }; +/// A widget representing an element's square on the periodic table. class AtomicElementWidget extends StatelessWidget { AtomicElementWidget({Key key, this.element}) : super(key: key); final AtomicElement element; @@ -181,6 +190,7 @@ Future loadPeriodicTable() async { .toList()); } +/// The elements and structure of the periodic table. class PeriodicTable { PeriodicTable(this.elements) { for (final e in elements) { @@ -194,6 +204,8 @@ class PeriodicTable { int numRows = 0; } +/// Describes an atomic element, with a few view helpers and deserialization +/// logic. class AtomicElement { AtomicElement({ @required this.name, @@ -237,6 +249,7 @@ class AtomicElement { } } +/// Categories of atomic element, as dictacted by...physics! enum AtomicElementCategory { actinide, alkaliMetal, @@ -277,29 +290,3 @@ AtomicElementCategory _parseAtomicElementCategory(String category) { assert(category.startsWith('unknown')); return AtomicElementCategory.unknown; } - -extension ListExt on List { - List operator *(int times) => generate(times).expand((e) => this).toList(); -} - -Size _viewportSize = Size.zero; - -extension on num { - double get vw => _viewportSize.width * (this / 100.0); -} - -extension on double { - /// Formats a double with a maximum precision of [maxFractionDigits]. Any - /// trailing zeroes will be trimmed from the returned string. - String toStringAsMaxFixed([int maxFractionDigits = 2]) { - return this - .toStringAsFixed(maxFractionDigits) - .replaceAll(RegExp(r'\.?0+$'), ''); - } -} - -Iterable generate(int times) sync* { - for (int i = 0; i < times; i++) { - yield 0; - } -} diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 926255e..e87c1ae 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -11,6 +11,8 @@ dependencies: flutter_layout_grid: path: ../ google_fonts: ^1.0.0 + quiver: ^2.1.5 + url_launcher: ^5.7.0 flutter: assets: diff --git a/example/scantron_answer_sheet.dart b/example/scantron_answer_sheet.dart new file mode 100644 index 0000000..9aadac8 --- /dev/null +++ b/example/scantron_answer_sheet.dart @@ -0,0 +1,1236 @@ +// Inspired by the excellent work of Jon Kantner: +// https://codepen.io/jkantner/pen/MGMMVo + +import 'package:flutter/material.dart'; +import 'package:flutter_layout_grid/flutter_layout_grid.dart'; + +import 'support/decoration.dart'; +import 'support/link.dart'; + +void main() { + runApp(ScantronAnswerSheetApp()); +} + +const questionCount = 50; + +/// Used by a couple of extensions on num, defined below +const remUnit = 16.0; +const scantronGreen = Color(0xff20b090); +final choiceLabelScaleFactor = 1.9; +final questionGroupingBorderRadius = 0.375.rem; +final scoreGridRadius = Radius.circular(0.5.rem); + +/// Column/row sizes, used by a couple of widgets +const questionLabels = ['A', 'B', 'C', 'D', 'E']; +final questionGridColumnSizes = [ + fixed(2.rem), // Question number + // A, B, C, D, E, (blank) + ...repeat(questionLabels.length + 1, [fixed(2.5.rem)]), +]; +final questionGridRowHeight = 1.25.rem; + +final rootTextStyle = TextStyle( + fontFamily: 'Helvetica Neue', + fontFamilyFallback: ['Helvetica'], + fontSize: 1.rem, + color: scantronGreen, +); +final bubbleHeaderTextStyle = rootTextStyle.copyWith( + color: Colors.white, + fontWeight: FontWeight.bold, +); +final instructionsTextStyle = rootTextStyle.copyWith( + fontSize: 0.625.rem, + fontWeight: FontWeight.bold, + height: 1.4, +); +final tagSeparatedTextStyle = TextStyle( + fontSize: 3.rem, + height: 0, +); +final questionHeaderTextStyle = TextStyle( + fontSize: 0.8.rem, + letterSpacing: 0.05.rem, +); + +/// Top-level widget, composing the components of the answer sheet. +class ScantronAnswerSheet extends StatelessWidget { + @override + Widget build(BuildContext context) { + return DefaultTextStyle( + style: rootTextStyle, + child: Builder( + builder: (context) => SizedBox( + height: 56 * questionGridRowHeight + 76, + child: LayoutGrid( + gridFit: GridFit.loose, + areas: ''' + . . score . . part + margin barcode score . . part + margin barcode questions tags reorder metadata + ''', + columnSizes: [ + fixed(3.rem), // help and copyright (margin) + fixed(2.625.rem), // barcode + auto, // questions + auto, // test tags + fixed(2.6.rem), // call to reorder + auto, // metadata and legend + ], + rowSizes: [ + fixed(3.5.rem), + auto, + auto, + ], + children: [ + _buildMargin(context).inGridArea('margin'), + _buildBarcode().inGridArea('barcode'), + _buildScore().inGridArea('score'), + _buildQuestions().inGridArea('questions'), + _buildTestTags().inGridArea('tags'), + _buildReorder().inGridArea('reorder'), + _buildPartLabel().inGridArea('part'), + _buildMetadataAndInstructions().inGridArea('metadata'), + ], + ), + ), + ), + ); + } + + Widget _buildMargin(BuildContext context) { + return RotatedBox( + quarterTurns: 1, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text( + '© SCANTRON CORPORATION 2007\nALL RIGHTS RESERVED', + style: TextStyle(fontSize: 0.6.rem, letterSpacing: -0.03.rem), + ), + Row( + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: 'Customer Service\n', + style: TextStyle( + fontSize: .9.rem, + letterSpacing: 0.04.rem, + ), + ), + WidgetSpan( + child: UrlLink( + 'tel:1-800-SCANTRON', + style: TextStyle( + fontSize: .9.rem, + letterSpacing: 0.04.rem, + ), + ), + ), + ], + ), + textAlign: TextAlign.center, + ), + SizedBox(width: 1.8.rem), + Container( + decoration: ArrowBoxDecoration( + headLength: 4.75.rem, + tailLength: 4.75.rem, + ), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 0.4.rem), + child: Text( + 'FEED THIS DIRECTION', + style: TextStyle( + fontSize: .75.rem, + fontStyle: FontStyle.italic, + ), + ), + ), + ), + ], + ), + RichText( + text: TextSpan( + style: DefaultTextStyle.of(context) + .style + .copyWith(fontSize: 0.75.rem), + children: [ + TextSpan( + text: '8012 4207 599', + style: TextStyle(fontWeight: FontWeight.bold), + ), + TextSpan(text: ' 16'), + ], + ), + ), + ], + ), + ); + } + + Widget _buildBarcode() { + return SizedBox( + width: double.infinity, + height: (questionCount + 4 + 3) * questionGridRowHeight, + child: Padding( + padding: EdgeInsets.only(right: 0.6.rem), + child: QuestionBarcodes( + pattern: [ + for (int i = 0; i < 4; i++) BarcodeStripeType.short, + BarcodeStripeType.blank, + BarcodeStripeType.long, + for (int i = 0; i < questionCount - 1; i++) BarcodeStripeType.short, + BarcodeStripeType.long, + ], + ), + ), + ); + } + + Widget _buildScore() { + return ScoreGrid(); + } + + Widget _buildQuestions() { + return QuestionGrid( + questionCount: questionCount, + ); + } + + Widget _buildTestTags() { + return Padding( + padding: EdgeInsets.only(top: questionGridRowHeight), + child: RotatedBox( + quarterTurns: 1, + child: Text.rich( + TextSpan( + children: [ + TextSpan(text: 'SHORT ESSAY '), + WidgetSpan(child: Text('•', style: tagSeparatedTextStyle)), + TextSpan(text: ' COMPLETION '), + WidgetSpan(child: Text('•', style: tagSeparatedTextStyle)), + TextSpan(text: ' MULTIPLE CHOICE '), + WidgetSpan(child: Text('•', style: tagSeparatedTextStyle)), + TextSpan(text: ' MATCHING'), + ], + ), + style: TextStyle( + fontSize: 1.8.rem, + letterSpacing: 0.08.rem, + color: scantronGreen, + fontWeight: FontWeight.bold, + ), + ), + ), + ); + } + + Widget _buildReorder() { + return RotatedBox( + quarterTurns: 1, + // Transform squishes the text a bit + child: Transform( + transform: Matrix4.diagonal3Values(0.85, 1.25, 1.0), + child: SizedBox.expand( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('REORDER ONLINE'), + SizedBox(width: 1.rem), + UrlLink('https://www.scantronforms.com'), + ], + ), + ), + ), + ); + } + + Widget _buildPartLabel() { + return Padding( + padding: EdgeInsets.only(bottom: 3.rem), + child: Center( + child: Text( + 'PART 1', + textAlign: TextAlign.center, + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ); + } + + Widget _buildMetadataAndInstructions() { + return RotatedBox( + quarterTurns: 1, + child: ScantronMetadataContainer(), + ); + } +} + +enum BarcodeStripeType { + blank, + short, + long, +} + +class QuestionBarcodes extends StatelessWidget { + const QuestionBarcodes({ + Key key, + @required this.pattern, + }) : super(key: key); + final List pattern; + + @override + Widget build(BuildContext context) { + return CustomPaint( + painter: BarcodePainter(pattern: pattern), + ); + } +} + +class BarcodePainter extends CustomPainter { + BarcodePainter({@required this.pattern}); + final List pattern; + + Rect rectForStripe(BarcodeStripeType type) { + switch (type) { + case BarcodeStripeType.long: + return Offset(0, -2) & Size(double.infinity, 0.8.rem); + + case BarcodeStripeType.short: + return Offset.zero & Size(double.infinity, 0.18.rem); + + default: + return Rect.zero; + } + } + + @override + void paint(Canvas canvas, Size size) { + final fill = Paint() + ..style = PaintingStyle.fill + ..color = Colors.black; + + for (int i = 0; i < pattern.length; i++) { + if (pattern[i] != BarcodeStripeType.blank) { + final cellRect = rectForStripe(pattern[i]); + final adjustedCellRect = cellRect + .shift(Offset(0, i * questionGridRowHeight)) + .copyWith(width: size.width); + + canvas.drawRect(adjustedCellRect, fill); + } + } + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => true; +} + +class ScoreGrid extends StatelessWidget { + const ScoreGrid({ + Key key, + this.includeHeader = true, + this.includeEmptyLeadingColumn = true, + this.finalScore, + this.filledScoreCells = const {}, + }) : super(key: key); + + final bool includeHeader; + final bool includeEmptyLeadingColumn; + final String finalScore; + final Set filledScoreCells; + + int get firstScoreRow => includeHeader ? 1 : 0; + int get firstScoreColumn => includeEmptyLeadingColumn ? 1 : 0; + + @override + Widget build(BuildContext context) { + return LayoutGrid( + gridFit: GridFit.expand, + columnSizes: questionGridColumnSizes, + rowSizes: [ + if (includeHeader) auto, + ...repeat(4, [questionGridRowHeight.px]) + ], + children: [ + ..._buildScoreCells(), + if (includeHeader) _buildHeader(), + ..._buildOutlines(), + if (finalScore != null) _buildFinalScore(), + ], + ); + } + + Widget _buildHeader() { + return SizedBox.expand( + child: Heading('SUBJECTIVE SCORE\nINSTRUCTOR USE ONLY'), + ).withGridPlacement(columnStart: 1, columnSpan: 6, rowStart: 0); + } + + List _buildScoreCells() { + final rows = [ + [100, 90, 80, 70, 60], + [50, 40, 30, 20, 10], + [9, 8, 7, 6, 5], + [4, 3, 2, 1, 0], + ]; + final colStart = firstScoreColumn; + final rowStart = firstScoreRow; + + return [ + for (int i = 0; i < rows.length; i++) + for (int j = 0; j < 5; j++) + QuestionChoice( + label: rows[i][j].toString(), + filled: filledScoreCells.contains(rows[i][j]), + ).withGridPlacement( + columnStart: colStart + j, + rowStart: rowStart + i, + ), + ]; + } + + List _buildOutlines() { + return [ + // Outline around entire grid + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all(scoreGridRadius), + border: Border.all(color: scantronGreen), + ), + ).withGridPlacement( + columnStart: firstScoreColumn, + columnSpan: 6, + rowStart: 0, + rowSpan: includeHeader ? 5 : 4, + ), + // Single line on right edge of choices + Container( + decoration: BoxDecoration( + border: Border(right: BorderSide(color: scantronGreen)), + ), + ).withGridPlacement( + columnStart: firstScoreColumn, + columnSpan: 5, + rowStart: firstScoreRow, + rowSpan: 4, + ) + ]; + } + + Widget _buildFinalScore() { + return SizedBox(); + } +} + +class QuestionGrid extends StatelessWidget { + QuestionGrid({ + @required this.questionCount, + }); + + final int questionCount; + + @override + Widget build(BuildContext context) { + // TODO(shyndman): This would be better with a template + return LayoutGrid( + // ordinals + questions + blank + columnSizes: questionGridColumnSizes, + // header + pre-question + questions + rowSizes: repeat(1 + 1 + questionCount, [fixed(questionGridRowHeight)]), + children: [ + ..._buildHeaderRow(), + ..._buildPreQuestionRow(), + ..._buildQuestions(), + ..._buildQuestionGroupings(), + ], + ); + } + + List _buildHeaderRow() { + return [ + QuestionHeader(label: '(T)') + .withGridPlacement(columnStart: 1, rowStart: 0), + QuestionHeader(label: '(F)') + .withGridPlacement(columnStart: 2, rowStart: 0), + QuestionHeader(label: 'KEY', bold: true) + .withGridPlacement(columnStart: 5, rowStart: 0), + ]; + } + + List _buildPreQuestionRow() { + return [ + QuestionChoice(label: '%', italic: true) + .withGridPlacement(columnStart: 1, rowStart: 1), + QuestionChoice(label: '2', italic: true) + .withGridPlacement(columnStart: 2, rowStart: 1), + QuestionChoice(label: '3', italic: true) + .withGridPlacement(columnStart: 3, rowStart: 1), + QuestionChoice(label: '5', italic: true) + .withGridPlacement(columnStart: 5, rowStart: 1), + ]; + } + + List _buildQuestions() { + final firstRow = 2; + return [ + for (int i = 0; i < questionCount; i++) + QuestionNumber(label: i + 1) + .withGridPlacement(columnStart: 0, rowStart: firstRow + i), + for (int i = 0; i < questionCount; i++) + for (int j = 0; j < questionLabels.length; j++) + QuestionChoice(label: questionLabels[j]).withGridPlacement( + columnStart: 1 + j, + rowStart: firstRow + i, + ), + ]; + } + + /// Lined brackets around groups of questions + List _buildQuestionGroupings() { + final firstRow = 2; + return [ + if (questionCount > 20) + QuestionGrouping().withGridPlacement( + columnStart: 0, + columnSpan: 6, + rowStart: firstRow + 10, + rowSpan: 10, + ), + if (questionCount > 40) + QuestionGrouping().withGridPlacement( + columnStart: 0, + columnSpan: 6, + rowStart: firstRow + 30, + rowSpan: 10, + ), + ]; + } +} + +class QuestionHeader extends StatelessWidget { + const QuestionHeader({ + Key key, + this.label, + this.bold = false, + }) : super(key: key); + + final String label; + final bool bold; + + @override + Widget build(BuildContext context) { + final style = questionHeaderTextStyle; + return SizedBox.expand( + child: Center( + child: Text( + label, + style: bold ? style.copyWith(fontWeight: FontWeight.bold) : style, + ), + ), + ); + } +} + +/// The number next to a question +class QuestionNumber extends StatelessWidget { + const QuestionNumber({Key key, this.label}) : super(key: key); + final int label; + + @override + Widget build(BuildContext context) { + return SizedBox.expand( + child: Padding( + padding: EdgeInsets.only(right: 0.25.rem), + child: Text( + label.toString(), + textAlign: TextAlign.right, + style: TextStyle( + fontSize: 1.rem, + fontWeight: FontWeight.bold, + ), + ), + ), + ); + } +} + +/// One of a question's choices (ie, A, B, C, etc) +class QuestionChoice extends StatelessWidget { + const QuestionChoice({ + Key key, + this.label, + this.margin, + this.filled = false, + this.italic = false, + }) : super(key: key); + + final String label; + final bool filled; + final bool italic; + final EdgeInsets margin; + + double get fontSize => label.length == 3 + ? 0.74.rem + : label.length == 2 + ? 0.85.rem + : 0.95.rem; + + EdgeInsets get labelPadding => label.length == 3 + ? EdgeInsets.symmetric(vertical: 0.075.rem) + : EdgeInsets.all(0.05.rem); + + EdgeInsets get effectiveBoxMargin => + margin ?? + EdgeInsets.symmetric( + horizontal: 0.45.rem, + vertical: 0.37.rem, + ); + + @override + Widget build(BuildContext context) { + return Stack( + alignment: Alignment.center, + children: [ + // Green edges + Container( + margin: effectiveBoxMargin, + decoration: BoxDecoration( + border: Border.all(color: scantronGreen), + ), + ), + Transform.scale( + scale: choiceLabelScaleFactor, + child: Container( + color: Colors.white, + padding: labelPadding, + child: Text( + label, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: fontSize / choiceLabelScaleFactor, + fontWeight: FontWeight.bold, + fontStyle: italic ? FontStyle.italic : FontStyle.normal, + ), + ), + ), + ), + if (filled) + Container( + margin: effectiveBoxMargin, + color: scantronGreen, + ), + ], + ); + } +} + +class QuestionGrouping extends StatelessWidget { + @override + Widget build(BuildContext context) { + return SizedBox.expand( + child: CustomPaint( + painter: QuestionGroupingPainter(), + ), + ); + } +} + +class ScantronMetadataContainer extends StatelessWidget { + @override + Widget build(BuildContext context) { + return LayoutGrid( + areas: ''' + instructions sheet_meta score_tally + instructions student_meta score_tally + ''', + columnSizes: [1.5.fr, 1.5.fr, 0.75.fr], + rowSizes: [auto, auto], + columnGap: 1.rem, + children: [ + ScantronInstructions().inGridArea('instructions'), + ScantronLogoAndSheetMetadata().inGridArea('sheet_meta'), + ScantronStudentMetadata().inGridArea('student_meta'), + ScantronScoreTally().inGridArea('score_tally'), + ], + ); + } +} + +class ScantronInstructions extends StatelessWidget { + @override + Widget build(BuildContext context) { + return DefaultTextStyle( + style: instructionsTextStyle, + child: Container( + decoration: BoxDecoration( + border: Border.all(color: scantronGreen), + borderRadius: BorderRadius.all(scoreGridRadius), + ), + clipBehavior: Clip.hardEdge, + child: _buildGrid(), + ), + ); + } + + LayoutGrid _buildGrid() { + return LayoutGrid( + gridFit: GridFit.loose, + areas: ''' + header header + student teacher + ''', + columnSizes: [1.fr, 1.fr], + rowSizes: [ + auto, + auto, + ], + children: [ + _buildHeader().inGridArea('header'), + _buildStudentInstructions().inGridArea('student'), + _buildTeacherInstructions().inGridArea('teacher'), + ], + ); + } + + Widget _buildHeader() { + return Container( + color: scantronGreen, + child: Heading('IMPORTANT'), + ); + } + + Widget _buildStudentInstructions() { + return Container( + decoration: BoxDecoration( + border: Border( + right: BorderSide(color: scantronGreen), + ), + ), + padding: EdgeInsets.symmetric( + horizontal: 0.25.rem, + vertical: 0.125.rem, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: PencilBoxDecoration( + headLength: 1.3.rem, + tailLength: 0.9.rem, + ), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 0.4.rem), + child: Text( + 'USE NO. 2 PENCIL ONLY', + style: TextStyle( + fontFamily: 'Times New Roman', + fontWeight: FontWeight.normal, + height: 1.1, + ), + ), + ), + ), + Bullet(child: Text('MAKE DARK MARKS')), + Bullet( + child: Text('ERASE COMPLETELY\nTO CHANGE'), + ), + Bullet( + child: Row( + children: [ + Expanded(child: Text('EXAMPLE:')), + ..._buildExampleChoices(), + ], + ), + ), + ], + ), + ); + } + + List _buildExampleChoices() { + return [ + for (int i = 0; i < questionLabels.length; i++) + SizedBox( + width: 26, + height: 13, + child: Transform.scale( + scale: 0.6, + child: QuestionChoice( + margin: EdgeInsets.symmetric(vertical: 0.15.rem), + label: questionLabels[i], + filled: i == 1, // fill in B + ), + ), + ), + ]; + } + + Widget _buildTeacherInstructions() { + return Padding( + padding: EdgeInsets.only( + left: 0.4.rem, + right: 0.25.rem, + top: 0.125.rem, + bottom: 0.3125.rem, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + // crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + 'TO USE SUBJECTIVE\nSCORE FEATURE:', + textAlign: TextAlign.center, + style: TextStyle( + height: 1.5, + ), + ), + Column( + children: [ + Bullet(child: Text('Make total possible subjective points')), + Bullet(child: Text('Only one mark per line on key')), + Bullet(child: Text('163 points maximum')), + ], + ), + _buildTeacherExample(), + ], + ), + ); + } + + Widget _buildTeacherExample() { + return Row( + children: [ + Flexible(child: Text('EXAMPLE OF STUDENT SCORE:')), + Transform.scale( + scale: 0.5, + origin: Offset(0, 0), + child: ScoreGrid( + includeEmptyLeadingColumn: false, + includeHeader: false, + filledScoreCells: {100, 20, 5}, + finalScore: '125', + ), + ), + ], + ); + } +} + +class ScantronLogoAndSheetMetadata extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ + Column( + children: [ + Transform( + transform: Matrix4.diagonal3Values(1, 1.5, 1), + child: Text( + 'SCANTRON®', + style: TextStyle( + fontWeight: FontWeight.w300, + letterSpacing: 0.825.rem, + ), + ), + ), + Text('FORM NO. 883-E'), + ], + ), + Text( + 'FOR USE ON\nTEST SCORING\nMACHINE ONLY', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 0.9.rem, + fontStyle: FontStyle.italic, + ), + ) + ]); + } +} + +class ScantronStudentMetadata extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + border: Border.all(color: scantronGreen), + borderRadius: BorderRadius.all(scoreGridRadius), + ), + clipBehavior: Clip.hardEdge, + child: LayoutGrid( + areas: ''' + nameLabel name name name + subjectLabel subject testNoLabel testLabel + dateLabel date periodLabel period + ''', + columnGap: 10, + columnSizes: repeat(4, [auto]), + rowSizes: repeat(3, [auto]), + children: [ + // Headings + Heading('NAME').inGridArea('nameLabel'), + Heading('SUBJECT').inGridArea('subjectLabel'), + Heading('DATE').inGridArea('dateLabel'), + Heading('TEST NO.').inGridArea('testNoLabel'), + Heading('PERIOD').inGridArea('periodLabel'), + + // Lines + ..._buildRowLines(), + ], + ), + ); + } + + List _buildRowLines() { + return [ + Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide(color: scantronGreen), + ), + ), + ).withGridPlacement(columnStart: 0, columnSpan: 4, rowStart: 1), + Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide(color: scantronGreen), + ), + ), + ).withGridPlacement(columnStart: 0, columnSpan: 4, rowStart: 2), + ]; + } +} + +class ScantronScoreTally extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + border: Border.all(color: scantronGreen), + borderRadius: BorderRadius.all(scoreGridRadius), + ), + clipBehavior: Clip.hardEdge, + child: LayoutGrid( + areas: ''' + header header + part1 score1 + part2 score2 + part3 score3 + total total_score + ''', + columnSizes: repeat(2, [auto]), + rowSizes: repeat(5, [auto]), + children: [ + _buildHeader().inGridArea('header'), + for (int i = 1; i <= 3; i++) ...[ + SizedBox.expand(child: Text('PART $i', textAlign: TextAlign.center)) + .inGridArea('part$i'), + Container().inGridArea('score$i'), + ], + _buildTotal().inGridArea('total'), + ], + ), + ); + } + + Widget _buildHeader() { + return SizedBox.expand( + child: Container( + color: scantronGreen, + child: Heading('TEST RECORD'), + ), + ); + } + + Widget _buildTotal() { + return SizedBox.expand( + child: Text( + 'TOTAL', + textAlign: TextAlign.center, + style: TextStyle(fontWeight: FontWeight.bold), + ), + ); + } +} + +class Heading extends StatelessWidget { + const Heading( + this.label, { + Key key, + this.topLeft = false, + this.topRight = false, + this.bottomRight = false, + this.bottomLeft = false, + }) : super(key: key); + + final String label; + final bool topLeft; + final bool topRight; + final bool bottomRight; + final bool bottomLeft; + + @override + Widget build(BuildContext context) { + return SizedBox.expand( + child: Container( + decoration: BoxDecoration( + color: scantronGreen, + borderRadius: BorderRadius.only( + topLeft: topLeft ? scoreGridRadius : Radius.zero, + topRight: topRight ? scoreGridRadius : Radius.zero, + bottomRight: bottomRight ? scoreGridRadius : Radius.zero, + bottomLeft: bottomLeft ? scoreGridRadius : Radius.zero, + ), + ), + padding: EdgeInsets.symmetric(horizontal: 0.75.rem, vertical: 0.25.rem), + child: Text( + label, + textAlign: TextAlign.center, + style: bubbleHeaderTextStyle, + ), + ), + ); + } +} + +class Bullet extends StatelessWidget { + const Bullet({Key key, this.child}) : super(key: key); + final Widget child; + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('•'), + SizedBox(width: 4), + Flexible(child: child), + ], + ); + } +} + +class QuestionGroupingPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final radius = questionGroupingBorderRadius; + + final path = Path() + ..moveTo(size.width, 0) + ..lineTo(radius, 0) + ..arcToPoint(Offset(0, radius), + radius: Radius.circular(radius), clockwise: false) + ..lineTo(0, size.height - radius) + ..arcToPoint(Offset(radius, size.height), + radius: Radius.circular(radius), clockwise: false) + ..lineTo(size.width, size.height); + + canvas.drawPath( + path, + Paint() + ..style = PaintingStyle.stroke + ..color = scantronGreen + ..strokeWidth = 0.125.rem, + ); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; + } +} + +/// Draws a fancy arrow around the [DecoratedBox]'s child. +class ArrowBoxDecoration extends SimpleDecoration { + ArrowBoxDecoration({ + @required this.headLength, + @required this.tailLength, + }); + + final double headLength; + final double tailLength; + + @override + EdgeInsetsGeometry get padding => + EdgeInsets.fromLTRB(headLength, 0, tailLength, 0); + + @override + void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) { + final paint = Paint() + ..style = PaintingStyle.fill + ..color = scantronGreen + ..isAntiAlias = true; + final size = configuration.size; + + final pointLength = 1.2 * headLength / 3; + final featherLength = 3 * tailLength / 5; + final featherStraightLength = 1.3 * tailLength / 3; + final featherInsetLength = tailLength / 5; + + final shaftWidth = size.height / 4; + final shaftTop = (size.height / 2) - shaftWidth / 2; + final shaftBottom = shaftTop + shaftWidth; + + final headPath = Path() + // The point of the arrow + ..moveTo(0, size.height / 2) + ..lineTo(pointLength, 0) + ..lineTo(pointLength, shaftTop) + ..lineTo(headLength, shaftTop) + ..lineTo(headLength, shaftBottom) + ..lineTo(pointLength, shaftBottom) + ..lineTo(pointLength, size.height); + + final tailBox = + Rect.fromLTWH(size.width - tailLength, 0, tailLength, size.height); + final tailPath = Path() + // Top of the + ..moveTo(tailBox.left, shaftTop) + ..lineTo(tailBox.right - featherLength, shaftTop) + ..lineTo(tailBox.right - featherStraightLength, 0) + ..lineTo(tailBox.right, 0) + ..lineTo(tailBox.right - featherInsetLength, size.height / 2) + ..lineTo(tailBox.right, size.height) + ..lineTo(tailBox.right - featherStraightLength, size.height) + ..lineTo(tailBox.right - featherLength, shaftBottom) + ..lineTo(tailBox.left, shaftBottom); + + canvas.save(); + canvas.translate(offset.dx, offset.dy); + canvas.drawPath(headPath, paint); + canvas.drawPath(tailPath, paint); + canvas.restore(); + } +} + +/// Draws a pencil around the [DecoratedBox]'s child. +class PencilBoxDecoration extends SimpleDecoration { + PencilBoxDecoration({ + @required this.headLength, + @required this.tailLength, + }); + + final double headLength; + final double tailLength; + + @override + EdgeInsetsGeometry get padding => + EdgeInsets.fromLTRB(headLength, 0, tailLength, 0); + + @override + void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) { + final stroke = Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 1.0 + ..color = scantronGreen; + + final fill = Paint() + ..style = PaintingStyle.fill + ..color = scantronGreen; + + final size = configuration.size; + final leadLength = 0.4 * headLength; + final pointLength = 3 * headLength / 4; + final eraserLength = 4 * tailLength / 7; + final eraserHolderLength = 4 * tailLength / 7; + + final pointPath = Path() + ..moveTo(0, size.height / 2) + ..lineTo(pointLength, 0) + ..lineTo(pointLength, size.height) + ..lineTo(0, size.height / 2); + canvas.drawPath(pointPath.shift(offset), stroke); + + canvas.save(); + canvas.clipPath(pointPath.shift(offset)); + canvas.drawRect( + Rect.fromLTWH(0, 0, leadLength, size.height).shift(offset), fill); + canvas.restore(); + + final outlineRect = Rect.fromLTWH( + pointLength, + 0, + size.width - pointLength, + size.height, + ); + canvas.drawRect( + outlineRect.shift(offset), + stroke, + ); + + final eraserRect = + Rect.fromLTWH(size.width - eraserLength, 0, eraserLength, size.height); + canvas.drawRect( + eraserRect.shift(offset), + fill, + ); + + final eraserHolderRect = Rect.fromLTWH(eraserRect.left - eraserHolderLength, + 0, eraserHolderLength, size.height); + canvas.drawRect( + eraserHolderRect.shift(offset), + stroke, + ); + } +} + +/// Little extension to support scaling +extension on num { + double get rem => this.toDouble() * remUnit; +} + +/// Little extension to support simple copies +extension on Rect { + Rect copyWith({ + double left, + double top, + double width, + double height, + }) { + return Rect.fromLTWH( + left ?? this.left, + top ?? this.top, + width ?? this.width, + height ?? this.height, + ); + } +} + +/// Boilerplate +class ScantronAnswerSheetApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: BoxDecoration( + color: Colors.white, + ), + child: WidgetsApp( + title: 'Scantron Answer Sheet', + color: Colors.white, + debugShowCheckedModeBanner: false, + builder: (_, __) { + return Center( + child: SizedBox( + width: 416, + child: ScantronInstructions(), + ), + ); + + // return SingleChildScrollView( + // child: Center( + // child: RotatedBox( + // quarterTurns: 3, + // child: ScantronAnswerSheet(), + // ), + // ), + // ); + }, + ), + ); + } +} diff --git a/example/support/decoration.dart b/example/support/decoration.dart new file mode 100644 index 0000000..5dbf5d1 --- /dev/null +++ b/example/support/decoration.dart @@ -0,0 +1,29 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +typedef _BoxPainterDelegate = void Function( + Canvas canvas, + Offset offset, + ImageConfiguration configuration, +); + +/// Simplifies decoration by allowing all functionality through a single class. +abstract class SimpleDecoration extends Decoration { + void paint(Canvas canvas, Offset offset, ImageConfiguration configuration); + + @override + @nonVirtual + BoxPainter createBoxPainter([onChanged]) { + return _GenericBoxPainter(this.paint); + } +} + +class _GenericBoxPainter extends BoxPainter { + _GenericBoxPainter(this.delegate); + final _BoxPainterDelegate delegate; + + @override + void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) { + delegate(canvas, offset, configuration); + } +} diff --git a/example/support/link.dart b/example/support/link.dart new file mode 100644 index 0000000..9162679 --- /dev/null +++ b/example/support/link.dart @@ -0,0 +1,36 @@ +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class UrlLink extends StatelessWidget { + UrlLink( + this.url, { + Key key, + this.style, + this.stripScheme = true, + }) : assert(url.contains(':')), + super(key: key); + + final String url; + final TextStyle style; + final bool stripScheme; + + String get label { + if (!stripScheme) return url; + + return url.contains('://') + ? url.substring(url.indexOf('://') + 3) + : url.substring(url.indexOf(':') + 1); + } + + @override + Widget build(BuildContext context) { + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () => launch(url), + child: Text(label, style: style), + ), + ); + } +} diff --git a/lib/src/foundation/collections.dart b/lib/src/foundation/collections.dart index 92ddf73..845c0e1 100644 --- a/lib/src/foundation/collections.dart +++ b/lib/src/foundation/collections.dart @@ -20,7 +20,7 @@ T sum(Iterable numbers) { return numbers.fold(zeroForType(), (acc, number) => (acc + number) as T); } -/// Returns an iterable of [number]'s cumulative sums. +/// Returns an iterable of [label]'s cumulative sums. /// /// ``` /// cumulativeSum([1, 2, 3]) // 0, 1, 3, 6 diff --git a/pubspec.yaml b/pubspec.yaml index d7c7e51..6933978 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,9 +8,9 @@ environment: sdk: ">=2.6.0 <3.0.0" dependencies: - collection: ^1.0.0 flutter: sdk: flutter + collection: ^1.0.0 meta: ^1.0.0 quiver: ^2.0.0