From 3b02c1194ce88f1af21c1329e89e90dad14643b6 Mon Sep 17 00:00:00 2001 From: Saad Ardati Date: Fri, 25 Oct 2024 14:49:08 +0300 Subject: [PATCH 1/4] Placeholder Work #1 --- lib/src/api/nodes/grid_view_node.g.dart | 2 ++ lib/src/api/nodes/list_view_node.g.dart | 2 ++ lib/src/api/nodes/page_view_node.g.dart | 14 ++++++++------ lib/src/api/nodes/single_placeholder_node.dart | 4 ++++ lib/src/api/nodes/single_placeholder_node.g.dart | 6 ++++-- lib/src/api/nodes/variance_node.g.dart | 2 ++ 6 files changed, 22 insertions(+), 8 deletions(-) diff --git a/lib/src/api/nodes/grid_view_node.g.dart b/lib/src/api/nodes/grid_view_node.g.dart index 31bc466..8d33446 100644 --- a/lib/src/api/nodes/grid_view_node.g.dart +++ b/lib/src/api/nodes/grid_view_node.g.dart @@ -85,6 +85,7 @@ GridViewNode _$GridViewNodeFromJson(Map json) => GridViewNode( ) ..widthFactor = (json['widthFactor'] as num?)?.toDouble() ..heightFactor = (json['heightFactor'] as num?)?.toDouble() + ..ephemeral = json['ephemeral'] as bool ..allowedTypes = (json['allowedTypes'] as List) .map((e) => e as String) .toList() @@ -150,6 +151,7 @@ Map _$GridViewNodeToJson(GridViewNode instance) { writeNotNull( 'heightFactor', instance.heightFactor, instance.heightFactor, null); writeNotNull('children', instance.children, instance.children, []); + val['ephemeral'] = instance.ephemeral; val['allowedTypes'] = instance.allowedTypes; val['deniedTypes'] = instance.deniedTypes; writeNotNull('maxAllowedSize', instance.maxAllowedSize, diff --git a/lib/src/api/nodes/list_view_node.g.dart b/lib/src/api/nodes/list_view_node.g.dart index 5391e1a..9a605ea 100644 --- a/lib/src/api/nodes/list_view_node.g.dart +++ b/lib/src/api/nodes/list_view_node.g.dart @@ -85,6 +85,7 @@ ListViewNode _$ListViewNodeFromJson(Map json) => ListViewNode( ) ..widthFactor = (json['widthFactor'] as num?)?.toDouble() ..heightFactor = (json['heightFactor'] as num?)?.toDouble() + ..ephemeral = json['ephemeral'] as bool ..allowedTypes = (json['allowedTypes'] as List) .map((e) => e as String) .toList() @@ -150,6 +151,7 @@ Map _$ListViewNodeToJson(ListViewNode instance) { writeNotNull( 'heightFactor', instance.heightFactor, instance.heightFactor, null); writeNotNull('children', instance.children, instance.children, []); + val['ephemeral'] = instance.ephemeral; val['allowedTypes'] = instance.allowedTypes; val['deniedTypes'] = instance.deniedTypes; writeNotNull('maxAllowedSize', instance.maxAllowedSize, diff --git a/lib/src/api/nodes/page_view_node.g.dart b/lib/src/api/nodes/page_view_node.g.dart index fc33e88..ca099a3 100644 --- a/lib/src/api/nodes/page_view_node.g.dart +++ b/lib/src/api/nodes/page_view_node.g.dart @@ -74,15 +74,16 @@ PageViewNode _$PageViewNodeFromJson(Map json) => PageViewNode( {} ..widthFactor = (json['widthFactor'] as num?)?.toDouble() ..heightFactor = (json['heightFactor'] as num?)?.toDouble() + ..ephemeral = json['ephemeral'] as bool + ..allowedTypes = (json['allowedTypes'] as List) + .map((e) => e as String) + .toList() ..deniedTypes = (json['deniedTypes'] as List) .map((e) => e as String) .toList() ..maxAllowedSize = json['maxAllowedSize'] == null ? null : SizeC.fromJson(json['maxAllowedSize'] as Map) - ..allowedTypes = (json['allowedTypes'] as List) - .map((e) => e as String) - .toList() ..isScrollable = json['isScrollable'] as bool ..useFlutterListView = json['useFlutterListView'] as bool ..type = json['type'] as String; @@ -140,12 +141,13 @@ Map _$PageViewNodeToJson(PageViewNode instance) { writeNotNull( 'heightFactor', instance.heightFactor, instance.heightFactor, null); writeNotNull('children', instance.children, instance.children, []); - val['deniedTypes'] = instance.deniedTypes; - writeNotNull('maxAllowedSize', instance.maxAllowedSize, - instance.maxAllowedSize?.toJson(), null); writeNotNull( 'clipsContent', instance.clipsContent, instance.clipsContent, true); + val['ephemeral'] = instance.ephemeral; val['allowedTypes'] = instance.allowedTypes; + val['deniedTypes'] = instance.deniedTypes; + writeNotNull('maxAllowedSize', instance.maxAllowedSize, + instance.maxAllowedSize?.toJson(), null); val['isScrollable'] = instance.isScrollable; writeNotNull('scrollDirection', instance.scrollDirection, _$AxisCEnumMap[instance.scrollDirection]!, AxisC.vertical); diff --git a/lib/src/api/nodes/single_placeholder_node.dart b/lib/src/api/nodes/single_placeholder_node.dart index c3ca983..195f6a8 100644 --- a/lib/src/api/nodes/single_placeholder_node.dart +++ b/lib/src/api/nodes/single_placeholder_node.dart @@ -16,6 +16,9 @@ class SinglePlaceholderNode extends SceneNode @override final bool supportsPadding = true; + /// Whether the placeholder is only meant to exist for a short period of time. + bool ephemeral = false; + @override BoxConstraintsModel? relegatedConstraintsToChildren(BaseNode child) { final superRelegated = super.relegatedConstraintsToChildren(child); @@ -44,6 +47,7 @@ class SinglePlaceholderNode extends SceneNode required this.allowedTypes, required this.deniedTypes, this.maxAllowedSize, + this.ephemeral = false, required super.id, required super.name, required super.basicBoxLocal, diff --git a/lib/src/api/nodes/single_placeholder_node.g.dart b/lib/src/api/nodes/single_placeholder_node.g.dart index 1de094a..9b6a4f9 100644 --- a/lib/src/api/nodes/single_placeholder_node.g.dart +++ b/lib/src/api/nodes/single_placeholder_node.g.dart @@ -17,6 +17,7 @@ SinglePlaceholderNode _$SinglePlaceholderNodeFromJson(Map json) => maxAllowedSize: json['maxAllowedSize'] == null ? null : SizeC.fromJson(json['maxAllowedSize'] as Map), + ephemeral: json['ephemeral'] as bool? ?? false, id: json['id'] as String, name: json['name'] as String, basicBoxLocal: NodeBox.fromJson(json['basicBoxLocal']), @@ -85,6 +86,8 @@ Map _$SinglePlaceholderNodeToJson( } } + writeNotNull('reactions', instance.reactions, + instance.reactions.map((e) => e.toJson()).toList(), const []); writeNotNull('variables', instance.variables, instance.variables, {}); writeNotNull('multipleVariables', instance.multipleVariables, instance.multipleVariables, {}); @@ -111,8 +114,6 @@ Map _$SinglePlaceholderNodeToJson( instance.aspectRatioLock, false); writeNotNull('alignment', instance.alignment, instance.alignment.toJson(), AlignmentModel.none); - writeNotNull('reactions', instance.reactions, - instance.reactions.map((e) => e.toJson()).toList(), const []); val['basicBoxLocal'] = instance.basicBoxLocal.toJson(); writeNotNull('margin', instance.margin, instance.margin.toJson(), EdgeInsetsModel.zero); @@ -125,6 +126,7 @@ Map _$SinglePlaceholderNodeToJson( 'heightFactor', instance.heightFactor, instance.heightFactor, null); writeNotNull('children', instance.children, instance.children, []); val['type'] = instance.type; + writeNotNull('ephemeral', instance.ephemeral, instance.ephemeral, false); val['allowedTypes'] = instance.allowedTypes; val['deniedTypes'] = instance.deniedTypes; writeNotNull('maxAllowedSize', instance.maxAllowedSize, diff --git a/lib/src/api/nodes/variance_node.g.dart b/lib/src/api/nodes/variance_node.g.dart index 55e4dd2..a7f0b5d 100644 --- a/lib/src/api/nodes/variance_node.g.dart +++ b/lib/src/api/nodes/variance_node.g.dart @@ -59,6 +59,7 @@ VarianceNode _$VarianceNodeFromJson(Map json) => VarianceNode( {} ..widthFactor = (json['widthFactor'] as num?)?.toDouble() ..heightFactor = (json['heightFactor'] as num?)?.toDouble() + ..ephemeral = json['ephemeral'] as bool ..allowedTypes = (json['allowedTypes'] as List) .map((e) => e as String) .toList() @@ -121,6 +122,7 @@ Map _$VarianceNodeToJson(VarianceNode instance) { writeNotNull('widthFactor', instance.widthFactor, instance.widthFactor, null); writeNotNull( 'heightFactor', instance.heightFactor, instance.heightFactor, null); + val['ephemeral'] = instance.ephemeral; val['allowedTypes'] = instance.allowedTypes; val['deniedTypes'] = instance.deniedTypes; writeNotNull('maxAllowedSize', instance.maxAllowedSize, From f74dcf70347d671f028c0e85c71d54e26369a482 Mon Sep 17 00:00:00 2001 From: Saad Ardati Date: Mon, 28 Oct 2024 14:41:31 +0200 Subject: [PATCH 2/4] Placeholder Work #2 --- lib/src/api/nodes/auto_placeholder_node.dart | 8 ++++++++ lib/src/api/nodes/auto_placeholder_node.g.dart | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/src/api/nodes/auto_placeholder_node.dart b/lib/src/api/nodes/auto_placeholder_node.dart index 627c462..f54c54b 100644 --- a/lib/src/api/nodes/auto_placeholder_node.dart +++ b/lib/src/api/nodes/auto_placeholder_node.dart @@ -18,6 +18,11 @@ class AutoPlaceholderNode extends DefaultShapeNode @override final bool supportsPadding = true; + /// Whether the placeholder is only meant to exist for a short period of time. + /// This is used to determine whether the placeholder should be removed when + /// the user inserts anything into it. + bool ephemeral = false; + /// Creates a new [AutoPlaceholderNode] instance. AutoPlaceholderNode({ required super.id, @@ -59,6 +64,9 @@ class AutoPlaceholderNode extends DefaultShapeNode super.strokeCap, super.dashPattern, super.strokeSide, + + // PlaceholderMixin properties. + this.ephemeral = false, }) { setChildrenMixin(children: children); setRowColumnMixin( diff --git a/lib/src/api/nodes/auto_placeholder_node.g.dart b/lib/src/api/nodes/auto_placeholder_node.g.dart index 903e8fc..9714317 100644 --- a/lib/src/api/nodes/auto_placeholder_node.g.dart +++ b/lib/src/api/nodes/auto_placeholder_node.g.dart @@ -89,6 +89,7 @@ AutoPlaceholderNode _$AutoPlaceholderNodeFromJson(Map json) => strokeSide: $enumDecodeNullable(_$StrokeSideEnumMap, json['strokeSide']) ?? StrokeSide.all, + ephemeral: json['ephemeral'] as bool? ?? false, ) ..variables = (json['variables'] as Map?)?.map( (k, e) => MapEntry(k as String, e as String), @@ -120,6 +121,8 @@ Map _$AutoPlaceholderNodeToJson(AutoPlaceholderNode instance) { } } + writeNotNull('reactions', instance.reactions, + instance.reactions.map((e) => e.toJson()).toList(), const []); writeNotNull('variables', instance.variables, instance.variables, {}); writeNotNull('multipleVariables', instance.multipleVariables, instance.multipleVariables, {}); @@ -146,8 +149,6 @@ Map _$AutoPlaceholderNodeToJson(AutoPlaceholderNode instance) { instance.aspectRatioLock, false); writeNotNull('alignment', instance.alignment, instance.alignment.toJson(), AlignmentModel.none); - writeNotNull('reactions', instance.reactions, - instance.reactions.map((e) => e.toJson()).toList(), const []); val['basicBoxLocal'] = instance.basicBoxLocal.toJson(); writeNotNull('margin', instance.margin, instance.margin.toJson(), EdgeInsetsModel.zero); @@ -194,6 +195,7 @@ Map _$AutoPlaceholderNodeToJson(AutoPlaceholderNode instance) { _$CrossAxisAlignmentCEnumMap[instance.crossAxisAlignment]!, CrossAxisAlignmentC.center); val['type'] = instance.type; + writeNotNull('ephemeral', instance.ephemeral, instance.ephemeral, false); return val; } From 7c821636d7080cdb124fe4b9741a815b5d657511 Mon Sep 17 00:00:00 2001 From: birjuvachhani Date: Mon, 4 Nov 2024 14:44:08 +0530 Subject: [PATCH 3/4] :bug: fix ephemeral deserialization crash. --- lib/src/api/nodes/grid_view_node.dart | 1 + lib/src/api/nodes/grid_view_node.g.dart | 4 ++-- lib/src/api/nodes/list_view_node.dart | 1 + lib/src/api/nodes/list_view_node.g.dart | 4 ++-- lib/src/api/nodes/page_view_node.dart | 1 + lib/src/api/nodes/page_view_node.g.dart | 4 ++-- lib/src/api/nodes/single_placeholder_node.dart | 3 ++- lib/src/api/nodes/variance_node.dart | 7 ++++++- lib/src/api/nodes/variance_node.g.dart | 4 ++-- 9 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/src/api/nodes/grid_view_node.dart b/lib/src/api/nodes/grid_view_node.dart index 11233fb..20ffc26 100644 --- a/lib/src/api/nodes/grid_view_node.dart +++ b/lib/src/api/nodes/grid_view_node.dart @@ -71,6 +71,7 @@ class GridViewNode extends SinglePlaceholderNode children: [], allowedTypes: [], deniedTypes: ['GridView'], + ephemeral: false, ) { setChildrenMixin(children: children); setClipMixin(clipsContent: clipsContent); diff --git a/lib/src/api/nodes/grid_view_node.g.dart b/lib/src/api/nodes/grid_view_node.g.dart index 8d33446..4645681 100644 --- a/lib/src/api/nodes/grid_view_node.g.dart +++ b/lib/src/api/nodes/grid_view_node.g.dart @@ -85,7 +85,7 @@ GridViewNode _$GridViewNodeFromJson(Map json) => GridViewNode( ) ..widthFactor = (json['widthFactor'] as num?)?.toDouble() ..heightFactor = (json['heightFactor'] as num?)?.toDouble() - ..ephemeral = json['ephemeral'] as bool + ..ephemeral = json['ephemeral'] as bool? ?? false ..allowedTypes = (json['allowedTypes'] as List) .map((e) => e as String) .toList() @@ -151,7 +151,7 @@ Map _$GridViewNodeToJson(GridViewNode instance) { writeNotNull( 'heightFactor', instance.heightFactor, instance.heightFactor, null); writeNotNull('children', instance.children, instance.children, []); - val['ephemeral'] = instance.ephemeral; + writeNotNull('ephemeral', instance.ephemeral, instance.ephemeral, false); val['allowedTypes'] = instance.allowedTypes; val['deniedTypes'] = instance.deniedTypes; writeNotNull('maxAllowedSize', instance.maxAllowedSize, diff --git a/lib/src/api/nodes/list_view_node.dart b/lib/src/api/nodes/list_view_node.dart index 8ff2574..5b4c710 100644 --- a/lib/src/api/nodes/list_view_node.dart +++ b/lib/src/api/nodes/list_view_node.dart @@ -80,6 +80,7 @@ class ListViewNode extends SinglePlaceholderNode deniedTypes: [ 'listView', ], + ephemeral: false, ) { setChildrenMixin(children: children); setClipMixin(clipsContent: clipsContent); diff --git a/lib/src/api/nodes/list_view_node.g.dart b/lib/src/api/nodes/list_view_node.g.dart index 9a605ea..474aa23 100644 --- a/lib/src/api/nodes/list_view_node.g.dart +++ b/lib/src/api/nodes/list_view_node.g.dart @@ -85,7 +85,7 @@ ListViewNode _$ListViewNodeFromJson(Map json) => ListViewNode( ) ..widthFactor = (json['widthFactor'] as num?)?.toDouble() ..heightFactor = (json['heightFactor'] as num?)?.toDouble() - ..ephemeral = json['ephemeral'] as bool + ..ephemeral = json['ephemeral'] as bool? ?? false ..allowedTypes = (json['allowedTypes'] as List) .map((e) => e as String) .toList() @@ -151,7 +151,7 @@ Map _$ListViewNodeToJson(ListViewNode instance) { writeNotNull( 'heightFactor', instance.heightFactor, instance.heightFactor, null); writeNotNull('children', instance.children, instance.children, []); - val['ephemeral'] = instance.ephemeral; + writeNotNull('ephemeral', instance.ephemeral, instance.ephemeral, false); val['allowedTypes'] = instance.allowedTypes; val['deniedTypes'] = instance.deniedTypes; writeNotNull('maxAllowedSize', instance.maxAllowedSize, diff --git a/lib/src/api/nodes/page_view_node.dart b/lib/src/api/nodes/page_view_node.dart index 2df4270..e072fe1 100644 --- a/lib/src/api/nodes/page_view_node.dart +++ b/lib/src/api/nodes/page_view_node.dart @@ -61,6 +61,7 @@ class PageViewNode extends SinglePlaceholderNode children: [], allowedTypes: [], deniedTypes: ['pageView'], + ephemeral: false, ) { setChildrenMixin(children: children); setClipMixin(clipsContent: clipsContent); diff --git a/lib/src/api/nodes/page_view_node.g.dart b/lib/src/api/nodes/page_view_node.g.dart index ca099a3..0152416 100644 --- a/lib/src/api/nodes/page_view_node.g.dart +++ b/lib/src/api/nodes/page_view_node.g.dart @@ -74,7 +74,7 @@ PageViewNode _$PageViewNodeFromJson(Map json) => PageViewNode( {} ..widthFactor = (json['widthFactor'] as num?)?.toDouble() ..heightFactor = (json['heightFactor'] as num?)?.toDouble() - ..ephemeral = json['ephemeral'] as bool + ..ephemeral = json['ephemeral'] as bool? ?? false ..allowedTypes = (json['allowedTypes'] as List) .map((e) => e as String) .toList() @@ -143,7 +143,7 @@ Map _$PageViewNodeToJson(PageViewNode instance) { writeNotNull('children', instance.children, instance.children, []); writeNotNull( 'clipsContent', instance.clipsContent, instance.clipsContent, true); - val['ephemeral'] = instance.ephemeral; + writeNotNull('ephemeral', instance.ephemeral, instance.ephemeral, false); val['allowedTypes'] = instance.allowedTypes; val['deniedTypes'] = instance.deniedTypes; writeNotNull('maxAllowedSize', instance.maxAllowedSize, diff --git a/lib/src/api/nodes/single_placeholder_node.dart b/lib/src/api/nodes/single_placeholder_node.dart index 195f6a8..c73390d 100644 --- a/lib/src/api/nodes/single_placeholder_node.dart +++ b/lib/src/api/nodes/single_placeholder_node.dart @@ -17,7 +17,8 @@ class SinglePlaceholderNode extends SceneNode final bool supportsPadding = true; /// Whether the placeholder is only meant to exist for a short period of time. - bool ephemeral = false; + @JsonKey(defaultValue: false) + bool ephemeral; @override BoxConstraintsModel? relegatedConstraintsToChildren(BaseNode child) { diff --git a/lib/src/api/nodes/variance_node.dart b/lib/src/api/nodes/variance_node.dart index d89a370..50d4850 100644 --- a/lib/src/api/nodes/variance_node.dart +++ b/lib/src/api/nodes/variance_node.dart @@ -78,7 +78,12 @@ class VarianceNode extends SinglePlaceholderNode { String? currentVariantId, }) : assert(variants.isNotEmpty), currentVariantId = currentVariantId ?? variants[0].id, - super(children: [], allowedTypes: [], deniedTypes: []); + super( + children: [], + allowedTypes: [], + deniedTypes: [], + ephemeral: false, + ); @override void setChildrenMixin({required List children}) {} diff --git a/lib/src/api/nodes/variance_node.g.dart b/lib/src/api/nodes/variance_node.g.dart index a7f0b5d..c2ec420 100644 --- a/lib/src/api/nodes/variance_node.g.dart +++ b/lib/src/api/nodes/variance_node.g.dart @@ -59,7 +59,7 @@ VarianceNode _$VarianceNodeFromJson(Map json) => VarianceNode( {} ..widthFactor = (json['widthFactor'] as num?)?.toDouble() ..heightFactor = (json['heightFactor'] as num?)?.toDouble() - ..ephemeral = json['ephemeral'] as bool + ..ephemeral = json['ephemeral'] as bool? ?? false ..allowedTypes = (json['allowedTypes'] as List) .map((e) => e as String) .toList() @@ -122,7 +122,7 @@ Map _$VarianceNodeToJson(VarianceNode instance) { writeNotNull('widthFactor', instance.widthFactor, instance.widthFactor, null); writeNotNull( 'heightFactor', instance.heightFactor, instance.heightFactor, null); - val['ephemeral'] = instance.ephemeral; + writeNotNull('ephemeral', instance.ephemeral, instance.ephemeral, false); val['allowedTypes'] = instance.allowedTypes; val['deniedTypes'] = instance.deniedTypes; writeNotNull('maxAllowedSize', instance.maxAllowedSize, From e10c47c337c22f7f21d80ffad6fdfb5ed7d935ea Mon Sep 17 00:00:00 2001 From: birjuvachhani Date: Thu, 7 Nov 2024 21:22:30 +0530 Subject: [PATCH 4/4] Placeholder Work #14 - Make things work! --- lib/src/api/nodes/canvas_node.dart | 14 ++++++++++++++ lib/src/api/nodes/spacer_node.dart | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/lib/src/api/nodes/canvas_node.dart b/lib/src/api/nodes/canvas_node.dart index dce4117..e644bf9 100644 --- a/lib/src/api/nodes/canvas_node.dart +++ b/lib/src/api/nodes/canvas_node.dart @@ -143,6 +143,13 @@ class CanvasNode extends ParentNode } } + /// Checks if a node is symbiotic with its canvas, ie the node acts as the + /// canvas's body or navigation bar or top app bar. + bool isNodeAttachedToCanvas(String nodeID) => + properties.bodyId == nodeID || + properties.navigationBarPlaceholderId == nodeID || + properties.topAppBarPlaceholderId == nodeID; + /// Creates a new [CanvasNode] from a JSON data. factory CanvasNode.fromJson(Map json) => _$CanvasNodeFromJson(json); @@ -199,6 +206,13 @@ class CanvasProperties with SerializableMixin, EquatableMixin { this.brightness = BrightnessModel.system, }); + /// Checks if a node is symbiotic with its canvas, ie the node acts as the + /// canvas's body or navigation bar or top app bar. + bool isNodeAttachedToCanvas(String nodeID) => + bodyId == nodeID || + navigationBarPlaceholderId == nodeID || + topAppBarPlaceholderId == nodeID; + @override List get props => [ navigationBarPlaceholderId, diff --git a/lib/src/api/nodes/spacer_node.dart b/lib/src/api/nodes/spacer_node.dart index 29f11d8..89cc750 100644 --- a/lib/src/api/nodes/spacer_node.dart +++ b/lib/src/api/nodes/spacer_node.dart @@ -16,6 +16,12 @@ class SpacerNode extends SceneNode { @override bool get supportsMargin => false; + @override + bool get supportsRotation => false; + + @override + bool get supportsVisibility => false; + /// Creates a new [SpacerNode] with the given data. SpacerNode({ required super.id,