diff --git a/lib/screens/roster/pdf/pdf.dart b/lib/screens/roster/pdf/pdf.dart index 717cbe57..bfc58f41 100644 --- a/lib/screens/roster/pdf/pdf.dart +++ b/lib/screens/roster/pdf/pdf.dart @@ -5,7 +5,7 @@ import 'package:gearforce/models/roster/roster.dart'; import 'package:gearforce/screens/roster/pdf/record_sheet/record_sheet.dart'; import 'package:gearforce/screens/roster/pdf/record_sheet/rules_sheet.dart'; import 'package:gearforce/screens/roster/pdf/record_sheet/traits_sheet.dart'; -import 'package:gearforce/screens/roster/pdf/unit_cards/unit_cards.dart'; +import 'package:gearforce/screens/roster/pdf/unit_cards/horizontal_unit_cards.dart'; import 'package:gearforce/widgets/pdf_settings.dart'; import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw; @@ -129,7 +129,7 @@ Future buildPdf( } if (pdfSettings.sections.unitCards) { - final unitCards = buildUnitCards( + final unitCards = buildHorizontalUnitCards( font, roster, version: version, diff --git a/lib/screens/roster/pdf/unit_cards/horizontal_unit_cards.dart b/lib/screens/roster/pdf/unit_cards/horizontal_unit_cards.dart new file mode 100644 index 00000000..a6397715 --- /dev/null +++ b/lib/screens/roster/pdf/unit_cards/horizontal_unit_cards.dart @@ -0,0 +1,698 @@ +import 'package:gearforce/models/roster/roster.dart'; +import 'package:gearforce/models/traits/trait.dart'; +import 'package:gearforce/models/unit/command.dart'; +import 'package:gearforce/models/unit/unit.dart'; +import 'package:gearforce/models/weapons/weapon.dart'; +import 'package:pdf/pdf.dart'; +import 'package:pdf/widgets.dart' as pw; + +const double _cornerRadius = 5.0; +const double _borderThickness = 1.0; +const double _roleRowPadding = 2.0; +const double _nameRowVerticalPadding = 1.0; +const double _nameRowHorizontalPadding = 3.0; +const double _traitsSectionPadding = 3.0; +const pw.EdgeInsets _weaponSectionPadding = + pw.EdgeInsets.only(left: 3.0, right: 3.0); +const double _unitCardFooterPadding = 1.5; +const double _cardHeight = PdfPageFormat.inch * 3.33; +const double _cardWidth = PdfPageFormat.inch * 3.75; +const _combatStatsWidth = 42.0; +const double? _statSectionHeight = 48; +const double _hullStructureNameWidth = 12.0; +const double _standardFontSize = 10; +const double _weaponHeaderFontSize = 10; +const double _weaponFontSize = 8; +const double _traitFontSize = 8; +const double _nameFontSize = 12; +const double _unitCardFooterFontSize = 6; + +const _reactSymbol = '»'; + +List buildHorizontalUnitCards( + pw.Font font, + UnitRoster roster, { + required bool isExtendedContentAllowed, + required bool isAlphaBetaAllowed, + required String version, +}) { + final List units = []; + roster.getCGs().forEach((cg) { + units.addAll(_buildGroupUnits( + font, + primaryUnits: cg.primary.allUnits(), + secondaryUnits: cg.secondary.allUnits(), + isExtendedContentAllowed: isExtendedContentAllowed, + isAlphaBetaAllowed: isAlphaBetaAllowed, + version: version, + )); + }); + + return units; +} + +List _buildGroupUnits( + pw.Font font, { + required List primaryUnits, + required List secondaryUnits, + required bool isExtendedContentAllowed, + required bool isAlphaBetaAllowed, + required String version, +}) { + final List groupCards = []; + + groupCards.addAll(_buildUnitCards( + font, + primaryUnits, + version: version, + isExtendedContentAllowed: isExtendedContentAllowed, + isAlphaBetaAllowed: isAlphaBetaAllowed, + )); + groupCards.addAll(_buildUnitCards( + font, + secondaryUnits, + version: version, + isExtendedContentAllowed: isExtendedContentAllowed, + isAlphaBetaAllowed: isAlphaBetaAllowed, + )); + + return groupCards; +} + +List _buildUnitCards( + pw.Font font, + List units, { + required bool isExtendedContentAllowed, + required bool isAlphaBetaAllowed, + required String version, +}) { + return units + .map((us) => _buildUnitCard( + font, + us, + version: version, + isExtendedContentAllowed: isExtendedContentAllowed, + isAlphaBetaAllowed: isAlphaBetaAllowed, + )) + .toList(); +} + +pw.Widget _buildUnitCard( + pw.Font font, + Unit u, { + required bool isExtendedContentAllowed, + required bool isAlphaBetaAllowed, + required String version, +}) { + final rulesVersion = u.roster?.rulesVersion; + var rulesVersionText = + '${rulesVersion != null ? 'Rules: $rulesVersion' : ''}'; + if (isExtendedContentAllowed) { + rulesVersionText += ' + Extended Content'; + } + if (isAlphaBetaAllowed) { + rulesVersionText += ' + Alpha/Beta'; + } + + final card = pw.Container( + width: _cardWidth, + height: _cardHeight, + child: pw.Row( + children: [ + pw.Expanded( + child: pw.Column( + crossAxisAlignment: pw.CrossAxisAlignment.stretch, + children: [ + _buildNameSection(font, u), + _buildCGandTVSection(font, u), + _buildStatSection(font, u), + _buildTraitsSection(font, u.traits), + pw.Expanded(child: _buildWeaponsSection(font, u.weapons)), + pw.Padding( + padding: pw.EdgeInsets.only( + left: 5.0, + right: 5.0, + bottom: _unitCardFooterPadding, + ), + child: pw.Row( + children: [ + pw.Text( + 'Gearforce $version', + maxLines: 1, + softWrap: true, + style: pw.TextStyle( + color: PdfColors.grey, + fontSize: _unitCardFooterFontSize), + ), + pw.Spacer(), + pw.Text( + rulesVersionText, + style: pw.TextStyle( + color: PdfColors.grey, + fontSize: _unitCardFooterFontSize), + ), + ], + )) + ], + ), + ), + ], + ), + decoration: pw.BoxDecoration( + border: pw.Border.all(), + borderRadius: const pw.BorderRadius.only( + topLeft: pw.Radius.circular(_cornerRadius), + topRight: pw.Radius.circular(_cornerRadius), + bottomLeft: pw.Radius.circular(_cornerRadius), + bottomRight: pw.Radius.circular(_cornerRadius), + ), + ), + ); + + return card; +} + +pw.Widget _buildNameSection(pw.Font font, Unit u) { + return pw.Container( + padding: pw.EdgeInsets.symmetric( + vertical: _nameRowVerticalPadding, + horizontal: _nameRowHorizontalPadding, + ), + child: pw.Row(children: [ + pw.Expanded( + child: pw.Text( + u.name, + style: pw.TextStyle( + fontSize: _nameFontSize, + font: font, + fontWeight: pw.FontWeight.bold, + ), + textAlign: pw.TextAlign.center, + ), + ), + ]), + decoration: pw.BoxDecoration( + border: pw.Border( + bottom: pw.BorderSide( + width: _borderThickness, + ), + ), + ), + ); +} + +pw.Widget _buildCGandTVSection(pw.Font font, Unit u) { + return pw.Container( + padding: pw.EdgeInsets.only(top: _roleRowPadding, bottom: _roleRowPadding), + child: pw.Row( + mainAxisAlignment: pw.MainAxisAlignment.start, + children: [ + pw.Container( + padding: pw.EdgeInsets.only(left: 3.0), + child: pw.Text( + u.combatGroup?.name ?? 'not part of a CG', + style: pw.TextStyle(fontSize: _standardFontSize), + textAlign: pw.TextAlign.left, + ), + ), + pw.Spacer(), + pw.Container( + padding: pw.EdgeInsets.only(right: 3.0), + child: pw.Text( + 'TV: ${u.tv}', + style: pw.TextStyle(fontSize: _standardFontSize), + textAlign: pw.TextAlign.right, + ), + ), + ], + ), + decoration: pw.BoxDecoration( + border: pw.Border( + bottom: pw.BorderSide( + width: _borderThickness, + ), + ), + ), + ); +} + +pw.Widget _buildStatSection(pw.Font font, Unit u) { + return pw.Container( + height: _statSectionHeight, + child: pw.Row( + mainAxisAlignment: pw.MainAxisAlignment.start, + crossAxisAlignment: pw.CrossAxisAlignment.start, + children: [ + _buildFirstStatBlock(font, u), + _buildSecondStatBlock(font, u), + _buildSecondaryStatBlock(font, u) + ], + ), + decoration: pw.BoxDecoration( + border: pw.Border( + bottom: pw.BorderSide( + width: _borderThickness, + ), + ), + ), + ); +} + +pw.Widget _buildFirstStatBlock(pw.Font font, Unit u) { + final textStyle = pw.TextStyle(font: font, fontSize: _standardFontSize); + const nameColumnSize = 21.0; + return pw.Container( + alignment: pw.Alignment.topCenter, + width: _combatStatsWidth, + padding: pw.EdgeInsets.fromLTRB(3.0, 2.0, 3.0, 2.0), + child: pw.Table( + columnWidths: { + 0: pw.FixedColumnWidth(nameColumnSize), + 1: pw.FlexColumnWidth(), + }, + children: [ + _buildPrimaryStatRow( + textStyle, + 'Gu:', + '${u.gunnery ?? ' - '}${u.gunnery != null ? '+' : ''}', + ), + _buildPrimaryStatRow( + textStyle, + 'Pi:', + '${u.piloting ?? ' - '}${u.piloting != null ? '+' : ''}', + ), + _buildPrimaryStatRow( + textStyle, + 'Ew:', + '${u.ew ?? ' - '}${u.ew != null ? '+' : ''}', + ), + ], + ), + decoration: pw.BoxDecoration( + border: pw.Border( + right: pw.BorderSide( + width: _borderThickness, + ), + ), + ), + ); +} + +pw.Widget _buildSecondStatBlock(pw.Font font, Unit u) { + final textStyle = pw.TextStyle(font: font, fontSize: _standardFontSize); + const nameColumnSize = 21.0; + return pw.Container( + alignment: pw.Alignment.topCenter, + width: _combatStatsWidth, + padding: pw.EdgeInsets.fromLTRB(3.0, 2.0, 3.0, 2.0), + child: pw.Table( + columnWidths: { + 0: pw.FixedColumnWidth(nameColumnSize), + 1: pw.FlexColumnWidth(), + }, + children: [ + _buildPrimaryStatRow( + textStyle, + 'Arm:', + '${u.armor ?? ' - '}', + ), + _buildPrimaryStatRow( + textStyle, + 'A:', + '${u.actions ?? ' - '}', + ), + _buildPrimaryStatRow( + textStyle, + '${u.commandLevel == CommandLevel.none ? 'SP' : 'CP'}:', + '${u.commandLevel == CommandLevel.none ? u.skillPoints : u.commandPoints}', + ), + ], + ), + decoration: pw.BoxDecoration( + border: pw.Border( + right: pw.BorderSide( + width: _borderThickness, + ), + ), + ), + ); +} + +pw.TableRow _buildPrimaryStatRow( + pw.TextStyle textStyle, String stat, String value) { + final row = pw.TableRow( + children: [ + pw.Text(stat, style: textStyle, textAlign: pw.TextAlign.right), + pw.Padding( + padding: pw.EdgeInsets.only(left: 2.0), + child: pw.Text( + value, + style: textStyle, + textAlign: pw.TextAlign.left, + ), + ), + ], + ); + + return row; +} + +pw.Widget _buildSecondaryStatBlock(pw.Font font, Unit u) { + final textStyle = pw.TextStyle(font: font, fontSize: _standardFontSize); + + final typeBlock = pw.Container( + child: pw.Padding( + padding: pw.EdgeInsets.only(left: 4.0, top: 1.0, bottom: 1.0, right: 4.0), + child: pw.Row( + children: [ + pw.Text( + u.type.name, + style: textStyle, + textAlign: pw.TextAlign.left, + ), + pw.Spacer(), + pw.Text( + '${u.core.height == '-' ? '' : '${u.core.height}"'}', + style: textStyle, + textAlign: pw.TextAlign.left, + ), + ], + ), + ), + decoration: pw.BoxDecoration( + border: pw.Border( + bottom: pw.BorderSide( + width: _borderThickness, + ), + ), + ), + ); + + final block = pw.Container( + decoration: pw.BoxDecoration(), + child: pw.Column( + mainAxisAlignment: pw.MainAxisAlignment.center, + children: [ + typeBlock, + pw.Row(children: [ + _buildCommandAndMovementBlock(font, u), + _buildStructureAndHullBlock(font, u), + ], mainAxisAlignment: pw.MainAxisAlignment.spaceAround), + ], + ), + ); + + return pw.Expanded(child: block); +} + +pw.Widget _buildCommandAndMovementBlock(pw.Font font, Unit u) { + final textStyle = pw.TextStyle(font: font, fontSize: _standardFontSize); + const blockWidth = 70.0; + const attributeNameWidth = 23.0; + + final commandBlock = pw.Row(children: [ + pw.Container( + child: pw.Text( + 'Cmd: ', + style: textStyle, + textAlign: pw.TextAlign.left, + ), + ), + pw.Padding( + padding: pw.EdgeInsets.only(left: 2.0), + child: pw.Text( + u.commandLevel == CommandLevel.none + ? ' - ' + : '${u.commandLevel.name}${u.roster?.selectedForceLeader == u ? '**' : ''}', + style: textStyle, + textAlign: pw.TextAlign.left, + ), + ), + ]); + + final movementBlock = pw.Row( + children: [ + pw.Container( + width: attributeNameWidth, + child: pw.Text('MR:', style: textStyle, textAlign: pw.TextAlign.right), + ), + pw.Padding( + padding: pw.EdgeInsets.only(left: 2.0), + child: pw.Text( + '${u.movement ?? ' - '}', + style: textStyle, + textAlign: pw.TextAlign.left, + ), + ), + ], + ); + + final block = pw.Container( + padding: pw.EdgeInsets.only(top: 2.0, bottom: 2.0, right: 3.0, left: 3.0), + width: blockWidth, + child: pw.Column(children: [ + commandBlock, + movementBlock, + ]), + decoration: pw.BoxDecoration( + border: pw.Border( + right: pw.BorderSide( + width: _borderThickness, + ), + ), + ), + ); + return block; +} + +pw.Widget _buildStructureAndHullBlock(pw.Font font, Unit u) { + final textStyle = pw.TextStyle(font: font, fontSize: _standardFontSize); + + final hullBlock = pw.Row( + children: [ + pw.Container( + child: pw.Text('H:', style: textStyle, textAlign: pw.TextAlign.right), + width: _hullStructureNameWidth, + ), + pw.Padding( + padding: pw.EdgeInsets.only(left: 2.0), + child: pw.Text( + _cheapHS(u.hull), + style: textStyle, + textAlign: pw.TextAlign.left, + ), + ), + ], + ); + + final structureBlock = pw.Row( + children: [ + pw.Container( + child: pw.Text('S:', style: textStyle, textAlign: pw.TextAlign.right), + width: _hullStructureNameWidth, + ), + pw.Padding( + padding: pw.EdgeInsets.only(left: 2.0), + child: pw.Text( + _cheapHS(u.structure), + style: textStyle, + textAlign: pw.TextAlign.left, + ), + ), + ], + ); + + final block = pw.Container( + padding: pw.EdgeInsets.only(top: 2.0, bottom: 2.0, right: 3.0, left: 3.0), + child: pw.Column(children: [ + hullBlock, + structureBlock, + ]), + decoration: pw.BoxDecoration(), + ); + return pw.Expanded(child: block); +} + +String _cheapHS(int? num) { + if (num == null || num == 0) { + return ''; + } + final r = 'O ' * num; + return r; +} + +pw.Widget _buildTraitsSection(pw.Font font, List traits) { + return pw.Container( + child: pw.Text(traits.join(', '), + softWrap: true, + style: pw.TextStyle( + fontSize: _traitFontSize, + font: font, + )), + padding: pw.EdgeInsets.all(_traitsSectionPadding), + decoration: pw.BoxDecoration( + border: pw.Border.all(), + ), + ); +} + +pw.Widget _buildWeaponsSection(pw.Font font, List weapons) { + final List rows = []; + weapons.forEach((w) { + rows.add(_buildWeaponRow(font, w)); + if (w.isCombo && w.combo != null) { + rows.add(_buildWeaponRow(font, w.combo!)); + } + }); + final headerRow = pw.TableRow(children: [ + pw.Padding( + padding: pw.EdgeInsets.only(right: 5.0), + child: pw.Text( + 'Code', + style: pw.TextStyle( + font: font, + fontSize: _weaponHeaderFontSize, + fontWeight: pw.FontWeight.bold, + ), + ), + ), + pw.Padding( + padding: pw.EdgeInsets.only(), + child: pw.Text( + 'Range', + style: pw.TextStyle( + font: font, + fontSize: _weaponHeaderFontSize, + fontWeight: pw.FontWeight.bold, + ), + ), + ), + pw.Padding( + padding: pw.EdgeInsets.only(right: 5.0, left: 5.0), + child: pw.Text( + 'D', + style: pw.TextStyle( + font: font, + fontSize: _weaponHeaderFontSize, + fontWeight: pw.FontWeight.bold, + ), + textAlign: pw.TextAlign.center, + ), + ), + pw.Padding( + padding: pw.EdgeInsets.only(), + child: pw.Text( + 'Traits', + style: pw.TextStyle( + font: font, + fontSize: _weaponHeaderFontSize, + fontWeight: pw.FontWeight.bold, + ), + ), + ), + pw.Padding( + padding: pw.EdgeInsets.only(), + child: pw.Text( + 'Mode', + style: pw.TextStyle( + font: font, + fontSize: _weaponHeaderFontSize, + fontWeight: pw.FontWeight.bold, + ), + textAlign: pw.TextAlign.center, + ), + ), + ]); + + final Map columnWidths = {3: pw.FlexColumnWidth()}; + + return pw.Container( + alignment: pw.Alignment.topLeft, + padding: _weaponSectionPadding, + child: pw.Table( + children: [headerRow, ...rows], + columnWidths: columnWidths, + ), + decoration: pw.BoxDecoration(), + ); +} + +pw.TableRow _buildWeaponRow(pw.Font font, Weapon w) { + return pw.TableRow(children: [ + pw.Padding( + padding: pw.EdgeInsets.only(right: 5.0), + child: _buildWeaponName(font, w), + ), + pw.Padding( + padding: pw.EdgeInsets.only(), + child: _buildWeaponRange(font, w), + ), + pw.Padding( + padding: pw.EdgeInsets.only(right: 5.0, left: 5.0), + child: _buildWeaponDamage(font, w), + ), + pw.Padding( + padding: pw.EdgeInsets.only(), + child: _buildWeaponTraits(font, w), + ), + pw.Padding( + padding: pw.EdgeInsets.only(), + child: _buildWeaponModes(font, w), + ), + ]); +} + +pw.Widget _buildWeaponName(pw.Font font, Weapon w) { + final nameField = _buildWeaponField( + font, + '${w.hasReact ? _reactSymbol : ''}${w.numberOf >= 2 ? '2 x ' : ''}${w.abbreviation}', + ); + + return nameField; +} + +pw.Widget _buildWeaponRange(pw.Font font, Weapon w) { + final rangeField = _buildWeaponField( + font, + w.range.toString(), + ); + + return rangeField; +} + +pw.Widget _buildWeaponDamage(pw.Font font, Weapon w) { + final damageField = _buildWeaponField(font, w.damage.toString(), + textAlign: pw.TextAlign.center); + + return damageField; +} + +pw.Widget _buildWeaponTraits(pw.Font font, Weapon w) { + final traits1 = w.traits.join(', '); + final traits2 = w.alternativeTraits.join(', '); + final traitField = _buildWeaponField( + font, + traits2.isEmpty ? traits1 : "[$traits1] or [$traits2]", + ); + return traitField; +} + +pw.Widget _buildWeaponModes(pw.Font font, Weapon w) { + final modeField = _buildWeaponField( + font, w.modes.map((m) => m.abbr).join(', '), + textAlign: pw.TextAlign.center); + + return modeField; +} + +pw.Widget _buildWeaponField( + pw.Font font, + String text, { + pw.TextAlign? textAlign, +}) { + return pw.Text( + text, + style: pw.TextStyle(font: font, fontSize: _weaponFontSize), + textAlign: textAlign, + ); +} diff --git a/lib/screens/roster/pdf/unit_cards/unit_cards.dart b/lib/screens/roster/pdf/unit_cards/vertical_unit_cards.dart similarity index 99% rename from lib/screens/roster/pdf/unit_cards/unit_cards.dart rename to lib/screens/roster/pdf/unit_cards/vertical_unit_cards.dart index 0c1455a5..fca4900b 100644 --- a/lib/screens/roster/pdf/unit_cards/unit_cards.dart +++ b/lib/screens/roster/pdf/unit_cards/vertical_unit_cards.dart @@ -26,7 +26,7 @@ const double _unitCardFooterFontSize = 6; const _reactSymbol = '»'; -List buildUnitCards( +List buildVerticalUnitCards( pw.Font font, UnitRoster roster, { required bool isExtendedContentAllowed, diff --git a/pubspec.lock b/pubspec.lock index 25b9dfed..7a09197e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 url: "https://pub.dev" source: hosted - version: "67.0.0" + version: "72.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.2" analyzer: dependency: transitive description: name: analyzer - sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "6.7.0" archive: dependency: transitive description: @@ -101,26 +106,26 @@ packages: dependency: transitive description: name: coverage - sha256: "3945034e86ea203af7a056d98e98e42a5518fff200d6e8e6647e1886b07e936e" + sha256: "576aaab8b1abdd452e0f656c3e73da9ead9d7880e15bdc494189d9c1a1baf0db" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.0" cross_file: dependency: transitive description: name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.dev" source: hosted - version: "0.3.4+1" + version: "0.3.4+2" crypto: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" cupertino_icons: dependency: "direct main" description: @@ -141,10 +146,10 @@ packages: dependency: transitive description: name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" file: dependency: transitive description: @@ -165,10 +170,10 @@ packages: dependency: transitive description: name: file_selector_android - sha256: "8bcc3af859e9d47fab9c7dc315537406511a894ab578e198bd8f9ed745ea5a01" + sha256: "77f23eb5916fd0875946720d1f286f809a28a867d4882db6ac2cf053e2d5f7c6" url: "https://pub.dev" source: hosted - version: "0.5.1+2" + version: "0.5.1+6" file_selector_ios: dependency: transitive description: @@ -205,18 +210,18 @@ packages: dependency: transitive description: name: file_selector_web - sha256: "619e431b224711a3869e30dbd7d516f5f5a4f04b265013a50912f39e1abc88c8" + sha256: c4c0ea4224d97a60a7067eca0c8fd419e708ff830e0c83b11a48faf566cec3e7 url: "https://pub.dev" source: hosted - version: "0.9.4+1" + version: "0.9.4+2" file_selector_windows: dependency: transitive description: name: file_selector_windows - sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69" url: "https://pub.dev" source: hosted - version: "0.9.3+1" + version: "0.9.3+2" fixnum: dependency: transitive description: @@ -260,10 +265,10 @@ packages: dependency: "direct main" description: name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" http_multi_server: dependency: transitive description: @@ -308,18 +313,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -336,6 +341,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + macros: + dependency: transitive + description: + name: macros + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + url: "https://pub.dev" + source: hosted + version: "0.1.2-main.4" matcher: dependency: transitive description: @@ -348,18 +361,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -396,18 +409,18 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0 + sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.0.2" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" path: dependency: transitive description: @@ -444,18 +457,18 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" pdf: dependency: "direct main" description: name: pdf - sha256: "243f05342fc0bdf140eba5b069398985cdbdd3dbb1d776cf43d5ea29cc570ba6" + sha256: "05df53f8791587402493ac97b9869d3824eccbc77d97855f4545cf72df3cae07" url: "https://pub.dev" source: hosted - version: "3.10.8" + version: "3.11.1" pdf_widget_wrapper: dependency: transitive description: @@ -500,10 +513,10 @@ packages: dependency: "direct main" description: name: printing - sha256: "1c99cab90ebcc1fff65831d264627d5b529359d563e53f33ab9b8117f2d280bc" + sha256: de1889f30b34029fc46e5de6a9841498850b23d32942a9ee810ca36b0cb1b234 url: "https://pub.dev" source: hosted - version: "5.12.0" + version: "5.13.2" provider: dependency: "direct main" description: @@ -524,66 +537,66 @@ packages: dependency: transitive description: name: qr - sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3" + sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" + sha256: a7e8467e9181cef109f601e3f65765685786c1a738a83d7fbbde377589c0d974 url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.1" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.5.2" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shelf: dependency: transitive description: @@ -612,10 +625,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "2.0.0" sky_engine: dependency: transitive description: flutter @@ -689,26 +702,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" url: "https://pub.dev" source: hosted - version: "1.25.2" + version: "1.25.7" test_api: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" test_core: dependency: transitive description: name: test_core - sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.4" typed_data: dependency: transitive description: @@ -729,26 +742,26 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf + sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79 url: "https://pub.dev" source: hosted - version: "6.3.3" + version: "6.3.9" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.2.0" url_launcher_macos: dependency: transitive description: @@ -769,26 +782,26 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: "direct main" description: name: uuid - sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" + sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.4.2" vector_math: dependency: transitive description: @@ -801,10 +814,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.4" watcher: dependency: transitive description: @@ -817,18 +830,26 @@ packages: dependency: transitive description: name: web - sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "2.4.5" + version: "3.0.1" webkit_inspection_protocol: dependency: transitive description: @@ -841,10 +862,10 @@ packages: dependency: transitive description: name: win32 - sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 + sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" url: "https://pub.dev" source: hosted - version: "5.5.1" + version: "5.5.4" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5d505883..3fd91bfa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.11.2 +version: 1.12.0 environment: sdk: ">=3.0.0" @@ -28,20 +28,20 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: 1.0.8 provider: 6.1.2 - uuid: 4.4.0 - pdf: 3.10.8 - printing: 5.12.0 + uuid: 4.4.2 + pdf: 3.11.1 + printing: 5.13.2 url_launcher: 6.3.0 file_selector: 1.0.3 - http: 1.2.1 - package_info_plus: 8.0.0 - pub_semver: ^2.1.4 - shared_preferences: ^2.2.3 + http: 1.2.2 + package_info_plus: 8.0.2 + pub_semver: 2.1.4 + shared_preferences: 2.3.2 dev_dependencies: flutter_test: sdk: flutter - test: ^1.24.3 + test: 1.25.7 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec