From a8bc1fce9a4bdfffde70efe648396ef0e26aeb50 Mon Sep 17 00:00:00 2001 From: "Michael W. Aziz" Date: Tue, 14 May 2024 16:05:17 +0300 Subject: [PATCH] [DEV] done with the Radio Selectors --- lib/src/Selectors/selectors.astromic.dart | 15 ++-- lib/src/Selectors/src/radio.selector.dart | 83 ++++++++++++----------- 2 files changed, 53 insertions(+), 45 deletions(-) diff --git a/lib/src/Selectors/selectors.astromic.dart b/lib/src/Selectors/selectors.astromic.dart index 76a5134..3e87527 100644 --- a/lib/src/Selectors/selectors.astromic.dart +++ b/lib/src/Selectors/selectors.astromic.dart @@ -1,6 +1,7 @@ //s2 Core Packages Imports - import 'package:flutter/widgets.dart'; +import 'src/configuration.dart'; +import 'src/radio.selector.dart'; class AstromicSelectors { //S1 -- Radio @@ -12,17 +13,17 @@ class AstromicSelectors { // double? itemSpacing = 4, // - required Widget Function(AstromicRadioSelectorItem item, VoidCallback? onTap, bool isSelected) itemBuilder, - Widget Function(AstromicRadioSelectorItem item)? disabledItemBuilder, - required List> items, + required Widget Function(T item, {VoidCallback? onTap, bool isSelected}) itemBuilder, + Widget Function(T item)? disabledItemBuilder, + required List<(T item, bool isEnabled)> items, }) => - astromicRadioSelector( + AstromicRadioSelector( initialSelectedValue: initialSelectedValue, onChanged: onChanged, // - configurations: configurations, + configurations: configurations ?? const AstromicSelectorConfiguration(), // - itemSpacing: itemSpacing, + itemSpacing: itemSpacing ?? 8.0, // itemBuilder: itemBuilder, disabledItemBuilder: disabledItemBuilder, diff --git a/lib/src/Selectors/src/radio.selector.dart b/lib/src/Selectors/src/radio.selector.dart index 30399b2..8d4ab6d 100644 --- a/lib/src/Selectors/src/radio.selector.dart +++ b/lib/src/Selectors/src/radio.selector.dart @@ -10,6 +10,7 @@ import 'package:flutter/widgets.dart'; //--------------- //s2 SERVICES //s2 MODELS +import '../../Spacing/spacing.astromic.dart'; import 'configuration.dart'; //s2 MISC //!SECTION - Imports @@ -25,14 +26,14 @@ class AstromicRadioSelector extends StatefulWidget { final T? initialSelectedValue; final Function(T selectedItem)? onChanged; //s1 -- Configuration - final AstromicSelectorConfiguration? configurations; + final AstromicSelectorConfiguration configurations; //s1 -- Style - final double? itemSpacing; + final double itemSpacing; //s1 -- Content - final List> items; + final List<(T item, bool isEnabled)> items; // - final Widget Function(AstromicRadioSelectorItem item, VoidCallback? onTap, bool isSelected) itemBuilder; - final Widget Function(AstromicRadioSelectorItem item)? disabledItemBuilder; + final Widget Function(T item, {VoidCallback? onTap, bool isSelected}) itemBuilder; + final Widget Function(T item)? disabledItemBuilder; //!SECTION // AstromicRadioSelector({ @@ -42,22 +43,23 @@ class AstromicRadioSelector extends StatefulWidget { required this.items, this.onChanged, //s1 -- Configuration - this.configurations = const AstromicSelectorConfiguration(), + required this.configurations, //s1 -- Style - this.itemSpacing = 8, + required this.itemSpacing, //s1 -- Content required this.itemBuilder, this.disabledItemBuilder, - }) : assert(configurations!.isNullable || initialSelectedValue != null, 'You need to supply an initial value if not nullable!'), + }) : assert(configurations.isNullable || initialSelectedValue != null, 'You need to supply an initial value if not nullable!'), assert( - configurations!.isNullable || + configurations.isNullable || (items - .map( - (e) => e.value, - ) - .toList() - .contains(initialSelectedValue)), - "Initial value is not present in the items!", + .map( + (e) => e.$1, + ) + .toList() + .contains(initialSelectedValue) && + items.where((e) => e.$1 == initialSelectedValue).first.$2), + "Initial value is not present in the items or is not enabled!", ), super( key: key, @@ -129,38 +131,43 @@ class _AstromicRadioSelectorState extends State> { // //s1 -Widgets List baseChildren = widget.items.map((currentItem) { - bool isSelected = currentItem.value == selectedItem; + bool isEnabled = currentItem.$2; + bool isSelected = currentItem.$1 == selectedItem; // - return !currentItem.enabled! && widget.disabledItemBuilder != null - ? widget.configurations!.withExpandedSpace - ? Expanded(child: widget.disabledItemBuilder!(currentItem)) - : widget.disabledItemBuilder!(currentItem) - : widget.configurations!.withExpandedSpace - ? Expanded(child: widget.itemBuilder(currentItem, currentItem.enabled! ? () => _onTap(currentItem.value) : null, isSelected)) - : widget.itemBuilder(currentItem, currentItem.enabled! ? () => _onTap(currentItem.value) : null, isSelected); + return !isEnabled && widget.disabledItemBuilder != null + ? widget.configurations.withExpandedSpace && widget.configurations.axis == Axis.horizontal + ? Expanded(child: widget.disabledItemBuilder!(currentItem.$1)) + : widget.disabledItemBuilder!(currentItem.$1) + : widget.configurations.withExpandedSpace && widget.configurations.axis == Axis.horizontal + ? Expanded(child: widget.itemBuilder(currentItem.$1, onTap: isEnabled ? () => _onTap(currentItem.$1) : null, isSelected: isSelected)) + : widget.itemBuilder(currentItem.$1, onTap: isEnabled ? () => _onTap(currentItem.$1) : null, isSelected: isSelected); }).toList(); //s1 -Widgets //!SECTION //SECTION - Build Return - return widget.configurations!.withExpandedSpace - ? widget.configurations!.axis == Axis.horizontal + return + // widget.configurations.withExpandedSpace + // ? + widget.configurations.axis == Axis.horizontal ? separatedRow( baseChildren, - AstromicSpacing.hsb(widget.itemSpacing!), + AstromicSpacing.hsb(widget.itemSpacing), ) : separatedColumn( baseChildren, - AstromicSpacing.vsb(widget.itemSpacing!), - ) - : Wrap( - alignment: WrapAlignment.center, - runAlignment: WrapAlignment.center, - crossAxisAlignment: WrapCrossAlignment.center, - direction: widget.configurations!.axis, - spacing: widget.itemSpacing!, - children: baseChildren, - ); + AstromicSpacing.vsb(widget.itemSpacing), + widget.configurations.withExpandedSpace, + ); + // : Wrap( + // direction: widget.configurations.axis, + // alignment: WrapAlignment.center, + // runAlignment: WrapAlignment.center, + // crossAxisAlignment: WrapCrossAlignment.center, + // spacing: widget.itemSpacing, + // runSpacing: widget.itemSpacing, + // children: baseChildren, + // ); //!SECTION } @@ -189,7 +196,7 @@ Widget separatedRow(List children, Widget separator) { ); } -Widget separatedColumn(List children, Widget separator) { +Widget separatedColumn(List children, Widget separator, bool withExpandedSpace) { List finalChildren = []; for (var e in children) { if (children.indexOf(e) != children.length - 1) { @@ -200,7 +207,7 @@ Widget separatedColumn(List children, Widget separator) { } return Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: withExpandedSpace ? CrossAxisAlignment.stretch : CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: finalChildren, );