From 18aaa5fc36be34770dad348810fb1835b6740430 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 12 Aug 2024 19:05:56 +0800 Subject: [PATCH 01/44] First draft --- .../widgets/line_calendar/line_calendar.dart | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 forui/lib/src/widgets/line_calendar/line_calendar.dart diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart new file mode 100644 index 000000000..88a34f0c8 --- /dev/null +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -0,0 +1,189 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:forui/forui.dart'; +import 'package:forui/src/foundation/tappable.dart'; +import 'package:meta/meta.dart'; + +import 'package:sugar/sugar.dart'; + +const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; +final _epoch = LocalDate(2000); + +class FLineCalendar extends StatefulWidget { + final FLineCalendarStyle? style; + + /// The currently selected [LocalDate]. + final ValueNotifier selected; + + /// The first date in this calendar carousel. Defaults to 1st January 2000. + final LocalDate epoch; + + /// Today's date. Defaults to the [LocalDate.now]. + final LocalDate today; + + /// Creates a [FLineCalendar]. + FLineCalendar({ + required this.selected, + LocalDate? epoch, + LocalDate? today, + this.style, + super.key, + }) : epoch = epoch ?? _epoch, + today = today ?? LocalDate.now(); + + @override + State createState() => _FLineCalendarState(); +} + +class _FLineCalendarState extends State { + late final ScrollController _controller; + late final double _width; + + @override + void initState() { + final width = MediaQuery.of(context).size.width / 5; + final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * width; + _controller = ScrollController(initialScrollOffset: offset); + + super.initState(); + } + + @override + Widget build(BuildContext context) => SizedBox( + height: 85, + child: ListView.builder( + controller: _controller, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.zero, + itemExtent: _width, + itemBuilder: (context, index) => Container( + padding: EdgeInsets.symmetric(horizontal: (_width - 55) / 2), + child: _Tile( + style: widget.style, + selected: widget.selected, + date: widget.epoch.add(Duration(days: index)), + today: widget.today, + ), + ), + ), + ); +} + +class _Tile extends StatelessWidget { + final FLineCalendarStyle? style; + final ValueNotifier selected; + final LocalDate date; + final bool underline; + + const _Tile({required this.selected, required this.date, required LocalDate today, this.style}) + : underline = date == today; + + @override + Widget build(BuildContext context) { + final style = this.style ?? context.theme.lineCalendarStyle; + + final selected = this.selected.value == date; + return FTappable( + onPress: () => this.selected.value = date, + child: Container( + alignment: Alignment.center, + width: 55, + height: 85, + padding: const EdgeInsets.all(8), + decoration: selected ? style.selectedDecoration : null, + child: Column( + children: [ + Text( + _days[date.weekday - 1], + style: selected ? style.selectedTextStyle : style.unselectedTextStyle, + ), + const SizedBox(height: 5), + _Date( + date: date, + selected: selected, + underline: underline, + style: style, + ), + ], + ), + ), + ); + } +} + +class _Date extends StatelessWidget { + final FLineCalendarStyle? style; + final LocalDate date; + final bool selected; + final bool underline; + + const _Date({required this.date, required this.selected, required this.underline, this.style}); + + @override + Widget build(BuildContext context) { + final style = this.style ?? context.theme.lineCalendarStyle; + return Container( + alignment: Alignment.center, + height: 40, + width: 40, + decoration: style.dateDecoration, + child: Text( + date.day.toString(), + style: selected ? style.selectedTextStyle : style.unselectedTextStyle, + ), + ); + } +} + +/// [FAvatar]'s style. +final class FLineCalendarStyle with Diagnosticable { + /// The fallback's background color. + final Color backgroundColor; + + /// The fallback's color. + final Color foregroundColor; + + final BoxDecoration dateDecoration; + + final BoxDecoration selectedDecoration; + + /// The text style for the selected date. + final TextStyle selectedTextStyle; + + /// The text style for the selected date. + final TextStyle unselectedTextStyle; + + /// Creates a [FLineCalendarStyle]. + const FLineCalendarStyle({ + required this.backgroundColor, + required this.foregroundColor, + required this.dateDecoration, + required this.selectedDecoration, + required this.selectedTextStyle, + required this.unselectedTextStyle, + }); + + /// Creates a [FCardStyle] that inherits its properties from [colorScheme] and [typography]. + FLineCalendarStyle.inherit( + {required FColorScheme colorScheme, required FTypography typography, required FStyle style}) + : backgroundColor = colorScheme.muted, + foregroundColor = colorScheme.mutedForeground, + dateDecoration = BoxDecoration( + color: colorScheme.foreground, + borderRadius: style.borderRadius, + border: Border.all(color: colorScheme.border), + ), + selectedDecoration = BoxDecoration( + color: colorScheme.primary, + borderRadius: style.borderRadius, + border: Border.all(color: colorScheme.border), + ), + selectedTextStyle = typography.base.copyWith( + color: colorScheme.mutedForeground, + height: 0, + ), + unselectedTextStyle = typography.base.copyWith( + color: colorScheme.mutedForeground, + height: 0, + ); +} From 7a8b228595ba70bdc6e0bb54eeda35c29c194f71 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Wed, 14 Aug 2024 16:22:00 +0800 Subject: [PATCH 02/44] fixed build issues --- forui/lib/forui.dart | 4 ++- .../widgets/line_calendar/line_calendar.dart | 31 +++++++++++-------- forui/lib/widgets/line_calendar.dart | 8 +++++ 3 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 forui/lib/widgets/line_calendar.dart diff --git a/forui/lib/forui.dart b/forui/lib/forui.dart index 0d721fbd4..a85ad3c36 100644 --- a/forui/lib/forui.dart +++ b/forui/lib/forui.dart @@ -20,7 +20,9 @@ export 'widgets/header.dart'; export 'widgets/icon.dart'; export 'widgets/label.dart'; export 'widgets/popover.dart'; -export 'widgets/popover_menu.dart'; + +export 'widgets/line_calendar.dart'; + export 'widgets/progress.dart'; export 'widgets/radio.dart'; export 'widgets/resizable.dart'; diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 88a34f0c8..4860ebd3b 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -1,8 +1,7 @@ import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/foundation/tappable.dart'; -import 'package:meta/meta.dart'; import 'package:sugar/sugar.dart'; @@ -41,10 +40,11 @@ class _FLineCalendarState extends State { @override void initState() { - final width = MediaQuery.of(context).size.width / 5; - final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * width; + widget.selected.addListener(() => setState(() {})); + final mediaQuery = (context.getElementForInheritedWidgetOfExactType()!.widget as MediaQuery).data; + _width = mediaQuery.size.width / 5; + final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * _width; _controller = ScrollController(initialScrollOffset: offset); - super.initState(); } @@ -67,6 +67,12 @@ class _FLineCalendarState extends State { ), ), ); + + @override + void dispose() { + super.dispose(); + _controller.dispose(); + } } class _Tile extends StatelessWidget { @@ -81,9 +87,9 @@ class _Tile extends StatelessWidget { @override Widget build(BuildContext context) { final style = this.style ?? context.theme.lineCalendarStyle; - final selected = this.selected.value == date; - return FTappable( + + return FTappable.animated( onPress: () => this.selected.value = date, child: Container( alignment: Alignment.center, @@ -93,17 +99,17 @@ class _Tile extends StatelessWidget { decoration: selected ? style.selectedDecoration : null, child: Column( children: [ - Text( - _days[date.weekday - 1], - style: selected ? style.selectedTextStyle : style.unselectedTextStyle, - ), - const SizedBox(height: 5), _Date( date: date, selected: selected, underline: underline, style: style, ), + const SizedBox(height: 5), + Text( + _days[date.weekday - 1], + style: selected ? style.selectedTextStyle : style.unselectedTextStyle, + ), ], ), ), @@ -171,7 +177,6 @@ final class FLineCalendarStyle with Diagnosticable { dateDecoration = BoxDecoration( color: colorScheme.foreground, borderRadius: style.borderRadius, - border: Border.all(color: colorScheme.border), ), selectedDecoration = BoxDecoration( color: colorScheme.primary, diff --git a/forui/lib/widgets/line_calendar.dart b/forui/lib/widgets/line_calendar.dart new file mode 100644 index 000000000..700667424 --- /dev/null +++ b/forui/lib/widgets/line_calendar.dart @@ -0,0 +1,8 @@ +/// {@category Widgets} +/// +/// A line calendar. +/// +/// See https://forui.dev/docs/line-calendar for working examples. +library forui.widgets.line_calendar; + +export '../src/widgets/line_calendar/line_calendar.dart'; From ffb1889ea1e2efede0a31467c2fdb94c1585b681 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 19 Aug 2024 03:02:50 +0800 Subject: [PATCH 03/44] styling done --- .../widgets/line_calendar/line_calendar.dart | 217 +++++++++++------- 1 file changed, 139 insertions(+), 78 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 4860ebd3b..49415040d 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -2,13 +2,16 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/foundation/tappable.dart'; +import 'package:meta/meta.dart'; import 'package:sugar/sugar.dart'; const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; final _epoch = LocalDate(2000); +/// A calendar that can be scrolled horizontally. class FLineCalendar extends StatefulWidget { + /// The style. Defaults to [FThemeData.lineCalendarStyle]. final FLineCalendarStyle? style; /// The currently selected [LocalDate]. @@ -32,40 +35,59 @@ class FLineCalendar extends StatefulWidget { @override State createState() => _FLineCalendarState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('style', style)) + ..add(DiagnosticsProperty>('selected', selected)) + ..add(DiagnosticsProperty('epoch', epoch)) + ..add(DiagnosticsProperty('today', today)); + } } class _FLineCalendarState extends State { - late final ScrollController _controller; - late final double _width; + late ScrollController _controller = ScrollController(); + late double _width; @override void initState() { widget.selected.addListener(() => setState(() {})); - final mediaQuery = (context.getElementForInheritedWidgetOfExactType()!.widget as MediaQuery).data; - _width = mediaQuery.size.width / 5; - final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * _width; - _controller = ScrollController(initialScrollOffset: offset); super.initState(); } @override - Widget build(BuildContext context) => SizedBox( - height: 85, - child: ListView.builder( - controller: _controller, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.zero, - itemExtent: _width, - itemBuilder: (context, index) => Container( - padding: EdgeInsets.symmetric(horizontal: (_width - 55) / 2), - child: _Tile( - style: widget.style, - selected: widget.selected, - date: widget.epoch.add(Duration(days: index)), - today: widget.today, + Widget build(BuildContext context) => LayoutBuilder( + builder: (context, constraints) { + if (constraints.maxWidth < 450) { + _width = constraints.maxWidth / 5; + } else if (constraints.maxWidth >= 450 && constraints.maxWidth <= 650) { + _width = constraints.maxWidth / 7; + } else { + _width = constraints.maxWidth / 10; + } + final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * _width; + _controller = ScrollController(initialScrollOffset: offset); + return SizedBox( + height: 70, + child: ListView.builder( + controller: _controller, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.zero, + itemExtent: _width, + itemBuilder: (context, index) => Container( + padding: EdgeInsets.symmetric(horizontal: (_width - 55) / 2), + child: _Tile( + style: widget.style, + selected: widget.selected, + date: widget.epoch.add(Duration(days: index)), + today: widget.today, + ), + ), ), - ), - ), + ); + }, ); @override @@ -84,6 +106,16 @@ class _Tile extends StatelessWidget { const _Tile({required this.selected, required this.date, required LocalDate today, this.style}) : underline = date == today; + TextStyle _style(BuildContext context, bool selected) { + final style = this.style ?? context.theme.lineCalendarStyle; + return switch ((selected, underline)) { + (true, true) => style.selectedTextStyle.copyWith(decoration: TextDecoration.underline), + (true, false) => style.selectedTextStyle, + (false, true) => style.unselectedTextStyle.copyWith(decoration: TextDecoration.underline), + (false, false) => style.unselectedTextStyle, + }; + } + @override Widget build(BuildContext context) { final style = this.style ?? context.theme.lineCalendarStyle; @@ -91,104 +123,133 @@ class _Tile extends StatelessWidget { return FTappable.animated( onPress: () => this.selected.value = date, - child: Container( - alignment: Alignment.center, - width: 55, - height: 85, - padding: const EdgeInsets.all(8), - decoration: selected ? style.selectedDecoration : null, + child: DecoratedBox( + decoration: selected ? style.selectedDecoration : style.unselectedDecoration, child: Column( + mainAxisAlignment: MainAxisAlignment.center, children: [ - _Date( - date: date, - selected: selected, - underline: underline, - style: style, + Text( + date.day.toString(), + style: selected ? style.selectedTextStyle : style.unselectedTextStyle, ), - const SizedBox(height: 5), + const SizedBox(height: 4), Text( _days[date.weekday - 1], - style: selected ? style.selectedTextStyle : style.unselectedTextStyle, + style: _style(context, selected), ), ], ), ), ); } -} - -class _Date extends StatelessWidget { - final FLineCalendarStyle? style; - final LocalDate date; - final bool selected; - final bool underline; - - const _Date({required this.date, required this.selected, required this.underline, this.style}); @override - Widget build(BuildContext context) { - final style = this.style ?? context.theme.lineCalendarStyle; - return Container( - alignment: Alignment.center, - height: 40, - width: 40, - decoration: style.dateDecoration, - child: Text( - date.day.toString(), - style: selected ? style.selectedTextStyle : style.unselectedTextStyle, - ), - ); + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('style', style)) + ..add(DiagnosticsProperty>('selected', selected)) + ..add(DiagnosticsProperty('date', date)) + ..add(DiagnosticsProperty('underline', underline)); } } /// [FAvatar]'s style. final class FLineCalendarStyle with Diagnosticable { - /// The fallback's background color. - final Color backgroundColor; - - /// The fallback's color. - final Color foregroundColor; - - final BoxDecoration dateDecoration; - + /// The box decoration for a selected date. final BoxDecoration selectedDecoration; + /// The box decoration for an unselected date. + final BoxDecoration unselectedDecoration; + /// The text style for the selected date. final TextStyle selectedTextStyle; - /// The text style for the selected date. + /// The text style for an unselected date. final TextStyle unselectedTextStyle; /// Creates a [FLineCalendarStyle]. const FLineCalendarStyle({ - required this.backgroundColor, - required this.foregroundColor, - required this.dateDecoration, + required this.unselectedDecoration, required this.selectedDecoration, required this.selectedTextStyle, required this.unselectedTextStyle, }); /// Creates a [FCardStyle] that inherits its properties from [colorScheme] and [typography]. - FLineCalendarStyle.inherit( - {required FColorScheme colorScheme, required FTypography typography, required FStyle style}) - : backgroundColor = colorScheme.muted, - foregroundColor = colorScheme.mutedForeground, - dateDecoration = BoxDecoration( - color: colorScheme.foreground, + FLineCalendarStyle.inherit({ + required FColorScheme colorScheme, + required FTypography typography, + required FStyle style, + }) : selectedDecoration = BoxDecoration( + color: colorScheme.primary, borderRadius: style.borderRadius, ), - selectedDecoration = BoxDecoration( - color: colorScheme.primary, + unselectedDecoration = BoxDecoration( + color: colorScheme.background, borderRadius: style.borderRadius, border: Border.all(color: colorScheme.border), ), selectedTextStyle = typography.base.copyWith( - color: colorScheme.mutedForeground, + color: colorScheme.primaryForeground, height: 0, ), unselectedTextStyle = typography.base.copyWith( - color: colorScheme.mutedForeground, + color: colorScheme.primary, height: 0, ); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('selectedDecoration', selectedDecoration)) + ..add(DiagnosticsProperty('unselectedDecoration', unselectedDecoration)) + ..add(DiagnosticsProperty('selectedTextStyle', selectedTextStyle)) + ..add(DiagnosticsProperty('unselectedTextStyle', unselectedTextStyle)); + } + + /// Returns a copy of this [FLineCalendarStyle] with the given properties replaced. + /// + /// ```dart + /// final style = FLineCalendarStyle( + /// selectedDecoration: ..., + /// unselectedDecoration: ..., + /// ); + /// + /// final copy = style.copyWith(unselectedDecoration: ...); + /// + /// print(style.selectedDecoration == copy.selectedDecoration); // true + /// print(style.unselectedDecoration == copy.unselectedDecoration); // false + /// ``` + @useResult + FLineCalendarStyle copyWith({ + BoxDecoration? selectedDecoration, + BoxDecoration? unselectedDecoration, + TextStyle? selectedTextStyle, + TextStyle? unselectedTextStyle, + }) => + FLineCalendarStyle( + selectedDecoration: selectedDecoration ?? this.selectedDecoration, + unselectedDecoration: unselectedDecoration ?? this.unselectedDecoration, + selectedTextStyle: selectedTextStyle ?? this.selectedTextStyle, + unselectedTextStyle: unselectedTextStyle ?? this.unselectedTextStyle, + ); + + @override + bool operator ==(Object other) => + identical(this, other) || + other is FLineCalendarStyle && + runtimeType == other.runtimeType && + selectedDecoration == other.selectedDecoration && + unselectedDecoration == other.unselectedDecoration && + selectedTextStyle == other.selectedTextStyle && + unselectedTextStyle == other.unselectedTextStyle; + + @override + int get hashCode => + selectedDecoration.hashCode ^ + unselectedDecoration.hashCode ^ + selectedTextStyle.hashCode ^ + unselectedTextStyle.hashCode; } From c7e55796f3428f9fad17b0525b557325940d8fb8 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Wed, 21 Aug 2024 14:08:12 +0800 Subject: [PATCH 04/44] Update line_calendar.dart --- .../widgets/line_calendar/line_calendar.dart | 64 +++++++++++++++++-- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 49415040d..b8aa392da 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -1,4 +1,5 @@ import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/foundation/tappable.dart'; @@ -70,14 +71,14 @@ class _FLineCalendarState extends State { final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * _width; _controller = ScrollController(initialScrollOffset: offset); return SizedBox( - height: 70, + height: _width*0.9, child: ListView.builder( controller: _controller, scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, itemExtent: _width, itemBuilder: (context, index) => Container( - padding: EdgeInsets.symmetric(horizontal: (_width - 55) / 2), + padding: EdgeInsets.symmetric(horizontal: (_width * 0.2) / 2), child: _Tile( style: widget.style, selected: widget.selected, @@ -130,9 +131,9 @@ class _Tile extends StatelessWidget { children: [ Text( date.day.toString(), - style: selected ? style.selectedTextStyle : style.unselectedTextStyle, + style: selected ? style.selectedDateTextStyle : style.unselectedDateTextStyle, ), - const SizedBox(height: 4), + const SizedBox(height: 2), Text( _days[date.weekday - 1], style: _style(context, selected), @@ -162,6 +163,18 @@ final class FLineCalendarStyle with Diagnosticable { /// The box decoration for an unselected date. final BoxDecoration unselectedDecoration; + /// The box decoration for an unselected date. + final BoxDecoration unselectedDateDecoration; + + /// The box decoration for a selected date. + final BoxDecoration selectedDateDecoration; + + /// The text style for the selected date. + final TextStyle selectedDateTextStyle; + + /// The text style for an unselected date. + final TextStyle unselectedDateTextStyle; + /// The text style for the selected date. final TextStyle selectedTextStyle; @@ -170,8 +183,12 @@ final class FLineCalendarStyle with Diagnosticable { /// Creates a [FLineCalendarStyle]. const FLineCalendarStyle({ - required this.unselectedDecoration, required this.selectedDecoration, + required this.unselectedDecoration, + required this.selectedDateDecoration, + required this.unselectedDateDecoration, + required this.selectedDateTextStyle, + required this.unselectedDateTextStyle, required this.selectedTextStyle, required this.unselectedTextStyle, }); @@ -190,12 +207,33 @@ final class FLineCalendarStyle with Diagnosticable { borderRadius: style.borderRadius, border: Border.all(color: colorScheme.border), ), - selectedTextStyle = typography.base.copyWith( + selectedDateDecoration = BoxDecoration( + color: colorScheme.background, + borderRadius: style.borderRadius, + border: Border.all(color: colorScheme.border), + ), + unselectedDateDecoration = BoxDecoration( + color: colorScheme.background, + borderRadius: style.borderRadius, + ), + selectedDateTextStyle = typography.xl.copyWith( + color: colorScheme.primaryForeground, + fontWeight: FontWeight.w500, + height: 0, + ), + unselectedDateTextStyle = typography.xl.copyWith( + color: colorScheme.primary, + fontWeight: FontWeight.w500, + height: 0, + ), + selectedTextStyle = typography.xs.copyWith( color: colorScheme.primaryForeground, + fontWeight: FontWeight.w600, height: 0, ), - unselectedTextStyle = typography.base.copyWith( + unselectedTextStyle = typography.xs.copyWith( color: colorScheme.primary, + fontWeight: FontWeight.w600, height: 0, ); @@ -226,12 +264,20 @@ final class FLineCalendarStyle with Diagnosticable { FLineCalendarStyle copyWith({ BoxDecoration? selectedDecoration, BoxDecoration? unselectedDecoration, + BoxDecoration? selectedDateDecoration, + BoxDecoration? unselectedDateDecoration, + TextStyle? selectedDateTextStyle, + TextStyle? unselectedDateTextStyle, TextStyle? selectedTextStyle, TextStyle? unselectedTextStyle, }) => FLineCalendarStyle( selectedDecoration: selectedDecoration ?? this.selectedDecoration, unselectedDecoration: unselectedDecoration ?? this.unselectedDecoration, + selectedDateDecoration: selectedDateDecoration ?? this.selectedDateDecoration, + unselectedDateDecoration: unselectedDateDecoration ?? this.unselectedDateDecoration, + selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, + unselectedDateTextStyle: unselectedDateTextStyle ?? this.unselectedDateTextStyle, selectedTextStyle: selectedTextStyle ?? this.selectedTextStyle, unselectedTextStyle: unselectedTextStyle ?? this.unselectedTextStyle, ); @@ -243,6 +289,8 @@ final class FLineCalendarStyle with Diagnosticable { runtimeType == other.runtimeType && selectedDecoration == other.selectedDecoration && unselectedDecoration == other.unselectedDecoration && + selectedDateDecoration == other.selectedDateDecoration && + unselectedDateDecoration == other.unselectedDateDecoration && selectedTextStyle == other.selectedTextStyle && unselectedTextStyle == other.unselectedTextStyle; @@ -250,6 +298,8 @@ final class FLineCalendarStyle with Diagnosticable { int get hashCode => selectedDecoration.hashCode ^ unselectedDecoration.hashCode ^ + selectedDateDecoration.hashCode ^ + unselectedDateDecoration.hashCode ^ selectedTextStyle.hashCode ^ unselectedTextStyle.hashCode; } From c46c04ac4032818bd7691163d9c68c99594c4d2a Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Wed, 21 Aug 2024 19:40:11 +0800 Subject: [PATCH 05/44] Ready for clean up and testing code --- .../widgets/line_calendar/line_calendar.dart | 209 ++++++++++-------- 1 file changed, 122 insertions(+), 87 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index b8aa392da..fe8a16797 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -1,14 +1,15 @@ import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/foundation/tappable.dart'; +import 'package:forui/src/foundation/util.dart'; import 'package:meta/meta.dart'; import 'package:sugar/sugar.dart'; const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; final _epoch = LocalDate(2000); +const _textSpacing = 2.0; /// A calendar that can be scrolled horizontally. class FLineCalendar extends StatefulWidget { @@ -50,7 +51,6 @@ class FLineCalendar extends StatefulWidget { class _FLineCalendarState extends State { late ScrollController _controller = ScrollController(); - late double _width; @override void initState() { @@ -59,37 +59,35 @@ class _FLineCalendarState extends State { } @override - Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) { - if (constraints.maxWidth < 450) { - _width = constraints.maxWidth / 5; - } else if (constraints.maxWidth >= 450 && constraints.maxWidth <= 650) { - _width = constraints.maxWidth / 7; - } else { - _width = constraints.maxWidth / 10; - } - final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * _width; - _controller = ScrollController(initialScrollOffset: offset); - return SizedBox( - height: _width*0.9, - child: ListView.builder( - controller: _controller, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.zero, - itemExtent: _width, - itemBuilder: (context, index) => Container( - padding: EdgeInsets.symmetric(horizontal: (_width * 0.2) / 2), - child: _Tile( - style: widget.style, - selected: widget.selected, - date: widget.epoch.add(Duration(days: index)), - today: widget.today, - ), - ), - ), - ); - }, - ); + Widget build(BuildContext context) { + final style = widget.style ?? context.theme.lineCalendarStyle; + final textScalor = MediaQuery.textScalerOf(context); + final dateHeight = textScalor.scale(style.unselectedTextStyle.fontSize!); + final textHeight = textScalor.scale(style.unselectedTextStyle.fontSize!); + final height = dateHeight + textHeight + _textSpacing + (style.heightPadding * 2); + + final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * height + style.itemPadding; + _controller = ScrollController(initialScrollOffset: offset); + return SizedBox( + height: height, + child: ListView.builder( + controller: _controller, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.zero, + // TODO: calculate width of items based on the text width. + itemExtent: height, + itemBuilder: (context, index) => Container( + padding: EdgeInsets.symmetric(horizontal: style.itemPadding), + child: _Tile( + style: widget.style, + selected: widget.selected, + date: widget.epoch.add(Duration(days: index)), + today: widget.today, + ), + ), + ), + ); + } @override void dispose() { @@ -102,18 +100,18 @@ class _Tile extends StatelessWidget { final FLineCalendarStyle? style; final ValueNotifier selected; final LocalDate date; - final bool underline; + final bool today; const _Tile({required this.selected, required this.date, required LocalDate today, this.style}) - : underline = date == today; + : today = date == today; - TextStyle _style(BuildContext context, bool selected) { + Color _style(BuildContext context, bool selected) { final style = this.style ?? context.theme.lineCalendarStyle; - return switch ((selected, underline)) { - (true, true) => style.selectedTextStyle.copyWith(decoration: TextDecoration.underline), - (true, false) => style.selectedTextStyle, - (false, true) => style.unselectedTextStyle.copyWith(decoration: TextDecoration.underline), - (false, false) => style.unselectedTextStyle, + return switch ((selected, today)) { + (true, true) => style.primaryForeground, + (true, false) => const Color(0x00000000), + (false, true) => style.primary, + (false, false) => const Color(0x00000000), }; } @@ -124,22 +122,50 @@ class _Tile extends StatelessWidget { return FTappable.animated( onPress: () => this.selected.value = date, - child: DecoratedBox( - decoration: selected ? style.selectedDecoration : style.unselectedDecoration, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - date.day.toString(), - style: selected ? style.selectedDateTextStyle : style.unselectedDateTextStyle, + child: Stack( + children: [ + Positioned.fill( + child: DecoratedBox( + decoration: selected ? style.selectedDecoration : style.unselectedDecoration, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. + merge( + textHeightBehavior: const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: false, + ), + style: selected ? style.selectedDateTextStyle : style.unselectedDateTextStyle, + child: Text(date.day.toString()), + ), + const SizedBox(height: _textSpacing), + // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. + merge( + textHeightBehavior: const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: false, + ), + style: selected ? style.selectedTextStyle : style.unselectedTextStyle, + child: Text(_days[date.weekday - 1]), + ), + ], + ), ), - const SizedBox(height: 2), - Text( - _days[date.weekday - 1], - style: _style(context, selected), + ), + Positioned( + top: 6, + right: 6, + child: Container( + height: 4, + width: 4, + decoration: BoxDecoration( + color: _style(context, selected), + shape: BoxShape.circle, + ), ), - ], - ), + ), + ], ), ); } @@ -151,24 +177,26 @@ class _Tile extends StatelessWidget { ..add(DiagnosticsProperty('style', style)) ..add(DiagnosticsProperty>('selected', selected)) ..add(DiagnosticsProperty('date', date)) - ..add(DiagnosticsProperty('underline', underline)); + ..add(DiagnosticsProperty('underline', today)); } } /// [FAvatar]'s style. final class FLineCalendarStyle with Diagnosticable { + final Color primary; + + final Color primaryForeground; + + final double heightPadding; + + final double itemPadding; + /// The box decoration for a selected date. final BoxDecoration selectedDecoration; /// The box decoration for an unselected date. final BoxDecoration unselectedDecoration; - /// The box decoration for an unselected date. - final BoxDecoration unselectedDateDecoration; - - /// The box decoration for a selected date. - final BoxDecoration selectedDateDecoration; - /// The text style for the selected date. final TextStyle selectedDateTextStyle; @@ -183,10 +211,12 @@ final class FLineCalendarStyle with Diagnosticable { /// Creates a [FLineCalendarStyle]. const FLineCalendarStyle({ + required this.heightPadding, + required this.itemPadding, + required this.primary, + required this.primaryForeground, required this.selectedDecoration, required this.unselectedDecoration, - required this.selectedDateDecoration, - required this.unselectedDateDecoration, required this.selectedDateTextStyle, required this.unselectedDateTextStyle, required this.selectedTextStyle, @@ -198,7 +228,11 @@ final class FLineCalendarStyle with Diagnosticable { required FColorScheme colorScheme, required FTypography typography, required FStyle style, - }) : selectedDecoration = BoxDecoration( + }) : heightPadding = 15.5, + itemPadding = 6.5, + primary = colorScheme.primary, + primaryForeground = colorScheme.primaryForeground, + selectedDecoration = BoxDecoration( color: colorScheme.primary, borderRadius: style.borderRadius, ), @@ -207,34 +241,25 @@ final class FLineCalendarStyle with Diagnosticable { borderRadius: style.borderRadius, border: Border.all(color: colorScheme.border), ), - selectedDateDecoration = BoxDecoration( - color: colorScheme.background, - borderRadius: style.borderRadius, - border: Border.all(color: colorScheme.border), - ), - unselectedDateDecoration = BoxDecoration( - color: colorScheme.background, - borderRadius: style.borderRadius, - ), selectedDateTextStyle = typography.xl.copyWith( color: colorScheme.primaryForeground, fontWeight: FontWeight.w500, - height: 0, + //height: 0, ), unselectedDateTextStyle = typography.xl.copyWith( color: colorScheme.primary, fontWeight: FontWeight.w500, - height: 0, + //height: 0, ), selectedTextStyle = typography.xs.copyWith( color: colorScheme.primaryForeground, - fontWeight: FontWeight.w600, - height: 0, + fontWeight: FontWeight.w500, + //height: 0, ), unselectedTextStyle = typography.xs.copyWith( - color: colorScheme.primary, - fontWeight: FontWeight.w600, - height: 0, + color: colorScheme.mutedForeground, + fontWeight: FontWeight.w500, + //height: 0, ); @override @@ -262,6 +287,10 @@ final class FLineCalendarStyle with Diagnosticable { /// ``` @useResult FLineCalendarStyle copyWith({ + double? heightPadding, + double? itemPadding, + Color? primary, + Color? primaryForeground, BoxDecoration? selectedDecoration, BoxDecoration? unselectedDecoration, BoxDecoration? selectedDateDecoration, @@ -272,10 +301,12 @@ final class FLineCalendarStyle with Diagnosticable { TextStyle? unselectedTextStyle, }) => FLineCalendarStyle( + heightPadding: heightPadding ?? this.heightPadding, + itemPadding: itemPadding ?? this.itemPadding, + primary: primary ?? this.primary, + primaryForeground: primaryForeground ?? this.primaryForeground, selectedDecoration: selectedDecoration ?? this.selectedDecoration, unselectedDecoration: unselectedDecoration ?? this.unselectedDecoration, - selectedDateDecoration: selectedDateDecoration ?? this.selectedDateDecoration, - unselectedDateDecoration: unselectedDateDecoration ?? this.unselectedDateDecoration, selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, unselectedDateTextStyle: unselectedDateTextStyle ?? this.unselectedDateTextStyle, selectedTextStyle: selectedTextStyle ?? this.selectedTextStyle, @@ -287,19 +318,23 @@ final class FLineCalendarStyle with Diagnosticable { identical(this, other) || other is FLineCalendarStyle && runtimeType == other.runtimeType && + heightPadding == other.heightPadding && + itemPadding == other.itemPadding && + primary == other.primary && + primaryForeground == other.primaryForeground && selectedDecoration == other.selectedDecoration && unselectedDecoration == other.unselectedDecoration && - selectedDateDecoration == other.selectedDateDecoration && - unselectedDateDecoration == other.unselectedDateDecoration && selectedTextStyle == other.selectedTextStyle && unselectedTextStyle == other.unselectedTextStyle; @override int get hashCode => + heightPadding.hashCode ^ + itemPadding.hashCode ^ + primary.hashCode ^ + primaryForeground.hashCode ^ selectedDecoration.hashCode ^ unselectedDecoration.hashCode ^ - selectedDateDecoration.hashCode ^ - unselectedDateDecoration.hashCode ^ selectedTextStyle.hashCode ^ unselectedTextStyle.hashCode; } From 7985653fb3fce9a85eb11c06fe4cd444a86c4868 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Thu, 29 Aug 2024 23:30:53 +0800 Subject: [PATCH 06/44] Ready for review? --- forui/lib/forui.dart | 3 +- .../{line_calendar => }/line_calendar.dart | 82 ++++++++++-------- forui/lib/widgets/line_calendar.dart | 8 -- .../line_calendar/zinc-dark-default.png | Bin 0 -> 47540 bytes .../line_calendar/zinc-light-default.png | Bin 0 -> 47189 bytes .../widgets/line_calendar_golden_test.dart | 37 ++++++++ 6 files changed, 84 insertions(+), 46 deletions(-) rename forui/lib/src/widgets/{line_calendar => }/line_calendar.dart (82%) delete mode 100644 forui/lib/widgets/line_calendar.dart create mode 100644 forui/test/golden/line_calendar/zinc-dark-default.png create mode 100644 forui/test/golden/line_calendar/zinc-light-default.png create mode 100644 forui/test/src/widgets/line_calendar_golden_test.dart diff --git a/forui/lib/forui.dart b/forui/lib/forui.dart index a85ad3c36..e03b75f8b 100644 --- a/forui/lib/forui.dart +++ b/forui/lib/forui.dart @@ -17,12 +17,11 @@ export 'widgets/checkbox.dart'; export 'widgets/dialog.dart'; export 'widgets/divider.dart'; export 'widgets/header.dart'; + export 'widgets/icon.dart'; export 'widgets/label.dart'; export 'widgets/popover.dart'; -export 'widgets/line_calendar.dart'; - export 'widgets/progress.dart'; export 'widgets/radio.dart'; export 'widgets/resizable.dart'; diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar.dart similarity index 82% rename from forui/lib/src/widgets/line_calendar/line_calendar.dart rename to forui/lib/src/widgets/line_calendar.dart index fe8a16797..9da86588c 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar.dart @@ -42,10 +42,10 @@ class FLineCalendar extends StatefulWidget { void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties - ..add(DiagnosticsProperty('style', style)) - ..add(DiagnosticsProperty>('selected', selected)) - ..add(DiagnosticsProperty('epoch', epoch)) - ..add(DiagnosticsProperty('today', today)); + ..add(DiagnosticsProperty('style', style)) + ..add(DiagnosticsProperty('selected', selected)) + ..add(DiagnosticsProperty('epoch', epoch)) + ..add(DiagnosticsProperty('today', today)); } } @@ -61,21 +61,23 @@ class _FLineCalendarState extends State { @override Widget build(BuildContext context) { final style = widget.style ?? context.theme.lineCalendarStyle; + final textScalor = MediaQuery.textScalerOf(context); - final dateHeight = textScalor.scale(style.unselectedTextStyle.fontSize!); - final textHeight = textScalor.scale(style.unselectedTextStyle.fontSize!); - final height = dateHeight + textHeight + _textSpacing + (style.heightPadding * 2); + final dateTextSize = textScalor.scale(style.unselectedDateTextStyle.fontSize!); + final dayTextSize = textScalor.scale(style.unselectedTextStyle.fontSize!); + final size = dateTextSize + dayTextSize + _textSpacing + (style.heightPadding * 2); - final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * height + style.itemPadding; + final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * size + style.itemPadding; _controller = ScrollController(initialScrollOffset: offset); + return SizedBox( - height: height, + height: size, child: ListView.builder( controller: _controller, scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, - // TODO: calculate width of items based on the text width. - itemExtent: height, + // TODO: calculate width of items based on the text font size. + itemExtent: size, itemBuilder: (context, index) => Container( padding: EdgeInsets.symmetric(horizontal: style.itemPadding), child: _Tile( @@ -108,9 +110,9 @@ class _Tile extends StatelessWidget { Color _style(BuildContext context, bool selected) { final style = this.style ?? context.theme.lineCalendarStyle; return switch ((selected, today)) { - (true, true) => style.primaryForeground, + (true, true) => style.selectedIndicatorColor, (true, false) => const Color(0x00000000), - (false, true) => style.primary, + (false, true) => style.unselectedIndicatorColor, (false, false) => const Color(0x00000000), }; } @@ -175,7 +177,7 @@ class _Tile extends StatelessWidget { super.debugFillProperties(properties); properties ..add(DiagnosticsProperty('style', style)) - ..add(DiagnosticsProperty>('selected', selected)) + ..add(DiagnosticsProperty('selected', selected)) ..add(DiagnosticsProperty('date', date)) ..add(DiagnosticsProperty('underline', today)); } @@ -183,12 +185,10 @@ class _Tile extends StatelessWidget { /// [FAvatar]'s style. final class FLineCalendarStyle with Diagnosticable { - final Color primary; - - final Color primaryForeground; - + /// The vertical padding around the text. final double heightPadding; + /// The horizontal padding around each date item. final double itemPadding; /// The box decoration for a selected date. @@ -197,7 +197,13 @@ final class FLineCalendarStyle with Diagnosticable { /// The box decoration for an unselected date. final BoxDecoration unselectedDecoration; - /// The text style for the selected date. + /// The color of the indicator for the current date when it is selected. + final Color selectedIndicatorColor; + + /// The color of the indicator for the current date when it is not selected. + final Color unselectedIndicatorColor; + + /// The color of . final TextStyle selectedDateTextStyle; /// The text style for an unselected date. @@ -213,8 +219,8 @@ final class FLineCalendarStyle with Diagnosticable { const FLineCalendarStyle({ required this.heightPadding, required this.itemPadding, - required this.primary, - required this.primaryForeground, + required this.selectedIndicatorColor, + required this.unselectedIndicatorColor, required this.selectedDecoration, required this.unselectedDecoration, required this.selectedDateTextStyle, @@ -230,8 +236,8 @@ final class FLineCalendarStyle with Diagnosticable { required FStyle style, }) : heightPadding = 15.5, itemPadding = 6.5, - primary = colorScheme.primary, - primaryForeground = colorScheme.primaryForeground, + selectedIndicatorColor = colorScheme.primaryForeground, + unselectedIndicatorColor = colorScheme.primary, selectedDecoration = BoxDecoration( color: colorScheme.primary, borderRadius: style.borderRadius, @@ -244,22 +250,22 @@ final class FLineCalendarStyle with Diagnosticable { selectedDateTextStyle = typography.xl.copyWith( color: colorScheme.primaryForeground, fontWeight: FontWeight.w500, - //height: 0, + height: 0, ), unselectedDateTextStyle = typography.xl.copyWith( color: colorScheme.primary, fontWeight: FontWeight.w500, - //height: 0, + height: 0, ), selectedTextStyle = typography.xs.copyWith( color: colorScheme.primaryForeground, fontWeight: FontWeight.w500, - //height: 0, + height: 0, ), unselectedTextStyle = typography.xs.copyWith( color: colorScheme.mutedForeground, fontWeight: FontWeight.w500, - //height: 0, + height: 0, ); @override @@ -269,7 +275,13 @@ final class FLineCalendarStyle with Diagnosticable { ..add(DiagnosticsProperty('selectedDecoration', selectedDecoration)) ..add(DiagnosticsProperty('unselectedDecoration', unselectedDecoration)) ..add(DiagnosticsProperty('selectedTextStyle', selectedTextStyle)) - ..add(DiagnosticsProperty('unselectedTextStyle', unselectedTextStyle)); + ..add(DiagnosticsProperty('unselectedTextStyle', unselectedTextStyle)) + ..add(ColorProperty('primary', selectedIndicatorColor)) + ..add(DoubleProperty('heightPadding', heightPadding)) + ..add(DoubleProperty('itemPadding', itemPadding)) + ..add(ColorProperty('unselectedIndicatorColor', unselectedIndicatorColor)) + ..add(DiagnosticsProperty('selectedDateTextStyle', selectedDateTextStyle)) + ..add(DiagnosticsProperty('unselectedDateTextStyle', unselectedDateTextStyle)); } /// Returns a copy of this [FLineCalendarStyle] with the given properties replaced. @@ -293,8 +305,6 @@ final class FLineCalendarStyle with Diagnosticable { Color? primaryForeground, BoxDecoration? selectedDecoration, BoxDecoration? unselectedDecoration, - BoxDecoration? selectedDateDecoration, - BoxDecoration? unselectedDateDecoration, TextStyle? selectedDateTextStyle, TextStyle? unselectedDateTextStyle, TextStyle? selectedTextStyle, @@ -303,8 +313,8 @@ final class FLineCalendarStyle with Diagnosticable { FLineCalendarStyle( heightPadding: heightPadding ?? this.heightPadding, itemPadding: itemPadding ?? this.itemPadding, - primary: primary ?? this.primary, - primaryForeground: primaryForeground ?? this.primaryForeground, + selectedIndicatorColor: primary ?? this.selectedIndicatorColor, + unselectedIndicatorColor: primaryForeground ?? this.unselectedIndicatorColor, selectedDecoration: selectedDecoration ?? this.selectedDecoration, unselectedDecoration: unselectedDecoration ?? this.unselectedDecoration, selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, @@ -320,8 +330,8 @@ final class FLineCalendarStyle with Diagnosticable { runtimeType == other.runtimeType && heightPadding == other.heightPadding && itemPadding == other.itemPadding && - primary == other.primary && - primaryForeground == other.primaryForeground && + selectedIndicatorColor == other.selectedIndicatorColor && + unselectedIndicatorColor == other.unselectedIndicatorColor && selectedDecoration == other.selectedDecoration && unselectedDecoration == other.unselectedDecoration && selectedTextStyle == other.selectedTextStyle && @@ -331,8 +341,8 @@ final class FLineCalendarStyle with Diagnosticable { int get hashCode => heightPadding.hashCode ^ itemPadding.hashCode ^ - primary.hashCode ^ - primaryForeground.hashCode ^ + selectedIndicatorColor.hashCode ^ + unselectedIndicatorColor.hashCode ^ selectedDecoration.hashCode ^ unselectedDecoration.hashCode ^ selectedTextStyle.hashCode ^ diff --git a/forui/lib/widgets/line_calendar.dart b/forui/lib/widgets/line_calendar.dart deleted file mode 100644 index 700667424..000000000 --- a/forui/lib/widgets/line_calendar.dart +++ /dev/null @@ -1,8 +0,0 @@ -/// {@category Widgets} -/// -/// A line calendar. -/// -/// See https://forui.dev/docs/line-calendar for working examples. -library forui.widgets.line_calendar; - -export '../src/widgets/line_calendar/line_calendar.dart'; diff --git a/forui/test/golden/line_calendar/zinc-dark-default.png b/forui/test/golden/line_calendar/zinc-dark-default.png new file mode 100644 index 0000000000000000000000000000000000000000..509083f50e5a775d3078b58de01e92c942f756d3 GIT binary patch literal 47540 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 W-zrq*BXOR&GEH?|wSv=Eg8m02O@oL4 literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-light-default.png b/forui/test/golden/line_calendar/zinc-light-default.png new file mode 100644 index 0000000000000000000000000000000000000000..15b758b0a63cdc638e5b38a7d283e1b4134c0c91 GIT binary patch literal 47189 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%0DD$<&qt;7|2TSi!GK)DmCW2wIg+e3Xk%A2UBjX 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 Date: Thu, 29 Aug 2024 23:40:21 +0800 Subject: [PATCH 07/44] updated some documentations --- forui/lib/src/widgets/line_calendar.dart | 80 ++++++++++++------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar.dart b/forui/lib/src/widgets/line_calendar.dart index 9da86588c..772de0b43 100644 --- a/forui/lib/src/widgets/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar.dart @@ -64,7 +64,7 @@ class _FLineCalendarState extends State { final textScalor = MediaQuery.textScalerOf(context); final dateTextSize = textScalor.scale(style.unselectedDateTextStyle.fontSize!); - final dayTextSize = textScalor.scale(style.unselectedTextStyle.fontSize!); + final dayTextSize = textScalor.scale(style.unselectedDayTextStyle.fontSize!); final size = dateTextSize + dayTextSize + _textSpacing + (style.heightPadding * 2); final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * size + style.itemPadding; @@ -110,9 +110,9 @@ class _Tile extends StatelessWidget { Color _style(BuildContext context, bool selected) { final style = this.style ?? context.theme.lineCalendarStyle; return switch ((selected, today)) { - (true, true) => style.selectedIndicatorColor, + (true, true) => style.selectedCurrentDateIndicatorColor, (true, false) => const Color(0x00000000), - (false, true) => style.unselectedIndicatorColor, + (false, true) => style.unselectedCurrentDateIndicatorColor, (false, false) => const Color(0x00000000), }; } @@ -148,7 +148,7 @@ class _Tile extends StatelessWidget { applyHeightToFirstAscent: false, applyHeightToLastDescent: false, ), - style: selected ? style.selectedTextStyle : style.unselectedTextStyle, + style: selected ? style.selectedDayTextStyle : style.unselectedDayTextStyle, child: Text(_days[date.weekday - 1]), ), ], @@ -185,10 +185,10 @@ class _Tile extends StatelessWidget { /// [FAvatar]'s style. final class FLineCalendarStyle with Diagnosticable { - /// The vertical padding around the text. + /// The vertical padding around the text in the calendar items. final double heightPadding; - /// The horizontal padding around each date item. + /// The horizontal padding around the text in the calendar items. final double itemPadding; /// The box decoration for a selected date. @@ -197,36 +197,36 @@ final class FLineCalendarStyle with Diagnosticable { /// The box decoration for an unselected date. final BoxDecoration unselectedDecoration; - /// The color of the indicator for the current date when it is selected. - final Color selectedIndicatorColor; + /// The color of the indicator for the selected current date. + final Color selectedCurrentDateIndicatorColor; - /// The color of the indicator for the current date when it is not selected. - final Color unselectedIndicatorColor; + /// The color of the indicator for the unselected current date. + final Color unselectedCurrentDateIndicatorColor; - /// The color of . + /// The text style for the selected date. final TextStyle selectedDateTextStyle; - /// The text style for an unselected date. + /// The text style for the unselected date. final TextStyle unselectedDateTextStyle; - /// The text style for the selected date. - final TextStyle selectedTextStyle; + /// The text style for the selected day of the week. + final TextStyle selectedDayTextStyle; - /// The text style for an unselected date. - final TextStyle unselectedTextStyle; + /// The text style for the unselected day of the week. + final TextStyle unselectedDayTextStyle; /// Creates a [FLineCalendarStyle]. const FLineCalendarStyle({ required this.heightPadding, required this.itemPadding, - required this.selectedIndicatorColor, - required this.unselectedIndicatorColor, + required this.selectedCurrentDateIndicatorColor, + required this.unselectedCurrentDateIndicatorColor, required this.selectedDecoration, required this.unselectedDecoration, required this.selectedDateTextStyle, required this.unselectedDateTextStyle, - required this.selectedTextStyle, - required this.unselectedTextStyle, + required this.selectedDayTextStyle, + required this.unselectedDayTextStyle, }); /// Creates a [FCardStyle] that inherits its properties from [colorScheme] and [typography]. @@ -236,8 +236,8 @@ final class FLineCalendarStyle with Diagnosticable { required FStyle style, }) : heightPadding = 15.5, itemPadding = 6.5, - selectedIndicatorColor = colorScheme.primaryForeground, - unselectedIndicatorColor = colorScheme.primary, + selectedCurrentDateIndicatorColor = colorScheme.primaryForeground, + unselectedCurrentDateIndicatorColor = colorScheme.primary, selectedDecoration = BoxDecoration( color: colorScheme.primary, borderRadius: style.borderRadius, @@ -257,12 +257,12 @@ final class FLineCalendarStyle with Diagnosticable { fontWeight: FontWeight.w500, height: 0, ), - selectedTextStyle = typography.xs.copyWith( + selectedDayTextStyle = typography.xs.copyWith( color: colorScheme.primaryForeground, fontWeight: FontWeight.w500, height: 0, ), - unselectedTextStyle = typography.xs.copyWith( + unselectedDayTextStyle = typography.xs.copyWith( color: colorScheme.mutedForeground, fontWeight: FontWeight.w500, height: 0, @@ -274,12 +274,12 @@ final class FLineCalendarStyle with Diagnosticable { properties ..add(DiagnosticsProperty('selectedDecoration', selectedDecoration)) ..add(DiagnosticsProperty('unselectedDecoration', unselectedDecoration)) - ..add(DiagnosticsProperty('selectedTextStyle', selectedTextStyle)) - ..add(DiagnosticsProperty('unselectedTextStyle', unselectedTextStyle)) - ..add(ColorProperty('primary', selectedIndicatorColor)) + ..add(DiagnosticsProperty('selectedTextStyle', selectedDayTextStyle)) + ..add(DiagnosticsProperty('unselectedTextStyle', unselectedDayTextStyle)) + ..add(ColorProperty('primary', selectedCurrentDateIndicatorColor)) ..add(DoubleProperty('heightPadding', heightPadding)) ..add(DoubleProperty('itemPadding', itemPadding)) - ..add(ColorProperty('unselectedIndicatorColor', unselectedIndicatorColor)) + ..add(ColorProperty('unselectedIndicatorColor', unselectedCurrentDateIndicatorColor)) ..add(DiagnosticsProperty('selectedDateTextStyle', selectedDateTextStyle)) ..add(DiagnosticsProperty('unselectedDateTextStyle', unselectedDateTextStyle)); } @@ -313,14 +313,14 @@ final class FLineCalendarStyle with Diagnosticable { FLineCalendarStyle( heightPadding: heightPadding ?? this.heightPadding, itemPadding: itemPadding ?? this.itemPadding, - selectedIndicatorColor: primary ?? this.selectedIndicatorColor, - unselectedIndicatorColor: primaryForeground ?? this.unselectedIndicatorColor, + selectedCurrentDateIndicatorColor: primary ?? this.selectedCurrentDateIndicatorColor, + unselectedCurrentDateIndicatorColor: primaryForeground ?? this.unselectedCurrentDateIndicatorColor, selectedDecoration: selectedDecoration ?? this.selectedDecoration, unselectedDecoration: unselectedDecoration ?? this.unselectedDecoration, selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, unselectedDateTextStyle: unselectedDateTextStyle ?? this.unselectedDateTextStyle, - selectedTextStyle: selectedTextStyle ?? this.selectedTextStyle, - unselectedTextStyle: unselectedTextStyle ?? this.unselectedTextStyle, + selectedDayTextStyle: selectedTextStyle ?? this.selectedDayTextStyle, + unselectedDayTextStyle: unselectedTextStyle ?? this.unselectedDayTextStyle, ); @override @@ -330,21 +330,21 @@ final class FLineCalendarStyle with Diagnosticable { runtimeType == other.runtimeType && heightPadding == other.heightPadding && itemPadding == other.itemPadding && - selectedIndicatorColor == other.selectedIndicatorColor && - unselectedIndicatorColor == other.unselectedIndicatorColor && + selectedCurrentDateIndicatorColor == other.selectedCurrentDateIndicatorColor && + unselectedCurrentDateIndicatorColor == other.unselectedCurrentDateIndicatorColor && selectedDecoration == other.selectedDecoration && unselectedDecoration == other.unselectedDecoration && - selectedTextStyle == other.selectedTextStyle && - unselectedTextStyle == other.unselectedTextStyle; + selectedDayTextStyle == other.selectedDayTextStyle && + unselectedDayTextStyle == other.unselectedDayTextStyle; @override int get hashCode => heightPadding.hashCode ^ itemPadding.hashCode ^ - selectedIndicatorColor.hashCode ^ - unselectedIndicatorColor.hashCode ^ + selectedCurrentDateIndicatorColor.hashCode ^ + unselectedCurrentDateIndicatorColor.hashCode ^ selectedDecoration.hashCode ^ unselectedDecoration.hashCode ^ - selectedTextStyle.hashCode ^ - unselectedTextStyle.hashCode; + selectedDayTextStyle.hashCode ^ + unselectedDayTextStyle.hashCode; } From 7b1e0435892e8285c97d7f9a3abf9b516a744c5a Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Thu, 29 Aug 2024 15:35:54 +0000 Subject: [PATCH 08/44] Commit from GitHub Actions (Forui Presubmit) --- forui/lib/src/theme/theme_data.dart | 3 +++ forui/lib/src/widgets/line_calendar.dart | 10 +++++++--- forui/test/src/widgets/line_calendar_golden_test.dart | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/forui/lib/src/theme/theme_data.dart b/forui/lib/src/theme/theme_data.dart index 54216ed26..aeddf3122 100644 --- a/forui/lib/src/theme/theme_data.dart +++ b/forui/lib/src/theme/theme_data.dart @@ -4,8 +4,11 @@ import 'package:flutter/rendering.dart'; import 'package:meta/meta.dart'; import 'package:forui/forui.dart'; + import 'package:forui/src/theme/breakpoints.dart'; +import 'package:forui/src/widgets/line_calendar.dart'; + /// Defines the configuration of the overall visual [FTheme] for a widget subtree. /// /// A [FThemeData] is composed of [colorScheme], [typography], [style], and widget styles. diff --git a/forui/lib/src/widgets/line_calendar.dart b/forui/lib/src/widgets/line_calendar.dart index 772de0b43..a70d29981 100644 --- a/forui/lib/src/widgets/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar.dart @@ -1,11 +1,12 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; + +import 'package:meta/meta.dart'; +import 'package:sugar/sugar.dart'; + import 'package:forui/forui.dart'; import 'package:forui/src/foundation/tappable.dart'; import 'package:forui/src/foundation/util.dart'; -import 'package:meta/meta.dart'; - -import 'package:sugar/sugar.dart'; const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; final _epoch = LocalDate(2000); @@ -313,8 +314,11 @@ final class FLineCalendarStyle with Diagnosticable { FLineCalendarStyle( heightPadding: heightPadding ?? this.heightPadding, itemPadding: itemPadding ?? this.itemPadding, + selectedCurrentDateIndicatorColor: primary ?? this.selectedCurrentDateIndicatorColor, unselectedCurrentDateIndicatorColor: primaryForeground ?? this.unselectedCurrentDateIndicatorColor, + + selectedDecoration: selectedDecoration ?? this.selectedDecoration, unselectedDecoration: unselectedDecoration ?? this.unselectedDecoration, selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index b4283c6ab..b48047ac8 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -4,9 +4,9 @@ library; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:sugar/sugar.dart'; import 'package:forui/src/widgets/line_calendar.dart'; -import 'package:sugar/sugar.dart'; import '../test_scaffold.dart'; void main() { From efab2ba91a4b44be74ff7ee9d765c1cc30839d70 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Thu, 29 Aug 2024 23:42:20 +0800 Subject: [PATCH 09/44] Update line_calendar.dart --- forui/lib/src/widgets/line_calendar.dart | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar.dart b/forui/lib/src/widgets/line_calendar.dart index a70d29981..ee0e74e64 100644 --- a/forui/lib/src/widgets/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar.dart @@ -302,29 +302,27 @@ final class FLineCalendarStyle with Diagnosticable { FLineCalendarStyle copyWith({ double? heightPadding, double? itemPadding, - Color? primary, - Color? primaryForeground, + Color? selectedCurrentDateIndicatorColor, + Color? unselectedCurrentDateIndicatorColor, BoxDecoration? selectedDecoration, BoxDecoration? unselectedDecoration, TextStyle? selectedDateTextStyle, TextStyle? unselectedDateTextStyle, - TextStyle? selectedTextStyle, - TextStyle? unselectedTextStyle, + TextStyle? selectedDayTextStyle, + TextStyle? unselectedDayTextStyle, }) => FLineCalendarStyle( heightPadding: heightPadding ?? this.heightPadding, itemPadding: itemPadding ?? this.itemPadding, - - selectedCurrentDateIndicatorColor: primary ?? this.selectedCurrentDateIndicatorColor, - unselectedCurrentDateIndicatorColor: primaryForeground ?? this.unselectedCurrentDateIndicatorColor, - - + selectedCurrentDateIndicatorColor: selectedCurrentDateIndicatorColor ?? this.selectedCurrentDateIndicatorColor, + unselectedCurrentDateIndicatorColor: + unselectedCurrentDateIndicatorColor ?? this.unselectedCurrentDateIndicatorColor, selectedDecoration: selectedDecoration ?? this.selectedDecoration, unselectedDecoration: unselectedDecoration ?? this.unselectedDecoration, selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, unselectedDateTextStyle: unselectedDateTextStyle ?? this.unselectedDateTextStyle, - selectedDayTextStyle: selectedTextStyle ?? this.selectedDayTextStyle, - unselectedDayTextStyle: unselectedTextStyle ?? this.unselectedDayTextStyle, + selectedDayTextStyle: selectedDayTextStyle ?? this.selectedDayTextStyle, + unselectedDayTextStyle: unselectedDayTextStyle ?? this.unselectedDayTextStyle, ); @override From b8aef003d7530b97f483753297c5b0e66813d31c Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Fri, 30 Aug 2024 17:29:05 +0800 Subject: [PATCH 10/44] Fixed some PR issues --- forui/lib/src/widgets/line_calendar.dart | 84 +++++++++++-------- .../widgets/line_calendar_golden_test.dart | 2 +- 2 files changed, 52 insertions(+), 34 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar.dart b/forui/lib/src/widgets/line_calendar.dart index ee0e74e64..00a7d58e8 100644 --- a/forui/lib/src/widgets/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar.dart @@ -1,4 +1,5 @@ import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:meta/meta.dart'; @@ -8,6 +9,7 @@ import 'package:forui/forui.dart'; import 'package:forui/src/foundation/tappable.dart'; import 'package:forui/src/foundation/util.dart'; +//TODO: localizations. const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; final _epoch = LocalDate(2000); const _textSpacing = 2.0; @@ -51,18 +53,42 @@ class FLineCalendar extends StatefulWidget { } class _FLineCalendarState extends State { - late ScrollController _controller = ScrollController(); + ScrollController _controller = ScrollController(); + + @override + void didUpdateWidget(covariant FLineCalendar oldWidget) { + if (oldWidget.selected != widget.selected) { + WidgetsBinding.instance.addPostFrameCallback((_) { + final textDirection = Directionality.of(context); + oldWidget.selected.removeListener(() => onDateChange(textDirection)); + widget.selected.addListener(() => onDateChange(textDirection)); + }); + } + super.didUpdateWidget(oldWidget); + } @override void initState() { - widget.selected.addListener(() => setState(() {})); super.initState(); + + WidgetsBinding.instance.addPostFrameCallback((_) { + final textDirection = Directionality.of(context); + widget.selected.addListener(() => onDateChange(textDirection)); + }); + } + + void onDateChange(TextDirection textDirection) { + setState(() { + //TODO: localizations. + SemanticsService.announce(widget.selected.value.toString(), textDirection); + }); } @override Widget build(BuildContext context) { final style = widget.style ?? context.theme.lineCalendarStyle; + // TODO: calculate width of items based on the text font size. final textScalor = MediaQuery.textScalerOf(context); final dateTextSize = textScalor.scale(style.unselectedDateTextStyle.fontSize!); final dayTextSize = textScalor.scale(style.unselectedDayTextStyle.fontSize!); @@ -82,7 +108,7 @@ class _FLineCalendarState extends State { itemBuilder: (context, index) => Container( padding: EdgeInsets.symmetric(horizontal: style.itemPadding), child: _Tile( - style: widget.style, + style: style, selected: widget.selected, date: widget.epoch.add(Duration(days: index)), today: widget.today, @@ -94,36 +120,39 @@ class _FLineCalendarState extends State { @override void dispose() { - super.dispose(); _controller.dispose(); + super.dispose(); } } class _Tile extends StatelessWidget { - final FLineCalendarStyle? style; + final FLineCalendarStyle style; final ValueNotifier selected; final LocalDate date; final bool today; - const _Tile({required this.selected, required this.date, required LocalDate today, this.style}) - : today = date == today; - - Color _style(BuildContext context, bool selected) { - final style = this.style ?? context.theme.lineCalendarStyle; - return switch ((selected, today)) { - (true, true) => style.selectedCurrentDateIndicatorColor, - (true, false) => const Color(0x00000000), - (false, true) => style.unselectedCurrentDateIndicatorColor, - (false, false) => const Color(0x00000000), - }; - } + const _Tile({ + required this.style, + required this.selected, + required this.date, + required LocalDate today, + }) : today = date == today; + + Color _style(BuildContext context, bool selected) => switch ((selected, today)) { + (true, true) => style.selectedCurrentDateIndicatorColor, + (true, false) => const Color(0x00000000), + (false, true) => style.unselectedCurrentDateIndicatorColor, + (false, false) => const Color(0x00000000), + }; @override Widget build(BuildContext context) { - final style = this.style ?? context.theme.lineCalendarStyle; final selected = this.selected.value == date; + //TODO: Localization. return FTappable.animated( + semanticLabel: date.toString(), + selected: selected, onPress: () => this.selected.value = date, child: Stack( children: [ @@ -140,7 +169,8 @@ class _Tile extends StatelessWidget { applyHeightToLastDescent: false, ), style: selected ? style.selectedDateTextStyle : style.unselectedDateTextStyle, - child: Text(date.day.toString()), + //TODO: Localization. + child: Text('${date.day}'), ), const SizedBox(height: _textSpacing), // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. @@ -180,11 +210,11 @@ class _Tile extends StatelessWidget { ..add(DiagnosticsProperty('style', style)) ..add(DiagnosticsProperty('selected', selected)) ..add(DiagnosticsProperty('date', date)) - ..add(DiagnosticsProperty('underline', today)); + ..add(DiagnosticsProperty('today', today)); } } -/// [FAvatar]'s style. +/// [FLineCalendar]'s style. final class FLineCalendarStyle with Diagnosticable { /// The vertical padding around the text in the calendar items. final double heightPadding; @@ -286,18 +316,6 @@ final class FLineCalendarStyle with Diagnosticable { } /// Returns a copy of this [FLineCalendarStyle] with the given properties replaced. - /// - /// ```dart - /// final style = FLineCalendarStyle( - /// selectedDecoration: ..., - /// unselectedDecoration: ..., - /// ); - /// - /// final copy = style.copyWith(unselectedDecoration: ...); - /// - /// print(style.selectedDecoration == copy.selectedDecoration); // true - /// print(style.unselectedDecoration == copy.unselectedDecoration); // false - /// ``` @useResult FLineCalendarStyle copyWith({ double? heightPadding, diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index b48047ac8..62058fc79 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -12,7 +12,7 @@ import '../test_scaffold.dart'; void main() { group('FLineCalendar', () { for (final (name, theme, _) in TestScaffold.themes) { - for (final (lineCalendar, value) in [('default', ValueNotifier(LocalDate.now()))]) { + for (final (lineCalendar, value) in [('default', ValueNotifier(LocalDate(2024,8,29)))]) { testWidgets('$name - $lineCalendar', (tester) async { await tester.pumpWidget( TestScaffold( From 02ae910ea908e2e2baadbe47c549ceef21525cb1 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Fri, 30 Aug 2024 09:30:54 +0000 Subject: [PATCH 11/44] Commit from GitHub Actions (Forui Presubmit) --- forui/test/src/widgets/line_calendar_golden_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index 62058fc79..fa5b6ad38 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -12,7 +12,7 @@ import '../test_scaffold.dart'; void main() { group('FLineCalendar', () { for (final (name, theme, _) in TestScaffold.themes) { - for (final (lineCalendar, value) in [('default', ValueNotifier(LocalDate(2024,8,29)))]) { + for (final (lineCalendar, value) in [('default', ValueNotifier(LocalDate(2024, 8, 29)))]) { testWidgets('$name - $lineCalendar', (tester) async { await tester.pumpWidget( TestScaffold( From 0383b1f08398035a81062e2f36b6615bfdf9fd0c Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Sun, 1 Sep 2024 17:58:18 +0800 Subject: [PATCH 12/44] Fixed more pr issues --- forui/lib/src/widgets/line_calendar.dart | 324 ++++++++++-------- .../widgets/line_calendar_golden_test.dart | 3 +- 2 files changed, 181 insertions(+), 146 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar.dart b/forui/lib/src/widgets/line_calendar.dart index 00a7d58e8..308d1544b 100644 --- a/forui/lib/src/widgets/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar.dart @@ -11,7 +11,7 @@ import 'package:forui/src/foundation/util.dart'; //TODO: localizations. const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; -final _epoch = LocalDate(2000); +final _start = LocalDate(1900); const _textSpacing = 2.0; /// A calendar that can be scrolled horizontally. @@ -22,21 +22,22 @@ class FLineCalendar extends StatefulWidget { /// The currently selected [LocalDate]. final ValueNotifier selected; - /// The first date in this calendar carousel. Defaults to 1st January 2000. - final LocalDate epoch; + /// The first date in this calendar carousel. Defaults to 1st January 1900. + final LocalDate start; /// Today's date. Defaults to the [LocalDate.now]. final LocalDate today; /// Creates a [FLineCalendar]. FLineCalendar({ - required this.selected, - LocalDate? epoch, - LocalDate? today, + required ValueNotifier selected, + DateTime? start, + DateTime? today, this.style, super.key, - }) : epoch = epoch ?? _epoch, - today = today ?? LocalDate.now(); + }) : selected = ValueNotifier(selected.value.toLocalDate()), + start = start != null ? LocalDate(start.year, start.month, start.day) : _start, + today = today != null ? LocalDate(today.year, today.month, today.day) : LocalDate.now(); @override State createState() => _FLineCalendarState(); @@ -47,7 +48,7 @@ class FLineCalendar extends StatefulWidget { properties ..add(DiagnosticsProperty('style', style)) ..add(DiagnosticsProperty('selected', selected)) - ..add(DiagnosticsProperty('epoch', epoch)) + ..add(DiagnosticsProperty('epoch', start)) ..add(DiagnosticsProperty('today', today)); } } @@ -56,25 +57,10 @@ class _FLineCalendarState extends State { ScrollController _controller = ScrollController(); @override - void didUpdateWidget(covariant FLineCalendar oldWidget) { - if (oldWidget.selected != widget.selected) { - WidgetsBinding.instance.addPostFrameCallback((_) { - final textDirection = Directionality.of(context); - oldWidget.selected.removeListener(() => onDateChange(textDirection)); - widget.selected.addListener(() => onDateChange(textDirection)); - }); - } - super.didUpdateWidget(oldWidget); - } - - @override - void initState() { - super.initState(); - - WidgetsBinding.instance.addPostFrameCallback((_) { - final textDirection = Directionality.of(context); - widget.selected.addListener(() => onDateChange(textDirection)); - }); + void didChangeDependencies() { + final textDirection = Directionality.of(context); + widget.selected.addListener(() => onDateChange(textDirection)); + super.didChangeDependencies(); } void onDateChange(TextDirection textDirection) { @@ -90,11 +76,11 @@ class _FLineCalendarState extends State { // TODO: calculate width of items based on the text font size. final textScalor = MediaQuery.textScalerOf(context); - final dateTextSize = textScalor.scale(style.unselectedDateTextStyle.fontSize!); - final dayTextSize = textScalor.scale(style.unselectedDayTextStyle.fontSize!); - final size = dateTextSize + dayTextSize + _textSpacing + (style.heightPadding * 2); + final dateTextSize = textScalor.scale(style.content.unselectedDateTextStyle.fontSize!); + final dayTextSize = textScalor.scale(style.content.unselectedDayTextStyle.fontSize!); + final size = dateTextSize + dayTextSize + _textSpacing + (style.content.verticalPadding * 2); - final offset = (widget.selected.value.difference(widget.epoch).inDays - 2) * size + style.itemPadding; + final offset = (widget.selected.value.difference(widget.start).inDays - 2) * size + style.itemPadding; _controller = ScrollController(initialScrollOffset: offset); return SizedBox( @@ -110,7 +96,7 @@ class _FLineCalendarState extends State { child: _Tile( style: style, selected: widget.selected, - date: widget.epoch.add(Duration(days: index)), + date: widget.start.add(Duration(days: index)), today: widget.today, ), ), @@ -146,62 +132,64 @@ class _Tile extends StatelessWidget { }; @override - Widget build(BuildContext context) { - final selected = this.selected.value == date; - - //TODO: Localization. - return FTappable.animated( - semanticLabel: date.toString(), - selected: selected, - onPress: () => this.selected.value = date, - child: Stack( - children: [ - Positioned.fill( - child: DecoratedBox( - decoration: selected ? style.selectedDecoration : style.unselectedDecoration, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. - merge( - textHeightBehavior: const TextHeightBehavior( - applyHeightToFirstAscent: false, - applyHeightToLastDescent: false, + Widget build(BuildContext context) => ValueListenableBuilder( + valueListenable: selected, + builder: (context, selectedDate, _) { + final isSelected = selectedDate == date; + return FTappable.animated( + semanticLabel: date.toString(), + selected: isSelected, + onPress: () => selected.value = date, + child: Stack( + children: [ + Positioned.fill( + child: DecoratedBox( + decoration: isSelected ? style.selectedDecoration : style.unselectedDecoration, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. + merge( + textHeightBehavior: const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: false, + ), + style: + isSelected ? style.content.selectedDateTextStyle : style.content.unselectedDateTextStyle, + //TODO: Localization. + child: Text('${date.day}'), + ), + const SizedBox(height: _textSpacing), + // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. + merge( + textHeightBehavior: const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: false, + ), + style: isSelected ? style.content.selectedDayTextStyle : style.content.unselectedDayTextStyle, + child: Text(_days[date.weekday - 1]), + ), + ], ), - style: selected ? style.selectedDateTextStyle : style.unselectedDateTextStyle, - //TODO: Localization. - child: Text('${date.day}'), ), - const SizedBox(height: _textSpacing), - // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. - merge( - textHeightBehavior: const TextHeightBehavior( - applyHeightToFirstAscent: false, - applyHeightToLastDescent: false, + ), + Positioned( + top: 6, + right: 6, + child: Container( + height: 4, + width: 4, + decoration: BoxDecoration( + color: _style(context, isSelected), + shape: BoxShape.circle, ), - style: selected ? style.selectedDayTextStyle : style.unselectedDayTextStyle, - child: Text(_days[date.weekday - 1]), ), - ], - ), - ), - ), - Positioned( - top: 6, - right: 6, - child: Container( - height: 4, - width: 4, - decoration: BoxDecoration( - color: _style(context, selected), - shape: BoxShape.circle, - ), + ), + ], ), - ), - ], - ), - ); - } + ); + }, + ); @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { @@ -216,10 +204,7 @@ class _Tile extends StatelessWidget { /// [FLineCalendar]'s style. final class FLineCalendarStyle with Diagnosticable { - /// The vertical padding around the text in the calendar items. - final double heightPadding; - - /// The horizontal padding around the text in the calendar items. + /// The horizontal padding around each calendar item. final double itemPadding; /// The box decoration for a selected date. @@ -234,30 +219,17 @@ final class FLineCalendarStyle with Diagnosticable { /// The color of the indicator for the unselected current date. final Color unselectedCurrentDateIndicatorColor; - /// The text style for the selected date. - final TextStyle selectedDateTextStyle; - - /// The text style for the unselected date. - final TextStyle unselectedDateTextStyle; - - /// The text style for the selected day of the week. - final TextStyle selectedDayTextStyle; - - /// The text style for the unselected day of the week. - final TextStyle unselectedDayTextStyle; + /// The content's style. + final FLineCalendarContentStyle content; /// Creates a [FLineCalendarStyle]. const FLineCalendarStyle({ - required this.heightPadding, required this.itemPadding, required this.selectedCurrentDateIndicatorColor, required this.unselectedCurrentDateIndicatorColor, required this.selectedDecoration, required this.unselectedDecoration, - required this.selectedDateTextStyle, - required this.unselectedDateTextStyle, - required this.selectedDayTextStyle, - required this.unselectedDayTextStyle, + required this.content, }); /// Creates a [FCardStyle] that inherits its properties from [colorScheme] and [typography]. @@ -265,8 +237,7 @@ final class FLineCalendarStyle with Diagnosticable { required FColorScheme colorScheme, required FTypography typography, required FStyle style, - }) : heightPadding = 15.5, - itemPadding = 6.5, + }) : itemPadding = 6.5, selectedCurrentDateIndicatorColor = colorScheme.primaryForeground, unselectedCurrentDateIndicatorColor = colorScheme.primary, selectedDecoration = BoxDecoration( @@ -278,6 +249,93 @@ final class FLineCalendarStyle with Diagnosticable { borderRadius: style.borderRadius, border: Border.all(color: colorScheme.border), ), + content = FLineCalendarContentStyle.inherit(colorScheme: colorScheme, typography: typography); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('itemPadding', itemPadding)) + ..add(DiagnosticsProperty('selectedCurrentDateIndicatorColor', selectedCurrentDateIndicatorColor)) + ..add(DiagnosticsProperty('unselectedCurrentDateIndicatorColor', unselectedCurrentDateIndicatorColor)) + ..add(DiagnosticsProperty('selectedDecoration', selectedDecoration)) + ..add(DiagnosticsProperty('unselectedDecoration', unselectedDecoration)) + ..add(DiagnosticsProperty('content', content)); + } + + /// Returns a copy of this [FLineCalendarStyle] with the given properties replaced. + @useResult + FLineCalendarStyle copyWith({ + double? itemPadding, + Color? selectedCurrentDateIndicatorColor, + Color? unselectedCurrentDateIndicatorColor, + BoxDecoration? selectedDecoration, + BoxDecoration? unselectedDecoration, + FLineCalendarContentStyle? content, + }) => + FLineCalendarStyle( + itemPadding: itemPadding ?? this.itemPadding, + selectedCurrentDateIndicatorColor: selectedCurrentDateIndicatorColor ?? this.selectedCurrentDateIndicatorColor, + unselectedCurrentDateIndicatorColor: + unselectedCurrentDateIndicatorColor ?? this.unselectedCurrentDateIndicatorColor, + selectedDecoration: selectedDecoration ?? this.selectedDecoration, + unselectedDecoration: unselectedDecoration ?? this.unselectedDecoration, + content: content ?? this.content, + ); + + @override + bool operator ==(Object other) => + identical(this, other) || + other is FLineCalendarStyle && + runtimeType == other.runtimeType && + itemPadding == other.itemPadding && + selectedCurrentDateIndicatorColor == other.selectedCurrentDateIndicatorColor && + unselectedCurrentDateIndicatorColor == other.unselectedCurrentDateIndicatorColor && + selectedDecoration == other.selectedDecoration && + unselectedDecoration == other.unselectedDecoration && + content == other.content; + + @override + int get hashCode => + itemPadding.hashCode ^ + selectedCurrentDateIndicatorColor.hashCode ^ + unselectedCurrentDateIndicatorColor.hashCode ^ + selectedDecoration.hashCode ^ + unselectedDecoration.hashCode ^ + content.hashCode; +} + +/// A line calendar's content style. +final class FLineCalendarContentStyle with Diagnosticable { + /// The vertical padding around the text in the calendar items. + final double verticalPadding; + + /// The text style for the selected date. + final TextStyle selectedDateTextStyle; + + /// The text style for the unselected date. + final TextStyle unselectedDateTextStyle; + + /// The text style for the selected day of the week. + final TextStyle selectedDayTextStyle; + + /// The text style for the unselected day of the week. + final TextStyle unselectedDayTextStyle; + + /// Creates a [FLineCalendarContentStyle]. + const FLineCalendarContentStyle({ + required this.verticalPadding, + required this.selectedDateTextStyle, + required this.unselectedDateTextStyle, + required this.selectedDayTextStyle, + required this.unselectedDayTextStyle, + }); + + /// Creates a [FCardStyle] that inherits its properties from [colorScheme] and [typography]. + FLineCalendarContentStyle.inherit({ + required FColorScheme colorScheme, + required FTypography typography, + }) : verticalPadding = 15.5, selectedDateTextStyle = typography.xl.copyWith( color: colorScheme.primaryForeground, fontWeight: FontWeight.w500, @@ -303,40 +361,24 @@ final class FLineCalendarStyle with Diagnosticable { void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties - ..add(DiagnosticsProperty('selectedDecoration', selectedDecoration)) - ..add(DiagnosticsProperty('unselectedDecoration', unselectedDecoration)) - ..add(DiagnosticsProperty('selectedTextStyle', selectedDayTextStyle)) - ..add(DiagnosticsProperty('unselectedTextStyle', unselectedDayTextStyle)) - ..add(ColorProperty('primary', selectedCurrentDateIndicatorColor)) - ..add(DoubleProperty('heightPadding', heightPadding)) - ..add(DoubleProperty('itemPadding', itemPadding)) - ..add(ColorProperty('unselectedIndicatorColor', unselectedCurrentDateIndicatorColor)) + ..add(DiagnosticsProperty('verticalPadding', verticalPadding)) ..add(DiagnosticsProperty('selectedDateTextStyle', selectedDateTextStyle)) - ..add(DiagnosticsProperty('unselectedDateTextStyle', unselectedDateTextStyle)); + ..add(DiagnosticsProperty('unselectedDateTextStyle', unselectedDateTextStyle)) + ..add(DiagnosticsProperty('selectedDayTextStyle', selectedDayTextStyle)) + ..add(DiagnosticsProperty('unselectedDayTextStyle', unselectedDayTextStyle)); } - /// Returns a copy of this [FLineCalendarStyle] with the given properties replaced. + /// Returns a copy of this [FLineCalendarContentStyle] with the given properties replaced. @useResult - FLineCalendarStyle copyWith({ - double? heightPadding, - double? itemPadding, - Color? selectedCurrentDateIndicatorColor, - Color? unselectedCurrentDateIndicatorColor, - BoxDecoration? selectedDecoration, - BoxDecoration? unselectedDecoration, + FLineCalendarContentStyle copyWith({ + double? verticalPadding, TextStyle? selectedDateTextStyle, TextStyle? unselectedDateTextStyle, TextStyle? selectedDayTextStyle, TextStyle? unselectedDayTextStyle, }) => - FLineCalendarStyle( - heightPadding: heightPadding ?? this.heightPadding, - itemPadding: itemPadding ?? this.itemPadding, - selectedCurrentDateIndicatorColor: selectedCurrentDateIndicatorColor ?? this.selectedCurrentDateIndicatorColor, - unselectedCurrentDateIndicatorColor: - unselectedCurrentDateIndicatorColor ?? this.unselectedCurrentDateIndicatorColor, - selectedDecoration: selectedDecoration ?? this.selectedDecoration, - unselectedDecoration: unselectedDecoration ?? this.unselectedDecoration, + FLineCalendarContentStyle( + verticalPadding: verticalPadding ?? this.verticalPadding, selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, unselectedDateTextStyle: unselectedDateTextStyle ?? this.unselectedDateTextStyle, selectedDayTextStyle: selectedDayTextStyle ?? this.selectedDayTextStyle, @@ -346,25 +388,19 @@ final class FLineCalendarStyle with Diagnosticable { @override bool operator ==(Object other) => identical(this, other) || - other is FLineCalendarStyle && + other is FLineCalendarContentStyle && runtimeType == other.runtimeType && - heightPadding == other.heightPadding && - itemPadding == other.itemPadding && - selectedCurrentDateIndicatorColor == other.selectedCurrentDateIndicatorColor && - unselectedCurrentDateIndicatorColor == other.unselectedCurrentDateIndicatorColor && - selectedDecoration == other.selectedDecoration && - unselectedDecoration == other.unselectedDecoration && + verticalPadding == other.verticalPadding && + selectedDateTextStyle == other.selectedDateTextStyle && + unselectedDateTextStyle == other.unselectedDateTextStyle && selectedDayTextStyle == other.selectedDayTextStyle && unselectedDayTextStyle == other.unselectedDayTextStyle; @override int get hashCode => - heightPadding.hashCode ^ - itemPadding.hashCode ^ - selectedCurrentDateIndicatorColor.hashCode ^ - unselectedCurrentDateIndicatorColor.hashCode ^ - selectedDecoration.hashCode ^ - unselectedDecoration.hashCode ^ + verticalPadding.hashCode ^ + selectedDateTextStyle.hashCode ^ + unselectedDateTextStyle.hashCode ^ selectedDayTextStyle.hashCode ^ unselectedDayTextStyle.hashCode; } diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index fa5b6ad38..85eec1e02 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -4,7 +4,6 @@ library; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:sugar/sugar.dart'; import 'package:forui/src/widgets/line_calendar.dart'; import '../test_scaffold.dart'; @@ -12,7 +11,7 @@ import '../test_scaffold.dart'; void main() { group('FLineCalendar', () { for (final (name, theme, _) in TestScaffold.themes) { - for (final (lineCalendar, value) in [('default', ValueNotifier(LocalDate(2024, 8, 29)))]) { + for (final (lineCalendar, value) in [('default', ValueNotifier(DateTime(2024, 8, 29)))]) { testWidgets('$name - $lineCalendar', (tester) async { await tester.pumpWidget( TestScaffold( From d82127262b9d23bfdbbe854f9533905e2195d9b6 Mon Sep 17 00:00:00 2001 From: Matthias Ngeo Date: Thu, 19 Sep 2024 11:29:32 +0800 Subject: [PATCH 13/44] Update installation guide (#197) * Update installation guode * Update changelog * Commit from GitHub Actions (Forui Presubmit) --------- Co-authored-by: Pante --- docs/pages/docs/index.mdx | 6 +- forui/CHANGELOG.md | 187 +++---------------------------------- forui/example/pubspec.lock | 113 ++++++---------------- 3 files changed, 49 insertions(+), 257 deletions(-) diff --git a/docs/pages/docs/index.mdx b/docs/pages/docs/index.mdx index 7da1da024..d3b801a20 100644 --- a/docs/pages/docs/index.mdx +++ b/docs/pages/docs/index.mdx @@ -37,9 +37,13 @@ To use Forui widgets in your Flutter app, import the Forui package and place the It is perfectly fine to use Cupertino/Material widgets alongside Forui widgets! -```dart filename="main.dart" {3,12-18} + +```dart filename="main.dart" {3,12-16} import 'package:flutter/material.dart'; +```dart filename="main.dart" {3,12-18} +import 'package:flutter/widgets.dart'; + import 'package:forui/forui.dart'; void main() { diff --git a/forui/CHANGELOG.md b/forui/CHANGELOG.md index 57961f08b..f30143e23 100644 --- a/forui/CHANGELOG.md +++ b/forui/CHANGELOG.md @@ -1,170 +1,5 @@ -## 0.7.0 (Next) +## 0.6.0 (Next) -### Additions - -* Add `FButtonSpinner`. - -* Add `FBreakpoints`. - -* Add `FIcon.empty()`. - -* Add `FTappable`. - -* Add `FTile`. - -* Add `FTileGroup`. - -* Add `FSelectTile`. - -* Add `FSelectTileGroup`. - -* Add `FCalendarDayPickerStyle.tileSize`. - -* Add `FPopover.ignoreDirectionalPadding`. - -* Add `FPopover.tappable(...)`. - -* Add `FPopoverMenu`. - -* Add `FPortal.offset`. - -### Changes - -* **Breaking** Change `FPopover()` to not automatically wrap a target in a `GestureDetector` - use `FPopover.tappable(...)` - instead. - -### Fixes - -* Change FButton's animation to only start on mouse down and up. - -* Fix `FLabel` not showing error message if label and description are null. - -* Fix `FSelectGroup` not properly disposing callbacks. - - -## 0.6.1 - -* Fix range slider not displaying tooltip for minimum thumb. - - -## 0.6.0 - -### Additions - -* Add `FAccordion`. - -* Add `FSlider`. - -* Add `FButtonStyles.ghost`. - -* Add `FButtonCustomStyle.enabledHoverBoxDecoration`. - -* Add `FTextField.contentInsertionConfiguration`. - -* Add `FTextField.mouseCursor`. - -* Add `FTextField.forceErrorText`. - -* Add `FIcon`. - -* Add `FColorScheme.disable(...)`. - -* Add `FColorScheme.disableOpacity`. - -* Add `FColorScheme.hover(...)`. - -* Add `FColorScheme.enabledHoveredOpacity`. - -* Add `FChangeNotifier`. - -* Add `FValueNotifier`. - -### Changes - -* Change button to change color when hovering over it. - -* Change `FCalendar` year picker to update the header whenever a year is selected. - -* Increase `FCalendar`'s default text size from `FTypography.sm` to `FTypography.base`. - -* **Breaking** Change `FBottomNavigationBarItem.label` from `String` to `Widget`. - -* **Breaking** Split `FCalendarHeaderStyle.iconColor` into `FCalendarHeaderStyle.enabledIconColor` and - `FCalendarHeaderStyle.disabledIconColor`. - -* **Breaking** Change `FTextField` to use `FLabel`. - -* **Breaking** Remove `FTextFieldErrorStyle.animatioDuration`. - -* **Breaking** Rename `FLabelStateStyle` to `FLabelStateStyles`. - -* **Breaking** Rename `FTextField.onSave` to `FTextField.onSaved`. - -* **Breaking** Remove FAlertIcon & FAlertIconStyle - use `FIcon` instead. - -* **Breaking** Remove FButtonIcon & FAlertIconStyle - use `FIcon` instead. - -* **Breaking** Change FButtonCustomStyle to better represent the style's layout - this will only affect users that - create a custom `FButtonCustomStyle`. - -* **Breaking** Change `FBottomNavigationBarItem.icon` from `SvgAsset` to `Widget` - wrap the asset in ` FIcon` instead. - -* **Breaking** Change `FHeaderAction.icon` from `SvgAsset` to `Widget` - wrap the asset in ` FIcon` instead. - -* **Breaking** Change `FSelectGroup.builder` parameters. - -* **Breaking** Change `FBadgeCustomStyle.content` to `FBadgeCustomStyle.contentStyle`. - -* **Breaking** Change `FAvatarStyle.text` to `FAvatarStyle.textStyle`. - -* **Breaking** Change `FDialogStyle.horizontal` to `FDialogStyle.horizontalStyle`. - -* **Breaking** Change `FDialogStyle.selectedLabel` to `FDialogStyle.selectedLabelTextStyle`. - -* **Breaking** Change `FDialogStyle.unselectedLabel` to `FDialogStyle.unselectedLabelTextStyle`. - -* **Breaking** Change `FDividerStyle.horizontal` to `FDividerStyle.horizontalStyle`. - -* **Breaking** Change `FDividerStyle.vertical` to `FDividerStyle.verticalStyle`. - -* **Breaking** Change `FDialogStyle.indicator` to `FDialogStyle.indicatorDecoration`. - -* **Breaking** Change `FHeader.leftActions` to `FHeader.prefixActions`. - -* **Breaking** Change `FHeader.rightActions` to `FHeader.suffixActions`. - -* **Breaking** Change `FLabelStyle.horizontal` to `FLabelStyle.horizontalStyle`. - -* **Breaking** Change `FLabelStyle.vertical` to `FLabelStyle.verticalStyle`. - -* **Breaking** Change `FButtonStyles.outline`'s background to transparent. - -### Fixes - -* Fix `FBottomNavigationBar` items hit region being smaller than intended. - -* Fix `FCalendar` showing focused outline when pressing and long pressing a date. - -* Fix `FCalendar` year and month picker applying incorrect initial top padding. - -* Fix `FCalendar` year and month picker incorrectly calculating start and end dates. - -* Fix `FTextfield` being vertically larger than intended. - -* Fix `FTextfield` description text's odd transition animation whenever an error occurs. - -* Fix `FSwitch` not using correct label style. - -* Fix `FCheckbox`, `FRadio`, `FSelectGroup`, `FSwitch` and `FTextField` styles causing the widget inspector to crash. - -* Fix `FSelectGroup` not applying correct style if a custom widget-specific style is given. - -## 0.5.1 - -### - -* Fix `FTabs` not showing correct tab entry when switching tabs. - [Issue #203](https://github.com/forus-labs/forui/issues/203). ## 0.5.0 @@ -231,12 +66,12 @@ The minimum Flutter version has been increased from `3.19.0` to `3.24.0`. * Change `FTabController` to implement `ChangeNotifier` instead of `Listenable`. * **Breaking:** Flattened `FStyle.formFieldStyle` - use `FStyle.enabledFormFieldStyle`, `FStyle.disabledFormFieldStyle`, - and`FStyle.errorFormFieldStyle`. +and`FStyle.errorFormFieldStyle`. * Improve platform detection for web when initializing platform-specific variables. -* **Breaking:** `FCheckbox` and `FSwitch` no longer wraps `FormField` - consider wrapping them in a `FormField` if - required. +* **Breaking:** `FCheckbox` and `FSwitch` no longer wraps `FormField` - consider wrapping them in a `FormField` if +required. * **Breaking:** Require `FTheme` to be wrapped in a `CupertinoApp`, `MaterialApp` or `WidgetsApp`. @@ -252,14 +87,14 @@ The minimum Flutter version has been increased from `3.19.0` to `3.24.0`. * Fix `FTabs` not handling indexes properly. + ## 0.4.0 ### Additions * Add `FAvatar`. -* **Breaking:** Add `FCalendarEntryStyle.focusedBorderColor`. This only affects users that - customized `FCalendarEntryStyle`. +* **Breaking:** Add `FCalendarEntryStyle.focusedBorderColor`. This only affects users that customized `FCalendarEntryStyle`. * Add `FResizable`. @@ -300,6 +135,7 @@ The minimum Flutter version has been increased from `3.19.0` to `3.24.0`. * Fix `FCalendar` dates sometimes not being navigable using arrow keys. + ## 0.3.0 ### Additions @@ -320,24 +156,28 @@ The minimum Flutter version has been increased from `3.19.0` to `3.24.0`. * Fix missing `style` parameter for `FCheckbox`. + ## 0.2.0+3 ### Fixes * Fix broken images in README.md (yet again). + ## 0.2.0+2 ### Fixes * Fix broken images in README.md. + ## 0.2.0+1 ### Fixes * Fix broken images in README.md. + ## 0.2.0 ### Additions @@ -354,10 +194,10 @@ The minimum Flutter version has been increased from `3.19.0` to `3.24.0`. * **Breaking** Move `FHeaderActionStyle.padding` to `FRootHeaderStyle.actionSpacing`. -* **Breaking** Suffix style parameters with `Style`, i.e. `FRootHeaderStyle.action` has been renamed to +* **Breaking** Suffix style parameters with `Style`, i.e. `FRootHeaderStyle.action` has been renamed to `FRootHeaderStyle.actionStyle`. -* **Breaking** Raw fields have been removed, wrap strings with the Text() widget. E.g. `FButton(label: 'Hello')` or +* **Breaking** Raw fields have been removed, wrap strings with the Text() widget. E.g. `FButton(label: 'Hello')` or `FButton(rawLabel: 'Hello')` should be replaced with `FButton(label: Text('Hello'))`. * Change `FTextField` to be usable in `Form`s. @@ -374,6 +214,7 @@ The minimum Flutter version has been increased from `3.19.0` to `3.24.0`. * Fix padding inconsistencies in `FCard` and `FDialog`. + ## 0.1.0 * Initial release! 🚀 diff --git a/forui/example/pubspec.lock b/forui/example/pubspec.lock index 1a8ce5052..dd43f20f3 100644 --- a/forui/example/pubspec.lock +++ b/forui/example/pubspec.lock @@ -26,10 +26,10 @@ packages: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.5.0" async: dependency: transitive description: @@ -82,10 +82,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" + sha256: dd09dd4e2b078992f42aac7f1a622f01882a8492fef08486b27ddde929c19f04 url: "https://pub.dev" source: hosted - version: "2.4.13" + version: "2.4.12" build_runner_core: dependency: transitive description: @@ -154,18 +154,18 @@ packages: dependency: transitive description: name: convert - sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.1" crypto: dependency: transitive description: name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.5" dart_style: dependency: transitive description: @@ -174,14 +174,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.7" - dbus: - dependency: transitive - description: - name: dbus - sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" - url: "https://pub.dev" - source: hosted - version: "0.7.10" fake_async: dependency: transitive description: @@ -202,18 +194,18 @@ packages: dependency: transitive description: name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.0.0" fixnum: dependency: transitive description: name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.0" flint: dependency: "direct dev" description: @@ -245,26 +237,21 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" forui: dependency: "direct main" description: path: ".." relative: true source: path - version: "0.6.1" + version: "0.5.0" forui_assets: dependency: transitive description: name: forui_assets - sha256: "48a036b329a855db9a18ebb3db98d5e9d1320479d747b48efd4e698ec7b1f178" + sha256: "69575b73e96f509c2f54c1a7eff47b6034d0a55b6083a0ffc894f4ef071bfd9d" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.2.0" frontend_server_client: dependency: transitive description: @@ -381,10 +368,10 @@ packages: dependency: transitive description: name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.0" macros: dependency: transitive description: @@ -421,10 +408,10 @@ packages: dependency: transitive description: name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "1.0.6" mockito: dependency: "direct dev" description: @@ -457,22 +444,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" - package_info_plus: - dependency: transitive - description: - name: package_info_plus - sha256: df3eb3e0aed5c1107bb0fdb80a8e82e778114958b1c5ac5644fb1ac9cae8a998 - url: "https://pub.dev" - source: hosted - version: "8.1.0" - package_info_plus_platform_interface: - dependency: transitive - description: - name: package_info_plus_platform_interface - sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 - url: "https://pub.dev" - source: hosted - version: "3.0.1" path: dependency: transitive description: @@ -501,10 +472,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" url: "https://pub.dev" source: hosted - version: "2.2.12" + version: "2.2.10" path_provider_foundation: dependency: transitive description: @@ -549,10 +520,10 @@ packages: dependency: transitive description: name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.6" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -690,10 +661,10 @@ packages: dependency: transitive description: name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.3.2" vector_graphics: dependency: transitive description: @@ -734,22 +705,6 @@ packages: url: "https://pub.dev" source: hosted version: "14.2.5" - wakelock_plus: - dependency: "direct main" - description: - name: wakelock_plus - sha256: bf4ee6f17a2fa373ed3753ad0e602b7603f8c75af006d5b9bdade263928c0484 - url: "https://pub.dev" - source: hosted - version: "1.2.8" - wakelock_plus_platform_interface: - dependency: transitive - description: - name: wakelock_plus_platform_interface - sha256: "422d1cdbb448079a8a62a5a770b69baa489f8f7ca21aef47800c726d404f9d16" - url: "https://pub.dev" - source: hosted - version: "1.2.1" watcher: dependency: transitive description: @@ -762,10 +717,10 @@ packages: dependency: transitive description: name: web - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.0.0" web_socket: dependency: transitive description: @@ -782,22 +737,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" - win32: - dependency: transitive - description: - name: win32 - sha256: "2735daae5150e8b1dfeb3eb0544b4d3af0061e9e82cef063adcd583bdae4306a" - url: "https://pub.dev" - source: hosted - version: "5.7.0" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.0.4" xml: dependency: transitive description: @@ -815,5 +762,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.5.0 <4.0.0" + dart: ">=3.5.0-259.0.dev <4.0.0" flutter: ">=3.24.0" From bc7c78652a567cf334a11768f899f7805c11c0de Mon Sep 17 00:00:00 2001 From: Matthias Ngeo Date: Thu, 19 Sep 2024 19:44:10 +0800 Subject: [PATCH 14/44] Change button color when hovered over (#198) * Change button color on hover * Add tests * Add golden tests --- forui/CHANGELOG.md | 9 + forui/lib/src/widgets/button/button.dart | 1 - .../lib/src/widgets/button/button_styles.dart | 181 +++++++------ ...Variant.outline-enabled-hovered-button.png | Bin 0 -> 30533 bytes .../widgets/button/button_golden_test.dart | 241 ++++++++---------- 5 files changed, 203 insertions(+), 229 deletions(-) create mode 100644 forui/test/golden/button/zinc-light-Variant.outline-enabled-hovered-button.png diff --git a/forui/CHANGELOG.md b/forui/CHANGELOG.md index f30143e23..622009590 100644 --- a/forui/CHANGELOG.md +++ b/forui/CHANGELOG.md @@ -1,5 +1,14 @@ ## 0.6.0 (Next) +### Additions + +* Add `FButtonCustomStyle.enabledHoverBoxDecoration`. + + +### Changes + +* Change button to change color when hovering over it. + ## 0.5.0 diff --git a/forui/lib/src/widgets/button/button.dart b/forui/lib/src/widgets/button/button.dart index cfed6559e..f396d833c 100644 --- a/forui/lib/src/widgets/button/button.dart +++ b/forui/lib/src/widgets/button/button.dart @@ -120,7 +120,6 @@ class FButton extends StatelessWidget { }; final enabled = onPress != null || onLongPress != null; - return FTappable.animated( autofocus: autofocus, focusNode: focusNode, diff --git a/forui/lib/src/widgets/button/button_styles.dart b/forui/lib/src/widgets/button/button_styles.dart index be6dc1b9d..17818d637 100644 --- a/forui/lib/src/widgets/button/button_styles.dart +++ b/forui/lib/src/widgets/button/button_styles.dart @@ -19,110 +19,111 @@ final class FButtonStyles with Diagnosticable { /// The outlined button style. final FButtonCustomStyle outline; - /// The ghost button style. - final FButtonCustomStyle ghost; - /// Creates a [FButtonCustomStyle]. const FButtonStyles({ required this.primary, required this.secondary, required this.destructive, required this.outline, - required this.ghost, }); /// Creates a [FButtonCustomStyle] that inherits its properties from the provided [colorScheme], [typography], and /// [style]. FButtonStyles.inherit({required FColorScheme colorScheme, required FTypography typography, required FStyle style}) - : this( - primary: FButtonCustomStyle.inherit( - style: style, + : primary = FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.primary, + ), + enabledHoverBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.primary.withOpacity(0.9), + ), + disabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.primary.withOpacity(0.5), + ), + content: FButtonContentStyle.inherit( typography: typography, - enabledBoxColor: colorScheme.primary, - enabledHoveredBoxColor: colorScheme.hover(colorScheme.primary), - disabledBoxColor: colorScheme.disable(colorScheme.primary), - enabledContentColor: colorScheme.primaryForeground, - disabledContentColor: colorScheme.disable( - colorScheme.primaryForeground, - colorScheme.disable(colorScheme.primary), - ), + enabled: colorScheme.primaryForeground, + disabled: colorScheme.primaryForeground.withOpacity(0.5), + ), + icon: FButtonIconStyle( + enabledColor: colorScheme.primaryForeground, + disabledColor: colorScheme.primaryForeground.withOpacity(0.5), + ), + ), + secondary = FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.secondary, + ), + enabledHoverBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.secondary.withOpacity(0.9), ), - secondary: FButtonCustomStyle.inherit( - style: style, + disabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.secondary.withOpacity(0.5), + ), + content: FButtonContentStyle.inherit( typography: typography, - enabledBoxColor: colorScheme.secondary, - enabledHoveredBoxColor: colorScheme.hover(colorScheme.secondary), - disabledBoxColor: colorScheme.disable(colorScheme.secondary), - enabledContentColor: colorScheme.secondaryForeground, - disabledContentColor: colorScheme.disable( - colorScheme.secondaryForeground, - colorScheme.disable(colorScheme.secondary), - ), + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.secondaryForeground.withOpacity(0.5), + ), + icon: FButtonIconStyle( + enabledColor: colorScheme.secondaryForeground, + disabledColor: colorScheme.secondaryForeground.withOpacity(0.5), + ), + ), + destructive = FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.destructive, ), - destructive: FButtonCustomStyle.inherit( - style: style, + enabledHoverBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.destructive.withOpacity(0.9), + ), + disabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.destructive.withOpacity(0.5), + ), + content: FButtonContentStyle.inherit( typography: typography, - enabledBoxColor: colorScheme.destructive, - enabledHoveredBoxColor: colorScheme.hover(colorScheme.destructive), - disabledBoxColor: colorScheme.disable(colorScheme.destructive), - enabledContentColor: colorScheme.destructiveForeground, - disabledContentColor: colorScheme.disable( - colorScheme.destructiveForeground, - colorScheme.disable(colorScheme.destructive), - ), + enabled: colorScheme.destructiveForeground, + disabled: colorScheme.destructiveForeground.withOpacity(0.5), ), - outline: FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.border), - borderRadius: style.borderRadius, - ), - enabledHoverBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.border), - borderRadius: style.borderRadius, - color: colorScheme.secondary, - ), - disabledBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.disable(colorScheme.border)), - borderRadius: style.borderRadius, - ), - contentStyle: FButtonContentStyle.inherit( - typography: typography, - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), - ), - iconContentStyle: FButtonIconContentStyle( - enabledColor: colorScheme.secondaryForeground, - disabledColor: colorScheme.disable(colorScheme.secondaryForeground), - ), - spinnerStyle: FButtonSpinnerStyle.inherit( - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), - ), + icon: FButtonIconStyle( + enabledColor: colorScheme.destructiveForeground, + disabledColor: colorScheme.destructiveForeground.withOpacity(0.5), ), - ghost: FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - ), - enabledHoverBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.secondary, - ), - disabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - ), - contentStyle: FButtonContentStyle.inherit( - typography: typography, - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), - ), - iconContentStyle: FButtonIconContentStyle( - enabledColor: colorScheme.secondaryForeground, - disabledColor: colorScheme.disable(colorScheme.secondaryForeground), - ), - spinnerStyle: FButtonSpinnerStyle.inherit( - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + outline = FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + border: Border.all( + color: colorScheme.border, ), + borderRadius: style.borderRadius, + color: colorScheme.background, + ), + enabledHoverBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.secondary, + ), + disabledBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.border.withOpacity(0.5)), + borderRadius: style.borderRadius, + color: colorScheme.background, + ), + content: FButtonContentStyle.inherit( + typography: typography, + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.secondaryForeground.withOpacity(0.5), + ), + icon: FButtonIconStyle( + enabledColor: colorScheme.secondaryForeground, + disabledColor: colorScheme.secondaryForeground.withOpacity(0.5), ), ); @@ -133,14 +134,12 @@ final class FButtonStyles with Diagnosticable { FButtonCustomStyle? secondary, FButtonCustomStyle? destructive, FButtonCustomStyle? outline, - FButtonCustomStyle? ghost, }) => FButtonStyles( primary: primary ?? this.primary, secondary: secondary ?? this.secondary, destructive: destructive ?? this.destructive, outline: outline ?? this.outline, - ghost: ghost ?? this.ghost, ); @override @@ -150,8 +149,7 @@ final class FButtonStyles with Diagnosticable { ..add(DiagnosticsProperty('primary', primary)) ..add(DiagnosticsProperty('secondary', secondary)) ..add(DiagnosticsProperty('destructive', destructive)) - ..add(DiagnosticsProperty('outlined', outline)) - ..add(DiagnosticsProperty('ghost', ghost)); + ..add(DiagnosticsProperty('outlined', outline)); } @override @@ -162,9 +160,8 @@ final class FButtonStyles with Diagnosticable { primary == other.primary && secondary == other.secondary && destructive == other.destructive && - outline == other.outline && - ghost == other.ghost; + outline == other.outline; @override - int get hashCode => primary.hashCode ^ secondary.hashCode ^ destructive.hashCode ^ outline.hashCode ^ ghost.hashCode; + int get hashCode => primary.hashCode ^ secondary.hashCode ^ destructive.hashCode ^ outline.hashCode; } diff --git a/forui/test/golden/button/zinc-light-Variant.outline-enabled-hovered-button.png b/forui/test/golden/button/zinc-light-Variant.outline-enabled-hovered-button.png new file mode 100644 index 0000000000000000000000000000000000000000..2923a877e0d7299aa6f3d554f17693ee7a3b19f8 GIT binary patch literal 30533 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 G(f Date: Mon, 23 Sep 2024 22:21:22 +0800 Subject: [PATCH 15/44] Testing new controller --- forui/example/lib/sandbox.dart | 51 +++++++++++++++++------- forui/lib/src/widgets/line_calendar.dart | 47 +++++++++++++++++++++- 2 files changed, 82 insertions(+), 16 deletions(-) diff --git a/forui/example/lib/sandbox.dart b/forui/example/lib/sandbox.dart index e8b40a038..a001b8dad 100644 --- a/forui/example/lib/sandbox.dart +++ b/forui/example/lib/sandbox.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:forui/forui.dart'; +import 'package:forui/src/widgets/line_calendar.dart'; class Sandbox extends StatefulWidget { const Sandbox({super.key}); @@ -9,26 +10,48 @@ class Sandbox extends StatefulWidget { State createState() => _SandboxState(); } -enum Notification { all, direct, nothing } - -class _SandboxState extends State with SingleTickerProviderStateMixin { +class _SandboxState extends State { bool value = false; - FRadioSelectGroupController selectGroupController = FRadioSelectGroupController(); - late FPopoverController controller; + FSelectGroupController selectGroupController = FRadioSelectGroupController(value: 1); + + final selected = ValueNotifier(DateTime.now()); @override void initState() { super.initState(); - controller = FPopoverController(vsync: this); } @override - Widget build(BuildContext context) => const Column(); - - @override - void dispose() { - controller.dispose(); - selectGroupController.dispose(); - super.dispose(); - } + Widget build(BuildContext context) => Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FTextField.email( + autovalidateMode: AutovalidateMode.always, + description: const Text('Description'), + validator: (value) => value?.length == 5 ? 'Error message' : null, + ), + const SizedBox(height: 20), + const FTextField.password(), + FLineCalendar(selected: selected), + const SizedBox(height: 20), + FTooltip( + longPressExitDuration: const Duration(seconds: 5000), + tipBuilder: (context, style, _) => const Text('Add to library'), + child: FButton( + style: FButtonStyle.outline, + onPress: () {}, + label: const Text('Hover'), + ), + ), + Tooltip( + message: 'Add to library 2', + showDuration: const Duration(seconds: 5000), + child: FButton( + style: FButtonStyle.outline, + onPress: () {}, + label: const Text('Hover 2'), + ), + ), + ], + ); } diff --git a/forui/lib/src/widgets/line_calendar.dart b/forui/lib/src/widgets/line_calendar.dart index 308d1544b..bc2441f57 100644 --- a/forui/lib/src/widgets/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar.dart @@ -11,9 +11,53 @@ import 'package:forui/src/foundation/util.dart'; //TODO: localizations. const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; -final _start = LocalDate(1900); +final _start = (DateTime(1900), null); const _textSpacing = 2.0; +bool _true(DateTime _) => true; + +typedef FlineSelection = (DateTime start, DateTime? end); + +class FlineController extends FCalendarController { + final Predicate _selectable; + final FlineSelection? _period; + + FlineController({ + FlineSelection? period, + DateTime? initialSelection, + Predicate? selectable, + }) : assert( + period == null || (period.$1.isUtc && (period.$2?.isUtc ?? true)), + 'value must be in UTC timezone', + ), + assert( + () { + if (period == null) { + return true; + } + final start = period.$1; + final end = period.$2; + if (end == null) { + return true; + } + return start.isBefore(end) || start.isAtSameMomentAs(end); + }(), + 'end date must be greater than or equal to start date', + ), + _selectable = selectable ?? _true, + _period = period ?? _start, + super(initialSelection ?? DateTime.now()); + + @override + bool selectable(DateTime date) => _selectable(date); + + @override + void select(DateTime date) => value = value?.toLocalDate() == date.toLocalDate() ? null : date; + + @override + bool selected(DateTime date) => value?.toLocalDate() == date.toLocalDate(); +} + /// A calendar that can be scrolled horizontally. class FLineCalendar extends StatefulWidget { /// The style. Defaults to [FThemeData.lineCalendarStyle]. @@ -47,7 +91,6 @@ class FLineCalendar extends StatefulWidget { super.debugFillProperties(properties); properties ..add(DiagnosticsProperty('style', style)) - ..add(DiagnosticsProperty('selected', selected)) ..add(DiagnosticsProperty('epoch', start)) ..add(DiagnosticsProperty('today', today)); } From 5c45be829b17256d65d50cb76d5bb805e2ea8c88 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 23 Sep 2024 14:23:09 +0000 Subject: [PATCH 16/44] Commit from GitHub Actions (Forui Presubmit) --- forui/lib/src/widgets/line_calendar.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/forui/lib/src/widgets/line_calendar.dart b/forui/lib/src/widgets/line_calendar.dart index bc2441f57..5c8ec6add 100644 --- a/forui/lib/src/widgets/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar.dart @@ -93,6 +93,7 @@ class FLineCalendar extends StatefulWidget { ..add(DiagnosticsProperty('style', style)) ..add(DiagnosticsProperty('epoch', start)) ..add(DiagnosticsProperty('today', today)); + properties.add(DiagnosticsProperty>('selected', selected)); } } From 90bc4c7697d91882ee9ad4aaf16f500151e7661b Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Sun, 29 Sep 2024 17:15:42 +0000 Subject: [PATCH 17/44] Commit from GitHub Actions (Forui Presubmit) --- forui/example/pubspec.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forui/example/pubspec.lock b/forui/example/pubspec.lock index dd43f20f3..3569e2b1e 100644 --- a/forui/example/pubspec.lock +++ b/forui/example/pubspec.lock @@ -243,7 +243,7 @@ packages: path: ".." relative: true source: path - version: "0.5.0" + version: "0.5.1" forui_assets: dependency: transitive description: From 3da742f5132474bf67f15caad430b68189a7adfa Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Fri, 18 Oct 2024 13:36:19 +0800 Subject: [PATCH 18/44] added controller --- forui/lib/src/theme/theme_data.dart | 2 +- .../{ => line_calendar}/line_calendar.dart | 137 +----------------- .../line_calendar_controller.dart | 36 +++++ .../line_calendar/line_calendar_tile.dart | 103 +++++++++++++ forui/lib/widgets/line_calendar.dart | 10 ++ .../widgets/line_calendar_golden_test.dart | 2 +- 6 files changed, 152 insertions(+), 138 deletions(-) rename forui/lib/src/widgets/{ => line_calendar}/line_calendar.dart (70%) create mode 100644 forui/lib/src/widgets/line_calendar/line_calendar_controller.dart create mode 100644 forui/lib/src/widgets/line_calendar/line_calendar_tile.dart create mode 100644 forui/lib/widgets/line_calendar.dart diff --git a/forui/lib/src/theme/theme_data.dart b/forui/lib/src/theme/theme_data.dart index aeddf3122..cc807ff2e 100644 --- a/forui/lib/src/theme/theme_data.dart +++ b/forui/lib/src/theme/theme_data.dart @@ -7,7 +7,7 @@ import 'package:forui/forui.dart'; import 'package:forui/src/theme/breakpoints.dart'; -import 'package:forui/src/widgets/line_calendar.dart'; +import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; /// Defines the configuration of the overall visual [FTheme] for a widget subtree. /// diff --git a/forui/lib/src/widgets/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart similarity index 70% rename from forui/lib/src/widgets/line_calendar.dart rename to forui/lib/src/widgets/line_calendar/line_calendar.dart index 5c8ec6add..6df3a1959 100644 --- a/forui/lib/src/widgets/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -9,54 +9,9 @@ import 'package:forui/forui.dart'; import 'package:forui/src/foundation/tappable.dart'; import 'package:forui/src/foundation/util.dart'; -//TODO: localizations. -const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; final _start = (DateTime(1900), null); const _textSpacing = 2.0; -bool _true(DateTime _) => true; - -typedef FlineSelection = (DateTime start, DateTime? end); - -class FlineController extends FCalendarController { - final Predicate _selectable; - final FlineSelection? _period; - - FlineController({ - FlineSelection? period, - DateTime? initialSelection, - Predicate? selectable, - }) : assert( - period == null || (period.$1.isUtc && (period.$2?.isUtc ?? true)), - 'value must be in UTC timezone', - ), - assert( - () { - if (period == null) { - return true; - } - final start = period.$1; - final end = period.$2; - if (end == null) { - return true; - } - return start.isBefore(end) || start.isAtSameMomentAs(end); - }(), - 'end date must be greater than or equal to start date', - ), - _selectable = selectable ?? _true, - _period = period ?? _start, - super(initialSelection ?? DateTime.now()); - - @override - bool selectable(DateTime date) => _selectable(date); - - @override - void select(DateTime date) => value = value?.toLocalDate() == date.toLocalDate() ? null : date; - - @override - bool selected(DateTime date) => value?.toLocalDate() == date.toLocalDate(); -} /// A calendar that can be scrolled horizontally. class FLineCalendar extends StatefulWidget { @@ -137,7 +92,7 @@ class _FLineCalendarState extends State { itemExtent: size, itemBuilder: (context, index) => Container( padding: EdgeInsets.symmetric(horizontal: style.itemPadding), - child: _Tile( + child: FlineCalendarTile( style: style, selected: widget.selected, date: widget.start.add(Duration(days: index)), @@ -155,96 +110,6 @@ class _FLineCalendarState extends State { } } -class _Tile extends StatelessWidget { - final FLineCalendarStyle style; - final ValueNotifier selected; - final LocalDate date; - final bool today; - - const _Tile({ - required this.style, - required this.selected, - required this.date, - required LocalDate today, - }) : today = date == today; - - Color _style(BuildContext context, bool selected) => switch ((selected, today)) { - (true, true) => style.selectedCurrentDateIndicatorColor, - (true, false) => const Color(0x00000000), - (false, true) => style.unselectedCurrentDateIndicatorColor, - (false, false) => const Color(0x00000000), - }; - - @override - Widget build(BuildContext context) => ValueListenableBuilder( - valueListenable: selected, - builder: (context, selectedDate, _) { - final isSelected = selectedDate == date; - return FTappable.animated( - semanticLabel: date.toString(), - selected: isSelected, - onPress: () => selected.value = date, - child: Stack( - children: [ - Positioned.fill( - child: DecoratedBox( - decoration: isSelected ? style.selectedDecoration : style.unselectedDecoration, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. - merge( - textHeightBehavior: const TextHeightBehavior( - applyHeightToFirstAscent: false, - applyHeightToLastDescent: false, - ), - style: - isSelected ? style.content.selectedDateTextStyle : style.content.unselectedDateTextStyle, - //TODO: Localization. - child: Text('${date.day}'), - ), - const SizedBox(height: _textSpacing), - // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. - merge( - textHeightBehavior: const TextHeightBehavior( - applyHeightToFirstAscent: false, - applyHeightToLastDescent: false, - ), - style: isSelected ? style.content.selectedDayTextStyle : style.content.unselectedDayTextStyle, - child: Text(_days[date.weekday - 1]), - ), - ], - ), - ), - ), - Positioned( - top: 6, - right: 6, - child: Container( - height: 4, - width: 4, - decoration: BoxDecoration( - color: _style(context, isSelected), - shape: BoxShape.circle, - ), - ), - ), - ], - ), - ); - }, - ); - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties - ..add(DiagnosticsProperty('style', style)) - ..add(DiagnosticsProperty('selected', selected)) - ..add(DiagnosticsProperty('date', date)) - ..add(DiagnosticsProperty('today', today)); - } -} /// [FLineCalendar]'s style. final class FLineCalendarStyle with Diagnosticable { diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart b/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart new file mode 100644 index 000000000..e9ca7b5e7 --- /dev/null +++ b/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart @@ -0,0 +1,36 @@ +import 'package:flutter/cupertino.dart'; +import 'package:sugar/sugar.dart'; + +final _default = (DateTime(1900), null); + +class FLineCalendarController extends ValueNotifier { + final (DateTime, DateTime?) _calendarRange; + final DateTime _today; + + FLineCalendarController({ + (DateTime start, DateTime? end)? calendarRange, + DateTime? today, + DateTime? initialSelection, + }) : assert( + calendarRange == null || (calendarRange.$1.isUtc && (calendarRange.$2?.isUtc ?? true)), + 'value must be in UTC timezone', + ), + assert( + calendarRange == null || + calendarRange.$2 == null || + calendarRange.$1.isBefore(calendarRange.$2!) || + calendarRange.$1.isAtSameMomentAs(calendarRange.$2!), + 'end date must be greater than or equal to start date', + ), + _calendarRange = calendarRange ?? _default, + _today = today ?? DateTime.now(), + super(initialSelection ?? DateTime.now()); + + bool selected(DateTime date) => value?.toLocalDate() == date.toLocalDate(); + + void select(DateTime date) => value = value?.toLocalDate() == date.toLocalDate() ? null : date; + + DateTime get start => _calendarRange.$1; + DateTime? get end => _calendarRange.$2; + DateTime get today => _today; +} diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart new file mode 100644 index 000000000..d54e22c54 --- /dev/null +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -0,0 +1,103 @@ + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:forui/forui.dart'; +import 'package:forui/src/foundation/tappable.dart'; +import 'package:forui/src/foundation/util.dart'; +import 'package:sugar/sugar.dart'; + +//TODO: localizations. +const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; +final _start = (DateTime(1900), null); +const _textSpacing = 2.0; + +class FlineCalendarTile extends StatelessWidget { + final FLineCalendarStyle style; + final ValueNotifier selected; + final LocalDate date; + final bool today; + + const FlineCalendarTile({ + required this.style, + required this.selected, + required this.date, + required LocalDate today, + }) : today = date == today; + + Color _style(BuildContext context, bool selected) => switch ((selected, today)) { + (true, true) => style.selectedCurrentDateIndicatorColor, + (true, false) => const Color(0x00000000), + (false, true) => style.unselectedCurrentDateIndicatorColor, + (false, false) => const Color(0x00000000), + }; + + @override + Widget build(BuildContext context) => ValueListenableBuilder( + valueListenable: selected, + builder: (context, selectedDate, _) { + final isSelected = selectedDate == date; + return FTappable.animated( + semanticLabel: date.toString(), + selected: isSelected, + onPress: () => selected.value = date, + child: Stack( + children: [ + Positioned.fill( + child: DecoratedBox( + decoration: isSelected ? style.selectedDecoration : style.unselectedDecoration, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. + merge( + textHeightBehavior: const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: false, + ), + style: + isSelected ? style.content.selectedDateTextStyle : style.content.unselectedDateTextStyle, + //TODO: Localization. + child: Text('${date.day}'), + ), + const SizedBox(height: _textSpacing), + // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. + merge( + textHeightBehavior: const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: false, + ), + style: isSelected ? style.content.selectedDayTextStyle : style.content.unselectedDayTextStyle, + child: Text(_days[date.weekday - 1]), + ), + ], + ), + ), + ), + Positioned( + top: 6, + right: 6, + child: Container( + height: 4, + width: 4, + decoration: BoxDecoration( + color: _style(context, isSelected), + shape: BoxShape.circle, + ), + ), + ), + ], + ), + ); + }, + ); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('style', style)) + ..add(DiagnosticsProperty('selected', selected)) + ..add(DiagnosticsProperty('date', date)) + ..add(DiagnosticsProperty('today', today)); + } +} \ No newline at end of file diff --git a/forui/lib/widgets/line_calendar.dart b/forui/lib/widgets/line_calendar.dart new file mode 100644 index 000000000..75075f16c --- /dev/null +++ b/forui/lib/widgets/line_calendar.dart @@ -0,0 +1,10 @@ +/// {@category Widgets} +/// +/// A line calendar that allows users to select a single date. +/// +/// See https://forui.dev/docs/line-calendar for working examples. +library forui.widgets.lineCalendar; + +export '../src/widgets/line_calendar/line_calendar.dart'; +export '../src/widgets/line_calendar/line_calendar_controller.dart'; +export '../src/widgets/line_calendar/line_calendar_tile.dart'; diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index 85eec1e02..95220862e 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -5,7 +5,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:forui/src/widgets/line_calendar.dart'; +import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; import '../test_scaffold.dart'; void main() { From 3e18db84bf0aa929ed4a11df9628305fedc18583 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Sun, 20 Oct 2024 15:44:47 +0800 Subject: [PATCH 19/44] fixed rebase issues --- forui/lib/src/widgets/button/button.dart | 1 + .../lib/src/widgets/button/button_styles.dart | 173 +++++++++--------- .../widgets/line_calendar/line_calendar.dart | 1 + .../line_calendar/line_calendar_tile.dart | 1 + .../widgets/button/button_golden_test.dart | 144 ++++++++++----- .../widgets/line_calendar_golden_test.dart | 2 +- 6 files changed, 187 insertions(+), 135 deletions(-) diff --git a/forui/lib/src/widgets/button/button.dart b/forui/lib/src/widgets/button/button.dart index f396d833c..cfed6559e 100644 --- a/forui/lib/src/widgets/button/button.dart +++ b/forui/lib/src/widgets/button/button.dart @@ -120,6 +120,7 @@ class FButton extends StatelessWidget { }; final enabled = onPress != null || onLongPress != null; + return FTappable.animated( autofocus: autofocus, focusNode: focusNode, diff --git a/forui/lib/src/widgets/button/button_styles.dart b/forui/lib/src/widgets/button/button_styles.dart index 17818d637..202c9e6e1 100644 --- a/forui/lib/src/widgets/button/button_styles.dart +++ b/forui/lib/src/widgets/button/button_styles.dart @@ -19,111 +19,102 @@ final class FButtonStyles with Diagnosticable { /// The outlined button style. final FButtonCustomStyle outline; + /// The ghost button style. + final FButtonCustomStyle ghost; + /// Creates a [FButtonCustomStyle]. const FButtonStyles({ required this.primary, required this.secondary, required this.destructive, required this.outline, + required this.ghost, }); /// Creates a [FButtonCustomStyle] that inherits its properties from the provided [colorScheme], [typography], and /// [style]. FButtonStyles.inherit({required FColorScheme colorScheme, required FTypography typography, required FStyle style}) - : primary = FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.primary, - ), - enabledHoverBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.primary.withOpacity(0.9), - ), - disabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.primary.withOpacity(0.5), - ), - content: FButtonContentStyle.inherit( + : this( + primary: FButtonCustomStyle.inherit( + style: style, typography: typography, - enabled: colorScheme.primaryForeground, - disabled: colorScheme.primaryForeground.withOpacity(0.5), - ), - icon: FButtonIconStyle( - enabledColor: colorScheme.primaryForeground, - disabledColor: colorScheme.primaryForeground.withOpacity(0.5), - ), - ), - secondary = FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.secondary, - ), - enabledHoverBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.secondary.withOpacity(0.9), - ), - disabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.secondary.withOpacity(0.5), + enabledBoxColor: colorScheme.primary, + enabledHoveredBoxColor: colorScheme.hover(colorScheme.primary), + disabledBoxColor: colorScheme.disable(colorScheme.primary), + enabledContentColor: colorScheme.primaryForeground, + disabledContentColor: colorScheme.disable( + colorScheme.primaryForeground, + colorScheme.disable(colorScheme.primary), + ), ), - content: FButtonContentStyle.inherit( + secondary: FButtonCustomStyle.inherit( + style: style, typography: typography, - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.secondaryForeground.withOpacity(0.5), - ), - icon: FButtonIconStyle( - enabledColor: colorScheme.secondaryForeground, - disabledColor: colorScheme.secondaryForeground.withOpacity(0.5), - ), - ), - destructive = FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.destructive, - ), - enabledHoverBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.destructive.withOpacity(0.9), - ), - disabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.destructive.withOpacity(0.5), + enabledBoxColor: colorScheme.secondary, + enabledHoveredBoxColor: colorScheme.hover(colorScheme.secondary), + disabledBoxColor: colorScheme.disable(colorScheme.secondary), + enabledContentColor: colorScheme.secondaryForeground, + disabledContentColor: colorScheme.disable( + colorScheme.secondaryForeground, + colorScheme.disable(colorScheme.secondary), + ), ), - content: FButtonContentStyle.inherit( + destructive: FButtonCustomStyle.inherit( + style: style, typography: typography, - enabled: colorScheme.destructiveForeground, - disabled: colorScheme.destructiveForeground.withOpacity(0.5), - ), - icon: FButtonIconStyle( - enabledColor: colorScheme.destructiveForeground, - disabledColor: colorScheme.destructiveForeground.withOpacity(0.5), - ), - ), - outline = FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - border: Border.all( - color: colorScheme.border, + enabledBoxColor: colorScheme.destructive, + enabledHoveredBoxColor: colorScheme.hover(colorScheme.destructive), + disabledBoxColor: colorScheme.disable(colorScheme.destructive), + enabledContentColor: colorScheme.destructiveForeground, + disabledContentColor: colorScheme.disable( + colorScheme.destructiveForeground, + colorScheme.disable(colorScheme.destructive), ), - borderRadius: style.borderRadius, - color: colorScheme.background, - ), - enabledHoverBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.secondary, ), - disabledBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.border.withOpacity(0.5)), - borderRadius: style.borderRadius, - color: colorScheme.background, - ), - content: FButtonContentStyle.inherit( - typography: typography, - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.secondaryForeground.withOpacity(0.5), + outline: FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.border), + borderRadius: style.borderRadius, + ), + enabledHoverBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.border), + borderRadius: style.borderRadius, + color: colorScheme.secondary, + ), + disabledBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.disable(colorScheme.border)), + borderRadius: style.borderRadius, + ), + contentStyle: FButtonContentStyle.inherit( + typography: typography, + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + iconContentStyle: FButtonIconContentStyle( + enabledColor: colorScheme.secondaryForeground, + disabledColor: colorScheme.disable(colorScheme.secondaryForeground), + ), ), - icon: FButtonIconStyle( - enabledColor: colorScheme.secondaryForeground, - disabledColor: colorScheme.secondaryForeground.withOpacity(0.5), + ghost: FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + ), + enabledHoverBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.secondary, + ), + disabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + ), + contentStyle: FButtonContentStyle.inherit( + typography: typography, + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + iconContentStyle: FButtonIconContentStyle( + enabledColor: colorScheme.secondaryForeground, + disabledColor: colorScheme.disable(colorScheme.secondaryForeground), + ), ), ); @@ -134,12 +125,14 @@ final class FButtonStyles with Diagnosticable { FButtonCustomStyle? secondary, FButtonCustomStyle? destructive, FButtonCustomStyle? outline, + FButtonCustomStyle? ghost, }) => FButtonStyles( primary: primary ?? this.primary, secondary: secondary ?? this.secondary, destructive: destructive ?? this.destructive, outline: outline ?? this.outline, + ghost: ghost ?? this.ghost, ); @override @@ -149,7 +142,8 @@ final class FButtonStyles with Diagnosticable { ..add(DiagnosticsProperty('primary', primary)) ..add(DiagnosticsProperty('secondary', secondary)) ..add(DiagnosticsProperty('destructive', destructive)) - ..add(DiagnosticsProperty('outlined', outline)); + ..add(DiagnosticsProperty('outlined', outline)) + ..add(DiagnosticsProperty('ghost', ghost)); } @override @@ -160,8 +154,9 @@ final class FButtonStyles with Diagnosticable { primary == other.primary && secondary == other.secondary && destructive == other.destructive && - outline == other.outline; + outline == other.outline && + ghost == other.ghost; @override - int get hashCode => primary.hashCode ^ secondary.hashCode ^ destructive.hashCode ^ outline.hashCode; + int get hashCode => primary.hashCode ^ secondary.hashCode ^ destructive.hashCode ^ outline.hashCode ^ ghost.hashCode; } diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 6df3a1959..9db01f20e 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; +import 'package:forui/src/widgets/line_calendar/line_calendar_tile.dart'; import 'package:meta/meta.dart'; import 'package:sugar/sugar.dart'; diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index d54e22c54..7279f274b 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -4,6 +4,7 @@ import 'package:flutter/widgets.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/foundation/tappable.dart'; import 'package:forui/src/foundation/util.dart'; +import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; import 'package:sugar/sugar.dart'; //TODO: localizations. diff --git a/forui/test/src/widgets/button/button_golden_test.dart b/forui/test/src/widgets/button/button_golden_test.dart index 97fc1e7c4..89ffe6711 100644 --- a/forui/test/src/widgets/button/button_golden_test.dart +++ b/forui/test/src/widgets/button/button_golden_test.dart @@ -12,42 +12,111 @@ import '../../test_scaffold.dart'; void main() { group('FButton', () { - for (final (name, theme, _) in TestScaffold.themes) { + group('blue screen', () { + testWidgets('FButtonContent', (tester) async { + await tester.pumpWidget( + TestScaffold.blue( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: FButton( + label: const Text('Button'), + style: TestScaffold.blueScreen.buttonStyles.primary, + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), + onPress: () {}, + ), + ), + ), + ); + + await expectLater(find.byType(TestScaffold), isBlueScreen); + }); + + testWidgets('FButtonIconContent', (tester) async { + await tester.pumpWidget( + TestScaffold.blue( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: FButton.icon( + style: TestScaffold.blueScreen.buttonStyles.primary, + child: FIcon(FAssets.icons.circleStop), + onPress: () {}, + ), + ), + ), + ); + + await expectLater(find.byType(TestScaffold), isBlueScreen); + }); + }); + + for (final (name, theme, background) in TestScaffold.themes) { for (final variant in Variant.values) { testWidgets('$name enabled with FButtonContent', (tester) async { await tester.pumpWidget( TestScaffold( - data: theme, + theme: theme, + background: background, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: FButton( label: const Text('Button'), style: variant, - prefix: FButtonIcon(icon: FAssets.icons.circlePlay), - suffix: FButtonIcon(icon: FAssets.icons.circleStop), + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), onPress: () {}, ), ), ), ); + await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/enabled-content.png')); + }); + + testWidgets('$name enabled and hovered over', (tester) async { + await tester.pumpWidget( + TestScaffold( + theme: theme, + background: background, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: FButton( + label: const Text('Button'), + style: variant, + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), + onPress: () {}, + ), + ), + ), + ); + + final gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); + await gesture.addPointer(location: Offset.zero); + addTearDown(gesture.removePointer); + await tester.pump(); + + await gesture.moveTo(tester.getCenter(find.byType(FButton))); + await tester.pumpAndSettle(); + await expectLater( find.byType(TestScaffold), - matchesGoldenFile('button/$name-$variant-enabled-content-button.png'), + matchesGoldenFile('button/$name/$variant/enabled-hovered.png'), ); }); - testWidgets('$name enabled and hovered over', (tester) async { + testWidgets('$name enabled and long pressed', (tester) async { await tester.pumpWidget( TestScaffold( - data: theme, + theme: theme, + background: background, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: FButton( label: const Text('Button'), style: variant, - prefix: FButtonIcon(icon: FAssets.icons.circlePlay), - suffix: FButtonIcon(icon: FAssets.icons.circleStop), + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), onPress: () {}, ), ), @@ -64,37 +133,36 @@ void main() { await expectLater( find.byType(TestScaffold), - matchesGoldenFile('button/$name-$variant-enabled-hovered-button.png'), + matchesGoldenFile('button/$name/$variant/enabled-long-pressed.png'), ); }); testWidgets('$name disabled with FButtonContent', (tester) async { await tester.pumpWidget( TestScaffold( - data: theme, + theme: theme, + background: background, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: FButton( label: const Text('Button'), style: variant, - prefix: FButtonIcon(icon: FAssets.icons.circlePlay), - suffix: FButtonIcon(icon: FAssets.icons.circleStop), + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), onPress: null, ), ), ), ); - await expectLater( - find.byType(TestScaffold), - matchesGoldenFile('button/$name-$variant-disabled-content-button.png'), - ); + await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/disabled-content.png')); }); testWidgets('$name with enabled raw content', (tester) async { await tester.pumpWidget( TestScaffold( - data: theme, + theme: theme, + background: background, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: FButton.raw( @@ -124,16 +192,14 @@ void main() { ), ); - await expectLater( - find.byType(TestScaffold), - matchesGoldenFile('button/$name-$variant-enabled-raw-button.png'), - ); + await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/enabled-raw.png')); }); testWidgets('$name disabled with raw content', (tester) async { await tester.pumpWidget( TestScaffold( - data: theme, + theme: theme, + background: background, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: FButton.raw( @@ -163,24 +229,20 @@ void main() { ), ); - await expectLater( - find.byType(TestScaffold), - matchesGoldenFile('button/$name-$variant-disabled-raw-button.png'), - ); + await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/disabled-raw.png')); }); testWidgets('$name with enabled icon', (tester) async { await tester.pumpWidget( TestScaffold( - data: theme, + theme: theme, + background: background, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: FButton.icon( onPress: () {}, style: variant, - child: FButtonIcon( - icon: FAssets.icons.chevronRight, - ), + child: FIcon(FAssets.icons.chevronRight), ), ), ), @@ -188,37 +250,29 @@ void main() { await expectLater( find.byType(TestScaffold), - matchesGoldenFile( - 'button/$name-$variant-icon-enabled-button.png', - ), + matchesGoldenFile('button/$name/$variant/icon-enabled-button.png'), ); }); testWidgets('$name with disabled icon', (tester) async { await tester.pumpWidget( TestScaffold( - data: theme, + theme: theme, + background: background, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: FButton.icon( onPress: null, style: variant, - child: FButtonIcon( - icon: FAssets.icons.chevronRight, - ), + child: FIcon(FAssets.icons.chevronRight), ), ), ), ); - await expectLater( - find.byType(TestScaffold), - matchesGoldenFile( - 'button/$name-$variant-icon-disabled-button.png', - ), - ); + await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/icon-disabled.png')); }); } } }); -} +} \ No newline at end of file diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index 95220862e..f024ec39b 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -15,7 +15,7 @@ void main() { testWidgets('$name - $lineCalendar', (tester) async { await tester.pumpWidget( TestScaffold( - data: theme, + theme: theme, child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), From 251c6c250921871f6538cf44330cee76312fce4c Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Sun, 20 Oct 2024 16:49:17 +0800 Subject: [PATCH 20/44] Added lineCalendarController I have yet to include any documentation and proper tests as this may still require overhauls soon. --- .../widgets/line_calendar/line_calendar.dart | 107 +++++++------- .../line_calendar_controller.dart | 26 +++- .../line_calendar/line_calendar_tile.dart | 136 +++++++++--------- .../line_calendar/zinc-dark-default.png | Bin 47540 -> 49749 bytes .../line_calendar/zinc-light-default.png | Bin 47189 -> 49348 bytes .../widgets/line_calendar_golden_test.dart | 25 +++- 6 files changed, 161 insertions(+), 133 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 9db01f20e..7596f611b 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -6,38 +6,24 @@ import 'package:forui/src/widgets/line_calendar/line_calendar_tile.dart'; import 'package:meta/meta.dart'; import 'package:sugar/sugar.dart'; -import 'package:forui/forui.dart'; -import 'package:forui/src/foundation/tappable.dart'; -import 'package:forui/src/foundation/util.dart'; +import 'package:forui/forui.dart' hide FLineCalendar, FLineCalendarContentStyle, FLineCalendarStyle; -final _start = (DateTime(1900), null); const _textSpacing = 2.0; - /// A calendar that can be scrolled horizontally. class FLineCalendar extends StatefulWidget { /// The style. Defaults to [FThemeData.lineCalendarStyle]. final FLineCalendarStyle? style; /// The currently selected [LocalDate]. - final ValueNotifier selected; - - /// The first date in this calendar carousel. Defaults to 1st January 1900. - final LocalDate start; - - /// Today's date. Defaults to the [LocalDate.now]. - final LocalDate today; + final FLineCalendarController controller; /// Creates a [FLineCalendar]. - FLineCalendar({ - required ValueNotifier selected, - DateTime? start, - DateTime? today, + const FLineCalendar({ + required this.controller, this.style, super.key, - }) : selected = ValueNotifier(selected.value.toLocalDate()), - start = start != null ? LocalDate(start.year, start.month, start.day) : _start, - today = today != null ? LocalDate(today.year, today.month, today.day) : LocalDate.now(); + }); @override State createState() => _FLineCalendarState(); @@ -47,62 +33,68 @@ class FLineCalendar extends StatefulWidget { super.debugFillProperties(properties); properties ..add(DiagnosticsProperty('style', style)) - ..add(DiagnosticsProperty('epoch', start)) - ..add(DiagnosticsProperty('today', today)); - properties.add(DiagnosticsProperty>('selected', selected)); + ..add(DiagnosticsProperty('controller', controller)); } } class _FLineCalendarState extends State { - ScrollController _controller = ScrollController(); + late ScrollController _controller; + late double _size; + late FLineCalendarStyle _style; @override void didChangeDependencies() { + _style = widget.style ?? FTheme.of(context).lineCalendarStyle; + _size = _calculateSize(context, _style); + + // TODO: calculate the initial offset based on the selected date. Should this be placed in the controller? + final offset = + (widget.controller.value.difference(widget.controller.start).inDays - 2) * _size + _style.itemPadding; + _controller = ScrollController(initialScrollOffset: offset); + final textDirection = Directionality.of(context); - widget.selected.addListener(() => onDateChange(textDirection)); + widget.controller.addListener(() => _onDateChange(textDirection)); + super.didChangeDependencies(); } - void onDateChange(TextDirection textDirection) { + // TODO: calculate width of items based on the text font size. + double _calculateSize(BuildContext context, FLineCalendarStyle style) { + final textScalor = MediaQuery.textScalerOf(context); + final dateTextSize = textScalor.scale(style.content.unselectedDateTextStyle.fontSize!); + final dayTextSize = textScalor.scale(style.content.unselectedDayTextStyle.fontSize!); + return dateTextSize + dayTextSize + _textSpacing + (style.content.verticalPadding * 2); + } + + void _onDateChange(TextDirection textDirection) { setState(() { //TODO: localizations. - SemanticsService.announce(widget.selected.value.toString(), textDirection); + SemanticsService.announce(widget.controller.value.toString(), textDirection); }); } @override - Widget build(BuildContext context) { - final style = widget.style ?? context.theme.lineCalendarStyle; - - // TODO: calculate width of items based on the text font size. - final textScalor = MediaQuery.textScalerOf(context); - final dateTextSize = textScalor.scale(style.content.unselectedDateTextStyle.fontSize!); - final dayTextSize = textScalor.scale(style.content.unselectedDayTextStyle.fontSize!); - final size = dateTextSize + dayTextSize + _textSpacing + (style.content.verticalPadding * 2); - - final offset = (widget.selected.value.difference(widget.start).inDays - 2) * size + style.itemPadding; - _controller = ScrollController(initialScrollOffset: offset); - - return SizedBox( - height: size, - child: ListView.builder( - controller: _controller, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.zero, - // TODO: calculate width of items based on the text font size. - itemExtent: size, - itemBuilder: (context, index) => Container( - padding: EdgeInsets.symmetric(horizontal: style.itemPadding), - child: FlineCalendarTile( - style: style, - selected: widget.selected, - date: widget.start.add(Duration(days: index)), - today: widget.today, - ), + Widget build(BuildContext context) => SizedBox( + height: _size, + child: ListView.builder( + controller: _controller, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.zero, + itemExtent: _size, + itemBuilder: (context, index) { + final date = widget.controller.start.add(Duration(days: index)); + return Container( + padding: EdgeInsets.symmetric(horizontal: _style.itemPadding), + child: FlineCalendarTile( + style: _style, + controller: widget.controller, + date: date, + isToday: widget.controller.isToday(date), + ), + ); + }, ), - ), - ); - } + ); @override void dispose() { @@ -111,7 +103,6 @@ class _FLineCalendarState extends State { } } - /// [FLineCalendar]'s style. final class FLineCalendarStyle with Diagnosticable { /// The horizontal padding around each calendar item. diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart b/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart index e9ca7b5e7..4c05f80f9 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart @@ -3,13 +3,18 @@ import 'package:sugar/sugar.dart'; final _default = (DateTime(1900), null); -class FLineCalendarController extends ValueNotifier { +bool _true(DateTime _) => true; + +class FLineCalendarController extends ValueNotifier { final (DateTime, DateTime?) _calendarRange; + final DateTime _today; + final Predicate _selectable; FLineCalendarController({ (DateTime start, DateTime? end)? calendarRange, DateTime? today, + Predicate? selectable, DateTime? initialSelection, }) : assert( calendarRange == null || (calendarRange.$1.isUtc && (calendarRange.$2?.isUtc ?? true)), @@ -24,13 +29,28 @@ class FLineCalendarController extends ValueNotifier { ), _calendarRange = calendarRange ?? _default, _today = today ?? DateTime.now(), + _selectable = selectable ?? _true, super(initialSelection ?? DateTime.now()); - bool selected(DateTime date) => value?.toLocalDate() == date.toLocalDate(); + bool selectable(DateTime date) => _selectable(date); + + bool selected(DateTime date) => value.toLocalDate() == date.toLocalDate(); - void select(DateTime date) => value = value?.toLocalDate() == date.toLocalDate() ? null : date; + void select(DateTime date) { + if (value.toLocalDate() == date.toLocalDate()) { + return; + } + value = date; + } + /// Returns `true` if the given date is today. + bool isToday(DateTime date) => date.toLocalDate() == _today.toLocalDate(); + + /// The first date in this calendar carousel. Defaults to 1st January 1900. DateTime get start => _calendarRange.$1; + DateTime? get end => _calendarRange.$2; + + /// Returns today's date. Defaults to the [LocalDate.now]. DateTime get today => _today; } diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index 7279f274b..d1b181097 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -1,104 +1,100 @@ - import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/foundation/tappable.dart'; import 'package:forui/src/foundation/util.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; -import 'package:sugar/sugar.dart'; //TODO: localizations. const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; -final _start = (DateTime(1900), null); const _textSpacing = 2.0; class FlineCalendarTile extends StatelessWidget { final FLineCalendarStyle style; - final ValueNotifier selected; - final LocalDate date; - final bool today; + final FLineCalendarController controller; + final DateTime date; + final bool isToday; const FlineCalendarTile({ required this.style, - required this.selected, + required this.controller, required this.date, - required LocalDate today, - }) : today = date == today; + required this.isToday, + }); - Color _style(BuildContext context, bool selected) => switch ((selected, today)) { - (true, true) => style.selectedCurrentDateIndicatorColor, - (true, false) => const Color(0x00000000), - (false, true) => style.unselectedCurrentDateIndicatorColor, - (false, false) => const Color(0x00000000), - }; + Color _style(BuildContext context, bool selected) => switch ((selected, isToday)) { + (true, true) => style.selectedCurrentDateIndicatorColor, + (true, false) => const Color(0x00000000), + (false, true) => style.unselectedCurrentDateIndicatorColor, + (false, false) => const Color(0x00000000), + }; @override Widget build(BuildContext context) => ValueListenableBuilder( - valueListenable: selected, - builder: (context, selectedDate, _) { - final isSelected = selectedDate == date; - return FTappable.animated( - semanticLabel: date.toString(), - selected: isSelected, - onPress: () => selected.value = date, - child: Stack( - children: [ - Positioned.fill( - child: DecoratedBox( - decoration: isSelected ? style.selectedDecoration : style.unselectedDecoration, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. - merge( - textHeightBehavior: const TextHeightBehavior( - applyHeightToFirstAscent: false, - applyHeightToLastDescent: false, - ), - style: - isSelected ? style.content.selectedDateTextStyle : style.content.unselectedDateTextStyle, - //TODO: Localization. - child: Text('${date.day}'), - ), - const SizedBox(height: _textSpacing), - // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. - merge( - textHeightBehavior: const TextHeightBehavior( - applyHeightToFirstAscent: false, - applyHeightToLastDescent: false, - ), - style: isSelected ? style.content.selectedDayTextStyle : style.content.unselectedDayTextStyle, - child: Text(_days[date.weekday - 1]), + valueListenable: controller, + builder: (context, selectedDate, _) { + final isSelected = controller.selected(date); + return FTappable.animated( + semanticLabel: date.toString(), + selected: isSelected, + onPress: () => controller.select(date), + child: Stack( + children: [ + Positioned.fill( + child: DecoratedBox( + decoration: isSelected ? style.selectedDecoration : style.unselectedDecoration, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. + merge( + textHeightBehavior: const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: false, + ), + style: + isSelected ? style.content.selectedDateTextStyle : style.content.unselectedDateTextStyle, + //TODO: Localization. + child: Text('${date.day}'), + ), + const SizedBox(height: _textSpacing), + // TODO: replace with DefaultTextStyle.merge when textHeightBehavior has been added. + merge( + textHeightBehavior: const TextHeightBehavior( + applyHeightToFirstAscent: false, + applyHeightToLastDescent: false, + ), + style: isSelected ? style.content.selectedDayTextStyle : style.content.unselectedDayTextStyle, + child: Text(_days[date.weekday - 1]), + ), + ], ), - ], + ), ), - ), - ), - Positioned( - top: 6, - right: 6, - child: Container( - height: 4, - width: 4, - decoration: BoxDecoration( - color: _style(context, isSelected), - shape: BoxShape.circle, + Positioned( + top: 6, + right: 6, + child: Container( + height: 4, + width: 4, + decoration: BoxDecoration( + color: _style(context, isSelected), + shape: BoxShape.circle, + ), + ), ), - ), + ], ), - ], - ), + ); + }, ); - }, - ); @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties ..add(DiagnosticsProperty('style', style)) - ..add(DiagnosticsProperty('selected', selected)) ..add(DiagnosticsProperty('date', date)) - ..add(DiagnosticsProperty('today', today)); + ..add(DiagnosticsProperty('today', isToday)); } -} \ No newline at end of file +} diff --git a/forui/test/golden/line_calendar/zinc-dark-default.png b/forui/test/golden/line_calendar/zinc-dark-default.png index 509083f50e5a775d3078b58de01e92c942f756d3..ccb803012ed93c56ad8604ff6a9743551c00ce5a 100644 GIT binary patch literal 49749 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 literal 47540 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 W-zrq*BXOR&GEH?|wSv=Eg8m02O@oL4 diff --git a/forui/test/golden/line_calendar/zinc-light-default.png b/forui/test/golden/line_calendar/zinc-light-default.png index 15b758b0a63cdc638e5b38a7d283e1b4134c0c91..08637ef42fc52c43771e3ab85d409e0d87dc98d2 100644 GIT binary patch literal 49348 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 literal 47189 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%0DD$<&qt;7|2TSi!GK)DmCW2wIg+e3Xk%A2UBjX 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 Date: Sun, 20 Oct 2024 23:08:53 +0800 Subject: [PATCH 21/44] new lineCalendarController with scrollController --- .../widgets/calendar/calendar_controller.dart | 2 +- .../widgets/line_calendar/line_calendar.dart | 10 +-- .../line_calendar_controller.dart | 76 +++++++++++++++++-- 3 files changed, 75 insertions(+), 13 deletions(-) diff --git a/forui/lib/src/widgets/calendar/calendar_controller.dart b/forui/lib/src/widgets/calendar/calendar_controller.dart index c96131e12..a598c36cc 100644 --- a/forui/lib/src/widgets/calendar/calendar_controller.dart +++ b/forui/lib/src/widgets/calendar/calendar_controller.dart @@ -31,7 +31,7 @@ abstract class FCalendarController extends FValueNotifier { /// [selectable] will always return true if not given. /// /// ## Contract - /// Throws [AssertionError] if the dates in [initialSelections] are not in UTC timezone. + /// Throws [AssertionError] if assert(initialSelection?.isUtc ?? true, 'value must be in UTC timezone'), static FCalendarController> dates({ Set initialSelections = const {}, Predicate? selectable, diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 7596f611b..9eed2f215 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -38,7 +38,7 @@ class FLineCalendar extends StatefulWidget { } class _FLineCalendarState extends State { - late ScrollController _controller; + late FLineCalendarController _controller; late double _size; late FLineCalendarStyle _style; @@ -46,11 +46,7 @@ class _FLineCalendarState extends State { void didChangeDependencies() { _style = widget.style ?? FTheme.of(context).lineCalendarStyle; _size = _calculateSize(context, _style); - - // TODO: calculate the initial offset based on the selected date. Should this be placed in the controller? - final offset = - (widget.controller.value.difference(widget.controller.start).inDays - 2) * _size + _style.itemPadding; - _controller = ScrollController(initialScrollOffset: offset); + _controller = widget.controller.withInitialScrollOffset(_size, _style.itemPadding); final textDirection = Directionality.of(context); widget.controller.addListener(() => _onDateChange(textDirection)); @@ -77,7 +73,7 @@ class _FLineCalendarState extends State { Widget build(BuildContext context) => SizedBox( height: _size, child: ListView.builder( - controller: _controller, + controller: _controller.scrollController, scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, itemExtent: _size, diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart b/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart index 4c05f80f9..d862d8334 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart @@ -1,22 +1,39 @@ import 'package:flutter/cupertino.dart'; import 'package:sugar/sugar.dart'; -final _default = (DateTime(1900), null); +final _default = (DateTime(1900).toUtc(), null); bool _true(DateTime _) => true; +/// A controller for the FLineCalendar widget. class FLineCalendarController extends ValueNotifier { + /// The [_calendarRange] parameter defines the range of dates that can be displayed in the calendar. + /// Both the start and end dates of the range is inclusive. The selected dates are always in UTC timezone and + /// truncated to the nearest day. final (DateTime, DateTime?) _calendarRange; - final DateTime _today; final Predicate _selectable; + /// The scroll controller. + final ScrollController scrollController; + + /// Creates a [FLineCalendarController]. + /// + /// [selectable] will always return true if not given. + /// + /// ## Contract + /// Throws [AssertionError] if: + /// * if [initialSelection] is not in UTC timezone. + /// * the dates in [calendarRange] are not in UTC timezone. + /// * the end date is less than start date. FLineCalendarController({ (DateTime start, DateTime? end)? calendarRange, DateTime? today, Predicate? selectable, DateTime? initialSelection, - }) : assert( + ScrollController? scrollController, + }) : assert(initialSelection?.isUtc ?? true, 'value must be in UTC timezone'), + assert( calendarRange == null || (calendarRange.$1.isUtc && (calendarRange.$2?.isUtc ?? true)), 'value must be in UTC timezone', ), @@ -30,12 +47,57 @@ class FLineCalendarController extends ValueNotifier { _calendarRange = calendarRange ?? _default, _today = today ?? DateTime.now(), _selectable = selectable ?? _true, - super(initialSelection ?? DateTime.now()); + scrollController = scrollController ?? ScrollController(), + super(initialSelection ?? DateTime.now().toUtc()); + /// Returns a new instance of [FLineCalendarController] with the same properties, + /// but with its [ScrollController] initialized to a specific scroll offset. + /// + /// The [size], [itemPadding], and [position] parameters are used to calculate + /// the initial scroll offset for the [ScrollController]. + /// + /// * [size]: The size of each calendar item. + /// * [itemPadding]: The padding between calendar items. + /// * [position]: The position of the selected date within the visible items. + /// + /// This method is useful for creating a controller that starts with a specific + /// scroll position, typically to ensure the selected date is visible. + FLineCalendarController withInitialScrollOffset( + double size, + double itemPadding, { + int position = 3, + }) => + FLineCalendarController( + calendarRange: (start, end), + today: _today, + selectable: _selectable, + initialSelection: value, + scrollController: ScrollController( + initialScrollOffset: _selectedDateOffset(size, itemPadding, position), + debugLabel: scrollController.debugLabel, + keepScrollOffset: scrollController.keepScrollOffset, + onAttach: scrollController.onAttach, + onDetach: scrollController.onDetach, + ), + ); + + /// Returns true if the given [date] can be selected/unselected. + /// + /// [date] should always in UTC timezone and truncated to the nearest day. + /// + /// ## Note + /// It is unsafe for this function to have side effects since it may be called more than once for a single date. As it + /// is called frequently, it should not be computationally expensive. bool selectable(DateTime date) => _selectable(date); + /// Returns true if the given [date] is selected. + /// + /// [date] should always in UTC timezone and truncated to the nearest day. bool selected(DateTime date) => value.toLocalDate() == date.toLocalDate(); + /// Selects the given [date]. + /// + /// [date] should always in UTC timezone and truncated to the nearest day. void select(DateTime date) { if (value.toLocalDate() == date.toLocalDate()) { return; @@ -43,14 +105,18 @@ class FLineCalendarController extends ValueNotifier { value = date; } + double _selectedDateOffset(double size, double itemPadding, int position) => + (value.toLocalDate().difference(start.toLocalDate()).inDays - (position - 1)) * size + itemPadding; + /// Returns `true` if the given date is today. bool isToday(DateTime date) => date.toLocalDate() == _today.toLocalDate(); /// The first date in this calendar carousel. Defaults to 1st January 1900. DateTime get start => _calendarRange.$1; + /// The final date in this calendar carousel. DateTime? get end => _calendarRange.$2; - /// Returns today's date. Defaults to the [LocalDate.now]. + /// Returns the current date. It is truncated to the nearest date. Defaults to the [DateTime.now] DateTime get today => _today; } From 15d0fb21ace0aa22f7464af9e1120d9560bcaf16 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Wed, 23 Oct 2024 20:52:07 +0800 Subject: [PATCH 22/44] reverted to scroll controller with FCalendarController --- forui/example/lib/sandbox.dart | 4 +- .../widgets/line_calendar/line_calendar.dart | 41 +++++++++++++++---- .../line_calendar/line_calendar_tile.dart | 2 +- .../widgets/line_calendar_golden_test.dart | 5 ++- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/forui/example/lib/sandbox.dart b/forui/example/lib/sandbox.dart index a001b8dad..01a88e47f 100644 --- a/forui/example/lib/sandbox.dart +++ b/forui/example/lib/sandbox.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:forui/forui.dart'; -import 'package:forui/src/widgets/line_calendar.dart'; +import 'package:forui/widgets/line_calendar.dart'; class Sandbox extends StatefulWidget { const Sandbox({super.key}); @@ -32,7 +32,7 @@ class _SandboxState extends State { ), const SizedBox(height: 20), const FTextField.password(), - FLineCalendar(selected: selected), + FLineCalendar(controller: FCalendarController.date()), const SizedBox(height: 20), FTooltip( longPressExitDuration: const Duration(seconds: 5000), diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 9eed2f215..53c7e6302 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -15,15 +15,36 @@ class FLineCalendar extends StatefulWidget { /// The style. Defaults to [FThemeData.lineCalendarStyle]. final FLineCalendarStyle? style; - /// The currently selected [LocalDate]. - final FLineCalendarController controller; + /// The controller. + final FCalendarController controller; + + /// The start date. It is truncated to the nearest date. + /// + /// ## Contract + /// Throws [AssertionError] if [end] <= [start]. + final DateTime start; + + /// The end date. It is truncated to the nearest date. + /// + /// ## Contract + /// Throws [AssertionError] if [end] <= [start]. + final DateTime? end; + + /// The current date. It is truncated to the nearest date. Defaults to the [DateTime.now]. + final DateTime today; /// Creates a [FLineCalendar]. - const FLineCalendar({ + FLineCalendar({ required this.controller, this.style, + this.end, + DateTime? start, + DateTime? today, super.key, - }); + }) : start = start ?? DateTime(1900).toUtc(), + assert(start == null || end == null || start.toLocalDate() < end.toLocalDate(), + 'end date must be greater than start date'), + today = today ?? DateTime.now(); @override State createState() => _FLineCalendarState(); @@ -38,7 +59,7 @@ class FLineCalendar extends StatefulWidget { } class _FLineCalendarState extends State { - late FLineCalendarController _controller; + late ScrollController _controller; late double _size; late FLineCalendarStyle _style; @@ -46,7 +67,9 @@ class _FLineCalendarState extends State { void didChangeDependencies() { _style = widget.style ?? FTheme.of(context).lineCalendarStyle; _size = _calculateSize(context, _style); - _controller = widget.controller.withInitialScrollOffset(_size, _style.itemPadding); + final offset = (widget.controller.value.toLocalDate().difference(widget.start.toLocalDate()).inDays - 2) * _size + + _style.itemPadding; + _controller = ScrollController(initialScrollOffset: offset); final textDirection = Directionality.of(context); widget.controller.addListener(() => _onDateChange(textDirection)); @@ -73,19 +96,19 @@ class _FLineCalendarState extends State { Widget build(BuildContext context) => SizedBox( height: _size, child: ListView.builder( - controller: _controller.scrollController, + controller: _controller, scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, itemExtent: _size, itemBuilder: (context, index) { - final date = widget.controller.start.add(Duration(days: index)); + final date = widget.start.add(Duration(days: index)); return Container( padding: EdgeInsets.symmetric(horizontal: _style.itemPadding), child: FlineCalendarTile( style: _style, controller: widget.controller, date: date, - isToday: widget.controller.isToday(date), + isToday: widget.today == date, ), ); }, diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index d1b181097..3d8baea26 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -11,7 +11,7 @@ const _textSpacing = 2.0; class FlineCalendarTile extends StatelessWidget { final FLineCalendarStyle style; - final FLineCalendarController controller; + final FCalendarController controller; final DateTime date; final bool isToday; diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index e54068c2c..aa48fabf8 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -4,6 +4,7 @@ library; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:forui/forui.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar_controller.dart'; @@ -19,7 +20,7 @@ void main() { padding: const EdgeInsets.symmetric(horizontal: 20), child: FLineCalendar( style: TestScaffold.blueScreen.lineCalendarStyle, - controller: FLineCalendarController(), + controller: FCalendarController.date(), ), ), ), @@ -40,7 +41,7 @@ void main() { child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), - child: FLineCalendar(controller: controller), + child: FLineCalendar(controller: FCalendarController.date()), ), ), ), From e43eb94bdf1d4f8c4eba5cebdb16d7d57d7ebe5c Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Sun, 27 Oct 2024 22:34:06 +0800 Subject: [PATCH 23/44] controller limited to FCalendarController.date --- forui/example/lib/sandbox.dart | 6 +++++- .../src/widgets/line_calendar/line_calendar.dart | 15 ++++++++++----- .../line_calendar/line_calendar_controller.dart | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/forui/example/lib/sandbox.dart b/forui/example/lib/sandbox.dart index 01a88e47f..c9dd5b863 100644 --- a/forui/example/lib/sandbox.dart +++ b/forui/example/lib/sandbox.dart @@ -32,7 +32,11 @@ class _SandboxState extends State { ), const SizedBox(height: 20), const FTextField.password(), - FLineCalendar(controller: FCalendarController.date()), + FLineCalendar( + controller: FCalendarController.date( + initialSelection: DateTime(2024, 10, 13).toUtc(), + ), + ), const SizedBox(height: 20), FTooltip( longPressExitDuration: const Duration(seconds: 5000), diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 53c7e6302..f304edebe 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -1,6 +1,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; +import 'package:forui/src/widgets/line_calendar/line_calendar_controller.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar_tile.dart'; import 'package:meta/meta.dart'; @@ -16,7 +18,7 @@ class FLineCalendar extends StatefulWidget { final FLineCalendarStyle? style; /// The controller. - final FCalendarController controller; + final FCalendarController controller; /// The start date. It is truncated to the nearest date. /// @@ -42,8 +44,10 @@ class FLineCalendar extends StatefulWidget { DateTime? today, super.key, }) : start = start ?? DateTime(1900).toUtc(), - assert(start == null || end == null || start.toLocalDate() < end.toLocalDate(), - 'end date must be greater than start date'), + assert( + start == null || end == null || start.toLocalDate() < end.toLocalDate(), + 'end date must be greater than start date', + ), today = today ?? DateTime.now(); @override @@ -67,8 +71,9 @@ class _FLineCalendarState extends State { void didChangeDependencies() { _style = widget.style ?? FTheme.of(context).lineCalendarStyle; _size = _calculateSize(context, _style); - final offset = (widget.controller.value.toLocalDate().difference(widget.start.toLocalDate()).inDays - 2) * _size + - _style.itemPadding; + + final value = widget.controller.value?.toLocalDate() ?? widget.today.toLocalDate(); + final offset = (value.difference(widget.start.toLocalDate()).inDays - 2) * _size + _style.itemPadding; _controller = ScrollController(initialScrollOffset: offset); final textDirection = Directionality.of(context); diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart b/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart index d862d8334..be99bc605 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart @@ -1,4 +1,4 @@ -import 'package:flutter/cupertino.dart'; +import 'package:flutter/widgets.dart'; import 'package:sugar/sugar.dart'; final _default = (DateTime(1900).toUtc(), null); From 472d8dfac3466ec28b4ee8255c493b9dfa3c202d Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Tue, 29 Oct 2024 01:22:16 +0800 Subject: [PATCH 24/44] Need to complete Tests, FLineCalendarController removed --- forui/example/lib/sandbox.dart | 2 +- .../widgets/line_calendar/line_calendar.dart | 63 ++++----- .../line_calendar_controller.dart | 122 ------------------ .../widgets/line_calendar_golden_test.dart | 52 +++++++- 4 files changed, 83 insertions(+), 156 deletions(-) delete mode 100644 forui/lib/src/widgets/line_calendar/line_calendar_controller.dart diff --git a/forui/example/lib/sandbox.dart b/forui/example/lib/sandbox.dart index c9dd5b863..24efaecb3 100644 --- a/forui/example/lib/sandbox.dart +++ b/forui/example/lib/sandbox.dart @@ -34,7 +34,7 @@ class _SandboxState extends State { const FTextField.password(), FLineCalendar( controller: FCalendarController.date( - initialSelection: DateTime(2024, 10, 13).toUtc(), + initialSelection: DateTime.utc(2024, 9, 13), ), ), const SizedBox(height: 20), diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index f304edebe..9543cbe15 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -2,14 +2,12 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:forui/src/widgets/line_calendar/line_calendar_controller.dart'; +import 'package:forui/forui.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar_tile.dart'; import 'package:meta/meta.dart'; import 'package:sugar/sugar.dart'; -import 'package:forui/forui.dart' hide FLineCalendar, FLineCalendarContentStyle, FLineCalendarStyle; - const _textSpacing = 2.0; /// A calendar that can be scrolled horizontally. @@ -76,9 +74,6 @@ class _FLineCalendarState extends State { final offset = (value.difference(widget.start.toLocalDate()).inDays - 2) * _size + _style.itemPadding; _controller = ScrollController(initialScrollOffset: offset); - final textDirection = Directionality.of(context); - widget.controller.addListener(() => _onDateChange(textDirection)); - super.didChangeDependencies(); } @@ -90,33 +85,43 @@ class _FLineCalendarState extends State { return dateTextSize + dayTextSize + _textSpacing + (style.content.verticalPadding * 2); } - void _onDateChange(TextDirection textDirection) { - setState(() { - //TODO: localizations. - SemanticsService.announce(widget.controller.value.toString(), textDirection); - }); - } - @override Widget build(BuildContext context) => SizedBox( height: _size, - child: ListView.builder( - controller: _controller, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.zero, - itemExtent: _size, - itemBuilder: (context, index) { - final date = widget.start.add(Duration(days: index)); - return Container( - padding: EdgeInsets.symmetric(horizontal: _style.itemPadding), - child: FlineCalendarTile( - style: _style, - controller: widget.controller, - date: date, - isToday: widget.today == date, - ), - ); + child: Focus( + autofocus: true, + onKeyEvent: (node, event) { + if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.arrowRight) { + widget.controller.value = widget.controller.value?.add(const Duration(days: 1)); + _controller.animateTo(_controller.offset + _size, + duration: const Duration(milliseconds: 100), curve: Curves.easeInOut); + return KeyEventResult.handled; + } else if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.arrowLeft) { + widget.controller.value = widget.controller.value?.subtract(const Duration(days: 1)); + _controller.animateTo(_controller.offset - _size, + duration: const Duration(milliseconds: 100), curve: Curves.easeInOut); + return KeyEventResult.handled; + } + return KeyEventResult.ignored; }, + child: ListView.builder( + controller: _controller, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.zero, + itemExtent: _size, + itemBuilder: (context, index) { + final date = widget.start.add(Duration(days: index)); + return Container( + padding: EdgeInsets.symmetric(horizontal: _style.itemPadding), + child: FlineCalendarTile( + style: _style, + controller: widget.controller, + date: date, + isToday: widget.today == date, + ), + ); + }, + ), ), ); diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart b/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart deleted file mode 100644 index be99bc605..000000000 --- a/forui/lib/src/widgets/line_calendar/line_calendar_controller.dart +++ /dev/null @@ -1,122 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:sugar/sugar.dart'; - -final _default = (DateTime(1900).toUtc(), null); - -bool _true(DateTime _) => true; - -/// A controller for the FLineCalendar widget. -class FLineCalendarController extends ValueNotifier { - /// The [_calendarRange] parameter defines the range of dates that can be displayed in the calendar. - /// Both the start and end dates of the range is inclusive. The selected dates are always in UTC timezone and - /// truncated to the nearest day. - final (DateTime, DateTime?) _calendarRange; - final DateTime _today; - final Predicate _selectable; - - /// The scroll controller. - final ScrollController scrollController; - - /// Creates a [FLineCalendarController]. - /// - /// [selectable] will always return true if not given. - /// - /// ## Contract - /// Throws [AssertionError] if: - /// * if [initialSelection] is not in UTC timezone. - /// * the dates in [calendarRange] are not in UTC timezone. - /// * the end date is less than start date. - FLineCalendarController({ - (DateTime start, DateTime? end)? calendarRange, - DateTime? today, - Predicate? selectable, - DateTime? initialSelection, - ScrollController? scrollController, - }) : assert(initialSelection?.isUtc ?? true, 'value must be in UTC timezone'), - assert( - calendarRange == null || (calendarRange.$1.isUtc && (calendarRange.$2?.isUtc ?? true)), - 'value must be in UTC timezone', - ), - assert( - calendarRange == null || - calendarRange.$2 == null || - calendarRange.$1.isBefore(calendarRange.$2!) || - calendarRange.$1.isAtSameMomentAs(calendarRange.$2!), - 'end date must be greater than or equal to start date', - ), - _calendarRange = calendarRange ?? _default, - _today = today ?? DateTime.now(), - _selectable = selectable ?? _true, - scrollController = scrollController ?? ScrollController(), - super(initialSelection ?? DateTime.now().toUtc()); - - /// Returns a new instance of [FLineCalendarController] with the same properties, - /// but with its [ScrollController] initialized to a specific scroll offset. - /// - /// The [size], [itemPadding], and [position] parameters are used to calculate - /// the initial scroll offset for the [ScrollController]. - /// - /// * [size]: The size of each calendar item. - /// * [itemPadding]: The padding between calendar items. - /// * [position]: The position of the selected date within the visible items. - /// - /// This method is useful for creating a controller that starts with a specific - /// scroll position, typically to ensure the selected date is visible. - FLineCalendarController withInitialScrollOffset( - double size, - double itemPadding, { - int position = 3, - }) => - FLineCalendarController( - calendarRange: (start, end), - today: _today, - selectable: _selectable, - initialSelection: value, - scrollController: ScrollController( - initialScrollOffset: _selectedDateOffset(size, itemPadding, position), - debugLabel: scrollController.debugLabel, - keepScrollOffset: scrollController.keepScrollOffset, - onAttach: scrollController.onAttach, - onDetach: scrollController.onDetach, - ), - ); - - /// Returns true if the given [date] can be selected/unselected. - /// - /// [date] should always in UTC timezone and truncated to the nearest day. - /// - /// ## Note - /// It is unsafe for this function to have side effects since it may be called more than once for a single date. As it - /// is called frequently, it should not be computationally expensive. - bool selectable(DateTime date) => _selectable(date); - - /// Returns true if the given [date] is selected. - /// - /// [date] should always in UTC timezone and truncated to the nearest day. - bool selected(DateTime date) => value.toLocalDate() == date.toLocalDate(); - - /// Selects the given [date]. - /// - /// [date] should always in UTC timezone and truncated to the nearest day. - void select(DateTime date) { - if (value.toLocalDate() == date.toLocalDate()) { - return; - } - value = date; - } - - double _selectedDateOffset(double size, double itemPadding, int position) => - (value.toLocalDate().difference(start.toLocalDate()).inDays - (position - 1)) * size + itemPadding; - - /// Returns `true` if the given date is today. - bool isToday(DateTime date) => date.toLocalDate() == _today.toLocalDate(); - - /// The first date in this calendar carousel. Defaults to 1st January 1900. - DateTime get start => _calendarRange.$1; - - /// The final date in this calendar carousel. - DateTime? get end => _calendarRange.$2; - - /// Returns the current date. It is truncated to the nearest date. Defaults to the [DateTime.now] - DateTime get today => _today; -} diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index aa48fabf8..281a12287 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -1,13 +1,14 @@ @Tags(['golden']) library; +import 'dart:ui'; + import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; -import 'package:forui/src/widgets/line_calendar/line_calendar_controller.dart'; import '../test_scaffold.dart'; void main() { @@ -32,7 +33,7 @@ void main() { for (final (name, theme, _) in TestScaffold.themes) { for (final (lineCalendar, controller) in [ - ('default', FLineCalendarController(today: DateTime(2024, 10, 20))), + ('default', FCalendarController.date(initialSelection: DateTime.utc(2024, 10, 20))), ]) { testWidgets('$name - $lineCalendar', (tester) async { await tester.pumpWidget( @@ -41,15 +42,58 @@ void main() { child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), - child: FLineCalendar(controller: FCalendarController.date()), + child: FLineCalendar(controller: controller), + ), + ), + ), + ); + + await expectLater( + find.byType(TestScaffold), + matchesGoldenFile('line_calendar/$name-$lineCalendar/default.png'), + ); + }); + + testWidgets('new date selected - $name', (tester) async { + await tester.pumpWidget( + TestScaffold( + theme: theme, + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: FLineCalendar(controller: controller), + ), + ), + ), + ); + + await tester.tap(find.text('24')); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(TestScaffold), + matchesGoldenFile('line_calendar/$name-$lineCalendar/new-date.png'), + ); + }); + + testWidgets('unselected - $name', (tester) async { + await tester.pumpWidget( + TestScaffold( + theme: theme, + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: FLineCalendar(controller: controller), ), ), ), ); + await tester.tap(find.text('20')); + await tester.pumpAndSettle(); await expectLater( find.byType(TestScaffold), - matchesGoldenFile('line_calendar/$name-$lineCalendar.png'), + matchesGoldenFile('line_calendar/$name-$lineCalendar/unselected.png'), ); }); } From 3976d263f77bdc76e1bfe90328fecc521cb06ef2 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Wed, 30 Oct 2024 14:06:16 +0800 Subject: [PATCH 25/44] Fixed rebase issues --- .../lib/src/widgets/button/button_styles.dart | 188 ++++++------- .../line_calendar/line_calendar_tile.dart | 1 - forui/lib/widgets/line_calendar.dart | 1 - .../widgets/button/button_golden_test.dart | 247 ++++++++---------- .../widgets/line_calendar_golden_test.dart | 20 +- 5 files changed, 220 insertions(+), 237 deletions(-) diff --git a/forui/lib/src/widgets/button/button_styles.dart b/forui/lib/src/widgets/button/button_styles.dart index 202c9e6e1..3f39de997 100644 --- a/forui/lib/src/widgets/button/button_styles.dart +++ b/forui/lib/src/widgets/button/button_styles.dart @@ -35,88 +35,96 @@ final class FButtonStyles with Diagnosticable { /// [style]. FButtonStyles.inherit({required FColorScheme colorScheme, required FTypography typography, required FStyle style}) : this( - primary: FButtonCustomStyle.inherit( - style: style, - typography: typography, - enabledBoxColor: colorScheme.primary, - enabledHoveredBoxColor: colorScheme.hover(colorScheme.primary), - disabledBoxColor: colorScheme.disable(colorScheme.primary), - enabledContentColor: colorScheme.primaryForeground, - disabledContentColor: colorScheme.disable( - colorScheme.primaryForeground, - colorScheme.disable(colorScheme.primary), - ), - ), - secondary: FButtonCustomStyle.inherit( - style: style, - typography: typography, - enabledBoxColor: colorScheme.secondary, - enabledHoveredBoxColor: colorScheme.hover(colorScheme.secondary), - disabledBoxColor: colorScheme.disable(colorScheme.secondary), - enabledContentColor: colorScheme.secondaryForeground, - disabledContentColor: colorScheme.disable( - colorScheme.secondaryForeground, - colorScheme.disable(colorScheme.secondary), - ), - ), - destructive: FButtonCustomStyle.inherit( - style: style, - typography: typography, - enabledBoxColor: colorScheme.destructive, - enabledHoveredBoxColor: colorScheme.hover(colorScheme.destructive), - disabledBoxColor: colorScheme.disable(colorScheme.destructive), - enabledContentColor: colorScheme.destructiveForeground, - disabledContentColor: colorScheme.disable( - colorScheme.destructiveForeground, - colorScheme.disable(colorScheme.destructive), - ), - ), - outline: FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.border), - borderRadius: style.borderRadius, - ), - enabledHoverBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.border), - borderRadius: style.borderRadius, - color: colorScheme.secondary, - ), - disabledBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.disable(colorScheme.border)), - borderRadius: style.borderRadius, - ), - contentStyle: FButtonContentStyle.inherit( - typography: typography, - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), - ), - iconContentStyle: FButtonIconContentStyle( - enabledColor: colorScheme.secondaryForeground, - disabledColor: colorScheme.disable(colorScheme.secondaryForeground), - ), - ), - ghost: FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - ), - enabledHoverBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.secondary, - ), - disabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - ), - contentStyle: FButtonContentStyle.inherit( - typography: typography, - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), - ), - iconContentStyle: FButtonIconContentStyle( - enabledColor: colorScheme.secondaryForeground, - disabledColor: colorScheme.disable(colorScheme.secondaryForeground), - ), - ), - ); + primary: FButtonCustomStyle.inherit( + style: style, + typography: typography, + enabledBoxColor: colorScheme.primary, + enabledHoveredBoxColor: colorScheme.hover(colorScheme.primary), + disabledBoxColor: colorScheme.disable(colorScheme.primary), + enabledContentColor: colorScheme.primaryForeground, + disabledContentColor: colorScheme.disable( + colorScheme.primaryForeground, + colorScheme.disable(colorScheme.primary), + ), + ), + secondary: FButtonCustomStyle.inherit( + style: style, + typography: typography, + enabledBoxColor: colorScheme.secondary, + enabledHoveredBoxColor: colorScheme.hover(colorScheme.secondary), + disabledBoxColor: colorScheme.disable(colorScheme.secondary), + enabledContentColor: colorScheme.secondaryForeground, + disabledContentColor: colorScheme.disable( + colorScheme.secondaryForeground, + colorScheme.disable(colorScheme.secondary), + ), + ), + destructive: FButtonCustomStyle.inherit( + style: style, + typography: typography, + enabledBoxColor: colorScheme.destructive, + enabledHoveredBoxColor: colorScheme.hover(colorScheme.destructive), + disabledBoxColor: colorScheme.disable(colorScheme.destructive), + enabledContentColor: colorScheme.destructiveForeground, + disabledContentColor: colorScheme.disable( + colorScheme.destructiveForeground, + colorScheme.disable(colorScheme.destructive), + ), + ), + outline: FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.border), + borderRadius: style.borderRadius, + ), + enabledHoverBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.border), + borderRadius: style.borderRadius, + color: colorScheme.secondary, + ), + disabledBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.disable(colorScheme.border)), + borderRadius: style.borderRadius, + ), + contentStyle: FButtonContentStyle.inherit( + typography: typography, + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + iconContentStyle: FButtonIconContentStyle( + enabledColor: colorScheme.secondaryForeground, + disabledColor: colorScheme.disable(colorScheme.secondaryForeground), + ), + spinnerStyle: FButtonSpinnerStyle.inherit( + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + ), + ghost: FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + ), + enabledHoverBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.secondary, + ), + disabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + ), + contentStyle: FButtonContentStyle.inherit( + typography: typography, + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + iconContentStyle: FButtonIconContentStyle( + enabledColor: colorScheme.secondaryForeground, + disabledColor: colorScheme.disable(colorScheme.secondaryForeground), + ), + spinnerStyle: FButtonSpinnerStyle.inherit( + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + ), + ); /// Returns a copy of this [FButtonStyles] with the given properties replaced. @useResult @@ -149,14 +157,14 @@ final class FButtonStyles with Diagnosticable { @override bool operator ==(Object other) => identical(this, other) || - other is FButtonStyles && - runtimeType == other.runtimeType && - primary == other.primary && - secondary == other.secondary && - destructive == other.destructive && - outline == other.outline && - ghost == other.ghost; + other is FButtonStyles && + runtimeType == other.runtimeType && + primary == other.primary && + secondary == other.secondary && + destructive == other.destructive && + outline == other.outline && + ghost == other.ghost; @override int get hashCode => primary.hashCode ^ secondary.hashCode ^ destructive.hashCode ^ outline.hashCode ^ ghost.hashCode; -} +} \ No newline at end of file diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index 3d8baea26..2cec2f279 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -36,7 +36,6 @@ class FlineCalendarTile extends StatelessWidget { final isSelected = controller.selected(date); return FTappable.animated( semanticLabel: date.toString(), - selected: isSelected, onPress: () => controller.select(date), child: Stack( children: [ diff --git a/forui/lib/widgets/line_calendar.dart b/forui/lib/widgets/line_calendar.dart index 75075f16c..761b56950 100644 --- a/forui/lib/widgets/line_calendar.dart +++ b/forui/lib/widgets/line_calendar.dart @@ -6,5 +6,4 @@ library forui.widgets.lineCalendar; export '../src/widgets/line_calendar/line_calendar.dart'; -export '../src/widgets/line_calendar/line_calendar_controller.dart'; export '../src/widgets/line_calendar/line_calendar_tile.dart'; diff --git a/forui/test/src/widgets/button/button_golden_test.dart b/forui/test/src/widgets/button/button_golden_test.dart index 89ffe6711..b37af9ac8 100644 --- a/forui/test/src/widgets/button/button_golden_test.dart +++ b/forui/test/src/widgets/button/button_golden_test.dart @@ -16,77 +16,66 @@ void main() { testWidgets('FButtonContent', (tester) async { await tester.pumpWidget( TestScaffold.blue( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton( - label: const Text('Button'), - style: TestScaffold.blueScreen.buttonStyles.primary, - prefix: FIcon(FAssets.icons.circlePlay), - suffix: FIcon(FAssets.icons.circleStop), - onPress: () {}, - ), + child: FButton( + label: const Text('Button'), + style: TestScaffold.blueScreen.buttonStyles.primary, + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), + onPress: () {}, ), ), ); - await expectLater(find.byType(TestScaffold), isBlueScreen); + await expectBlueScreen(find.byType(TestScaffold)); }); testWidgets('FButtonIconContent', (tester) async { await tester.pumpWidget( TestScaffold.blue( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton.icon( - style: TestScaffold.blueScreen.buttonStyles.primary, - child: FIcon(FAssets.icons.circleStop), - onPress: () {}, - ), + child: FButton.icon( + style: TestScaffold.blueScreen.buttonStyles.primary, + child: FIcon(FAssets.icons.circleStop), + onPress: () {}, ), ), ); - await expectLater(find.byType(TestScaffold), isBlueScreen); + await expectBlueScreen(find.byType(TestScaffold)); }); }); - for (final (name, theme, background) in TestScaffold.themes) { + for (final theme in TestScaffold.themes) { for (final variant in Variant.values) { - testWidgets('$name enabled with FButtonContent', (tester) async { + testWidgets('${theme.name} enabled with FButtonContent', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, - background: background, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton( - label: const Text('Button'), - style: variant, - prefix: FIcon(FAssets.icons.circlePlay), - suffix: FIcon(FAssets.icons.circleStop), - onPress: () {}, - ), + theme: theme.data, + child: FButton( + label: const Text('Button'), + style: variant, + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), + onPress: () {}, ), ), ); - await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/enabled-content.png')); + await expectLater( + find.byType(TestScaffold), + matchesGoldenFile('button/${theme.name}/$variant/enabled-content.png'), + ); }); - testWidgets('$name enabled and hovered over', (tester) async { + testWidgets('${theme.name} enabled and hovered over', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, - background: background, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton( - label: const Text('Button'), - style: variant, - prefix: FIcon(FAssets.icons.circlePlay), - suffix: FIcon(FAssets.icons.circleStop), - onPress: () {}, - ), + theme: theme.data, + child: FButton( + label: const Text('Button'), + style: variant, + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), + onPress: () {}, ), ), ); @@ -101,24 +90,20 @@ void main() { await expectLater( find.byType(TestScaffold), - matchesGoldenFile('button/$name/$variant/enabled-hovered.png'), + matchesGoldenFile('button/${theme.name}/$variant/enabled-hovered.png'), ); }); - testWidgets('$name enabled and long pressed', (tester) async { + testWidgets('${theme.name} enabled and long pressed', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, - background: background, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton( - label: const Text('Button'), - style: variant, - prefix: FIcon(FAssets.icons.circlePlay), - suffix: FIcon(FAssets.icons.circleStop), - onPress: () {}, - ), + theme: theme.data, + child: FButton( + label: const Text('Button'), + style: variant, + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), + onPress: () {}, ), ), ); @@ -133,56 +118,51 @@ void main() { await expectLater( find.byType(TestScaffold), - matchesGoldenFile('button/$name/$variant/enabled-long-pressed.png'), + matchesGoldenFile('button/${theme.name}/$variant/enabled-long-pressed.png'), ); }); - testWidgets('$name disabled with FButtonContent', (tester) async { + testWidgets('${theme.name} disabled with FButtonContent', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, - background: background, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton( - label: const Text('Button'), - style: variant, - prefix: FIcon(FAssets.icons.circlePlay), - suffix: FIcon(FAssets.icons.circleStop), - onPress: null, - ), + theme: theme.data, + child: FButton( + label: const Text('Button'), + style: variant, + prefix: FIcon(FAssets.icons.circlePlay), + suffix: FIcon(FAssets.icons.circleStop), + onPress: null, ), ), ); - await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/disabled-content.png')); + await expectLater( + find.byType(TestScaffold), + matchesGoldenFile('button/${theme.name}/$variant/disabled-content.png'), + ); }); - testWidgets('$name with enabled raw content', (tester) async { + testWidgets('${theme.name} with enabled raw content', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, - background: background, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton.raw( - style: variant, - onPress: () {}, - child: Padding( - padding: const EdgeInsets.all(50), + theme: theme.data, + child: FButton.raw( + style: variant, + onPress: () {}, + child: Padding( + padding: const EdgeInsets.all(50), + child: Container( + width: 50, + height: 50, + color: Colors.blueAccent, child: Container( width: 50, height: 50, - color: Colors.blueAccent, - child: Container( - width: 50, - height: 50, - decoration: BoxDecoration( - color: Colors.amber, - border: Border.all( - color: Colors.blueAccent, - width: 2, - ), + decoration: BoxDecoration( + color: Colors.amber, + border: Border.all( + color: Colors.blueAccent, + width: 2, ), ), ), @@ -192,34 +172,33 @@ void main() { ), ); - await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/enabled-raw.png')); + await expectLater( + find.byType(TestScaffold), + matchesGoldenFile('button/${theme.name}/$variant/enabled-raw.png'), + ); }); - testWidgets('$name disabled with raw content', (tester) async { + testWidgets('${theme.name} disabled with raw content', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, - background: background, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton.raw( - style: variant, - onPress: null, - child: Padding( - padding: const EdgeInsets.all(50), + theme: theme.data, + child: FButton.raw( + style: variant, + onPress: null, + child: Padding( + padding: const EdgeInsets.all(50), + child: Container( + width: 50, + height: 50, + color: Colors.blueAccent, child: Container( width: 50, height: 50, - color: Colors.blueAccent, - child: Container( - width: 50, - height: 50, - decoration: BoxDecoration( - color: Colors.amber, - border: Border.all( - color: Colors.blueAccent, - width: 2, - ), + decoration: BoxDecoration( + color: Colors.amber, + border: Border.all( + color: Colors.blueAccent, + width: 2, ), ), ), @@ -229,48 +208,46 @@ void main() { ), ); - await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/disabled-raw.png')); + await expectLater( + find.byType(TestScaffold), + matchesGoldenFile('button/${theme.name}/$variant/disabled-raw.png'), + ); }); - testWidgets('$name with enabled icon', (tester) async { + testWidgets('${theme.name} with enabled icon', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, - background: background, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton.icon( - onPress: () {}, - style: variant, - child: FIcon(FAssets.icons.chevronRight), - ), + theme: theme.data, + child: FButton.icon( + onPress: () {}, + style: variant, + child: FIcon(FAssets.icons.chevronRight), ), ), ); await expectLater( find.byType(TestScaffold), - matchesGoldenFile('button/$name/$variant/icon-enabled-button.png'), + matchesGoldenFile('button/${theme.name}/$variant/icon-enabled-button.png'), ); }); - testWidgets('$name with disabled icon', (tester) async { + testWidgets('${theme.name} with disabled icon', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, - background: background, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FButton.icon( - onPress: null, - style: variant, - child: FIcon(FAssets.icons.chevronRight), - ), + theme: theme.data, + child: FButton.icon( + onPress: null, + style: variant, + child: FIcon(FAssets.icons.chevronRight), ), ), ); - await expectLater(find.byType(TestScaffold), matchesGoldenFile('button/$name/$variant/icon-disabled.png')); + await expectLater( + find.byType(TestScaffold), + matchesGoldenFile('button/${theme.name}/$variant/icon-disabled.png'), + ); }); } } diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index 281a12287..14b7bc0bb 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -31,14 +31,14 @@ void main() { await expectLater(find.byType(TestScaffold), isBlueScreen); }); - for (final (name, theme, _) in TestScaffold.themes) { + for (final theme in TestScaffold.themes) { for (final (lineCalendar, controller) in [ ('default', FCalendarController.date(initialSelection: DateTime.utc(2024, 10, 20))), ]) { - testWidgets('$name - $lineCalendar', (tester) async { + testWidgets('$theme.name - $lineCalendar', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, + theme: theme.data, child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), @@ -50,14 +50,14 @@ void main() { await expectLater( find.byType(TestScaffold), - matchesGoldenFile('line_calendar/$name-$lineCalendar/default.png'), + matchesGoldenFile('line_calendar/$theme.name-$lineCalendar/default.png'), ); }); - testWidgets('new date selected - $name', (tester) async { + testWidgets('new date selected - $theme.name', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, + theme: theme.data, child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), @@ -72,14 +72,14 @@ void main() { await expectLater( find.byType(TestScaffold), - matchesGoldenFile('line_calendar/$name-$lineCalendar/new-date.png'), + matchesGoldenFile('line_calendar/$theme.name-$lineCalendar/new-date.png'), ); }); - testWidgets('unselected - $name', (tester) async { + testWidgets('unselected - $theme.name', (tester) async { await tester.pumpWidget( TestScaffold( - theme: theme, + theme: theme.data, child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), @@ -93,7 +93,7 @@ void main() { await expectLater( find.byType(TestScaffold), - matchesGoldenFile('line_calendar/$name-$lineCalendar/unselected.png'), + matchesGoldenFile('line_calendar/$theme.name-$lineCalendar/unselected.png'), ); }); } From e69f77df52a73ccee6b1e3a8e6461530249bee49 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 16:49:36 +0800 Subject: [PATCH 26/44] Tests fixed --- .../widgets/line_calendar/line_calendar.dart | 4 +- .../line_calendar/line_calendar_tile.dart | 4 +- .../line_calendar/zinc-dark-default.png | Bin 49749 -> 0 bytes .../zinc-dark-default/new-date.png | Bin 0 -> 47384 bytes .../line_calendar/zinc-dark-default/today.png | Bin 0 -> 48587 bytes .../zinc-dark-default/unselected.png | Bin 0 -> 44578 bytes .../line_calendar/zinc-light-default.png | Bin 49348 -> 0 bytes .../zinc-light-default/new-date.png | Bin 0 -> 46945 bytes .../zinc-light-default/today.png | Bin 0 -> 48191 bytes .../zinc-light-default/unselected.png | Bin 0 -> 43974 bytes .../widgets/line_calendar_golden_test.dart | 35 ++++++++++++------ 11 files changed, 27 insertions(+), 16 deletions(-) delete mode 100644 forui/test/golden/line_calendar/zinc-dark-default.png create mode 100644 forui/test/golden/line_calendar/zinc-dark-default/new-date.png create mode 100644 forui/test/golden/line_calendar/zinc-dark-default/today.png create mode 100644 forui/test/golden/line_calendar/zinc-dark-default/unselected.png delete mode 100644 forui/test/golden/line_calendar/zinc-light-default.png create mode 100644 forui/test/golden/line_calendar/zinc-light-default/new-date.png create mode 100644 forui/test/golden/line_calendar/zinc-light-default/today.png create mode 100644 forui/test/golden/line_calendar/zinc-light-default/unselected.png diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 9543cbe15..2bc350aad 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -113,11 +113,11 @@ class _FLineCalendarState extends State { final date = widget.start.add(Duration(days: index)); return Container( padding: EdgeInsets.symmetric(horizontal: _style.itemPadding), - child: FlineCalendarTile( + child: FLineCalendarTile( style: _style, controller: widget.controller, date: date, - isToday: widget.today == date, + isToday: widget.today.toLocalDate() == date.toLocalDate(), ), ); }, diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index 2cec2f279..09b29910a 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -9,13 +9,13 @@ import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; const _textSpacing = 2.0; -class FlineCalendarTile extends StatelessWidget { +class FLineCalendarTile extends StatelessWidget { final FLineCalendarStyle style; final FCalendarController controller; final DateTime date; final bool isToday; - const FlineCalendarTile({ + const FLineCalendarTile({ required this.style, required this.controller, required this.date, diff --git a/forui/test/golden/line_calendar/zinc-dark-default.png b/forui/test/golden/line_calendar/zinc-dark-default.png deleted file mode 100644 index ccb803012ed93c56ad8604ff6a9743551c00ce5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49749 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 diff --git a/forui/test/golden/line_calendar/zinc-dark-default/new-date.png b/forui/test/golden/line_calendar/zinc-dark-default/new-date.png new file mode 100644 index 0000000000000000000000000000000000000000..aee2e7cae7708800dfc0fafdf649e83ca072edcd GIT binary patch literal 47384 zcmeFZ1yGgU_clxl3KD{V(jkbHbf+L7NOy~bbV;Xxq=3>55+Zr%KA=+4-QCThJKlZN z=lA^n^Ugc-&3yCCyx)w>95~){pZn~+_S)B4*R|F*SV2zm?wyBs5D*aVN=u0=At2l~ zKtMo4N52KGR1cq{fIo;1N|Is-MLi_z;2$UsV$v$;;Ku{qCmR7p@Llc;=WOfSG@a3^Y3Poy7w=}(%k+x^hTom zn~_N){hO%MApXnWA`$+j^?x6afZ+4jH~^#mdJZtc-)#kqK=Bt8{({2qtmQ8#`~`*I zp70kGfF1s33UFum3ktvp|1UBHHxWe{5M_V$0*L%g#(^>aG8JHizcdaQ;V;JpM)(T~ zzzF}JfP$MUxlhyJx;RO~R&$pM%aTOi*M5VhJ(j{$?#HxcZSBN0bJGyG@cE>kpRE3-;dG>GO6}+q z(L0Fu;_QNrz5u!Y=|bGX_^L2@sEiE!dDVmy-=Y8GAw2{W-wB+!H<&yYlj5)sFIcrw za`CD#^Mz0{heN}7gt$p1O-wTe_hd?51~k25WMpc&T+qVI&_1$zVv4bCj4?Sb=05(z zsj^S6vKS02j>+=ZW%Wb1X_qxYSU9`zu1o!mCw9x!mgTVI0uB>1Q%hN|x6t)ruP`Be zc!p2MzMf0P*t3+!xxWI_W6>T1W9lTREPH=k`hFYB0t2bQ4cCBkOkA8KZM(IT2)99jU&VfA!*CSXp%F-?oOxqxp#z6cjXXY`lQ~X?aiOr{BX7L{6v*}xeu&yJM_=}|NR(M z%U7A+3*Q0X=Lmu_S}4Hy|2U3@Kkqatu1 z>8*35_`C=D&0@lfWef>Yf~uWf41c{hucY{vM~JBA_m&Trn>-<8Jb}RmPnZaEVIccV zLr16J&{D<1+L}3>l)s@+R!>JS90OyszuEbw9JQ#0!1CRX|9WLuX~(ahEGEoeR-9h9 zk>#F09{RR=y$@NC^j@%JgcPWFMkBB4&1p?Ifgy|<{%7!kb*PAHQ1s%58IuoMi6eSj zmsD@G>|9-Wnf2=D4jh9|XM4Ayd#y=^CMG7Ez3@pjuEZI>9!u^GuRwMB-wYAUlw5no zv`6QC%D;Ea-&nYjsX%?RJ0RSG?X^a|R{^=P7?$LHx`XO880-F>U@VMj4C(!^7s(6( zipJ5vb`Qyw_;8?sHy`d^>mvK)%#O{gSCo2QXNK9UhL?;?OwX$(C*2C+ej_i}{G%g% zBa;+e+W=yTct_jk2LZ6_fgK^mK^6kK^o0$Kk;R<75p>i=kh+PEJy{3{4;4mnUX7&Wcm#r^vt@o zD(eYE-ue0Y{p+&Lhlg*)#bsa0wb~Yw=a0>HP}ve)z`{THHO5yMnUB8Z#RcbKi_9#EHwR}*R+2#q z7#Ti}mz|xdzjk$X-Q2s|7A_9?(uiyM?h4rSAM?H$Ah51m?%vx=6VyIpeG{aA*4*2o zZCzKf@j9!Ta4dp$8l&=?*FUyU9E=mh#pNcc*>}y{+}yOA|MC7s@3SkNdKb!((a|ch zwB#hW>D34ZZG*;tz5u>{rSEfuu1nUO>cCV2z@NQP`D@wXHYq!nV*QsjgkVIazej|C zsAhFkhg+uZxw6(0N@&Pa0Gm8j44bzlVrlfS+uYld6+Y*@@GhzRCi>rV_(8DKc#?Yh zZ81X46Z7E;a)j_hY$03y;kIh#9aJnayd6~SIf_4X@IlD0lp}-gYo^J_gie|(Rg+m* zSd^5Pmmi%5P+yIDURRf(VudgPH2CcS64O8J4Tpme$rgn->#*Or==GRKFdrY}cl3 z134$+m?E`-3eGsS<({s3pJ@$C*3h0HWhzwx$RWD_2PY;v_zi};ww7YZ$M^T`F$0fI zyHr|dZ=kX(v~3roe!spuC0XdoAX)gvuzvSP+~QPC∾d!UmGn-bSJvdEsgZ%<4ZY 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
mqhn(3$@r@O#|9&X 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 IynO5b0I&{rL;wH) literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-dark-default/today.png b/forui/test/golden/line_calendar/zinc-dark-default/today.png new file mode 100644 index 0000000000000000000000000000000000000000..edcc359d23265d9696264d94aafc15542bc912a2 GIT binary patch literal 48587 zcmeFabx_s&8a@gLilPFdpwb~ADIg(TiYU^sXcP%S8tF6;47#LSV9_m&C@tNMfONxR z(cE`=_CEW}J?D=*bLY<7-;B&GS+4zE-*`W7JkRsKANM;&d6^66uAjrg!nz=PUs@Rp z>+EAJtTXudr{R+?efzlZ3)@avMiMKhonit0f@>!!tBMalZuo}2SXeYzveFW&PBF{F z`4_xyVb$h!CkhFj)W}*rBYk72A9%_(`@s1OeC=O9jk5#Tf4|4_G^)k<`!BxdHU55! z6@*Rj_j?-d$NxTF`ZU|$AA2=<;r;!d=vv<2Z?Wi3k^cQ&-0;uI|F*>+v;6UvzkK0O z5dFz5f4Rb+l>4Vx{N)ONYUm$m@s}(7L0o@;=wGhz2SWd07Js?IAHwyAhyLXXf9Uxi zVc~CA_#-U*A1W+7E_8IH4WDqNY^>p#i;3jnSrVPeD0(C*7v+_D6jt0E-1)}$ z2I(8R-n8%s5=k$T^VMH>6I9*Izdj`;5p?c7tMd852Z>~o%H)+qT&ZKe%-v(=#{4`c zaqT}grc8_-DGGTG#_VQ2kLONYblYU#j#2;E`>{s1c1S3T^AFl)!2XAX1!Mig&1L@) z_yQUJ3Ap>0{>j4(Xa6bB!MOjRwm+wb@cd&OFv1_t0V9b22`jL|pQP|7DS!pw=TA}q zBm7AU7+3g{6u=07kOCOtPf`FQ{J%&FyLlFCf6oG7{Q=`(%s)&8j6m~;#$jQ3{o%Oa z3V)Kq|3^uoH)kJ7w>ix===ZD z%f);TEy?qRY{!_O?JI zfumRgsiUo{*%^^f`7a_xag+P}+XTvQk^9Wf8JM+j)-zr^e>%T+seWqHWjk37Wy4}Z z&}KwHRy>mJw7z>V&E#>ou{-&VumNtiPi6{>9qqD_N>)wbxq(QVV%0y=+CGR@qs~xX z^`5omTsFjfS7=DmZm3Saq*JFPFNFPe1p9w~+#_Kj;ibljlXaGll2~R=+s5h1F}qAn zaq*QS4>3OegZ%uifUmV9iSnO6e@^N#mC5Y$cc`H3={Y$`dw=ot>o0kuAL_@A%_(

pDqr5&f7 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 diff --git a/forui/test/golden/line_calendar/zinc-light-default/new-date.png b/forui/test/golden/line_calendar/zinc-light-default/new-date.png new file mode 100644 index 0000000000000000000000000000000000000000..fc87252d2cc31babcd989b18442526259e15cc69 GIT binary patch literal 46945 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 literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-light-default/today.png b/forui/test/golden/line_calendar/zinc-light-default/today.png new file mode 100644 index 0000000000000000000000000000000000000000..16cadd1104501909f9793d658c1d3fc7b9117836 GIT binary patch literal 48191 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�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 literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-light-default/unselected.png b/forui/test/golden/line_calendar/zinc-light-default/unselected.png new file mode 100644 index 0000000000000000000000000000000000000000..131c5e84b8e83c0e33cc7d734fdcd21c2b1e4170 GIT binary patch literal 43974 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 literal 0 HcmV?d00001 diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index 14b7bc0bb..6f4524c07 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -9,6 +9,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; +import 'package:forui/src/widgets/line_calendar/line_calendar_tile.dart'; import '../test_scaffold.dart'; void main() { @@ -42,7 +43,10 @@ void main() { child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), - child: FLineCalendar(controller: controller), + child: FLineCalendar( + controller: controller, + today: DateTime.utc(2024, 10, 20), + ), ), ), ), @@ -50,50 +54,57 @@ void main() { await expectLater( find.byType(TestScaffold), - matchesGoldenFile('line_calendar/$theme.name-$lineCalendar/default.png'), + matchesGoldenFile('line_calendar/${theme.name}-$lineCalendar/today.png'), ); }); - testWidgets('new date selected - $theme.name', (tester) async { + testWidgets('$theme.name - unselected', (tester) async { await tester.pumpWidget( TestScaffold( theme: theme.data, child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), - child: FLineCalendar(controller: controller), + child: FLineCalendar( + controller: controller, + today: DateTime.utc(2024, 10, 20), + ), ), ), ), ); - await tester.tap(find.text('24')); - await tester.pumpAndSettle(); + await tester.tap(find.text('20')); + await tester.pumpAndSettle(const Duration(milliseconds: 300)); await expectLater( find.byType(TestScaffold), - matchesGoldenFile('line_calendar/$theme.name-$lineCalendar/new-date.png'), + matchesGoldenFile('line_calendar/${theme.name}-$lineCalendar/unselected.png'), ); }); - testWidgets('unselected - $theme.name', (tester) async { + testWidgets('$theme.name - new date selected', (tester) async { await tester.pumpWidget( TestScaffold( theme: theme.data, child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), - child: FLineCalendar(controller: controller), + child: FLineCalendar( + controller: controller, + today: DateTime.utc(2024, 10, 20), + ), ), ), ), ); - await tester.tap(find.text('20')); - await tester.pumpAndSettle(); + + await tester.tap(find.text('24')); + await tester.pumpAndSettle(const Duration(milliseconds: 300)); await expectLater( find.byType(TestScaffold), - matchesGoldenFile('line_calendar/$theme.name-$lineCalendar/unselected.png'), + matchesGoldenFile('line_calendar/${theme.name}-$lineCalendar/new-date.png'), ); }); } From cebf4f12f7da74141f61cb231f16c59eb8771bfe Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 16:54:12 +0800 Subject: [PATCH 27/44] fixed dart analyser issues --- forui/example/lib/sandbox.dart | 6 ------ .../lib/src/widgets/button/button_styles.dart | 2 +- .../widgets/line_calendar/line_calendar.dart | 19 ++++++++++++++----- .../line_calendar/line_calendar_tile.dart | 7 +++++-- forui/lib/widgets/line_calendar.dart | 9 --------- .../widgets/button/button_golden_test.dart | 2 +- .../widgets/line_calendar_golden_test.dart | 3 --- 7 files changed, 21 insertions(+), 27 deletions(-) delete mode 100644 forui/lib/widgets/line_calendar.dart diff --git a/forui/example/lib/sandbox.dart b/forui/example/lib/sandbox.dart index 24efaecb3..07dba4424 100644 --- a/forui/example/lib/sandbox.dart +++ b/forui/example/lib/sandbox.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:forui/forui.dart'; -import 'package:forui/widgets/line_calendar.dart'; class Sandbox extends StatefulWidget { const Sandbox({super.key}); @@ -32,11 +31,6 @@ class _SandboxState extends State { ), const SizedBox(height: 20), const FTextField.password(), - FLineCalendar( - controller: FCalendarController.date( - initialSelection: DateTime.utc(2024, 9, 13), - ), - ), const SizedBox(height: 20), FTooltip( longPressExitDuration: const Duration(seconds: 5000), diff --git a/forui/lib/src/widgets/button/button_styles.dart b/forui/lib/src/widgets/button/button_styles.dart index 3f39de997..b2152d7f7 100644 --- a/forui/lib/src/widgets/button/button_styles.dart +++ b/forui/lib/src/widgets/button/button_styles.dart @@ -167,4 +167,4 @@ final class FButtonStyles with Diagnosticable { @override int get hashCode => primary.hashCode ^ secondary.hashCode ^ destructive.hashCode ^ outline.hashCode ^ ghost.hashCode; -} \ No newline at end of file +} diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 2bc350aad..021cb3c70 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -56,7 +56,10 @@ class FLineCalendar extends StatefulWidget { super.debugFillProperties(properties); properties ..add(DiagnosticsProperty('style', style)) - ..add(DiagnosticsProperty('controller', controller)); + ..add(DiagnosticsProperty('controller', controller)) + ..add(DiagnosticsProperty('start', start)) + ..add(DiagnosticsProperty('end', end)) + ..add(DiagnosticsProperty('today', today)); } } @@ -93,13 +96,19 @@ class _FLineCalendarState extends State { onKeyEvent: (node, event) { if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.arrowRight) { widget.controller.value = widget.controller.value?.add(const Duration(days: 1)); - _controller.animateTo(_controller.offset + _size, - duration: const Duration(milliseconds: 100), curve: Curves.easeInOut); + _controller.animateTo( + _controller.offset + _size, + duration: const Duration(milliseconds: 100), + curve: Curves.easeInOut, + ); return KeyEventResult.handled; } else if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.arrowLeft) { widget.controller.value = widget.controller.value?.subtract(const Duration(days: 1)); - _controller.animateTo(_controller.offset - _size, - duration: const Duration(milliseconds: 100), curve: Curves.easeInOut); + _controller.animateTo( + _controller.offset - _size, + duration: const Duration(milliseconds: 100), + curve: Curves.easeInOut, + ); return KeyEventResult.handled; } return KeyEventResult.ignored; diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index 09b29910a..a3d537c4c 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -1,14 +1,15 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:forui/forui.dart'; -import 'package:forui/src/foundation/tappable.dart'; import 'package:forui/src/foundation/util.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; +import 'package:meta/meta.dart'; //TODO: localizations. const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; const _textSpacing = 2.0; +@internal class FLineCalendarTile extends StatelessWidget { final FLineCalendarStyle style; final FCalendarController controller; @@ -20,6 +21,7 @@ class FLineCalendarTile extends StatelessWidget { required this.controller, required this.date, required this.isToday, + super.key, }); Color _style(BuildContext context, bool selected) => switch ((selected, isToday)) { @@ -94,6 +96,7 @@ class FLineCalendarTile extends StatelessWidget { properties ..add(DiagnosticsProperty('style', style)) ..add(DiagnosticsProperty('date', date)) - ..add(DiagnosticsProperty('today', isToday)); + ..add(DiagnosticsProperty('today', isToday)) + ..add(DiagnosticsProperty('controller', controller)); } } diff --git a/forui/lib/widgets/line_calendar.dart b/forui/lib/widgets/line_calendar.dart deleted file mode 100644 index 761b56950..000000000 --- a/forui/lib/widgets/line_calendar.dart +++ /dev/null @@ -1,9 +0,0 @@ -/// {@category Widgets} -/// -/// A line calendar that allows users to select a single date. -/// -/// See https://forui.dev/docs/line-calendar for working examples. -library forui.widgets.lineCalendar; - -export '../src/widgets/line_calendar/line_calendar.dart'; -export '../src/widgets/line_calendar/line_calendar_tile.dart'; diff --git a/forui/test/src/widgets/button/button_golden_test.dart b/forui/test/src/widgets/button/button_golden_test.dart index b37af9ac8..816204972 100644 --- a/forui/test/src/widgets/button/button_golden_test.dart +++ b/forui/test/src/widgets/button/button_golden_test.dart @@ -252,4 +252,4 @@ void main() { } } }); -} \ No newline at end of file +} diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index 6f4524c07..bfbbaebeb 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -1,15 +1,12 @@ @Tags(['golden']) library; -import 'dart:ui'; - import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; -import 'package:forui/src/widgets/line_calendar/line_calendar_tile.dart'; import '../test_scaffold.dart'; void main() { From b648877c4407a7f33384548bc6b7b3ddce681e3a Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 08:56:34 +0000 Subject: [PATCH 28/44] Commit from GitHub Actions (Forui Presubmit) --- forui/example/pubspec.lock | 61 +++++- forui/lib/src/theme/theme_data.dart | 2 - .../lib/src/widgets/button/button_styles.dart | 194 +++++++++--------- .../widgets/line_calendar/line_calendar.dart | 5 +- .../line_calendar/line_calendar_tile.dart | 4 +- .../widgets/line_calendar_golden_test.dart | 2 +- 6 files changed, 161 insertions(+), 107 deletions(-) diff --git a/forui/example/pubspec.lock b/forui/example/pubspec.lock index 3569e2b1e..7b670565c 100644 --- a/forui/example/pubspec.lock +++ b/forui/example/pubspec.lock @@ -174,6 +174,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.7" + dbus: + dependency: transitive + description: + name: dbus + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" + source: hosted + version: "0.7.10" fake_async: dependency: transitive description: @@ -237,21 +245,26 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" forui: dependency: "direct main" description: path: ".." relative: true source: path - version: "0.5.1" + version: "0.6.1" forui_assets: dependency: transitive description: name: forui_assets - sha256: "69575b73e96f509c2f54c1a7eff47b6034d0a55b6083a0ffc894f4ef071bfd9d" + sha256: "48a036b329a855db9a18ebb3db98d5e9d1320479d747b48efd4e698ec7b1f178" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.3.0" frontend_server_client: dependency: transitive description: @@ -444,6 +457,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: df3eb3e0aed5c1107bb0fdb80a8e82e778114958b1c5ac5644fb1ac9cae8a998 + url: "https://pub.dev" + source: hosted + version: "8.1.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 + url: "https://pub.dev" + source: hosted + version: "3.0.1" path: dependency: transitive description: @@ -705,6 +734,22 @@ packages: url: "https://pub.dev" source: hosted version: "14.2.5" + wakelock_plus: + dependency: "direct main" + description: + name: wakelock_plus + sha256: bf4ee6f17a2fa373ed3753ad0e602b7603f8c75af006d5b9bdade263928c0484 + url: "https://pub.dev" + source: hosted + version: "1.2.8" + wakelock_plus_platform_interface: + dependency: transitive + description: + name: wakelock_plus_platform_interface + sha256: "422d1cdbb448079a8a62a5a770b69baa489f8f7ca21aef47800c726d404f9d16" + url: "https://pub.dev" + source: hosted + version: "1.2.1" watcher: dependency: transitive description: @@ -737,6 +782,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" + win32: + dependency: transitive + description: + name: win32 + sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2" + url: "https://pub.dev" + source: hosted + version: "5.8.0" xdg_directories: dependency: transitive description: @@ -762,5 +815,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.5.0-259.0.dev <4.0.0" + dart: ">=3.5.0 <4.0.0" flutter: ">=3.24.0" diff --git a/forui/lib/src/theme/theme_data.dart b/forui/lib/src/theme/theme_data.dart index cc807ff2e..244529f15 100644 --- a/forui/lib/src/theme/theme_data.dart +++ b/forui/lib/src/theme/theme_data.dart @@ -4,9 +4,7 @@ import 'package:flutter/rendering.dart'; import 'package:meta/meta.dart'; import 'package:forui/forui.dart'; - import 'package:forui/src/theme/breakpoints.dart'; - import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; /// Defines the configuration of the overall visual [FTheme] for a widget subtree. diff --git a/forui/lib/src/widgets/button/button_styles.dart b/forui/lib/src/widgets/button/button_styles.dart index b2152d7f7..be6dc1b9d 100644 --- a/forui/lib/src/widgets/button/button_styles.dart +++ b/forui/lib/src/widgets/button/button_styles.dart @@ -35,96 +35,96 @@ final class FButtonStyles with Diagnosticable { /// [style]. FButtonStyles.inherit({required FColorScheme colorScheme, required FTypography typography, required FStyle style}) : this( - primary: FButtonCustomStyle.inherit( - style: style, - typography: typography, - enabledBoxColor: colorScheme.primary, - enabledHoveredBoxColor: colorScheme.hover(colorScheme.primary), - disabledBoxColor: colorScheme.disable(colorScheme.primary), - enabledContentColor: colorScheme.primaryForeground, - disabledContentColor: colorScheme.disable( - colorScheme.primaryForeground, - colorScheme.disable(colorScheme.primary), - ), - ), - secondary: FButtonCustomStyle.inherit( - style: style, - typography: typography, - enabledBoxColor: colorScheme.secondary, - enabledHoveredBoxColor: colorScheme.hover(colorScheme.secondary), - disabledBoxColor: colorScheme.disable(colorScheme.secondary), - enabledContentColor: colorScheme.secondaryForeground, - disabledContentColor: colorScheme.disable( - colorScheme.secondaryForeground, - colorScheme.disable(colorScheme.secondary), - ), - ), - destructive: FButtonCustomStyle.inherit( - style: style, - typography: typography, - enabledBoxColor: colorScheme.destructive, - enabledHoveredBoxColor: colorScheme.hover(colorScheme.destructive), - disabledBoxColor: colorScheme.disable(colorScheme.destructive), - enabledContentColor: colorScheme.destructiveForeground, - disabledContentColor: colorScheme.disable( - colorScheme.destructiveForeground, - colorScheme.disable(colorScheme.destructive), - ), - ), - outline: FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.border), - borderRadius: style.borderRadius, - ), - enabledHoverBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.border), - borderRadius: style.borderRadius, - color: colorScheme.secondary, - ), - disabledBoxDecoration: BoxDecoration( - border: Border.all(color: colorScheme.disable(colorScheme.border)), - borderRadius: style.borderRadius, - ), - contentStyle: FButtonContentStyle.inherit( - typography: typography, - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), - ), - iconContentStyle: FButtonIconContentStyle( - enabledColor: colorScheme.secondaryForeground, - disabledColor: colorScheme.disable(colorScheme.secondaryForeground), - ), - spinnerStyle: FButtonSpinnerStyle.inherit( - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), - ), - ), - ghost: FButtonCustomStyle( - enabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - ), - enabledHoverBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - color: colorScheme.secondary, - ), - disabledBoxDecoration: BoxDecoration( - borderRadius: style.borderRadius, - ), - contentStyle: FButtonContentStyle.inherit( - typography: typography, - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), - ), - iconContentStyle: FButtonIconContentStyle( - enabledColor: colorScheme.secondaryForeground, - disabledColor: colorScheme.disable(colorScheme.secondaryForeground), - ), - spinnerStyle: FButtonSpinnerStyle.inherit( - enabled: colorScheme.secondaryForeground, - disabled: colorScheme.disable(colorScheme.secondaryForeground), - ), - ), - ); + primary: FButtonCustomStyle.inherit( + style: style, + typography: typography, + enabledBoxColor: colorScheme.primary, + enabledHoveredBoxColor: colorScheme.hover(colorScheme.primary), + disabledBoxColor: colorScheme.disable(colorScheme.primary), + enabledContentColor: colorScheme.primaryForeground, + disabledContentColor: colorScheme.disable( + colorScheme.primaryForeground, + colorScheme.disable(colorScheme.primary), + ), + ), + secondary: FButtonCustomStyle.inherit( + style: style, + typography: typography, + enabledBoxColor: colorScheme.secondary, + enabledHoveredBoxColor: colorScheme.hover(colorScheme.secondary), + disabledBoxColor: colorScheme.disable(colorScheme.secondary), + enabledContentColor: colorScheme.secondaryForeground, + disabledContentColor: colorScheme.disable( + colorScheme.secondaryForeground, + colorScheme.disable(colorScheme.secondary), + ), + ), + destructive: FButtonCustomStyle.inherit( + style: style, + typography: typography, + enabledBoxColor: colorScheme.destructive, + enabledHoveredBoxColor: colorScheme.hover(colorScheme.destructive), + disabledBoxColor: colorScheme.disable(colorScheme.destructive), + enabledContentColor: colorScheme.destructiveForeground, + disabledContentColor: colorScheme.disable( + colorScheme.destructiveForeground, + colorScheme.disable(colorScheme.destructive), + ), + ), + outline: FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.border), + borderRadius: style.borderRadius, + ), + enabledHoverBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.border), + borderRadius: style.borderRadius, + color: colorScheme.secondary, + ), + disabledBoxDecoration: BoxDecoration( + border: Border.all(color: colorScheme.disable(colorScheme.border)), + borderRadius: style.borderRadius, + ), + contentStyle: FButtonContentStyle.inherit( + typography: typography, + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + iconContentStyle: FButtonIconContentStyle( + enabledColor: colorScheme.secondaryForeground, + disabledColor: colorScheme.disable(colorScheme.secondaryForeground), + ), + spinnerStyle: FButtonSpinnerStyle.inherit( + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + ), + ghost: FButtonCustomStyle( + enabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + ), + enabledHoverBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + color: colorScheme.secondary, + ), + disabledBoxDecoration: BoxDecoration( + borderRadius: style.borderRadius, + ), + contentStyle: FButtonContentStyle.inherit( + typography: typography, + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + iconContentStyle: FButtonIconContentStyle( + enabledColor: colorScheme.secondaryForeground, + disabledColor: colorScheme.disable(colorScheme.secondaryForeground), + ), + spinnerStyle: FButtonSpinnerStyle.inherit( + enabled: colorScheme.secondaryForeground, + disabled: colorScheme.disable(colorScheme.secondaryForeground), + ), + ), + ); /// Returns a copy of this [FButtonStyles] with the given properties replaced. @useResult @@ -157,13 +157,13 @@ final class FButtonStyles with Diagnosticable { @override bool operator ==(Object other) => identical(this, other) || - other is FButtonStyles && - runtimeType == other.runtimeType && - primary == other.primary && - secondary == other.secondary && - destructive == other.destructive && - outline == other.outline && - ghost == other.ghost; + other is FButtonStyles && + runtimeType == other.runtimeType && + primary == other.primary && + secondary == other.secondary && + destructive == other.destructive && + outline == other.outline && + ghost == other.ghost; @override int get hashCode => primary.hashCode ^ secondary.hashCode ^ destructive.hashCode ^ outline.hashCode ^ ghost.hashCode; diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 021cb3c70..c87dd6681 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -2,12 +2,13 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:forui/forui.dart'; -import 'package:forui/src/widgets/line_calendar/line_calendar_tile.dart'; import 'package:meta/meta.dart'; import 'package:sugar/sugar.dart'; +import 'package:forui/forui.dart'; +import 'package:forui/src/widgets/line_calendar/line_calendar_tile.dart'; + const _textSpacing = 2.0; /// A calendar that can be scrolled horizontally. diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index a3d537c4c..4c99fcf74 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -1,9 +1,11 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; + +import 'package:meta/meta.dart'; + import 'package:forui/forui.dart'; import 'package:forui/src/foundation/util.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; -import 'package:meta/meta.dart'; //TODO: localizations. const _days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index bfbbaebeb..5072c98ef 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -4,8 +4,8 @@ library; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:forui/forui.dart'; +import 'package:forui/forui.dart'; import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; import '../test_scaffold.dart'; From 86f50e2413026e6a32a8fe80509165b8cf9c90df Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 17:12:30 +0800 Subject: [PATCH 29/44] Update theme_data.dart --- forui/lib/src/theme/theme_data.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/forui/lib/src/theme/theme_data.dart b/forui/lib/src/theme/theme_data.dart index 244529f15..110588d9b 100644 --- a/forui/lib/src/theme/theme_data.dart +++ b/forui/lib/src/theme/theme_data.dart @@ -69,6 +69,9 @@ final class FThemeData with Diagnosticable { /// The label styles. final FLabelStyles labelStyles; + /// The line calendar style. + final FLineCalendarStyle lineCalendarStyle; + /// The popover's style. final FPopoverStyle popoverStyle; @@ -130,6 +133,7 @@ final class FThemeData with Diagnosticable { required this.dividerStyles, required this.headerStyle, required this.labelStyles, + required this.lineCalendarStyle, required this.popoverStyle, required this.popoverMenuStyle, required this.progressStyle, @@ -172,6 +176,7 @@ final class FThemeData with Diagnosticable { dividerStyles: FDividerStyles.inherit(colorScheme: colorScheme, style: style), headerStyle: FHeaderStyles.inherit(colorScheme: colorScheme, typography: typography, style: style), labelStyles: FLabelStyles.inherit(style: style), + lineCalendarStyle: FLineCalendarStyle.inherit(colorScheme: colorScheme, style: style, typography: typography), popoverStyle: FPopoverStyle.inherit(colorScheme: colorScheme, style: style), popoverMenuStyle: FPopoverMenuStyle.inherit(colorScheme: colorScheme, style: style, typography: typography), progressStyle: FProgressStyle.inherit(colorScheme: colorScheme, style: style), @@ -248,6 +253,7 @@ final class FThemeData with Diagnosticable { FDividerStyles? dividerStyles, FHeaderStyles? headerStyle, FLabelStyles? labelStyles, + FLineCalendarStyle? lineCalendarStyle, FPopoverStyle? popoverStyle, FPopoverMenuStyle? popoverMenuStyle, FProgressStyle? progressStyle, @@ -279,6 +285,7 @@ final class FThemeData with Diagnosticable { dividerStyles: dividerStyles ?? this.dividerStyles, headerStyle: headerStyle ?? this.headerStyle, labelStyles: labelStyles ?? this.labelStyles, + lineCalendarStyle: lineCalendarStyle ?? this.lineCalendarStyle, popoverStyle: popoverStyle ?? this.popoverStyle, popoverMenuStyle: popoverMenuStyle ?? this.popoverMenuStyle, progressStyle: progressStyle ?? this.progressStyle, @@ -315,6 +322,7 @@ final class FThemeData with Diagnosticable { ..add(DiagnosticsProperty('dividerStyles', dividerStyles, level: DiagnosticLevel.debug)) ..add(DiagnosticsProperty('headerStyle', headerStyle, level: DiagnosticLevel.debug)) ..add(DiagnosticsProperty('labelStyles', labelStyles, level: DiagnosticLevel.debug)) + ..add(DiagnosticsProperty('lineCalendarStyle', lineCalendarStyle)) ..add(DiagnosticsProperty('popoverStyle', popoverStyle, level: DiagnosticLevel.debug)) ..add(DiagnosticsProperty('popoverMenuStyle', popoverMenuStyle, level: DiagnosticLevel.debug)) ..add(DiagnosticsProperty('progressStyle', progressStyle, level: DiagnosticLevel.debug)) @@ -352,6 +360,7 @@ final class FThemeData with Diagnosticable { dividerStyles == other.dividerStyles && headerStyle == other.headerStyle && labelStyles == other.labelStyles && + lineCalendarStyle == other.lineCalendarStyle && popoverStyle == other.popoverStyle && popoverMenuStyle == other.popoverMenuStyle && progressStyle == other.progressStyle && @@ -385,6 +394,7 @@ final class FThemeData with Diagnosticable { dividerStyles.hashCode ^ headerStyle.hashCode ^ labelStyles.hashCode ^ + lineCalendarStyle.hashCode ^ popoverStyle.hashCode ^ popoverMenuStyle.hashCode ^ progressStyle.hashCode ^ From 35c4370c8abc499644892bda81071093d608f625 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 09:02:21 +0000 Subject: [PATCH 30/44] Commit from GitHub Actions (Forui Presubmit) --- forui/lib/src/theme/theme_data.dart | 1 - .../lib/src/widgets/line_calendar/line_calendar.dart | 12 ++++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/forui/lib/src/theme/theme_data.dart b/forui/lib/src/theme/theme_data.dart index 110588d9b..36317bde0 100644 --- a/forui/lib/src/theme/theme_data.dart +++ b/forui/lib/src/theme/theme_data.dart @@ -5,7 +5,6 @@ import 'package:meta/meta.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/theme/breakpoints.dart'; -import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; /// Defines the configuration of the overall visual [FTheme] for a widget subtree. /// diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index c87dd6681..126cbae45 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -2,6 +2,18 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; +import 'package:forui/forui.dart'; +import 'package:forui/forui.dart'; +import 'package:forui/forui.dart'; +import 'package:forui/forui.dart'; +import 'package:forui/src/theme/theme_data.dart'; +import 'package:forui/src/theme/theme_data.dart'; +import 'package:forui/src/theme/theme_data.dart'; +import 'package:forui/src/theme/theme_data.dart'; +import 'package:forui/theme.dart'; +import 'package:forui/theme.dart'; +import 'package:forui/theme.dart'; +import 'package:forui/theme.dart'; import 'package:meta/meta.dart'; import 'package:sugar/sugar.dart'; From f53e623a3a166fab4faff4aa57a8b494ba0006a1 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 17:14:04 +0800 Subject: [PATCH 31/44] Update theme_data.dart --- forui/lib/src/theme/theme_data.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/forui/lib/src/theme/theme_data.dart b/forui/lib/src/theme/theme_data.dart index 36317bde0..bbc83c53f 100644 --- a/forui/lib/src/theme/theme_data.dart +++ b/forui/lib/src/theme/theme_data.dart @@ -1,5 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; +import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; import 'package:meta/meta.dart'; From d12bfc0eb39177c7b3dd7c82917b5629c4f9eef2 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 09:16:08 +0000 Subject: [PATCH 32/44] Commit from GitHub Actions (Forui Presubmit) --- forui/lib/src/theme/theme_data.dart | 2 +- .../lib/src/widgets/line_calendar/line_calendar.dart | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/forui/lib/src/theme/theme_data.dart b/forui/lib/src/theme/theme_data.dart index bbc83c53f..110588d9b 100644 --- a/forui/lib/src/theme/theme_data.dart +++ b/forui/lib/src/theme/theme_data.dart @@ -1,11 +1,11 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; -import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; import 'package:meta/meta.dart'; import 'package:forui/forui.dart'; import 'package:forui/src/theme/breakpoints.dart'; +import 'package:forui/src/widgets/line_calendar/line_calendar.dart'; /// Defines the configuration of the overall visual [FTheme] for a widget subtree. /// diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 126cbae45..c87dd6681 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -2,18 +2,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:forui/forui.dart'; -import 'package:forui/forui.dart'; -import 'package:forui/forui.dart'; -import 'package:forui/forui.dart'; -import 'package:forui/src/theme/theme_data.dart'; -import 'package:forui/src/theme/theme_data.dart'; -import 'package:forui/src/theme/theme_data.dart'; -import 'package:forui/src/theme/theme_data.dart'; -import 'package:forui/theme.dart'; -import 'package:forui/theme.dart'; -import 'package:forui/theme.dart'; -import 'package:forui/theme.dart'; import 'package:meta/meta.dart'; import 'package:sugar/sugar.dart'; From 4841ed8893784b44548926a1dc00e01ea68030f8 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 18:42:18 +0800 Subject: [PATCH 33/44] fixing rebase issues --- docs/pages/docs/index.mdx | 8 +- forui/CHANGELOG.md | 180 ++++++++++++++++-- forui/example/lib/sandbox.dart | 51 ++--- forui/lib/forui.dart | 3 +- .../widgets/calendar/calendar_controller.dart | 2 +- 5 files changed, 184 insertions(+), 60 deletions(-) diff --git a/docs/pages/docs/index.mdx b/docs/pages/docs/index.mdx index d3b801a20..36543e290 100644 --- a/docs/pages/docs/index.mdx +++ b/docs/pages/docs/index.mdx @@ -37,12 +37,8 @@ To use Forui widgets in your Flutter app, import the Forui package and place the It is perfectly fine to use Cupertino/Material widgets alongside Forui widgets! - -```dart filename="main.dart" {3,12-16} -import 'package:flutter/material.dart'; - ```dart filename="main.dart" {3,12-18} -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:forui/forui.dart'; @@ -70,4 +66,4 @@ Forui provides a set of predefined themes that you can use out of the box. In the example above, we used the `FThemes.zinc.light` theme, which is a light theme variant of the zinc color scheme. Themes are a very powerful building block in Forui, allowing you to customize the look and feel of your app. -To learn more about themes, refer to the [Themes](/docs/themes) page. +To learn more about themes, refer to the [Themes](/docs/themes) page. \ No newline at end of file diff --git a/forui/CHANGELOG.md b/forui/CHANGELOG.md index 622009590..e1c56a24f 100644 --- a/forui/CHANGELOG.md +++ b/forui/CHANGELOG.md @@ -1,14 +1,170 @@ -## 0.6.0 (Next) +## 0.7.0 (Next) ### Additions +* Add `FButtonSpinner`. + +* Add `FBreakpoints`. + +* Add `FIcon.empty()`. + +* Add `FTappable`. + +* Add `FTile`. + +* Add `FTileGroup`. + +* Add `FSelectTile`. + +* Add `FSelectTileGroup`. + +* Add `FCalendarDayPickerStyle.tileSize`. + +* Add `FPopover.ignoreDirectionalPadding`. + +* Add `FPopover.tappable(...)`. + +* Add `FPopoverMenu`. + +* Add `FPortal.offset`. + +### Changes + +* **Breaking** Change `FPopover()` to not automatically wrap a target in a `GestureDetector` - use `FPopover.tappable(...)` + instead. + +### Fixes + +* Change FButton's animation to only start on mouse down and up. + +* Fix `FLabel` not showing error message if label and description are null. + +* Fix `FSelectGroup` not properly disposing callbacks. + + +## 0.6.1 + +* Fix range slider not displaying tooltip for minimum thumb. + + +## 0.6.0 + +### Additions + +* Add `FAccordion`. + +* Add `FSlider`. + +* Add `FButtonStyles.ghost`. + * Add `FButtonCustomStyle.enabledHoverBoxDecoration`. +* Add `FTextField.contentInsertionConfiguration`. + +* Add `FTextField.mouseCursor`. + +* Add `FTextField.forceErrorText`. + +* Add `FIcon`. + +* Add `FColorScheme.disable(...)`. + +* Add `FColorScheme.disableOpacity`. + +* Add `FColorScheme.hover(...)`. + +* Add `FColorScheme.enabledHoveredOpacity`. + +* Add `FChangeNotifier`. + +* Add `FValueNotifier`. ### Changes * Change button to change color when hovering over it. +* Change `FCalendar` year picker to update the header whenever a year is selected. + +* Increase `FCalendar`'s default text size from `FTypography.sm` to `FTypography.base`. + +* **Breaking** Change `FBottomNavigationBarItem.label` from `String` to `Widget`. + +* **Breaking** Split `FCalendarHeaderStyle.iconColor` into `FCalendarHeaderStyle.enabledIconColor` and + `FCalendarHeaderStyle.disabledIconColor`. + +* **Breaking** Change `FTextField` to use `FLabel`. + +* **Breaking** Remove `FTextFieldErrorStyle.animatioDuration`. + +* **Breaking** Rename `FLabelStateStyle` to `FLabelStateStyles`. + +* **Breaking** Rename `FTextField.onSave` to `FTextField.onSaved`. + +* **Breaking** Remove FAlertIcon & FAlertIconStyle - use `FIcon` instead. + +* **Breaking** Remove FButtonIcon & FAlertIconStyle - use `FIcon` instead. + +* **Breaking** Change FButtonCustomStyle to better represent the style's layout - this will only affect users that + create a custom `FButtonCustomStyle`. + +* **Breaking** Change `FBottomNavigationBarItem.icon` from `SvgAsset` to `Widget` - wrap the asset in ` FIcon` instead. + +* **Breaking** Change `FHeaderAction.icon` from `SvgAsset` to `Widget` - wrap the asset in ` FIcon` instead. + +* **Breaking** Change `FSelectGroup.builder` parameters. + +* **Breaking** Change `FBadgeCustomStyle.content` to `FBadgeCustomStyle.contentStyle`. + +* **Breaking** Change `FAvatarStyle.text` to `FAvatarStyle.textStyle`. + +* **Breaking** Change `FDialogStyle.horizontal` to `FDialogStyle.horizontalStyle`. + +* **Breaking** Change `FDialogStyle.selectedLabel` to `FDialogStyle.selectedLabelTextStyle`. + +* **Breaking** Change `FDialogStyle.unselectedLabel` to `FDialogStyle.unselectedLabelTextStyle`. + +* **Breaking** Change `FDividerStyle.horizontal` to `FDividerStyle.horizontalStyle`. + +* **Breaking** Change `FDividerStyle.vertical` to `FDividerStyle.verticalStyle`. + +* **Breaking** Change `FDialogStyle.indicator` to `FDialogStyle.indicatorDecoration`. + +* **Breaking** Change `FHeader.leftActions` to `FHeader.prefixActions`. + +* **Breaking** Change `FHeader.rightActions` to `FHeader.suffixActions`. + +* **Breaking** Change `FLabelStyle.horizontal` to `FLabelStyle.horizontalStyle`. + +* **Breaking** Change `FLabelStyle.vertical` to `FLabelStyle.verticalStyle`. + +* **Breaking** Change `FButtonStyles.outline`'s background to transparent. + +### Fixes + +* Fix `FBottomNavigationBar` items hit region being smaller than intended. + +* Fix `FCalendar` showing focused outline when pressing and long pressing a date. + +* Fix `FCalendar` year and month picker applying incorrect initial top padding. + +* Fix `FCalendar` year and month picker incorrectly calculating start and end dates. + +* Fix `FTextfield` being vertically larger than intended. + +* Fix `FTextfield` description text's odd transition animation whenever an error occurs. + +* Fix `FSwitch` not using correct label style. + +* Fix `FCheckbox`, `FRadio`, `FSelectGroup`, `FSwitch` and `FTextField` styles causing the widget inspector to crash. + +* Fix `FSelectGroup` not applying correct style if a custom widget-specific style is given. + +## 0.5.1 + +### + +* Fix `FTabs` not showing correct tab entry when switching tabs. + [Issue #203](https://github.com/forus-labs/forui/issues/203). ## 0.5.0 @@ -75,12 +231,12 @@ The minimum Flutter version has been increased from `3.19.0` to `3.24.0`. * Change `FTabController` to implement `ChangeNotifier` instead of `Listenable`. * **Breaking:** Flattened `FStyle.formFieldStyle` - use `FStyle.enabledFormFieldStyle`, `FStyle.disabledFormFieldStyle`, -and`FStyle.errorFormFieldStyle`. + and`FStyle.errorFormFieldStyle`. * Improve platform detection for web when initializing platform-specific variables. -* **Breaking:** `FCheckbox` and `FSwitch` no longer wraps `FormField` - consider wrapping them in a `FormField` if -required. +* **Breaking:** `FCheckbox` and `FSwitch` no longer wraps `FormField` - consider wrapping them in a `FormField` if + required. * **Breaking:** Require `FTheme` to be wrapped in a `CupertinoApp`, `MaterialApp` or `WidgetsApp`. @@ -96,14 +252,14 @@ required. * Fix `FTabs` not handling indexes properly. - ## 0.4.0 ### Additions * Add `FAvatar`. -* **Breaking:** Add `FCalendarEntryStyle.focusedBorderColor`. This only affects users that customized `FCalendarEntryStyle`. +* **Breaking:** Add `FCalendarEntryStyle.focusedBorderColor`. This only affects users that + customized `FCalendarEntryStyle`. * Add `FResizable`. @@ -144,7 +300,6 @@ required. * Fix `FCalendar` dates sometimes not being navigable using arrow keys. - ## 0.3.0 ### Additions @@ -165,28 +320,24 @@ required. * Fix missing `style` parameter for `FCheckbox`. - ## 0.2.0+3 ### Fixes * Fix broken images in README.md (yet again). - ## 0.2.0+2 ### Fixes * Fix broken images in README.md. - ## 0.2.0+1 ### Fixes * Fix broken images in README.md. - ## 0.2.0 ### Additions @@ -203,10 +354,10 @@ required. * **Breaking** Move `FHeaderActionStyle.padding` to `FRootHeaderStyle.actionSpacing`. -* **Breaking** Suffix style parameters with `Style`, i.e. `FRootHeaderStyle.action` has been renamed to +* **Breaking** Suffix style parameters with `Style`, i.e. `FRootHeaderStyle.action` has been renamed to `FRootHeaderStyle.actionStyle`. -* **Breaking** Raw fields have been removed, wrap strings with the Text() widget. E.g. `FButton(label: 'Hello')` or +* **Breaking** Raw fields have been removed, wrap strings with the Text() widget. E.g. `FButton(label: 'Hello')` or `FButton(rawLabel: 'Hello')` should be replaced with `FButton(label: Text('Hello'))`. * Change `FTextField` to be usable in `Form`s. @@ -223,7 +374,6 @@ required. * Fix padding inconsistencies in `FCard` and `FDialog`. - ## 0.1.0 -* Initial release! 🚀 +* Initial release! 🚀 \ No newline at end of file diff --git a/forui/example/lib/sandbox.dart b/forui/example/lib/sandbox.dart index 07dba4424..69a9776bd 100644 --- a/forui/example/lib/sandbox.dart +++ b/forui/example/lib/sandbox.dart @@ -9,47 +9,26 @@ class Sandbox extends StatefulWidget { State createState() => _SandboxState(); } -class _SandboxState extends State { - bool value = false; - FSelectGroupController selectGroupController = FRadioSelectGroupController(value: 1); +enum Notification { all, direct, nothing } - final selected = ValueNotifier(DateTime.now()); +class _SandboxState extends State with SingleTickerProviderStateMixin { + bool value = false; + FRadioSelectGroupController selectGroupController = FRadioSelectGroupController(); + late FPopoverController controller; @override void initState() { super.initState(); + controller = FPopoverController(vsync: this); } @override - Widget build(BuildContext context) => Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FTextField.email( - autovalidateMode: AutovalidateMode.always, - description: const Text('Description'), - validator: (value) => value?.length == 5 ? 'Error message' : null, - ), - const SizedBox(height: 20), - const FTextField.password(), - const SizedBox(height: 20), - FTooltip( - longPressExitDuration: const Duration(seconds: 5000), - tipBuilder: (context, style, _) => const Text('Add to library'), - child: FButton( - style: FButtonStyle.outline, - onPress: () {}, - label: const Text('Hover'), - ), - ), - Tooltip( - message: 'Add to library 2', - showDuration: const Duration(seconds: 5000), - child: FButton( - style: FButtonStyle.outline, - onPress: () {}, - label: const Text('Hover 2'), - ), - ), - ], - ); -} + Widget build(BuildContext context) => const Column(); + + @override + void dispose() { + controller.dispose(); + selectGroupController.dispose(); + super.dispose(); + } +} \ No newline at end of file diff --git a/forui/lib/forui.dart b/forui/lib/forui.dart index e03b75f8b..0d721fbd4 100644 --- a/forui/lib/forui.dart +++ b/forui/lib/forui.dart @@ -17,11 +17,10 @@ export 'widgets/checkbox.dart'; export 'widgets/dialog.dart'; export 'widgets/divider.dart'; export 'widgets/header.dart'; - export 'widgets/icon.dart'; export 'widgets/label.dart'; export 'widgets/popover.dart'; - +export 'widgets/popover_menu.dart'; export 'widgets/progress.dart'; export 'widgets/radio.dart'; export 'widgets/resizable.dart'; diff --git a/forui/lib/src/widgets/calendar/calendar_controller.dart b/forui/lib/src/widgets/calendar/calendar_controller.dart index a598c36cc..c96131e12 100644 --- a/forui/lib/src/widgets/calendar/calendar_controller.dart +++ b/forui/lib/src/widgets/calendar/calendar_controller.dart @@ -31,7 +31,7 @@ abstract class FCalendarController extends FValueNotifier { /// [selectable] will always return true if not given. /// /// ## Contract - /// Throws [AssertionError] if assert(initialSelection?.isUtc ?? true, 'value must be in UTC timezone'), + /// Throws [AssertionError] if the dates in [initialSelections] are not in UTC timezone. static FCalendarController> dates({ Set initialSelections = const {}, Predicate? selectable, From 7f47e318f4fde30642611f22f7333093c7b2e67f Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 10:43:54 +0000 Subject: [PATCH 34/44] Commit from GitHub Actions (Forui Presubmit) --- forui/example/lib/sandbox.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forui/example/lib/sandbox.dart b/forui/example/lib/sandbox.dart index 69a9776bd..e8b40a038 100644 --- a/forui/example/lib/sandbox.dart +++ b/forui/example/lib/sandbox.dart @@ -31,4 +31,4 @@ class _SandboxState extends State with SingleTickerProviderStateMixin { selectGroupController.dispose(); super.dispose(); } -} \ No newline at end of file +} From 8484992d17d6cd7edd358ebb31c363c1dfe6814e Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 18:44:40 +0800 Subject: [PATCH 35/44] Update sandbox.dart --- forui/example/lib/sandbox.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forui/example/lib/sandbox.dart b/forui/example/lib/sandbox.dart index 69a9776bd..e8b40a038 100644 --- a/forui/example/lib/sandbox.dart +++ b/forui/example/lib/sandbox.dart @@ -31,4 +31,4 @@ class _SandboxState extends State with SingleTickerProviderStateMixin { selectGroupController.dispose(); super.dispose(); } -} \ No newline at end of file +} From 534bb3be09fe02abb94138f3f5cd0b71339076f1 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 21:35:38 +0800 Subject: [PATCH 36/44] Update forui/lib/src/widgets/line_calendar/line_calendar.dart Co-authored-by: Matthias Ngeo --- forui/lib/src/widgets/line_calendar/line_calendar.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index c87dd6681..352db73ed 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -43,11 +43,11 @@ class FLineCalendar extends StatefulWidget { DateTime? today, super.key, }) : start = start ?? DateTime(1900).toUtc(), + today = today ?? DateTime.now(), assert( start == null || end == null || start.toLocalDate() < end.toLocalDate(), 'end date must be greater than start date', - ), - today = today ?? DateTime.now(); + ); @override State createState() => _FLineCalendarState(); From 75f4e501f7a6987ce327d48fc0a84108e52147bc Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 21:36:06 +0800 Subject: [PATCH 37/44] Update forui/lib/src/widgets/line_calendar/line_calendar.dart Co-authored-by: Matthias Ngeo --- forui/lib/src/widgets/line_calendar/line_calendar.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 352db73ed..34ca70dce 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -71,7 +71,7 @@ class _FLineCalendarState extends State { @override void didChangeDependencies() { - _style = widget.style ?? FTheme.of(context).lineCalendarStyle; + _style = widget.style ?? context.theme.lineCalendarStyle; _size = _calculateSize(context, _style); final value = widget.controller.value?.toLocalDate() ?? widget.today.toLocalDate(); From 8c84d0c1a3eecb3c8eab20b3650daab8c3dd02ec Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 21:37:48 +0800 Subject: [PATCH 38/44] Apply suggestions from code review Co-authored-by: Matthias Ngeo --- forui/lib/src/widgets/line_calendar/line_calendar_tile.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index 4c99fcf74..e7544a282 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -39,7 +39,7 @@ class FLineCalendarTile extends StatelessWidget { builder: (context, selectedDate, _) { final isSelected = controller.selected(date); return FTappable.animated( - semanticLabel: date.toString(), + semanticLabel: date.toString(), // TODO: Localization onPress: () => controller.select(date), child: Stack( children: [ From a3a36bbc36249b08e0c8caf8ebe48c81fdf300c5 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Mon, 4 Nov 2024 21:46:10 +0800 Subject: [PATCH 39/44] Update forui/lib/src/widgets/line_calendar/line_calendar.dart Co-authored-by: Matthias Ngeo --- forui/lib/src/widgets/line_calendar/line_calendar.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 34ca70dce..0f4c43540 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -74,7 +74,7 @@ class _FLineCalendarState extends State { _style = widget.style ?? context.theme.lineCalendarStyle; _size = _calculateSize(context, _style); - final value = widget.controller.value?.toLocalDate() ?? widget.today.toLocalDate(); + final value = (widget.controller.value ?? widget.today).toLocalDate(); final offset = (value.difference(widget.start.toLocalDate()).inDays - 2) * _size + _style.itemPadding; _controller = ScrollController(initialScrollOffset: offset); From 9d8e0bd3cfca1eac7876295a98c33893dd802992 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Tue, 5 Nov 2024 18:20:33 +0800 Subject: [PATCH 40/44] Made some changes --- .../widgets/line_calendar/line_calendar.dart | 233 ++++++------------ .../line_calendar/line_calendar_tile.dart | 111 ++++++++- 2 files changed, 190 insertions(+), 154 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 0f4c43540..4b9781a43 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -19,6 +19,17 @@ class FLineCalendar extends StatefulWidget { /// The controller. final FCalendarController controller; + /// Whether the calendar should focus itself if nothing else is already focused. Defaults to false. + final bool autofocus; + + /// Defines the [FocusNode] for this line calendar. + final FocusNode? focusNode; + + /// Handler called when the focus changes. + /// + /// Called with true if this widget's node gains focus, and false if it loses focus. + final ValueChanged? onFocusChange; + /// The start date. It is truncated to the nearest date. /// /// ## Contract @@ -38,12 +49,15 @@ class FLineCalendar extends StatefulWidget { FLineCalendar({ required this.controller, this.style, + this.autofocus = false, + this.focusNode, + this.onFocusChange, this.end, DateTime? start, DateTime? today, super.key, }) : start = start ?? DateTime(1900).toUtc(), - today = today ?? DateTime.now(), + today = today ?? DateTime.now().toUtc(), assert( start == null || end == null || start.toLocalDate() < end.toLocalDate(), 'end date must be greater than start date', @@ -66,19 +80,26 @@ class FLineCalendar extends StatefulWidget { class _FLineCalendarState extends State { late ScrollController _controller; + late final FocusNode _focusNode; late double _size; late FLineCalendarStyle _style; + @override + void initState() { + super.initState(); + _focusNode = widget.focusNode ?? FocusNode(); + } + @override void didChangeDependencies() { + super.didChangeDependencies(); _style = widget.style ?? context.theme.lineCalendarStyle; _size = _calculateSize(context, _style); final value = (widget.controller.value ?? widget.today).toLocalDate(); - final offset = (value.difference(widget.start.toLocalDate()).inDays - 2) * _size + _style.itemPadding; - _controller = ScrollController(initialScrollOffset: offset); + final offset = (value.difference(widget.start.toLocalDate()).inDays - 2) * _size + _style.itemPadding.horizontal; - super.didChangeDependencies(); + _controller = ScrollController(initialScrollOffset: offset); } // TODO: calculate width of items based on the text font size. @@ -92,45 +113,48 @@ class _FLineCalendarState extends State { @override Widget build(BuildContext context) => SizedBox( height: _size, - child: Focus( - autofocus: true, - onKeyEvent: (node, event) { - if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.arrowRight) { + child: CallbackShortcuts( + bindings: { + const SingleActivator(LogicalKeyboardKey.arrowRight): () { widget.controller.value = widget.controller.value?.add(const Duration(days: 1)); _controller.animateTo( _controller.offset + _size, duration: const Duration(milliseconds: 100), curve: Curves.easeInOut, ); - return KeyEventResult.handled; - } else if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.arrowLeft) { + }, + const SingleActivator(LogicalKeyboardKey.arrowLeft): () { widget.controller.value = widget.controller.value?.subtract(const Duration(days: 1)); _controller.animateTo( _controller.offset - _size, duration: const Duration(milliseconds: 100), curve: Curves.easeInOut, ); - return KeyEventResult.handled; - } - return KeyEventResult.ignored; - }, - child: ListView.builder( - controller: _controller, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.zero, - itemExtent: _size, - itemBuilder: (context, index) { - final date = widget.start.add(Duration(days: index)); - return Container( - padding: EdgeInsets.symmetric(horizontal: _style.itemPadding), - child: FLineCalendarTile( - style: _style, - controller: widget.controller, - date: date, - isToday: widget.today.toLocalDate() == date.toLocalDate(), - ), - ); }, + }, + child: Focus( + autofocus: widget.autofocus, + focusNode: _focusNode, + onFocusChange: (focused) => widget.onFocusChange?.call(focused), + child: ListView.builder( + controller: _controller, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.zero, + itemExtent: _size, + itemBuilder: (context, index) { + final date = widget.start.add(Duration(days: index)); + return Padding( + padding: _style.itemPadding, + child: FLineCalendarTile( + focusNode: _focusNode, + style: _style, + controller: widget.controller, + date: date, + isToday: widget.today.toLocalDate() == date.toLocalDate(), + ), + ); + }, + ), ), ), ); @@ -138,14 +162,18 @@ class _FLineCalendarState extends State { @override void dispose() { _controller.dispose(); + _focusNode.dispose(); super.dispose(); } } /// [FLineCalendar]'s style. final class FLineCalendarStyle with Diagnosticable { - /// The horizontal padding around each calendar item. - final double itemPadding; + /// The horizontal padding around each calendar item. Defaults to `EdgeInsets.symmetric(horizontal: 6.5)`. + /// + /// ## Contract + /// Throws [AssertionError] if itemPadding is negative. + final EdgeInsets itemPadding; /// The box decoration for a selected date. final BoxDecoration selectedDecoration; @@ -163,41 +191,42 @@ final class FLineCalendarStyle with Diagnosticable { final FLineCalendarContentStyle content; /// Creates a [FLineCalendarStyle]. - const FLineCalendarStyle({ - required this.itemPadding, + FLineCalendarStyle({ required this.selectedCurrentDateIndicatorColor, required this.unselectedCurrentDateIndicatorColor, required this.selectedDecoration, required this.unselectedDecoration, required this.content, - }); + this.itemPadding = const EdgeInsets.symmetric(horizontal: 6.5), + }) : assert(itemPadding.isNonNegative, 'itemPadding must be non-negative'); - /// Creates a [FCardStyle] that inherits its properties from [colorScheme] and [typography]. + /// Creates a [FLineCalendarStyle] that inherits its properties from [colorScheme] and [typography]. FLineCalendarStyle.inherit({ required FColorScheme colorScheme, required FTypography typography, required FStyle style, - }) : itemPadding = 6.5, - selectedCurrentDateIndicatorColor = colorScheme.primaryForeground, - unselectedCurrentDateIndicatorColor = colorScheme.primary, - selectedDecoration = BoxDecoration( - color: colorScheme.primary, - borderRadius: style.borderRadius, - ), - unselectedDecoration = BoxDecoration( - color: colorScheme.background, - borderRadius: style.borderRadius, - border: Border.all(color: colorScheme.border), - ), - content = FLineCalendarContentStyle.inherit(colorScheme: colorScheme, typography: typography); + }) : this( + selectedCurrentDateIndicatorColor: colorScheme.primaryForeground, + unselectedCurrentDateIndicatorColor: colorScheme.primary, + selectedDecoration: BoxDecoration( + color: colorScheme.primary, + borderRadius: style.borderRadius, + ), + unselectedDecoration: BoxDecoration( + color: colorScheme.background, + borderRadius: style.borderRadius, + border: Border.all(color: colorScheme.border), + ), + content: FLineCalendarContentStyle.inherit(colorScheme: colorScheme, typography: typography), + ); @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties ..add(DiagnosticsProperty('itemPadding', itemPadding)) - ..add(DiagnosticsProperty('selectedCurrentDateIndicatorColor', selectedCurrentDateIndicatorColor)) - ..add(DiagnosticsProperty('unselectedCurrentDateIndicatorColor', unselectedCurrentDateIndicatorColor)) + ..add(ColorProperty('selectedCurrentDateIndicatorColor', selectedCurrentDateIndicatorColor)) + ..add(ColorProperty('unselectedCurrentDateIndicatorColor', unselectedCurrentDateIndicatorColor)) ..add(DiagnosticsProperty('selectedDecoration', selectedDecoration)) ..add(DiagnosticsProperty('unselectedDecoration', unselectedDecoration)) ..add(DiagnosticsProperty('content', content)); @@ -206,7 +235,7 @@ final class FLineCalendarStyle with Diagnosticable { /// Returns a copy of this [FLineCalendarStyle] with the given properties replaced. @useResult FLineCalendarStyle copyWith({ - double? itemPadding, + EdgeInsets? itemPadding, Color? selectedCurrentDateIndicatorColor, Color? unselectedCurrentDateIndicatorColor, BoxDecoration? selectedDecoration, @@ -244,103 +273,3 @@ final class FLineCalendarStyle with Diagnosticable { unselectedDecoration.hashCode ^ content.hashCode; } - -/// A line calendar's content style. -final class FLineCalendarContentStyle with Diagnosticable { - /// The vertical padding around the text in the calendar items. - final double verticalPadding; - - /// The text style for the selected date. - final TextStyle selectedDateTextStyle; - - /// The text style for the unselected date. - final TextStyle unselectedDateTextStyle; - - /// The text style for the selected day of the week. - final TextStyle selectedDayTextStyle; - - /// The text style for the unselected day of the week. - final TextStyle unselectedDayTextStyle; - - /// Creates a [FLineCalendarContentStyle]. - const FLineCalendarContentStyle({ - required this.verticalPadding, - required this.selectedDateTextStyle, - required this.unselectedDateTextStyle, - required this.selectedDayTextStyle, - required this.unselectedDayTextStyle, - }); - - /// Creates a [FCardStyle] that inherits its properties from [colorScheme] and [typography]. - FLineCalendarContentStyle.inherit({ - required FColorScheme colorScheme, - required FTypography typography, - }) : verticalPadding = 15.5, - selectedDateTextStyle = typography.xl.copyWith( - color: colorScheme.primaryForeground, - fontWeight: FontWeight.w500, - height: 0, - ), - unselectedDateTextStyle = typography.xl.copyWith( - color: colorScheme.primary, - fontWeight: FontWeight.w500, - height: 0, - ), - selectedDayTextStyle = typography.xs.copyWith( - color: colorScheme.primaryForeground, - fontWeight: FontWeight.w500, - height: 0, - ), - unselectedDayTextStyle = typography.xs.copyWith( - color: colorScheme.mutedForeground, - fontWeight: FontWeight.w500, - height: 0, - ); - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties - ..add(DiagnosticsProperty('verticalPadding', verticalPadding)) - ..add(DiagnosticsProperty('selectedDateTextStyle', selectedDateTextStyle)) - ..add(DiagnosticsProperty('unselectedDateTextStyle', unselectedDateTextStyle)) - ..add(DiagnosticsProperty('selectedDayTextStyle', selectedDayTextStyle)) - ..add(DiagnosticsProperty('unselectedDayTextStyle', unselectedDayTextStyle)); - } - - /// Returns a copy of this [FLineCalendarContentStyle] with the given properties replaced. - @useResult - FLineCalendarContentStyle copyWith({ - double? verticalPadding, - TextStyle? selectedDateTextStyle, - TextStyle? unselectedDateTextStyle, - TextStyle? selectedDayTextStyle, - TextStyle? unselectedDayTextStyle, - }) => - FLineCalendarContentStyle( - verticalPadding: verticalPadding ?? this.verticalPadding, - selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, - unselectedDateTextStyle: unselectedDateTextStyle ?? this.unselectedDateTextStyle, - selectedDayTextStyle: selectedDayTextStyle ?? this.selectedDayTextStyle, - unselectedDayTextStyle: unselectedDayTextStyle ?? this.unselectedDayTextStyle, - ); - - @override - bool operator ==(Object other) => - identical(this, other) || - other is FLineCalendarContentStyle && - runtimeType == other.runtimeType && - verticalPadding == other.verticalPadding && - selectedDateTextStyle == other.selectedDateTextStyle && - unselectedDateTextStyle == other.unselectedDateTextStyle && - selectedDayTextStyle == other.selectedDayTextStyle && - unselectedDayTextStyle == other.unselectedDayTextStyle; - - @override - int get hashCode => - verticalPadding.hashCode ^ - selectedDateTextStyle.hashCode ^ - unselectedDateTextStyle.hashCode ^ - selectedDayTextStyle.hashCode ^ - unselectedDayTextStyle.hashCode; -} diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index e7544a282..2229ccfcb 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -15,12 +15,14 @@ const _textSpacing = 2.0; class FLineCalendarTile extends StatelessWidget { final FLineCalendarStyle style; final FCalendarController controller; + final FocusNode focusNode; final DateTime date; final bool isToday; const FLineCalendarTile({ required this.style, required this.controller, + required this.focusNode, required this.date, required this.isToday, super.key, @@ -40,7 +42,10 @@ class FLineCalendarTile extends StatelessWidget { final isSelected = controller.selected(date); return FTappable.animated( semanticLabel: date.toString(), // TODO: Localization - onPress: () => controller.select(date), + onPress: () { + focusNode.requestFocus(); + controller.select(date); + }, child: Stack( children: [ Positioned.fill( @@ -98,7 +103,109 @@ class FLineCalendarTile extends StatelessWidget { properties ..add(DiagnosticsProperty('style', style)) ..add(DiagnosticsProperty('date', date)) - ..add(DiagnosticsProperty('today', isToday)) + ..add(FlagProperty('today', value: isToday, ifTrue: 'today')) ..add(DiagnosticsProperty('controller', controller)); } } + +/// A line calendar's content style. +final class FLineCalendarContentStyle with Diagnosticable { + /// The vertical height around the text in the calendar items. + final double verticalPadding; + + /// The text style for the selected date. + final TextStyle selectedDateTextStyle; + + /// The text style for the unselected date. + final TextStyle unselectedDateTextStyle; + + /// The text style for the selected day of the week. + final TextStyle selectedDayTextStyle; + + /// The text style for the unselected day of the week. + final TextStyle unselectedDayTextStyle; + + /// Creates a [FLineCalendarContentStyle]. + const FLineCalendarContentStyle({ + required this.verticalPadding, + required this.selectedDateTextStyle, + required this.unselectedDateTextStyle, + required this.selectedDayTextStyle, + required this.unselectedDayTextStyle, + }); + + /// Creates a [FCardStyle] that inherits its properties from [colorScheme] and [typography]. + FLineCalendarContentStyle.inherit({ + required FColorScheme colorScheme, + required FTypography typography, + }) : this( + verticalPadding: 15.5, + selectedDateTextStyle: typography.xl.copyWith( + color: colorScheme.primaryForeground, + fontWeight: FontWeight.w500, + height: 0, + ), + unselectedDateTextStyle: typography.xl.copyWith( + color: colorScheme.primary, + fontWeight: FontWeight.w500, + height: 0, + ), + selectedDayTextStyle: typography.xs.copyWith( + color: colorScheme.primaryForeground, + fontWeight: FontWeight.w500, + height: 0, + ), + unselectedDayTextStyle: typography.xs.copyWith( + color: colorScheme.mutedForeground, + fontWeight: FontWeight.w500, + height: 0, + ), + ); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add(DiagnosticsProperty('verticalPadding', verticalPadding)) + ..add(DiagnosticsProperty('selectedDateTextStyle', selectedDateTextStyle)) + ..add(DiagnosticsProperty('unselectedDateTextStyle', unselectedDateTextStyle)) + ..add(DiagnosticsProperty('selectedDayTextStyle', selectedDayTextStyle)) + ..add(DiagnosticsProperty('unselectedDayTextStyle', unselectedDayTextStyle)); + } + + /// Returns a copy of this [FLineCalendarContentStyle] with the given properties replaced. + @useResult + FLineCalendarContentStyle copyWith({ + double? verticalPadding, + TextStyle? selectedDateTextStyle, + TextStyle? unselectedDateTextStyle, + TextStyle? selectedDayTextStyle, + TextStyle? unselectedDayTextStyle, + }) => + FLineCalendarContentStyle( + verticalPadding: verticalPadding ?? this.verticalPadding, + selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, + unselectedDateTextStyle: unselectedDateTextStyle ?? this.unselectedDateTextStyle, + selectedDayTextStyle: selectedDayTextStyle ?? this.selectedDayTextStyle, + unselectedDayTextStyle: unselectedDayTextStyle ?? this.unselectedDayTextStyle, + ); + + @override + bool operator ==(Object other) => + identical(this, other) || + other is FLineCalendarContentStyle && + runtimeType == other.runtimeType && + verticalPadding == other.verticalPadding && + selectedDateTextStyle == other.selectedDateTextStyle && + unselectedDateTextStyle == other.unselectedDateTextStyle && + selectedDayTextStyle == other.selectedDayTextStyle && + unselectedDayTextStyle == other.unselectedDayTextStyle; + + @override + int get hashCode => + verticalPadding.hashCode ^ + selectedDateTextStyle.hashCode ^ + unselectedDateTextStyle.hashCode ^ + selectedDayTextStyle.hashCode ^ + unselectedDayTextStyle.hashCode; +} From 59f39764b1993aa9b45f68e7499d57338304885f Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Tue, 5 Nov 2024 10:22:07 +0000 Subject: [PATCH 41/44] Commit from GitHub Actions (Forui Presubmit) --- forui/lib/src/widgets/line_calendar/line_calendar.dart | 3 +++ forui/lib/src/widgets/line_calendar/line_calendar_tile.dart | 1 + 2 files changed, 4 insertions(+) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 4b9781a43..46afa2582 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -75,6 +75,9 @@ class FLineCalendar extends StatefulWidget { ..add(DiagnosticsProperty('start', start)) ..add(DiagnosticsProperty('end', end)) ..add(DiagnosticsProperty('today', today)); + properties.add(DiagnosticsProperty('autofocus', autofocus)); + properties.add(DiagnosticsProperty('focusNode', focusNode)); + properties.add(ObjectFlagProperty?>.has('onFocusChange', onFocusChange)); } } diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index 2229ccfcb..b9572e2fa 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -105,6 +105,7 @@ class FLineCalendarTile extends StatelessWidget { ..add(DiagnosticsProperty('date', date)) ..add(FlagProperty('today', value: isToday, ifTrue: 'today')) ..add(DiagnosticsProperty('controller', controller)); + properties.add(DiagnosticsProperty('focusNode', focusNode)); } } From 5143268d3e2b76ff90904143dbb031b201acd4ff Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Thu, 7 Nov 2024 17:06:09 +0800 Subject: [PATCH 42/44] fixed PR issues --- .../widgets/line_calendar/line_calendar.dart | 74 +++++----- .../line_calendar/line_calendar_tile.dart | 24 ++-- .../zinc-dark-default/new-date.png | Bin 47384 -> 0 bytes .../line_calendar/zinc-dark-default/today.png | Bin 48587 -> 0 bytes .../zinc-dark-default/unselected.png | Bin 44578 -> 0 bytes .../line_calendar/zinc-dark/new-date.png | Bin 0 -> 48744 bytes .../zinc-dark/single-digit-date.png | Bin 0 -> 45309 bytes .../golden/line_calendar/zinc-dark/today.png | Bin 0 -> 50124 bytes .../line_calendar/zinc-dark/unselected.png | Bin 0 -> 46024 bytes .../zinc-light-default/new-date.png | Bin 46945 -> 0 bytes .../zinc-light-default/today.png | Bin 48191 -> 0 bytes .../zinc-light-default/unselected.png | Bin 43974 -> 0 bytes .../line_calendar/zinc-light/new-date.png | Bin 0 -> 48362 bytes .../zinc-light/single-digit-date.png | Bin 0 -> 44812 bytes .../golden/line_calendar/zinc-light/today.png | Bin 0 -> 49626 bytes .../line_calendar/zinc-light/unselected.png | Bin 0 -> 45609 bytes .../widgets/line_calendar_golden_test.dart | 133 ++++++++---------- 17 files changed, 107 insertions(+), 124 deletions(-) delete mode 100644 forui/test/golden/line_calendar/zinc-dark-default/new-date.png delete mode 100644 forui/test/golden/line_calendar/zinc-dark-default/today.png delete mode 100644 forui/test/golden/line_calendar/zinc-dark-default/unselected.png create mode 100644 forui/test/golden/line_calendar/zinc-dark/new-date.png create mode 100644 forui/test/golden/line_calendar/zinc-dark/single-digit-date.png create mode 100644 forui/test/golden/line_calendar/zinc-dark/today.png create mode 100644 forui/test/golden/line_calendar/zinc-dark/unselected.png delete mode 100644 forui/test/golden/line_calendar/zinc-light-default/new-date.png delete mode 100644 forui/test/golden/line_calendar/zinc-light-default/today.png delete mode 100644 forui/test/golden/line_calendar/zinc-light-default/unselected.png create mode 100644 forui/test/golden/line_calendar/zinc-light/new-date.png create mode 100644 forui/test/golden/line_calendar/zinc-light/single-digit-date.png create mode 100644 forui/test/golden/line_calendar/zinc-light/today.png create mode 100644 forui/test/golden/line_calendar/zinc-light/unselected.png diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 46afa2582..a2037712c 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -30,34 +30,33 @@ class FLineCalendar extends StatefulWidget { /// Called with true if this widget's node gains focus, and false if it loses focus. final ValueChanged? onFocusChange; - /// The start date. It is truncated to the nearest date. - /// - /// ## Contract - /// Throws [AssertionError] if [end] <= [start]. - final DateTime start; + final DateTime _start; - /// The end date. It is truncated to the nearest date. - /// - /// ## Contract - /// Throws [AssertionError] if [end] <= [start]. - final DateTime? end; + final DateTime? _end; - /// The current date. It is truncated to the nearest date. Defaults to the [DateTime.now]. - final DateTime today; + final LocalDate _today; /// Creates a [FLineCalendar]. + /// + /// [today] represents the current date. It is truncated to the nearest date. Defaults to the [DateTime.now]. + /// [start] represents the start date. It is truncated to the nearest date. Defaults to the [DateTime.utc(1900)]. + /// [end] represents the end date. It is truncated to the nearest date. + /// + /// ## Contract + /// Throws [AssertionError] if [_end] <= [_start]. FLineCalendar({ required this.controller, this.style, this.autofocus = false, this.focusNode, this.onFocusChange, - this.end, + DateTime? end, DateTime? start, DateTime? today, super.key, - }) : start = start ?? DateTime(1900).toUtc(), - today = today ?? DateTime.now().toUtc(), + }) : _end = end, + _start = start ?? DateTime.utc(1900), + _today = (today ?? DateTime.now()).toLocalDate(), assert( start == null || end == null || start.toLocalDate() < end.toLocalDate(), 'end date must be greater than start date', @@ -72,17 +71,17 @@ class FLineCalendar extends StatefulWidget { properties ..add(DiagnosticsProperty('style', style)) ..add(DiagnosticsProperty('controller', controller)) - ..add(DiagnosticsProperty('start', start)) - ..add(DiagnosticsProperty('end', end)) - ..add(DiagnosticsProperty('today', today)); - properties.add(DiagnosticsProperty('autofocus', autofocus)); - properties.add(DiagnosticsProperty('focusNode', focusNode)); - properties.add(ObjectFlagProperty?>.has('onFocusChange', onFocusChange)); + ..add(FlagProperty('autofocus', value: autofocus, ifTrue: 'autofocus')) + ..add(DiagnosticsProperty('focusNode', focusNode)) + ..add(ObjectFlagProperty.has('onFocusChange', onFocusChange)) + ..add(DiagnosticsProperty('start', _start)) + ..add(DiagnosticsProperty('end', _end)); + } } class _FLineCalendarState extends State { - late ScrollController _controller; + ScrollController? _controller; late final FocusNode _focusNode; late double _size; late FLineCalendarStyle _style; @@ -99,8 +98,12 @@ class _FLineCalendarState extends State { _style = widget.style ?? context.theme.lineCalendarStyle; _size = _calculateSize(context, _style); - final value = (widget.controller.value ?? widget.today).toLocalDate(); - final offset = (value.difference(widget.start.toLocalDate()).inDays - 2) * _size + _style.itemPadding.horizontal; + final value = widget.controller.value?.toLocalDate() ?? widget._today; + final offset = (value.difference(widget._start.toLocalDate()).inDays - 2) * _size + _style.itemPadding.horizontal; + + if (_controller != null) { + _controller!.dispose(); + } _controller = ScrollController(initialScrollOffset: offset); } @@ -110,26 +113,27 @@ class _FLineCalendarState extends State { final textScalor = MediaQuery.textScalerOf(context); final dateTextSize = textScalor.scale(style.content.unselectedDateTextStyle.fontSize!); final dayTextSize = textScalor.scale(style.content.unselectedDayTextStyle.fontSize!); - return dateTextSize + dayTextSize + _textSpacing + (style.content.verticalPadding * 2); + return dateTextSize + dayTextSize + _textSpacing + (style.content.verticalSpacing * 2); } @override Widget build(BuildContext context) => SizedBox( height: _size, + // TODO: Shortcut logic should be moved to FLineCalendarTile. child: CallbackShortcuts( bindings: { const SingleActivator(LogicalKeyboardKey.arrowRight): () { widget.controller.value = widget.controller.value?.add(const Duration(days: 1)); - _controller.animateTo( - _controller.offset + _size, + _controller!.animateTo( + _controller!.offset + _size, duration: const Duration(milliseconds: 100), curve: Curves.easeInOut, ); }, const SingleActivator(LogicalKeyboardKey.arrowLeft): () { widget.controller.value = widget.controller.value?.subtract(const Duration(days: 1)); - _controller.animateTo( - _controller.offset - _size, + _controller!.animateTo( + _controller!.offset - _size, duration: const Duration(milliseconds: 100), curve: Curves.easeInOut, ); @@ -145,7 +149,7 @@ class _FLineCalendarState extends State { padding: EdgeInsets.zero, itemExtent: _size, itemBuilder: (context, index) { - final date = widget.start.add(Duration(days: index)); + final date = widget._start.add(Duration(days: index)); return Padding( padding: _style.itemPadding, child: FLineCalendarTile( @@ -153,7 +157,7 @@ class _FLineCalendarState extends State { style: _style, controller: widget.controller, date: date, - isToday: widget.today.toLocalDate() == date.toLocalDate(), + isToday: widget._today == date.toLocalDate(), ), ); }, @@ -164,8 +168,7 @@ class _FLineCalendarState extends State { @override void dispose() { - _controller.dispose(); - _focusNode.dispose(); + _controller?.dispose(); super.dispose(); } } @@ -173,9 +176,6 @@ class _FLineCalendarState extends State { /// [FLineCalendar]'s style. final class FLineCalendarStyle with Diagnosticable { /// The horizontal padding around each calendar item. Defaults to `EdgeInsets.symmetric(horizontal: 6.5)`. - /// - /// ## Contract - /// Throws [AssertionError] if itemPadding is negative. final EdgeInsets itemPadding; /// The box decoration for a selected date. @@ -201,7 +201,7 @@ final class FLineCalendarStyle with Diagnosticable { required this.unselectedDecoration, required this.content, this.itemPadding = const EdgeInsets.symmetric(horizontal: 6.5), - }) : assert(itemPadding.isNonNegative, 'itemPadding must be non-negative'); + }); /// Creates a [FLineCalendarStyle] that inherits its properties from [colorScheme] and [typography]. FLineCalendarStyle.inherit({ diff --git a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart index b9572e2fa..85448ac4c 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar_tile.dart @@ -104,15 +104,18 @@ class FLineCalendarTile extends StatelessWidget { ..add(DiagnosticsProperty('style', style)) ..add(DiagnosticsProperty('date', date)) ..add(FlagProperty('today', value: isToday, ifTrue: 'today')) - ..add(DiagnosticsProperty('controller', controller)); - properties.add(DiagnosticsProperty('focusNode', focusNode)); + ..add(DiagnosticsProperty('controller', controller)) + ..add(DiagnosticsProperty('focusNode', focusNode)); } } /// A line calendar's content style. final class FLineCalendarContentStyle with Diagnosticable { /// The vertical height around the text in the calendar items. - final double verticalPadding; + /// + /// ## Contract + /// Throws [AssertionError] if verticalSpacing is negative. + final double verticalSpacing; /// The text style for the selected date. final TextStyle selectedDateTextStyle; @@ -128,19 +131,18 @@ final class FLineCalendarContentStyle with Diagnosticable { /// Creates a [FLineCalendarContentStyle]. const FLineCalendarContentStyle({ - required this.verticalPadding, required this.selectedDateTextStyle, required this.unselectedDateTextStyle, required this.selectedDayTextStyle, required this.unselectedDayTextStyle, - }); + this.verticalSpacing = 15.5, + }) : assert(0 < verticalSpacing, 'verticalSpacing must be positive, but is $verticalSpacing.'); /// Creates a [FCardStyle] that inherits its properties from [colorScheme] and [typography]. FLineCalendarContentStyle.inherit({ required FColorScheme colorScheme, required FTypography typography, }) : this( - verticalPadding: 15.5, selectedDateTextStyle: typography.xl.copyWith( color: colorScheme.primaryForeground, fontWeight: FontWeight.w500, @@ -167,7 +169,7 @@ final class FLineCalendarContentStyle with Diagnosticable { void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties - ..add(DiagnosticsProperty('verticalPadding', verticalPadding)) + ..add(DoubleProperty('verticalPadding', verticalSpacing)) ..add(DiagnosticsProperty('selectedDateTextStyle', selectedDateTextStyle)) ..add(DiagnosticsProperty('unselectedDateTextStyle', unselectedDateTextStyle)) ..add(DiagnosticsProperty('selectedDayTextStyle', selectedDayTextStyle)) @@ -177,14 +179,14 @@ final class FLineCalendarContentStyle with Diagnosticable { /// Returns a copy of this [FLineCalendarContentStyle] with the given properties replaced. @useResult FLineCalendarContentStyle copyWith({ - double? verticalPadding, + double? verticalSpacing, TextStyle? selectedDateTextStyle, TextStyle? unselectedDateTextStyle, TextStyle? selectedDayTextStyle, TextStyle? unselectedDayTextStyle, }) => FLineCalendarContentStyle( - verticalPadding: verticalPadding ?? this.verticalPadding, + verticalSpacing: verticalSpacing ?? this.verticalSpacing, selectedDateTextStyle: selectedDateTextStyle ?? this.selectedDateTextStyle, unselectedDateTextStyle: unselectedDateTextStyle ?? this.unselectedDateTextStyle, selectedDayTextStyle: selectedDayTextStyle ?? this.selectedDayTextStyle, @@ -196,7 +198,7 @@ final class FLineCalendarContentStyle with Diagnosticable { identical(this, other) || other is FLineCalendarContentStyle && runtimeType == other.runtimeType && - verticalPadding == other.verticalPadding && + verticalSpacing == other.verticalSpacing && selectedDateTextStyle == other.selectedDateTextStyle && unselectedDateTextStyle == other.unselectedDateTextStyle && selectedDayTextStyle == other.selectedDayTextStyle && @@ -204,7 +206,7 @@ final class FLineCalendarContentStyle with Diagnosticable { @override int get hashCode => - verticalPadding.hashCode ^ + verticalSpacing.hashCode ^ selectedDateTextStyle.hashCode ^ unselectedDateTextStyle.hashCode ^ selectedDayTextStyle.hashCode ^ diff --git a/forui/test/golden/line_calendar/zinc-dark-default/new-date.png b/forui/test/golden/line_calendar/zinc-dark-default/new-date.png deleted file mode 100644 index aee2e7cae7708800dfc0fafdf649e83ca072edcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47384 zcmeFZ1yGgU_clxl3KD{V(jkbHbf+L7NOy~bbV;Xxq=3>55+Zr%KA=+4-QCThJKlZN z=lA^n^Ugc-&3yCCyx)w>95~){pZn~+_S)B4*R|F*SV2zm?wyBs5D*aVN=u0=At2l~ zKtMo4N52KGR1cq{fIo;1N|Is-MLi_z;2$UsV$v$;;Ku{qCmR7p@Llc;=WOfSG@a3^Y3Poy7w=}(%k+x^hTom zn~_N){hO%MApXnWA`$+j^?x6afZ+4jH~^#mdJZtc-)#kqK=Bt8{({2qtmQ8#`~`*I zp70kGfF1s33UFum3ktvp|1UBHHxWe{5M_V$0*L%g#(^>aG8JHizcdaQ;V;JpM)(T~ zzzF}JfP$MUxlhyJx;RO~R&$pM%aTOi*M5VhJ(j{$?#HxcZSBN0bJGyG@cE>kpRE3-;dG>GO6}+q z(L0Fu;_QNrz5u!Y=|bGX_^L2@sEiE!dDVmy-=Y8GAw2{W-wB+!H<&yYlj5)sFIcrw za`CD#^Mz0{heN}7gt$p1O-wTe_hd?51~k25WMpc&T+qVI&_1$zVv4bCj4?Sb=05(z zsj^S6vKS02j>+=ZW%Wb1X_qxYSU9`zu1o!mCw9x!mgTVI0uB>1Q%hN|x6t)ruP`Be zc!p2MzMf0P*t3+!xxWI_W6>T1W9lTREPH=k`hFYB0t2bQ4cCBkOkA8KZM(IT2)99jU&VfA!*CSXp%F-?oOxqxp#z6cjXXY`lQ~X?aiOr{BX7L{6v*}xeu&yJM_=}|NR(M z%U7A+3*Q0X=Lmu_S}4Hy|2U3@Kkqatu1 z>8*35_`C=D&0@lfWef>Yf~uWf41c{hucY{vM~JBA_m&Trn>-<8Jb}RmPnZaEVIccV zLr16J&{D<1+L}3>l)s@+R!>JS90OyszuEbw9JQ#0!1CRX|9WLuX~(ahEGEoeR-9h9 zk>#F09{RR=y$@NC^j@%JgcPWFMkBB4&1p?Ifgy|<{%7!kb*PAHQ1s%58IuoMi6eSj zmsD@G>|9-Wnf2=D4jh9|XM4Ayd#y=^CMG7Ez3@pjuEZI>9!u^GuRwMB-wYAUlw5no zv`6QC%D;Ea-&nYjsX%?RJ0RSG?X^a|R{^=P7?$LHx`XO880-F>U@VMj4C(!^7s(6( zipJ5vb`Qyw_;8?sHy`d^>mvK)%#O{gSCo2QXNK9UhL?;?OwX$(C*2C+ej_i}{G%g% zBa;+e+W=yTct_jk2LZ6_fgK^mK^6kK^o0$Kk;R<75p>i=kh+PEJy{3{4;4mnUX7&Wcm#r^vt@o zD(eYE-ue0Y{p+&Lhlg*)#bsa0wb~Yw=a0>HP}ve)z`{THHO5yMnUB8Z#RcbKi_9#EHwR}*R+2#q z7#Ti}mz|xdzjk$X-Q2s|7A_9?(uiyM?h4rSAM?H$Ah51m?%vx=6VyIpeG{aA*4*2o zZCzKf@j9!Ta4dp$8l&=?*FUyU9E=mh#pNcc*>}y{+}yOA|MC7s@3SkNdKb!((a|ch zwB#hW>D34ZZG*;tz5u>{rSEfuu1nUO>cCV2z@NQP`D@wXHYq!nV*QsjgkVIazej|C zsAhFkhg+uZxw6(0N@&Pa0Gm8j44bzlVrlfS+uYld6+Y*@@GhzRCi>rV_(8DKc#?Yh zZ81X46Z7E;a)j_hY$03y;kIh#9aJnayd6~SIf_4X@IlD0lp}-gYo^J_gie|(Rg+m* zSd^5Pmmi%5P+yIDURRf(VudgPH2CcS64O8J4Tpme$rgn->#*Or==GRKFdrY}cl3 z134$+m?E`-3eGsS<({s3pJ@$C*3h0HWhzwx$RWD_2PY;v_zi};ww7YZ$M^T`F$0fI zyHr|dZ=kX(v~3roe!spuC0XdoAX)gvuzvSP+~QPC∾d!UmGn-bSJvdEsgZ%<4ZY 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

mqhn(3$@r@O#|9&X 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 IynO5b0I&{rL;wH) diff --git a/forui/test/golden/line_calendar/zinc-dark-default/today.png b/forui/test/golden/line_calendar/zinc-dark-default/today.png deleted file mode 100644 index edcc359d23265d9696264d94aafc15542bc912a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48587 zcmeFabx_s&8a@gLilPFdpwb~ADIg(TiYU^sXcP%S8tF6;47#LSV9_m&C@tNMfONxR z(cE`=_CEW}J?D=*bLY<7-;B&GS+4zE-*`W7JkRsKANM;&d6^66uAjrg!nz=PUs@Rp z>+EAJtTXudr{R+?efzlZ3)@avMiMKhonit0f@>!!tBMalZuo}2SXeYzveFW&PBF{F z`4_xyVb$h!CkhFj)W}*rBYk72A9%_(`@s1OeC=O9jk5#Tf4|4_G^)k<`!BxdHU55! z6@*Rj_j?-d$NxTF`ZU|$AA2=<;r;!d=vv<2Z?Wi3k^cQ&-0;uI|F*>+v;6UvzkK0O z5dFz5f4Rb+l>4Vx{N)ONYUm$m@s}(7L0o@;=wGhz2SWd07Js?IAHwyAhyLXXf9Uxi zVc~CA_#-U*A1W+7E_8IH4WDqNY^>p#i;3jnSrVPeD0(C*7v+_D6jt0E-1)}$ z2I(8R-n8%s5=k$T^VMH>6I9*Izdj`;5p?c7tMd852Z>~o%H)+qT&ZKe%-v(=#{4`c zaqT}grc8_-DGGTG#_VQ2kLONYblYU#j#2;E`>{s1c1S3T^AFl)!2XAX1!Mig&1L@) z_yQUJ3Ap>0{>j4(Xa6bB!MOjRwm+wb@cd&OFv1_t0V9b22`jL|pQP|7DS!pw=TA}q zBm7AU7+3g{6u=07kOCOtPf`FQ{J%&FyLlFCf6oG7{Q=`(%s)&8j6m~;#$jQ3{o%Oa z3V)Kq|3^uoH)kJ7w>ix===ZD z%f);TEy?qRY{!_O?JI zfumRgsiUo{*%^^f`7a_xag+P}+XTvQk^9Wf8JM+j)-zr^e>%T+seWqHWjk37Wy4}Z z&}KwHRy>mJw7z>V&E#>ou{-&VumNtiPi6{>9qqD_N>)wbxq(QVV%0y=+CGR@qs~xX z^`5omTsFjfS7=DmZm3Saq*JFPFNFPe1p9w~+#_Kj;ibljlXaGll2~R=+s5h1F}qAn zaq*QS4>3OegZ%uifUmV9iSnO6e@^N#mC5Y$cc`H3={Y$`dw=ot>o0kuAL_@A%_(

pDqr5&f7 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 Nl(};~Q|iI9{{@~Gm!1Fs literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-dark/single-digit-date.png b/forui/test/golden/line_calendar/zinc-dark/single-digit-date.png new file mode 100644 index 0000000000000000000000000000000000000000..05159facf181fa228bd2c2a261f72118dcb40259 GIT binary patch literal 45309 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 literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-dark/today.png b/forui/test/golden/line_calendar/zinc-dark/today.png new file mode 100644 index 0000000000000000000000000000000000000000..6313a2dab77bf28cfb41682f8c8cf65f0df70dea GIT binary patch literal 50124 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 W+b@}J8;oLHa8+6DVxFS$(|-ZL*(hKD literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-dark/unselected.png b/forui/test/golden/line_calendar/zinc-dark/unselected.png new file mode 100644 index 0000000000000000000000000000000000000000..15eedf605e86193b2075b5a4c2aeee0fc0578b47 GIT binary patch literal 46024 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ëE=Udt-|z{~N}&%4u@vDr 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 literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-light-default/new-date.png b/forui/test/golden/line_calendar/zinc-light-default/new-date.png deleted file mode 100644 index fc87252d2cc31babcd989b18442526259e15cc69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46945 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 diff --git a/forui/test/golden/line_calendar/zinc-light-default/today.png b/forui/test/golden/line_calendar/zinc-light-default/today.png deleted file mode 100644 index 16cadd1104501909f9793d658c1d3fc7b9117836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48191 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�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 diff --git a/forui/test/golden/line_calendar/zinc-light-default/unselected.png b/forui/test/golden/line_calendar/zinc-light-default/unselected.png deleted file mode 100644 index 131c5e84b8e83c0e33cc7d734fdcd21c2b1e4170..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43974 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 diff --git a/forui/test/golden/line_calendar/zinc-light/new-date.png b/forui/test/golden/line_calendar/zinc-light/new-date.png new file mode 100644 index 0000000000000000000000000000000000000000..60f3e82bf64d9a1c05fcbf8d5c153fa453b0c056 GIT binary patch literal 48362 zcmeFabySsI*ELQGiV`9qQqm$NASI0`DJb3DEnNptKtKefyQI6jLAqNS>F&;NU*38@ z&pUqO`~UsMPsTWd1D>w>9D5P*72C zf!|b&oFjp6@Yd48f^d1gglpgjBx^xYSyb@lf~xBS2lp6GR7gP9A$D^@;9kQs%!Y!z z%fj%cd(Hb%PsdRa9`{8>A%i#l`f4z^*!lAu&Rqq+;NKs}5OM!J=htmO`19Q7uHv7k za6#~Bf1W>P)`b7_T<8|vpQrBa?*D!i=HJ2pF3UeF@HbliZld3N;cssFn{t1L!rx-? zw}$?ykbj}YU&Qr07XAX!zYzL&DE#d#{x)2{L*Z{9`nNs*9SVPmg};2u?@;)EmsoHZ zudaUBwNV|gP|sq}+r8Pq+hG2sOd;*vhSvaFaKE3}VpGgI@&FfktC&n~>vLYuhdRbI zc&S!eK3Mb^19M*Np=eb{q-zLbcVw~NkUsu|x%m;bx@)_enF|a@$mnXLuMn}cX<%^7 zcXQ)dd%vkyzu8rExwsx_ruwDGf01qbBK?P@Acg-=y7~L^zbnK4HwgX)!QUW& z`x^v*gWzuv!2Jz^zd`Uf2;lyA1;N=A#UC%g|E>%BTQvXX%fAu%H(&lQ%a{MRv}9Pe zhL|_pxnaQuL*U98+X!o%O6>0K3!AC)VvaYvN?*%cH8TzE2^(Qn)?jQt(!vjHdz0`T zz1XYchv3P0ldfsfg{c;ESwF1o8NSLYuS#UMTiqea5=otF$z|7&RD|2j*h=Smr8V>> zl^^B#m#1xf@~-=>1YLcXo9UexutVW!UL&b}2Ac%?|1r)NdYc4#iB{aIKHR*3nauEf zVfPW3M`L35PJLP^3{9_iP3IAtj2O*|eAmQ&wH^l{8w_0`ir%!?YfT?*(p0NzyopUE z(!8vo2RAK--qiWPpS?2~gHJkucVEQutR*6v*E@UD+wCxUNv3>C+I4%yf@bz634;|T znOuW5)KmTYegB`~xRgmWeY>7N^6xZ!{*-{=XlKXZ8T%7! zl;eoK%PF~9i#|ma#%7kT2p71EE7z#FEeo@cc7`0i7mT)jH`fZ zlvt$z`RVURmeFjJ`F+iSJIMq3O3KO%w6rT_br$;iX>_V?8KD8!?;UDOkF2(b*NQ4D zujCZ)@J_-I!EJSQOB!<>n0 z>Zf*n31WEl6ddp>B8^<|Oh5P)dUfI!{C-5X(r>cCbdl2 zC);mT*ei5)uBGN;IM=FIUZ20z)6%LNDE`4^+K8L+-;Xpcw1vHjshe~+`R&RLTD|9w zSYhb&13M>OD{eQ(`)hqyPUWul<@O&ip55CKq$z7aDMnUFEc*S3j;2>dMxawR;Fx+s zEg4&t*k8N6YpXXEB>b(sN`8jttar4Hg@t9QJ!qp#^V#I8+9ppKTo^sS9@^V+1X;D& zrjS6scdlD_ZfhUi_#(e|cS}^BB-KAns5wgq^A>i%iRG}_k9~>Vaw_0qsP2JhZ+2=Kdf2!i% zi3_efqpHd)Lfs*0%BhPnw79G5O@g5K7GFXAWe-fI3tznzctUki{k{&{(bN<}A< zVu^hHETcDuhJsV=`JSPUEL&g63134%FI~idp{y89>KN_Pu2$gVkiy?@1Cv{yz}>D} z=-po?uy_u;MYOw4n;%-eQ&GIeqCJBwt>z5kC-mRxOg4>BHGCUcUcR-|pX8xJlAjk# zTl@2MGCQSHvwu;UmHEcPOKxK{UBYLVE!qz*hHPKXQ{$1@NFDldm!`hY>7>GdEjfJ1m7k9dUMy2LjFw%8LfM5I1 zyyODI{`mx3Ei`-BPd}A<4?MdjkQwb~_fpgPDokgP?F8{=KqyfE`2FG$FZ$;K?ysl` zISSl1CO5K8Qp@XRR(T?l%gf|P$I5ni94v1r-MCdh|Cw_coLo%#?xId$1T~46g4 zMCiNAg^Cm_to3^h+GYw{Jz80VBnXm!?nIA@;b%BM$%l9K88hs?#SI8*SFG+v%ub&l z&(GH}b8$_s@|48-5_av09Is^;?Igq)Oe+#7OZ|j zM9BjKoliK?#4NntiE3Y7M#kAcyFvf@=i|X0HD18&WnhfBaXK1F>q~5|JD9T8tGuTn z*;w7cV7LGcd+X1z%9UQXZi8W6>osn9G#=aMdKc}#KsVWy4KIGa@u(O*QFAa z?*`6t%YSOt8ZzkDYW`VpIaH|gCSk7;EW<~(I19Cia`{ofzH^ zH2t6YSauMqQ_Vog7pVN%md2B~(TjergEVMp2YPF@`8+RFRcM{7Hi!bd&XF;G3MQ}g z)0gq9tADqfg01_4;&%U9cK@a6>-6yj%g2$fMd7X(xhY zW?~CB|KUb{jE>$yi8$@(>B(XJ9QU~KKWuade+v(E=SoXVKL@amD~s2EPH)g zzfv0%Yh}CBW9qa95%$Yc!d~J^>dFkWu&vUxJ_ijD%rY@hFth)O{E;;J=WpC!t*GuE zncno>^v{a7u1vFWZD8rHj3YQt4xv@yWj72Q)sA>c- zI-tT*W$ohW3nF+fHjA-uet>)x?{@8Vy7DKm!SyPtD;u99rM0VHyBshSOit`G{Aju< zvcDO4C%4knmSAW54i(u;)%c#!fRDCFo482gV|XT}L`6y_-%ye;?dP|0s4{BYF=-!L z4&3?nf$W2}Knjv?86Fx<(5FOo1d1*u&%|4e9}?M#v{NOmuG&s8n3+Oit@W3?qoPK=X7@ zteF2yyExZ~xWC(s(ShN%Izf5%6T|HZ22UvM&8e{0;npO(p&oSf;`f)m>w`^jdG75v zI5?Djycb`%_r7y;+HFS0zOWTDuUexL6%z}tgIyq1JN$VI9NZl4Z6K;XUOhkFA}^oi z6)>-d2^RSM>-B?!Q~!x7_@9@9XZ^m=WdG~y|L?z86K-UHyKFWu7q>p(sk5lRWoy-VNX_zQlRvYjmx2)E6SsbbT@@W^ee>2{Ych1h!}g4G&N19j0-7h3@F?4dr$CZL(V}*V8ZGC-wK-|!v^wJ974X2L5!=^8=luw^ztaj%F0w*$5%nL=tIu+LiJkJ_i zKyhRE;kEm!UK5Z10~n>$L}SqO0S0l-GYae<_)q%J8CZ>sGNFv%HSIY+rg5XfpmtvF z<8!!vfPE$~n}Ad;^11Hfe0Fd`y_Xl}N(OtQEUEGQd2H}Xyh_ppoUe~+g=O#8or&Uf z2{!Yol!-MNokB$l#vRhA=SJE;Slx%c8dx^073FLd)nT?F`f9SlFW813GS!}m zyQQS1$x}&Pr}mw^3yI<4N}(EmnW~1GUZpwuzNn-vIGj=Ar|k_rp|KCE=b=GVKr!Pd%|?9g*8v(WT6$)gG-KHxqDdEfQnCW2?o)kT-y zL`f963%MT0m9(J^@89a?`{wwIYr>NR=Fs@)4>2QkEb ztoWfj?m{IWMW2jJK3i_N_bPXBY00lg|6mTA-(DYvPK54FrzB0m$thzy(h?j@&#Wbw zWja|lUBFDb4~A8$Jx7k>K8vWD^aLx}Rbs@FnkD9F@U9kY2vK$QI{kf|#0dP!PtnoJ z9qsLdIM16RXwd76|FDyE5krpdRt9f4UY(KTgd|J7= zYo(XK!W83-pQ*c9;wlJ)`RSn}KO;+E$d+9-bn%Oe5+fsS-7n1H5RCfbnG=>> zuJ$feV?mYrDO&HtCFI0(JN-=BEw5f zRD;L#m?7h=tfj#*G3k|CDe2JqflM%T+GxTS)6>85jGevj>q@_VF*GmI+l>b+jG9G6 zRnQ_7Xa?mdEnEmCjTnc4CI5tk73-14PjQEwIjYbsBkKiS2=&e2*FrIn%sv`ec7f>& z={A4jd&p*PAMRHLN59Y(7y|ZFXhp>atWF`2m`ArW)HyY$`^0G}GgD?KVsUZN9Y)eb zaD~-Sv!H9VQ~xH0ZRqRu2fkT1d_5|YYMt?b+-D$9}2UR+-Goi=Abtn(p^ zV{yNV^L(;Z9e%n{ZDo}oTh_`HNmO**> z?u%UnyFef5%>lR7AVCc`bZZl9!r0hY?`KmwVz2|{mWmeNwL{Y63G~)`?B6@)8a*hV zJ{9YY=b=rPN(e8XIrr07ieS_rrKBXFWMdnh3nq`{2#GC;Pc12t6_u)gc?*MhYAQ<)3jY(cwlhFA)PqXJcu?Bp+vOSc8V~rh1u$+ho*~)1g4{6MAjO0<>Qp zm%@%H)Eo1=f3Sg4Umg+%N`=*=*#g(O1R0q@Uwjw_Uy1Q(6e7w~-K9>sBGYl{z%Gwn zgI1@-LAYFTZ5_<bJ!HJl3k3K*7!~Tq52@L0Dy^QdLjS!l+CE4Ud+TG%4q*^uq)VSr;?*8YfQ#^zvk^~xLsLP+N{lz zkqu_|NiCwl-0p9Z(VTB@xQUxMb6y;t`5v+wah5)0ih})Y;>_nO2Dw_FOj}Fq1NZ5i z#q*6OFt`1AKNC5EzRk^?uTrm57)~SPxikwEb!Tc2qBxk;PI!cbK7Ym)cfBT84>P&B zwu)jkDO*39ni`jWyIWy=1;Lg+o^rurYelsy0TIe4(s&5@Nk2m+BEM!i!H(ADtY%?R z(E`uxJ8D7oE;5@mAr5OB6Z#42Wi#2{*Qz-;eN%#x^EXgwKOFLV-bNXJcp_+a$*;D{ z$TEr;(?dlr93WpC9~Vbyy}VdWlw1v}aVZ{Xf<9|Fy!-5Sqg~+lv(yU>PsG(Ve*Fj} zx~_@Rjg+GOuj|h8c`lMg#l^DriB&dh!FLJtnNn)h{7LvE*(_!jN46ElRITGQI`4~E zCqz>+%b+_j_H;u9qAm ziqZfKIv$O@(ZUx0#(?w*zwO@ZXwC!pmKRCo@wX6d8|wk0)z#I_yiTk3Tk!KH@ERV0 zt;!XJOcc{@*&d`uj8<$>SH`%Z=}!-PRLyCCl3Qt_!R zNXFLAo*@8!=Bkv7fUEulvv}D|19lPkx&87?swx)^n>r1^-`9nTp&lctsnwjHF|)u$ zn@(k1su&e2rlja5Pr`lh5z*KGB&*<-cuvTmRyCEK`~bYB=JcCW934PGUE%a2IV3N= zXDA5R&A);`9XaWjY=|4va8o;)$W!A29WTDQ!ec5b^oXLO>8!r_4~RI#W=geM%_LLA zN-+Rot*`UiI5YD5;ZNSmb(H}d%55XLJ5Wgug(APH{MJ{#YA{*j4naXwA$}OJ>|MG>dXOY%OgXntB0|S&Bg_@ak zDH5g1ea?igEZxSBH*EtR&pe|p$c=S8MI`Dz-b5M2PAP%48Cj(DYatsMA%SMBPe((k zM^{MU(2}!oD_K^KNIuTe?ewQNf;w^J5J)?$*r8J`d#{8*yQ4Q z@VzmWUuf9YaYn+T`L)^F;8Kf4l&T=6OBFrJZ?dsl;Ko zlRzs?R3dMsYhWO1dxS!K_0S=^=5ptAz6u?#Qbm7tv4f0stC)G-J~|Bwx~wHH+tm3o zf%mem9oWv$=NTq0-pl<|QE{r5U&qMCCSQy#q6udV7=(AQ>y;kbUE^08rlvXFF$#%J z(=kH)xdJL6gaQ@9gkHVs$daR#-FOY)gOMS}()&tGrA@o)btG{xvO@M?^0#k`nd$Lw zYqz&E-e3i#rBRKT;QGBf-oDBfhQHT9#8P$-1%p_&_IOxE%7Il~R1}}q%d1oGDgAWM zDLfffE(*H$OWOevaBmk^_~vcZ6l;~w+S#*5){j!Cn}&unPqK-p$9^~{6FW;>jc;dx zy=yvAqI7i5=(>ldrZ-$<`4a)3jZS@UVsD}C-VLuOd-1Vw}QyjxsnXVc@tBHWpQ+Apb;tzu>N{ z>SYnADx-`lYcB}VM@T;5v!tzw9Y^!Rs@6--&qLH_F}_NMj32D<89ChlCjT-PMEKZy zlET8mB8NS)787ve3ea#Lz;+vNp47#MhiB2QS3&f9%B1-(OCxMGjP|u@h@6syozF=wmR9L>93A7PUusEn|M4 zaW@_n8;)qTVqk`hBIc&-aa!-!GKBcFtJzOyI&F1Fu~cpQ?pn1G8D)*JnY)Z^T;yuh z3rNOhDAeE*aJ6q-7~%7|#&$F>%}(9I=U zuX*z^=vXmWIaV&xRG1oCcdzOEx!W;4X=kwxT;;epIH~6@O1biZA;VJfrf*$%xVXf} z(33)_-pIb`zGpM-$r)7`m=aEyY4DQJC_kZ(yIAPxMYX0E30UU2sUtC|eeZPM8`awP zglwjfdCtbH;j=CW{&~)1MQ6^;D%qr?Voz+SDfM#J;og`%^JzaG5GJ9iiw|OYb;2{k zn|-XNW|T|V)#WTQw$1D7+bm}t7Gp&#F8}ivB8!P<@zD+)+ zfQA5JZ(N-ypFZUq5Fl@cH@wbE<_FjaLkb}Pfu@BeUI`0lOZK~+8zqAasrml>`;$7? z>r2P+N|`GW33_jIIhwkeWMPb`7e}sYC$jtPv&Ah9iYm#E^|6EMW+byV|s^9wF~rq)b#Z1GHgJkuwO>L^W-fhzxjkQ zHv3xD+W$Oja(UU!iTfcfs1X?4yC$wfKk>lw4%^vcvZFCgLD&mK(~E8Fpk~k$3qjE6 zGxm{jUs3un)#`1smqLr3wE1scrXz?3XWVXJ9esT=HFndsV{3I51^@?ifkdC>kXvF? zE-OzQ%%s!$a9_>muKspl#)xn!l2`+tJ`r{Hn^QgAQ?^;~uQvGHrxWJ+Cu=W1k~6R@ zR5YS)x*|)lva{3H<%R2RXM(!bLh-b8=RkI6rqqE-ZlYhNeOCoPj{B))2QiuOw-N9+oz+%8F83EI9a!r6anR6 zU3JnIn>x}Pot#2*t-y98+#Ta_3Dw<^vhHKgi99NaoQAlW+GNl_e|DGD&*sU0jnt;C zGs5z%FP8IVGYTFaLoCZ>ym9v1;a-uQ9Dw`QOI6I@-#FS!%UCFEJ_rvr4btlhKX-BS zi~!#sU8@?J-J7Z|KX!l0!=v{4i^%g=kI{ejn3^>M6n~Z~q2YR#I=_*l?;Tk{d^%Kr zom#`;IZ}&>h0il_dYdg*=hn?pzT270O-~GaN5coi>VNi?IAiVR!4+0i_Y_HHZmyh5 zT;!9>MpMwoCalT?$Gdt+F-N?ZI6c*PRAmFy(0p1A2bIgO#E&|43L863(*H%7fI(Zlwtcv8|@P(SfS^wf(f7^rWH|U?W$nsOJLmVJVt#v#C+vY`WtJQc2Z`Gqqog zs<;Kk#+v4r*U{3_%0OA$FB#{9;%jMw?+!(NO>0Bxa{2fJNyCp4!5$KpV5a&g zOh3-eZg1Dng@6>yXy(CZNE!FNtqrAy8|=z#fZPD(m8DL=M8=e;C$M} z)>+)eg?m8@$v=NVx6~=+NWwl3BkmqCw<734eOshZvor&ssq0%_I{2@%N?p*FPqV4- z9f6J$&}5?E>VR|R)n znQYgum`x+Cv_)Z8q6yozR!i3R@$75oO92^kVPnxi@?|~n3DFg4Tx-3YocGd*0()lJ z%eZ=bK;_ub2OuBr+s5YLqLeDqO`kK{RjUEAyrb1WMs~wr2H-qVDJg?;5+v1vwtFD= zvAlIgM?*v7t`mk*0QXdrmlV_q1md|&nzBW4os@qbd&t$S;j%@ZNx9`z< zGxgeqRl*WU3)T1Y=inAUJR0@i9LXT}nCwI`b-CFjL$N-MR3{!Tu0veoU8K(wQT-&a z!=SzsUZ=y1z7x1ZK#OL1B!i6RHl!&f?Py8lB58RCY__QOi3t?1RNRPWz64+7+sU-Qr13PN}Fx`2?8 z_@O-E(yehBs-d)=&`N8!4Yo6}32Gc`tF%s?KpY>?O z{YbVm&*kn*?Lr&A>nY<>F>~|yW&K-mT_J$tQzmZh-Nnjmy4#+iW8JS6@_QJ`n!G23IK&3L^<0~<{T_d#g z832hQIk0!nJ?n3wF@C&h`+o4_%bSq7_c`Hg(VZ~ zYM=|Em8VNr`>0{K_15K0H!p=JPvDvluFfhaoZON*V?jfDV1jlStlJm zJu*DeJ#l9Tcn&4}xVv6h3yYv7HB`6fAS`k^LL;VDx0O?_QUSyh)pJJXB$id%4^WGF|la^mt*!Ngm{=FW&;X!fHfLA@i2oi2O&Rj-EJrG(3jH0gp^0 zRu`4>x-{pLGC-s(utjQ?PmYTbf6C5!krVv@^rJCEx3QoAq*FaDnP>HDX%eIHqz3?- zfbCMimW&z51?M8qRG+Ok#`EZ9>6p?3dTSrFJxF>6FFfl3+Lp7=I6t1WfQbbwS6F`d z@{mbzZ{m21%SCJx;j*#)+Gk>$&*}b~D$pCzr%S@<^z^EIi<>O3iK*MZfA{fe|A_2o zLrrEE9>OALw>2Sp|IQ`VkA)Qw{2-$VECJ4N+#n+JSPRHvW45!Qp@l{EI~ouWz}Zm) zJn6v`R!WFv(QdH`4kZm3$Tx?C+|7rqg(UoOnHp+URv$I(H>@6s>s*k7W3 zkPlEX%@YUiIX#5#CP4ll^xdelIuwA+b*O?F4mdz4!Kuv!0rn;;3Ll;kyD0{cvcVAU zWN=j)%~cVH!*^u@e2U|05(S?#C z&YrmGy##8&B-1Gt_$;7mJt1%F02w*s^juCsjdHTgOyNykRgL)6QdJ^u^43#ogQvpV z4U8Xo%t6{IdQV=hL0X~iyd{-YKMs`VeVQn8ruP+~bq)t?6iy(;VW{^w!%K9`Dc20v&Afe{<9Q`|$Av5MCe)_ zU(7t@H9Ekyl#$}W>W8*vA@LKXe~=|rN5gIm=zu#WN*S|wcc>+YogXyF9kdcm;_O^O z?ZuAkNe;9tF~3}k04S-eD-pD~m|~9Y1xOkkK&0JV%{sG6kv;*T*U=%$Y`uK9xy!p< z=aA!UFf|`XgOS!*{5^ZZw{I<0C(|L-Bi^pf9un0{13?Y8|_6=w_qC(03{lP%kWYL$1NJ+sef!{@Q>!zHt9gE8%u;-{Z zfOs38q3sD;Pinh{JMVxR0RuImQq9X0yhZgK$PU<;>VjbI&!#zf&lvV;CPEi zFho#_e}2&$FRxuZu6wkOS0h%ZJt_RKMUCxxeI#4Z*lQSoMZyxq!$IZBu(-IT_rdg- zVj%tubE(3QM|5&jJ%a$W8tw+t!Th{=Xd5x@S8!Jv8PJ>hKO)~q*$(yt^buz-ISPZI zR)mU0t=yin-V$j5v1jIKHXpOYt|o}s%1H)ZKzx*$Pm@iS)lz|w&N>P3_Yb?g6i%r+ zM-&wom%EAwInZa?{G`f-U*W?eYWp}vDRJ?z^>qviz8kEO^RL0o@*wVMTUr>iXU0I9 zGs(Z|_{xl+{}8GyAK#eRzXj>rM6z4*@wbhxURQ#t} z9QtW;xE%(8SY*9mg{lZ6qXrAHZuz7hkg4!FtxDQD6!!M^)FW_~zoRRXLh>B=I8ke_ zuyU}6AYHC^_Er0nCl0Dv*@2mC%Do5aK&#d3jvRoJr>{?YgoY~(@C#E!HjXMtAdhcSrJzjJ5#%;u(zL_z(#J!qvJcLnTB+#OGg z`GO-kRPSSZ+Y_o)m`_gx+!nB~lkf$r?N7jNSf&LKWswgO@9j|zPN2dAMR#rw$rTWH zcOO3Ew{6@QOzonirk;FI9Ytmnr8m{Et$<2pPhDMeIQS^R%>>jEc9%R;z|HMLco#sK zpcK@Xr^SJxAQu9MNvg54^&Gz!A;()%FfY){L;!$}jTK~3clMh1`c#L8X8hYJ=W-G` z;%!CJ*V)!ITYOJs(x%9P5rA2<0WJbk38Gbmh{5}BF6w)Lh809X7pZJxQvzwc67iSf zJtv$5{8F0}rNt_7@Lv`g_`iZ2iH7&o!sLz+f<0ndaIn9roPU8%Ygyy8uED#3`G5|w z22}k_6iCYRKv8Q$2OmL326Xo9N8BNj3ju)ry)W`f3g}F=r}N4Qb{P{jjv;r!4E83( z88h>DkrC)0USZW@hXKG; zKOhMLg^d|FM;LDO^!0(DoZr#tfs-|<1DbE85<{jotfoT{7hN;8Za97|^9Qw4w#Q#i z(S_LT;Xi`P64>|UR#VWZyQq)|y09X%&g7hVQE@?mI}xGg6P6K=)m6h5CL0hapvK8Q zBH#-LvoQ|12P8;iVlQ;V0kOLKSdM!wrA4k+x28{k`7QPfPz?4aoOf!ex$Li%PHN%F zy|mpZKxsUPygzYk6|4Kb6}a}QovYPkYuO8N=aaexoes>*?&rT2%nvLWpxjSmhh>4a zfaNT!pnxB6-l1m)38B8&L)HFCph<_CV==X9@8Fp1x-Kc8EEbNN@`m9A(Y}SHfC~oU zwrZtYsSe7-bbyxAiN5PIRe&JLfCg@)ZzZqb_86ohV%ull=(VC?CnTPGya&-+bGA&J z&~^7z1vpv~9`S*+;(T&lnk2)zKgN``KG!-Z!GJk zI={j8Es1KoEsC={TGWwd9*^vQ>3I8Kf(Y`&o_s)tc; zJ;!R_p#aFpGN}#)GP3%MX_i4?Xfe;%sIn1tJ)%7z+VgFH(0PSbiX@B`giS4pR6>Ue zYb2(Yihlm?!~hV@kTCrq--w<8WjNC4*S5t4Bfj3u0e&3aGpi%=Nq~!J0Kd96ke4(t zFaRltz>bk~9>0=sQ@dS6W`$f8_yDq&$>;WeL9CQfy|fbE50kI);rzM_+B~2BJ0-Os z3FOo2$;yW2D3=P_Qs?|h*|GeIEv>DcRkkL2V|j5|ebx%NeyKWb72m)AB+5_Vw0^yJ z1v@`v&8hL>&aXYD?t%M&HGXQGEeiTRmnsVb<2FZh5?<9k+Xid^a;MQFQPoKak-wSk zegX{)ba~6V)Lg7hhM*&k{|q`P5CXDWZbTqSfR`hxGkE5Kl3Vqr&S{hBs!<&)2vW6F zr;a|4m08UG9IAy+_H=Tic=1Bn_QM=-B@qJHZiB2Hn}gE@k$9Ey{*PG2jvjF}HLB=8 z`c+IC^^1+DUON^Q2T;$rSO=~js6l9@j2bFL-@^t6r@`h7)9j(-Sl~y&kT=}k9F+t8 zNM`m$|I+GVAD_a^nSV%RQx{OP;VKM@$7Q)9K>*q&tPlXfNs6yl#8&z$&i$E;^F=-1Vi2&O6nT=Zm>d!$EQAtT{Z<5pRcNcWY z=My257^xoo@2%-kJuTo5_Pf6qK0wV3w<%_v4hJ|PC3wC*sldAgrzB7AI=Xwr& zpiyTKs9h~4CS!RAXV>oeO__Xy)%F%GV}Lo!M^wl4jOPys0cwqDJ8alfPy>D0pzJ*& zz{ULtQ7$8(=R9%-1n~AyZJh8>7NsW7LHGT@09K(z=1EmSP`yAg$TRsFHz6t!`yBh% zM0?|0LLUw^N&v3`6TG;Y0o`Ll0BJ`wXIaNEpS#;55Iyd{6U+KMR(krVM+ThLcw77W z%DudsO%nm3#k6t3GI~>J^_dFKZrCU~R)U-PP^}7UlSX22zL3!CFAtNPK$kvt_Y6I~ zkMAaD(qyGCAz~nTZBjrf>MZ zIJhbeNHa6ProOHC7RTKBwsFk%DHkX4hofdqJh*d5>)s69(h;Sms7;^8ZGmGzkco@K z+5fgyzJ1o(alLKLln$p6 z`TkdeqW}pGY9kvE>(Lb*zbGoEj3f++T?^`>l~*EFPv^Zj)`Hh?&_bbuBTWVjtFb|M z1WU#%q0X)@9F6*|vOV5uyr32}_XdseQz$9N#ijmmbl%9VKP`FmI$MTAzuR#74RfVLQ@~XUN&ahW;e2fg~#jPgT5|e-5o+IdY5ERUPzpzyoLI z-NwzpQwpWO+1 z`orv{0)+l+(#Z5W`?jjSNiRP^fcpSfF#&8B719=l-;8JGm<8QdGd7J7fkGl{+l{upo|`D zb1VB+DyKguWkxOzTm`kr02@E(lY+J^_s$f5G7tYE;N8#bO98E@au=lPUsV>MV~F4AwC;$1 zE4~c4M`n-=w=bGvf56isO0n{5MbQ$iw`t_5o|q?kueZQ-Lh}G zlRh{fGp~D)%_glhI&zWr)B}J0gZ%x_nLUq?>cZ!fZOul#u`W^U`TS0Yt4R*ivmFY+ zoF1QaQoY~l3Nfu#$%FQ+>^DRGJHm!6FWrPpP`nj1rc<)bipEW&u@4Um`=gXvJHV!b z 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 literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-light/single-digit-date.png b/forui/test/golden/line_calendar/zinc-light/single-digit-date.png new file mode 100644 index 0000000000000000000000000000000000000000..a682883876b2174dcc9f84c9ee3cedf9ae459d5a GIT binary patch literal 44812 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 KB3s?!m;VCMe?uDp literal 0 HcmV?d00001 diff --git a/forui/test/golden/line_calendar/zinc-light/today.png b/forui/test/golden/line_calendar/zinc-light/today.png new file mode 100644 index 0000000000000000000000000000000000000000..734bb558c448e2c50644888c477b4487c867d183 GIT binary patch literal 49626 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 literal 0 HcmV?d00001 diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index 5072c98ef..c832a84dd 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -1,8 +1,5 @@ @Tags(['golden']) library; - -import 'package:flutter/widgets.dart'; - import 'package:flutter_test/flutter_test.dart'; import 'package:forui/forui.dart'; @@ -14,14 +11,9 @@ void main() { testWidgets('blue screen', (tester) async { await tester.pumpWidget( TestScaffold.blue( - child: Center( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FLineCalendar( - style: TestScaffold.blueScreen.lineCalendarStyle, - controller: FCalendarController.date(), - ), - ), + child: FLineCalendar( + style: TestScaffold.blueScreen.lineCalendarStyle, + controller: FCalendarController.date(), ), ), ); @@ -30,81 +22,70 @@ void main() { }); for (final theme in TestScaffold.themes) { - for (final (lineCalendar, controller) in [ - ('default', FCalendarController.date(initialSelection: DateTime.utc(2024, 10, 20))), - ]) { - testWidgets('$theme.name - $lineCalendar', (tester) async { - await tester.pumpWidget( - TestScaffold( - theme: theme.data, - child: Center( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FLineCalendar( - controller: controller, - today: DateTime.utc(2024, 10, 20), - ), - ), - ), + testWidgets('$theme.name - default', (tester) async { + await tester.pumpWidget( + TestScaffold( + theme: theme.data, + child: FLineCalendar( + controller: FCalendarController.date(initialSelection: DateTime.utc(2024, 10, 20)), + today: DateTime.utc(2024, 10, 20), ), - ); + ), + ); - await expectLater( - find.byType(TestScaffold), - matchesGoldenFile('line_calendar/${theme.name}-$lineCalendar/today.png'), - ); - }); + await expectLater(find.byType(TestScaffold), matchesGoldenFile('line_calendar/${theme.name}/today.png')); + }); - testWidgets('$theme.name - unselected', (tester) async { - await tester.pumpWidget( - TestScaffold( - theme: theme.data, - child: Center( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FLineCalendar( - controller: controller, - today: DateTime.utc(2024, 10, 20), - ), - ), - ), + testWidgets('$theme.name - unselected', (tester) async { + await tester.pumpWidget( + TestScaffold( + theme: theme.data, + child: FLineCalendar( + controller: FCalendarController.date(initialSelection: DateTime.utc(2024, 10, 20)), + today: DateTime.utc(2024, 10, 20), ), - ); + ), + ); - await tester.tap(find.text('20')); - await tester.pumpAndSettle(const Duration(milliseconds: 300)); + await tester.tap(find.text('20')); + await tester.pumpAndSettle(const Duration(milliseconds: 300)); - await expectLater( - find.byType(TestScaffold), - matchesGoldenFile('line_calendar/${theme.name}-$lineCalendar/unselected.png'), - ); - }); + await expectLater(find.byType(TestScaffold), matchesGoldenFile('line_calendar/${theme.name}/unselected.png')); + }); - testWidgets('$theme.name - new date selected', (tester) async { - await tester.pumpWidget( - TestScaffold( - theme: theme.data, - child: Center( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: FLineCalendar( - controller: controller, - today: DateTime.utc(2024, 10, 20), - ), - ), - ), + testWidgets('$theme.name - new date selected', (tester) async { + await tester.pumpWidget( + TestScaffold( + theme: theme.data, + child: FLineCalendar( + controller: FCalendarController.date(initialSelection: DateTime.utc(2024, 10, 20)), + today: DateTime.utc(2024, 10, 20), ), - ); + ), + ); + + await tester.tap(find.text('24')); + await tester.pumpAndSettle(const Duration(milliseconds: 300)); + + await expectLater(find.byType(TestScaffold), matchesGoldenFile('line_calendar/${theme.name}/new-date.png')); + }); - await tester.tap(find.text('24')); - await tester.pumpAndSettle(const Duration(milliseconds: 300)); + testWidgets('$theme.name - single digit date', (tester) async { + await tester.pumpWidget( + TestScaffold( + theme: theme.data, + child: FLineCalendar( + controller: FCalendarController.date(initialSelection: DateTime.utc(2024, 10, 7)), + today: DateTime.utc(2024, 10, 8), + ), + ), + ); - await expectLater( - find.byType(TestScaffold), - matchesGoldenFile('line_calendar/${theme.name}-$lineCalendar/new-date.png'), - ); - }); - } + await expectLater( + find.byType(TestScaffold), + matchesGoldenFile('line_calendar/${theme.name}/single-digit-date.png'), + ); + }); } }); } From f588d1966ef212acb1218653e86f45154d0c55a0 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Thu, 7 Nov 2024 09:07:59 +0000 Subject: [PATCH 43/44] Commit from GitHub Actions (Forui Presubmit) --- forui/lib/src/widgets/line_calendar/line_calendar.dart | 1 - forui/test/src/widgets/line_calendar_golden_test.dart | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index a2037712c..3c44412f2 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -76,7 +76,6 @@ class FLineCalendar extends StatefulWidget { ..add(ObjectFlagProperty.has('onFocusChange', onFocusChange)) ..add(DiagnosticsProperty('start', _start)) ..add(DiagnosticsProperty('end', _end)); - } } diff --git a/forui/test/src/widgets/line_calendar_golden_test.dart b/forui/test/src/widgets/line_calendar_golden_test.dart index c832a84dd..506caca69 100644 --- a/forui/test/src/widgets/line_calendar_golden_test.dart +++ b/forui/test/src/widgets/line_calendar_golden_test.dart @@ -1,5 +1,6 @@ @Tags(['golden']) library; + import 'package:flutter_test/flutter_test.dart'; import 'package:forui/forui.dart'; From 089dc5bfde00cd08e4b04d7e50c28959e19271c7 Mon Sep 17 00:00:00 2001 From: Daviiddoo Date: Thu, 7 Nov 2024 23:55:48 +0800 Subject: [PATCH 44/44] Update line_calendar.dart --- .../widgets/line_calendar/line_calendar.dart | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/forui/lib/src/widgets/line_calendar/line_calendar.dart b/forui/lib/src/widgets/line_calendar/line_calendar.dart index 3c44412f2..c453e7b6f 100644 --- a/forui/lib/src/widgets/line_calendar/line_calendar.dart +++ b/forui/lib/src/widgets/line_calendar/line_calendar.dart @@ -30,9 +30,9 @@ class FLineCalendar extends StatefulWidget { /// Called with true if this widget's node gains focus, and false if it loses focus. final ValueChanged? onFocusChange; - final DateTime _start; + final LocalDate _start; - final DateTime? _end; + final LocalDate? _end; final LocalDate _today; @@ -43,19 +43,19 @@ class FLineCalendar extends StatefulWidget { /// [end] represents the end date. It is truncated to the nearest date. /// /// ## Contract - /// Throws [AssertionError] if [_end] <= [_start]. + /// Throws [AssertionError] if [end] <= [start]. FLineCalendar({ required this.controller, this.style, this.autofocus = false, this.focusNode, this.onFocusChange, - DateTime? end, DateTime? start, + DateTime? end, DateTime? today, super.key, - }) : _end = end, - _start = start ?? DateTime.utc(1900), + }) : _start = (start ?? DateTime.utc(1900)).toLocalDate(), + _end = end?.toLocalDate(), _today = (today ?? DateTime.now()).toLocalDate(), assert( start == null || end == null || start.toLocalDate() < end.toLocalDate(), @@ -73,9 +73,7 @@ class FLineCalendar extends StatefulWidget { ..add(DiagnosticsProperty('controller', controller)) ..add(FlagProperty('autofocus', value: autofocus, ifTrue: 'autofocus')) ..add(DiagnosticsProperty('focusNode', focusNode)) - ..add(ObjectFlagProperty.has('onFocusChange', onFocusChange)) - ..add(DiagnosticsProperty('start', _start)) - ..add(DiagnosticsProperty('end', _end)); + ..add(ObjectFlagProperty.has('onFocusChange', onFocusChange)); } } @@ -98,7 +96,7 @@ class _FLineCalendarState extends State { _size = _calculateSize(context, _style); final value = widget.controller.value?.toLocalDate() ?? widget._today; - final offset = (value.difference(widget._start.toLocalDate()).inDays - 2) * _size + _style.itemPadding.horizontal; + final offset = (value.difference(widget._start).inDays - 2) * _size + _style.itemPadding.horizontal; if (_controller != null) { _controller!.dispose(); @@ -147,6 +145,7 @@ class _FLineCalendarState extends State { scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, itemExtent: _size, + itemCount: widget._end != null ? widget._end!.difference(widget._start).inDays + 1 : null, itemBuilder: (context, index) { final date = widget._start.add(Duration(days: index)); return Padding( @@ -155,8 +154,8 @@ class _FLineCalendarState extends State { focusNode: _focusNode, style: _style, controller: widget.controller, - date: date, - isToday: widget._today == date.toLocalDate(), + date: date.toNative(), + isToday: widget._today == date, ), ); },