From 8f9c889e2ef655b966194bfff44276d8ed433a6c Mon Sep 17 00:00:00 2001 From: Abdalqader27 Date: Thu, 29 May 2025 09:05:02 +0400 Subject: [PATCH 1/3] feat: add StacVisibility widget --- packages/stac/lib/src/framework/stac.dart | 1 + .../stac_visibility/stac_visibility.dart | 23 ++ .../stac_visibility.freezed.dart | 334 ++++++++++++++++++ .../stac_visibility/stac_visibility.g.dart | 31 ++ .../stac_visibility_parser.dart | 48 +++ .../stac/lib/src/parsers/widgets/widgets.dart | 1 + packages/stac/lib/src/utils/widget_type.dart | 1 + 7 files changed, 439 insertions(+) create mode 100644 packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart create mode 100644 packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.freezed.dart create mode 100644 packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.g.dart create mode 100644 packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility_parser.dart diff --git a/packages/stac/lib/src/framework/stac.dart b/packages/stac/lib/src/framework/stac.dart index 6d06d031..41ef5104 100644 --- a/packages/stac/lib/src/framework/stac.dart +++ b/packages/stac/lib/src/framework/stac.dart @@ -107,6 +107,7 @@ class Stac { const StacSetValueParser(), const StacInkwellParser(), const StacConditionalParser(), + const StacVisibilityParser(), ]; static final _actionParsers = [ diff --git a/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart new file mode 100644 index 00000000..2e8d2207 --- /dev/null +++ b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart @@ -0,0 +1,23 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +export 'stac_visibility_parser.dart'; + +part 'stac_visibility.freezed.dart'; + +part 'stac_visibility.g.dart'; + +@freezed +abstract class StacVisibility with _$StacVisibility { + const factory StacVisibility({ + required Map child, + bool? visible, + bool? maintainState, + bool? maintainAnimation, + bool? maintainSize, + bool? maintainSemantics, + bool? maintainInteractivity, + Map? replacement, + }) = _StacVisibility; + + factory StacVisibility.fromJson(Map json) => + _$StacVisibilityFromJson(json); +} diff --git a/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.freezed.dart b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.freezed.dart new file mode 100644 index 00000000..4aebeb28 --- /dev/null +++ b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.freezed.dart @@ -0,0 +1,334 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'stac_visibility.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$StacVisibility { + Map get child; + bool? get visible; + bool? get maintainState; + bool? get maintainAnimation; + bool? get maintainSize; + bool? get maintainSemantics; + bool? get maintainInteractivity; + Map? get replacement; + + /// Create a copy of StacVisibility + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @pragma('vm:prefer-inline') + $StacVisibilityCopyWith get copyWith => + _$StacVisibilityCopyWithImpl( + this as StacVisibility, _$identity); + + /// Serializes this StacVisibility to a JSON map. + Map toJson(); + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is StacVisibility && + const DeepCollectionEquality().equals(other.child, child) && + (identical(other.visible, visible) || other.visible == visible) && + (identical(other.maintainState, maintainState) || + other.maintainState == maintainState) && + (identical(other.maintainAnimation, maintainAnimation) || + other.maintainAnimation == maintainAnimation) && + (identical(other.maintainSize, maintainSize) || + other.maintainSize == maintainSize) && + (identical(other.maintainSemantics, maintainSemantics) || + other.maintainSemantics == maintainSemantics) && + (identical(other.maintainInteractivity, maintainInteractivity) || + other.maintainInteractivity == maintainInteractivity) && + const DeepCollectionEquality() + .equals(other.replacement, replacement)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + const DeepCollectionEquality().hash(child), + visible, + maintainState, + maintainAnimation, + maintainSize, + maintainSemantics, + maintainInteractivity, + const DeepCollectionEquality().hash(replacement)); + + @override + String toString() { + return 'StacVisibility(child: $child, visible: $visible, maintainState: $maintainState, maintainAnimation: $maintainAnimation, maintainSize: $maintainSize, maintainSemantics: $maintainSemantics, maintainInteractivity: $maintainInteractivity, replacement: $replacement)'; + } +} + +/// @nodoc +abstract mixin class $StacVisibilityCopyWith<$Res> { + factory $StacVisibilityCopyWith( + StacVisibility value, $Res Function(StacVisibility) _then) = + _$StacVisibilityCopyWithImpl; + @useResult + $Res call( + {Map child, + bool? visible, + bool? maintainState, + bool? maintainAnimation, + bool? maintainSize, + bool? maintainSemantics, + bool? maintainInteractivity, + Map? replacement}); +} + +/// @nodoc +class _$StacVisibilityCopyWithImpl<$Res> + implements $StacVisibilityCopyWith<$Res> { + _$StacVisibilityCopyWithImpl(this._self, this._then); + + final StacVisibility _self; + final $Res Function(StacVisibility) _then; + + /// Create a copy of StacVisibility + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? child = null, + Object? visible = freezed, + Object? maintainState = freezed, + Object? maintainAnimation = freezed, + Object? maintainSize = freezed, + Object? maintainSemantics = freezed, + Object? maintainInteractivity = freezed, + Object? replacement = freezed, + }) { + return _then(_self.copyWith( + child: null == child + ? _self.child + : child // ignore: cast_nullable_to_non_nullable + as Map, + visible: freezed == visible + ? _self.visible + : visible // ignore: cast_nullable_to_non_nullable + as bool?, + maintainState: freezed == maintainState + ? _self.maintainState + : maintainState // ignore: cast_nullable_to_non_nullable + as bool?, + maintainAnimation: freezed == maintainAnimation + ? _self.maintainAnimation + : maintainAnimation // ignore: cast_nullable_to_non_nullable + as bool?, + maintainSize: freezed == maintainSize + ? _self.maintainSize + : maintainSize // ignore: cast_nullable_to_non_nullable + as bool?, + maintainSemantics: freezed == maintainSemantics + ? _self.maintainSemantics + : maintainSemantics // ignore: cast_nullable_to_non_nullable + as bool?, + maintainInteractivity: freezed == maintainInteractivity + ? _self.maintainInteractivity + : maintainInteractivity // ignore: cast_nullable_to_non_nullable + as bool?, + replacement: freezed == replacement + ? _self.replacement + : replacement // ignore: cast_nullable_to_non_nullable + as Map?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _StacVisibility implements StacVisibility { + const _StacVisibility( + {required final Map child, + this.visible, + this.maintainState, + this.maintainAnimation, + this.maintainSize, + this.maintainSemantics, + this.maintainInteractivity, + final Map? replacement}) + : _child = child, + _replacement = replacement; + factory _StacVisibility.fromJson(Map json) => + _$StacVisibilityFromJson(json); + + final Map _child; + @override + Map get child { + if (_child is EqualUnmodifiableMapView) return _child; + // ignore: implicit_dynamic_type + return EqualUnmodifiableMapView(_child); + } + + @override + final bool? visible; + @override + final bool? maintainState; + @override + final bool? maintainAnimation; + @override + final bool? maintainSize; + @override + final bool? maintainSemantics; + @override + final bool? maintainInteractivity; + final Map? _replacement; + @override + Map? get replacement { + final value = _replacement; + if (value == null) return null; + if (_replacement is EqualUnmodifiableMapView) return _replacement; + // ignore: implicit_dynamic_type + return EqualUnmodifiableMapView(value); + } + + /// Create a copy of StacVisibility + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + @pragma('vm:prefer-inline') + _$StacVisibilityCopyWith<_StacVisibility> get copyWith => + __$StacVisibilityCopyWithImpl<_StacVisibility>(this, _$identity); + + @override + Map toJson() { + return _$StacVisibilityToJson( + this, + ); + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _StacVisibility && + const DeepCollectionEquality().equals(other._child, _child) && + (identical(other.visible, visible) || other.visible == visible) && + (identical(other.maintainState, maintainState) || + other.maintainState == maintainState) && + (identical(other.maintainAnimation, maintainAnimation) || + other.maintainAnimation == maintainAnimation) && + (identical(other.maintainSize, maintainSize) || + other.maintainSize == maintainSize) && + (identical(other.maintainSemantics, maintainSemantics) || + other.maintainSemantics == maintainSemantics) && + (identical(other.maintainInteractivity, maintainInteractivity) || + other.maintainInteractivity == maintainInteractivity) && + const DeepCollectionEquality() + .equals(other._replacement, _replacement)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + const DeepCollectionEquality().hash(_child), + visible, + maintainState, + maintainAnimation, + maintainSize, + maintainSemantics, + maintainInteractivity, + const DeepCollectionEquality().hash(_replacement)); + + @override + String toString() { + return 'StacVisibility(child: $child, visible: $visible, maintainState: $maintainState, maintainAnimation: $maintainAnimation, maintainSize: $maintainSize, maintainSemantics: $maintainSemantics, maintainInteractivity: $maintainInteractivity, replacement: $replacement)'; + } +} + +/// @nodoc +abstract mixin class _$StacVisibilityCopyWith<$Res> + implements $StacVisibilityCopyWith<$Res> { + factory _$StacVisibilityCopyWith( + _StacVisibility value, $Res Function(_StacVisibility) _then) = + __$StacVisibilityCopyWithImpl; + @override + @useResult + $Res call( + {Map child, + bool? visible, + bool? maintainState, + bool? maintainAnimation, + bool? maintainSize, + bool? maintainSemantics, + bool? maintainInteractivity, + Map? replacement}); +} + +/// @nodoc +class __$StacVisibilityCopyWithImpl<$Res> + implements _$StacVisibilityCopyWith<$Res> { + __$StacVisibilityCopyWithImpl(this._self, this._then); + + final _StacVisibility _self; + final $Res Function(_StacVisibility) _then; + + /// Create a copy of StacVisibility + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $Res call({ + Object? child = null, + Object? visible = freezed, + Object? maintainState = freezed, + Object? maintainAnimation = freezed, + Object? maintainSize = freezed, + Object? maintainSemantics = freezed, + Object? maintainInteractivity = freezed, + Object? replacement = freezed, + }) { + return _then(_StacVisibility( + child: null == child + ? _self._child + : child // ignore: cast_nullable_to_non_nullable + as Map, + visible: freezed == visible + ? _self.visible + : visible // ignore: cast_nullable_to_non_nullable + as bool?, + maintainState: freezed == maintainState + ? _self.maintainState + : maintainState // ignore: cast_nullable_to_non_nullable + as bool?, + maintainAnimation: freezed == maintainAnimation + ? _self.maintainAnimation + : maintainAnimation // ignore: cast_nullable_to_non_nullable + as bool?, + maintainSize: freezed == maintainSize + ? _self.maintainSize + : maintainSize // ignore: cast_nullable_to_non_nullable + as bool?, + maintainSemantics: freezed == maintainSemantics + ? _self.maintainSemantics + : maintainSemantics // ignore: cast_nullable_to_non_nullable + as bool?, + maintainInteractivity: freezed == maintainInteractivity + ? _self.maintainInteractivity + : maintainInteractivity // ignore: cast_nullable_to_non_nullable + as bool?, + replacement: freezed == replacement + ? _self._replacement + : replacement // ignore: cast_nullable_to_non_nullable + as Map?, + )); + } +} + +// dart format on diff --git a/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.g.dart b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.g.dart new file mode 100644 index 00000000..ef0f8bd4 --- /dev/null +++ b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.g.dart @@ -0,0 +1,31 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'stac_visibility.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_StacVisibility _$StacVisibilityFromJson(Map json) => + _StacVisibility( + child: json['child'] as Map, + visible: json['visible'] as bool?, + maintainState: json['maintainState'] as bool?, + maintainAnimation: json['maintainAnimation'] as bool?, + maintainSize: json['maintainSize'] as bool?, + maintainSemantics: json['maintainSemantics'] as bool?, + maintainInteractivity: json['maintainInteractivity'] as bool?, + replacement: json['replacement'] as Map?, + ); + +Map _$StacVisibilityToJson(_StacVisibility instance) => + { + 'child': instance.child, + 'visible': instance.visible, + 'maintainState': instance.maintainState, + 'maintainAnimation': instance.maintainAnimation, + 'maintainSize': instance.maintainSize, + 'maintainSemantics': instance.maintainSemantics, + 'maintainInteractivity': instance.maintainInteractivity, + 'replacement': instance.replacement, + }; diff --git a/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility_parser.dart new file mode 100644 index 00000000..8fc72192 --- /dev/null +++ b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility_parser.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:stac/src/framework/framework.dart'; +import 'package:stac/src/parsers/widgets/stac_visibility/stac_visibility.dart'; +import 'package:stac/src/utils/widget_type.dart'; +import 'package:stac_framework/stac_framework.dart'; + +class StacVisibilityParser extends StacParser { + const StacVisibilityParser(); + + @override + String get type => WidgetType.visibility.name; + + @override + StacVisibility getModel(Map json) => + StacVisibility.fromJson(json); + + @override + Widget parse(BuildContext context, StacVisibility model) { + final child = + Stac.fromJson(model.child, context) ?? const SizedBox.shrink(); + + final useMaintainConstructor = model.maintainState == true && + model.maintainAnimation == true && + model.maintainSize == true && + model.maintainSemantics == true && + model.maintainInteractivity == true; + + if (useMaintainConstructor) { + return Visibility.maintain( + visible: model.visible ?? true, + child: child, + ); + } + final replacement = + Stac.fromJson(model.replacement, context) ?? const SizedBox.shrink(); + + return Visibility( + visible: model.visible ?? true, + maintainState: model.maintainState ?? false, + maintainAnimation: model.maintainAnimation ?? false, + maintainSize: model.maintainSize ?? false, + maintainSemantics: model.maintainSemantics ?? false, + maintainInteractivity: model.maintainInteractivity ?? false, + replacement: replacement, + child: child, + ); + } +} diff --git a/packages/stac/lib/src/parsers/widgets/widgets.dart b/packages/stac/lib/src/parsers/widgets/widgets.dart index 3f4fb4de..280b5e6c 100644 --- a/packages/stac/lib/src/parsers/widgets/widgets.dart +++ b/packages/stac/lib/src/parsers/widgets/widgets.dart @@ -96,3 +96,4 @@ export 'package:stac/src/parsers/widgets/stac_text_field/stac_text_field.dart'; export 'package:stac/src/parsers/widgets/stac_text_form_field/stac_text_form_field.dart'; export 'package:stac/src/parsers/widgets/stac_text_style/stac_text_style.dart'; export 'package:stac/src/parsers/widgets/stac_wrap/stac_wrap.dart'; +export 'package:stac/src/parsers/widgets/stac_visibility/stac_visibility_parser.dart'; diff --git a/packages/stac/lib/src/utils/widget_type.dart b/packages/stac/lib/src/utils/widget_type.dart index 2db64830..0b8a57d3 100644 --- a/packages/stac/lib/src/utils/widget_type.dart +++ b/packages/stac/lib/src/utils/widget_type.dart @@ -75,4 +75,5 @@ enum WidgetType { textField, textFormField, wrap, + visibility, } From 3325e0912bad063cb4d26356368aaa212440c508 Mon Sep 17 00:00:00 2001 From: Abdalqader27 Date: Thu, 29 May 2025 14:05:10 +0400 Subject: [PATCH 2/3] fix: remove export for StacVisibilityParser --- .../src/parsers/widgets/stac_visibility/stac_visibility.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart index 2e8d2207..e67ab572 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart @@ -1,8 +1,6 @@ import 'package:freezed_annotation/freezed_annotation.dart'; -export 'stac_visibility_parser.dart'; part 'stac_visibility.freezed.dart'; - part 'stac_visibility.g.dart'; @freezed From 94c7a7ba52553d6fd8dcf81733e7a326f718783c Mon Sep 17 00:00:00 2001 From: Abdalqader27 Date: Thu, 29 May 2025 14:40:25 +0400 Subject: [PATCH 3/3] fix: update `stac_visibility` export path --- .../src/parsers/widgets/stac_visibility/stac_visibility.dart | 2 ++ packages/stac/lib/src/parsers/widgets/widgets.dart | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart index e67ab572..034aa7b1 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_visibility/stac_visibility.dart @@ -1,5 +1,7 @@ import 'package:freezed_annotation/freezed_annotation.dart'; +export 'stac_visibility_parser.dart'; + part 'stac_visibility.freezed.dart'; part 'stac_visibility.g.dart'; diff --git a/packages/stac/lib/src/parsers/widgets/widgets.dart b/packages/stac/lib/src/parsers/widgets/widgets.dart index 280b5e6c..cf6a782a 100644 --- a/packages/stac/lib/src/parsers/widgets/widgets.dart +++ b/packages/stac/lib/src/parsers/widgets/widgets.dart @@ -96,4 +96,4 @@ export 'package:stac/src/parsers/widgets/stac_text_field/stac_text_field.dart'; export 'package:stac/src/parsers/widgets/stac_text_form_field/stac_text_form_field.dart'; export 'package:stac/src/parsers/widgets/stac_text_style/stac_text_style.dart'; export 'package:stac/src/parsers/widgets/stac_wrap/stac_wrap.dart'; -export 'package:stac/src/parsers/widgets/stac_visibility/stac_visibility_parser.dart'; +export 'package:stac/src/parsers/widgets/stac_visibility/stac_visibility.dart';