diff --git a/.gitmodules b/.gitmodules index e584bd51..e69de29b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "pbdl"] - path = pbdl - url = https://github.com/Parabeac/pbdl diff --git a/README.md b/README.md index afc31ea0..54686a45 100644 --- a/README.md +++ b/README.md @@ -44,66 +44,61 @@ The handoff between designers & developers is one of the most costly and frustra ### Dependencies - - [Dart](https://dart.dev/get-dart) - - [Flutter](https://flutter.dev/docs/get-started/install) - - [node.js](https://nodejs.org/en/download/) - - [Figma File](https://figma.com) - [Sample](https://www.figma.com/file/Ysnjcij14HaE98ucq1iwW1/Parabeac-Counter-App-Demo?node-id=0%3A1) +- [Dart](https://dart.dev/get-dart) +- [Flutter](https://flutter.dev/docs/get-started/install) +- [node.js](https://nodejs.org/en/download/) +- [Figma File](https://figma.com) - [Sample](https://www.figma.com/file/Ysnjcij14HaE98ucq1iwW1/Parabeac-Counter-App-Demo?node-id=0%3A1) -## Cloning parabeac_core -Because parabeac_core contains submodules, it is easiest to clone using the following command: -``` -git clone --recurse-submodules https://github.com/Parabeac/parabeac_core.git -``` - -If you have already cloned you may need to pull the submodules: -``` -git submodule update --init -``` - -**_Run the following command to update the submodules:_** - -``` -git pull --recurse-submodules -``` ## Running parabeac_core + ### Figma - In your terminal, change your directory to the root parabeac_core directory and run: -``` bash +In your terminal, change your directory to the root parabeac_core directory and run: + +```bash $ pub get - $ dart parabeac.dart -f -k -o + $ dart parabeac.dart -f -k -o ``` + #### Figma File ID (Required): -f + 1. Visit https://figma.com and log in. 2. Select your Design File -3. The file ID is contained in the URL of your design file immediately after figma.com/file/``/. - - *Example: The file ID for ```https://www.figma.com/file/Ysnjcij14HaE98ucq1iwW1/Parabeac-Counter-App-Demo``` is ```Ysnjcij14HaE98ucq1iwW1```* +3. The file ID is contained in the URL of your design file immediately after figma.com/file/``/. + + _Example: The file ID for `https://www.figma.com/file/Ysnjcij14HaE98ucq1iwW1/Parabeac-Counter-App-Demo` is `Ysnjcij14HaE98ucq1iwW1`_ + #### Figma API Key (Required): -k + 1. Visit https://figma.com and log in. 2. Navigate to your user profile and select `Settings` 3. Scroll Down to the "Create a new Personal Access Token" -4. Create a new Personal Access Token and copy your new API key. (It should look something like this: ```64522-a0e5509a-d5ce-47a8-880b-c295f9cb27ed```) +4. Create a new Personal Access Token and copy your new API key. (It should look something like this: `64522-a0e5509a-d5ce-47a8-880b-c295f9cb27ed`) #### Name (Optional): -n -Sets the name of the exported project. For instance, if you want to name your project "cool_project", set the `-n` flag to `cool_project`. *Note: parabeac_core can only use [valid Flutter project names](https://dart.dev/tools/pub/pubspec#name).* + +Sets the name of the exported project. For instance, if you want to name your project "cool_project", set the `-n` flag to `cool_project`. _Note: parabeac_core can only use [valid Flutter project names](https://dart.dev/tools/pub/pubspec#name)._ + #### Absolute Path (Optional): -o + Specifies the absolute path of the exported Flutter Project to be created. For instance, to export your Flutter project in the Documents folder, set your `-o` flag to `/Users/ParabeacUser/Documents/` Not setting this will export the project in the parabeac_core directory. ### Sketch -Due to the lack of requested support for Sketch and the major updates to this project, we temporarily stopped support for Sketch. +Due to the lack of requested support for Sketch and the major updates to this project, we temporarily stopped support for Sketch. # Running the generated code -We recommend following our [Hello World guide](https://docs.parabeac.com/docs/hello-world-guide) but if you feel experienced enough with Flutter, feel free to jump right in here: +We recommend following our [Hello World guide](https://docs.parabeac.com/docs/hello-world-guide) but if you feel experienced enough with Flutter, feel free to jump right in here: ### Running a Figma Frame/Screen ![Figma Frame Example](https://github.com/Parabeac/parabeac_core/blob/stable/repo_assets/figma_frame_example.png?raw=true) #### Steps + 1. Open your generated project (Will be at the absolute path you set or in the parabeac_core directory) 2. If your frame was designed to be a screen, you can quickly test it by editing the MaterialApp widget in main.dart like the following: -``` class MyApp extends StatelessWidget { + +```class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { @@ -116,12 +111,15 @@ We recommend following our [Hello World guide](https://docs.parabeac.com/docs/he } } ``` -3. Save `main.dart` and execute `flutter run` + +3. Save `main.dart` and execute `flutter run` + ### Running a Figma Component ![Figma Component Example](https://raw.githubusercontent.com/Parabeac/parabeac_core/stable/repo_assets/figma_component_example.png) 1. Navigate to a widget/screen where you can add in your component as a child. 2. Reference the component by providing a LayoutBuilder widget like the following: + ``` Container( child: LayoutBuilder(builder: (context, constraints) { @@ -131,6 +129,7 @@ Container( }) ) ``` + 1. Save the class and execute `flutter run` in your terminal & navigate your app to the expected location where the component should show up. diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart index 3bc52d52..e6abb75e 100644 --- a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart @@ -15,7 +15,7 @@ class WidgetBookFolder extends IsolationNode { WidgetbookFolder( name: '$name', ${genWidgets.isNotEmpty ? 'widgets: [\n$genWidgets\n],\n' : ''} - ) + ), '''; } } diff --git a/lib/generation/generators/attribute-helper/pb_box_decoration_gen_helper.dart b/lib/generation/generators/attribute-helper/pb_box_decoration_gen_helper.dart index 74a35b85..ad0534bc 100644 --- a/lib/generation/generators/attribute-helper/pb_box_decoration_gen_helper.dart +++ b/lib/generation/generators/attribute-helper/pb_box_decoration_gen_helper.dart @@ -1,9 +1,7 @@ import 'package:parabeac_core/generation/generators/attribute-helper/pb_attribute_gen_helper.dart'; import 'package:parabeac_core/generation/generators/attribute-helper/pb_color_gen_helper.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/container.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_container.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/inherited_container.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; class PBBoxDecorationHelper extends PBAttributesHelper { @@ -15,30 +13,49 @@ class PBBoxDecorationHelper extends PBAttributesHelper { final buffer = StringBuffer(); buffer.write('decoration: BoxDecoration('); var borderInfo = source.auxiliaryData.borderInfo; - if (source.auxiliaryData.color != null) { + var effectsInfo = source.auxiliaryData.effects; + var colors = source.auxiliaryData.colors; + if (colors != null && colors.isNotEmpty) { buffer.write(PBColorGenHelper().generate(source, generatorContext)); } if (borderInfo != null) { - if (borderInfo.shape == 'circle') { - buffer.write('shape: BoxShape.circle,'); - } else if (borderInfo.borderRadius != null) { + if (borderInfo.borderRadius != null) { // Write border radius if it exists buffer.write( 'borderRadius: BorderRadius.all(Radius.circular(${borderInfo.borderRadius})),'); - // Write border outline properties if applicable - if (borderInfo.isBorderOutlineVisible && - (borderInfo.color != null || borderInfo.thickness != null)) { - buffer.write('border: Border.all('); - if (borderInfo.color != null) { - buffer.write('color: Color(${borderInfo.color.toString()}),'); - } - if (borderInfo.thickness != null) { - buffer.write('width: ${borderInfo.thickness},'); - } - buffer.write('),'); // end of Border.all( + } else if (borderInfo.type == 'circle') { + buffer.write('shape: BoxShape.circle,'); + } + + // Write border outline properties if applicable + if (borderInfo.thickness > 0 && borderInfo.visible) { + buffer.write('border: Border.all('); + if (borderInfo.color != null) { + buffer.write('color: Color(${borderInfo.color.toString()}),'); } + buffer.write('width: ${borderInfo.thickness},'); + buffer.write('),'); // end of Border.all( } } + + if (effectsInfo != null && + effectsInfo.isNotEmpty && + effectsInfo.first.type.toLowerCase().contains('shadow')) { + buffer.write('boxShadow: ['); + + for (var effect in effectsInfo) { + buffer.write(''' + BoxShadow( + ${PBColorGenHelper().getHexColor(effect.color)} + spreadRadius: ${effect.radius}, + blurRadius: ${effect.radius}, + offset: Offset(${effect.offset['x']}, ${effect.offset['y']}), + ), + '''); + } + + buffer.write('],'); + } buffer.write('),'); return buffer.toString(); diff --git a/lib/generation/generators/attribute-helper/pb_color_gen_helper.dart b/lib/generation/generators/attribute-helper/pb_color_gen_helper.dart index 8bd98603..d67d1cc4 100644 --- a/lib/generation/generators/attribute-helper/pb_color_gen_helper.dart +++ b/lib/generation/generators/attribute-helper/pb_color_gen_helper.dart @@ -2,7 +2,9 @@ import 'package:parabeac_core/generation/generators/attribute-helper/pb_attribut import 'package:parabeac_core/interpret_and_optimize/entities/inherited_container.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_scaffold.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_fill.dart'; class PBColorGenHelper extends PBAttributesHelper { PBColorGenHelper() : super(); @@ -13,6 +15,13 @@ class PBColorGenHelper extends PBAttributesHelper { return ''; } + if (source.auxiliaryData.colors != null && + source.auxiliaryData.colors.first.type + .toLowerCase() + .contains('gradient')) { + return _gradientColor(source.auxiliaryData.colors.first); + } + var color = source.auxiliaryData.color?.toString(); if (color == null) { return ''; @@ -41,6 +50,54 @@ class PBColorGenHelper extends PBAttributesHelper { } } + /// Generate gradient for decoration box + String _gradientColor(PBFill gradient) { + var beginX = _roundNumber(gradient.gradientHandlePositions[0].x); + var beginY = _roundNumber(gradient.gradientHandlePositions[0].y); + var endX = _roundNumber(gradient.gradientHandlePositions[1].x); + var endY = _roundNumber(gradient.gradientHandlePositions[1].y); + + var gradientInfo = _getGradientInfo(gradient); + + return ''' + gradient: LinearGradient( + begin: Alignment($beginX,$beginY), + end: Alignment($endX,$endY), + colors: [ + ${gradientInfo[0]} + ], + stops: [ + ${gradientInfo[1]} + ], + tileMode: TileMode.clamp, + ), + '''; + } + + /// Gradient info is a list + /// 0 is for gradient color + /// 1 is for gradient stop position + List _getGradientInfo(PBFill gradient) { + var gradientInfo = ['', '']; + for (var stop in gradient.gradientStops) { + gradientInfo[0] += 'Color(${stop.color.toString()}),'; + gradientInfo[1] += '${stop.position},'; + } + return gradientInfo; + } + + num _roundNumber(num coordinate) { + return (2 * coordinate) - 1; + } + + /// Get String from Color + String getHexColor(PBColor color) { + if (color == null) { + return ''; + } + return 'color : Color(${color.toString()}),'; + } + /// Finds default color based on common hex patterns. /// /// Returns `null` if no pattern was found diff --git a/lib/generation/generators/attribute-helper/pb_size_helper.dart b/lib/generation/generators/attribute-helper/pb_size_helper.dart index 932ee7d6..1302f75f 100644 --- a/lib/generation/generators/attribute-helper/pb_size_helper.dart +++ b/lib/generation/generators/attribute-helper/pb_size_helper.dart @@ -60,6 +60,17 @@ class PBSizeHelper extends PBAttributesHelper { heightString = 'height: constraints.maxHeight * ${relativeHeight.toStringAsFixed(3)},'; + } else if (context.sizingContext == + SizingValueContext.LayoutBuilderStatefulValue) { + relativeWidth = relativeWidth / screenWidth; + relativeHeight = relativeHeight / screenHeight; + + // Size for LayoutBuilder + widthString = + 'width: widget.constraints.maxWidth * ${relativeWidth.toStringAsFixed(3)},'; + + heightString = + 'height: widget.constraints.maxHeight * ${relativeHeight.toStringAsFixed(3)},'; } else { // Size for constants value widthString = 'width: ${relativeWidth.toStringAsFixed(3)},'; diff --git a/lib/generation/generators/pb_flutter_generator.dart b/lib/generation/generators/pb_flutter_generator.dart index a55e9e07..49fa665d 100644 --- a/lib/generation/generators/pb_flutter_generator.dart +++ b/lib/generation/generators/pb_flutter_generator.dart @@ -62,7 +62,7 @@ class PBFlutterGenerator extends PBGenerationManager { var it = data.globalVariables; while (it.moveNext()) { param = it.current; - stringBuffer.write(param.type + + stringBuffer.write(param.pbdlType + ' ' + param.variableName + (param.defaultValue == null ? '' : ' = ${param.defaultValue}') + diff --git a/lib/generation/generators/plugins/pb_plugin_node.dart b/lib/generation/generators/plugins/pb_plugin_node.dart index f8ecde7c..05b23d16 100644 --- a/lib/generation/generators/plugins/pb_plugin_node.dart +++ b/lib/generation/generators/plugins/pb_plugin_node.dart @@ -1,5 +1,7 @@ -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_constraints.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_layout_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visual_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; @@ -29,4 +31,45 @@ abstract class PBTag extends PBVisualIntermediateNode { PBIntermediateTree tree); void extractInformation(PBIntermediateNode incomingNode); + + /// Handles `iNode` to convert into a [PBTag]. + /// + /// Returns the [PBIntermediateNode] that should go into the [PBIntermediateTree] + PBIntermediateNode handleIntermediateNode( + PBIntermediateNode iNode, + PBIntermediateNode parent, + PBTag tag, + PBIntermediateTree tree, + ) { + iNode.name = iNode.name.replaceAll(tag.semanticName, ''); + + // If `iNode` is [PBSharedMasterNode] we need to place the [CustomEgg] betweeen the + // [PBSharedMasterNode] and the [PBSharedMasterNode]'s children. That is why we are returing + // `iNode` at the end. + if (iNode is PBSharedMasterNode) { + return iNode; + } else if (iNode is PBSharedInstanceIntermediateNode) { + iNode.parent = parent; + + tree.replaceNode(iNode, tag); + + tree.addEdges(tag, [iNode]); + + return tag; + } else { + // [iNode] needs a parent and has not been added to the [tree] by [tree.addEdges] + iNode.parent = parent; + // If `iNode` has no children, it likely means we want to wrap `iNode` in [CustomEgg] + if (tree.childrenOf(iNode).isEmpty || iNode is PBLayoutIntermediateNode) { + /// Wrap `iNode` in `newTag` and make `newTag` child of `parent`. + tree.removeEdges(iNode.parent, [iNode]); + tree.addEdges(tag, [iNode]); + tree.addEdges(parent, [tag]); + return tag; + } + tree.replaceNode(iNode, tag, acceptChildren: true); + + return tag; + } + } } diff --git a/lib/generation/generators/symbols/pb_instancesym_gen.dart b/lib/generation/generators/symbols/pb_instancesym_gen.dart index b693fe75..b2084ba1 100644 --- a/lib/generation/generators/symbols/pb_instancesym_gen.dart +++ b/lib/generation/generators/symbols/pb_instancesym_gen.dart @@ -1,6 +1,5 @@ import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; -import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; diff --git a/lib/generation/generators/symbols/pb_mastersym_gen.dart b/lib/generation/generators/symbols/pb_mastersym_gen.dart index 94ed864b..e3bd1aaa 100644 --- a/lib/generation/generators/symbols/pb_mastersym_gen.dart +++ b/lib/generation/generators/symbols/pb_mastersym_gen.dart @@ -1,17 +1,17 @@ import 'package:parabeac_core/generation/generators/pb_generator.dart'; -import 'package:parabeac_core/generation/generators/value_objects/template_strategy/stateless_template_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/stateful_template_strategy.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:quick_log/quick_log.dart'; class PBMasterSymbolGenerator extends PBGenerator { - PBMasterSymbolGenerator() : super(strategy: StatelessTemplateStrategy()); + PBMasterSymbolGenerator() : super(strategy: StatefulTemplateStrategy()); var log = Logger('Symbol Master Generator'); @override String generate(PBIntermediateNode source, PBContext context) { - context.sizingContext = SizingValueContext.LayoutBuilderValue; + context.sizingContext = SizingValueContext.LayoutBuilderStatefulValue; var children = context.tree.childrenOf(source); var sourceChild = children.isNotEmpty ? children.first : null; var buffer = StringBuffer(); diff --git a/lib/generation/generators/value_objects/template_strategy/stateful_template_strategy.dart b/lib/generation/generators/value_objects/template_strategy/stateful_template_strategy.dart index 0ebb29bb..cea1b67c 100644 --- a/lib/generation/generators/value_objects/template_strategy/stateful_template_strategy.dart +++ b/lib/generation/generators/value_objects/template_strategy/stateful_template_strategy.dart @@ -3,6 +3,7 @@ import 'package:parabeac_core/generation/generators/value_objects/template_strat import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; +import 'package:recase/recase.dart'; ///Generating a [StatefulWidget] class StatefulTemplateStrategy extends TemplateStrategy { @@ -10,15 +11,46 @@ class StatefulTemplateStrategy extends TemplateStrategy { String generateTemplate(PBIntermediateNode node, PBGenerationManager manager, PBContext generatorContext, {args}) { - var widgetName = retrieveNodeName(node); + var widgetName = retrieveNodeName(node.name.pascalCase); var constructorName = '$widgetName'; var returnStatement = node.generator.generate(node, generatorContext); + /// Represents the overrides for the constructor. + var overrides = ''; + + /// Represents the overrides for the class variables. + var overrideVars = ''; + + /// Represents the override name and how many times it appears on the list. + var ovrCount = {}; + + if (node is PBSharedMasterNode && node.overridableProperties.isNotEmpty) { + node.overridableProperties.forEach((prop) { + /// Add the property to the overrides if not repeated. + /// + /// TODO: Add support for repeated properties. + /// The issue is that for instances, we cannot change the name from PBDL, + /// so we need a way to detect repeated overrides in a single place. + if (!ovrCount.containsKey(prop.propertyName)) { + ovrCount[prop.propertyName] = 0; + + var overrideType = 'Widget?'; + if (prop.type == 'stringValue') { + overrideType = 'String?'; + } + overrides += 'this.${prop.propertyName}, '; + overrideVars += 'final $overrideType ${prop.propertyName};'; + } + }); + } + return ''' ${manager.generateImports()} class $widgetName extends StatefulWidget{ - const $widgetName({Key? key}) : super(key: key); + ${node is PBSharedMasterNode ? 'final constraints;' : ''} + $overrideVars + const $widgetName(${node is PBSharedMasterNode ? 'this.constraints,' : ''} {Key? key, $overrides}) : super(key: key); @override _$widgetName createState() => _$widgetName(); } diff --git a/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart b/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart index 77942a6d..b3ae872b 100644 --- a/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart @@ -2,12 +2,10 @@ import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/generation/generators/attribute-helper/pb_size_helper.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/column.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_constraints.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_bitmap.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/override_helper.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; -import 'package:path/path.dart' as p; class PBBitmapGenerator extends PBGenerator { var _sizehelper; @@ -24,14 +22,14 @@ class PBBitmapGenerator extends PBGenerator { var buffer = StringBuffer(); var imageOverride = OverrideHelper.getProperty(source.UUID, 'image'); if (imageOverride != null) { - buffer.write('${imageOverride.propertyName} ?? '); + buffer.write(imageOverride.generateOverride()); } buffer.write('Image.asset('); var styleOverride = OverrideHelper.getProperty(source.UUID, 'layerStyle'); if (styleOverride != null) { - buffer.write('${styleOverride.propertyName} ?? '); + buffer.write(styleOverride.generateOverride()); } var boxFit = _getBoxFit(source); diff --git a/lib/generation/generators/visual-widgets/pb_positioned_gen.dart b/lib/generation/generators/visual-widgets/pb_positioned_gen.dart index 1f9700a4..7047750b 100644 --- a/lib/generation/generators/visual-widgets/pb_positioned_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_positioned_gen.dart @@ -79,6 +79,13 @@ class PBPositionedGenerator extends PBGenerator { } else { return 'constraints.maxHeight *'; } + } else if (sizingValueContext == + SizingValueContext.LayoutBuilderStatefulValue) { + if (_positionedValue.isXAxis) { + return 'widget.constraints.maxWidth *'; + } else { + return 'widget.constraints.maxHeight *'; + } } if (_positionedValue.remainPointValue || diff --git a/lib/generation/generators/visual-widgets/pb_text_gen.dart b/lib/generation/generators/visual-widgets/pb_text_gen.dart index c97a657e..3feaca32 100644 --- a/lib/generation/generators/visual-widgets/pb_text_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_text_gen.dart @@ -5,6 +5,7 @@ import 'package:parabeac_core/interpret_and_optimize/entities/inherited_text.dar import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/override_helper.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_effect.dart'; class PBTextGen extends PBGenerator { PBTextGen() : super(); @@ -14,6 +15,7 @@ class PBTextGen extends PBGenerator { @override String generate(PBIntermediateNode source, PBContext context) { if (source is InheritedText) { + var textStyle = source.auxiliaryData.intermediateTextStyle; var cleanText = cleanString(source.text); context.project.genProjectData.addDependencies('auto_size_text', '3.0.0'); @@ -29,40 +31,45 @@ class PBTextGen extends PBGenerator { var textOverride = OverrideHelper.getProperty(source.UUID, 'stringValue'); if (textOverride != null) { - buffer.write('${textOverride.propertyName} ?? '); + buffer.write(textOverride.generateOverride()); } buffer.write(('\'$cleanText\'') + ',\n'); } buffer.write('style: '); var styleOverride = OverrideHelper.getProperty(source.UUID, 'textStyle'); if (styleOverride != null) { - buffer.write('${styleOverride.propertyName} ?? '); + buffer.write(styleOverride.generateOverride()); } buffer.write('TextStyle(\n'); - if (source.fontName != null) { - buffer.write('fontFamily: \'${source.fontName}\',\n'); + if (textStyle.fontFamily != null) { + buffer.write('fontFamily: \'${textStyle.fontFamily}\',\n'); } - if (source.fontSize != null) { - buffer.write('fontSize: ${source.fontSize.toString()},\n'); + if (textStyle.fontSize != null) { + buffer.write('fontSize: ${textStyle.fontSize.toString()},\n'); } - if (source.fontWeight != null) { - buffer - .write('fontWeight: FontWeight.${source.fontWeight.toString()},\n'); + if (textStyle.fontWeight != null) { + buffer.write( + 'fontWeight: FontWeight.w${textStyle.fontWeight.toString()},\n'); } - if (source.fontStyle != null) { - buffer.write('fontStyle: FontStyle.${source.fontStyle},\n'); + if (textStyle.italics != null) { + buffer.write('fontStyle: FontStyle.${textStyle.italics},\n'); } - if (source.letterSpacing != null) { - buffer.write('letterSpacing: ${source.letterSpacing},\n'); + if (textStyle.letterSpacing != null) { + buffer.write('letterSpacing: ${textStyle.letterSpacing},\n'); } if (source.auxiliaryData.color != null) { buffer.write(PBColorGenHelper().generate(source, context)); } + if (source.auxiliaryData.effects != null) { + buffer.write(_getEffects(source.auxiliaryData.effects)); + } + buffer.write('),'); - if (source.textAlignment != null) { - buffer.write('textAlign: TextAlign.${source.textAlignment},\n'); + if (textStyle.textAlignHorizontal != null) { + buffer.write( + 'textAlign: TextAlign.${textStyle.textAlignHorizontal.toLowerCase()},\n'); } buffer.write('\n)'); @@ -70,4 +77,27 @@ class PBTextGen extends PBGenerator { } return ''; } + + String _getEffects(List effects) { + var shadows = ''; + effects.forEach((effect) { + if (effect.visible && effect.type.toLowerCase().contains('shadow')) { + shadows += ''' + Shadow( + ${PBColorGenHelper().getHexColor(effect.color)} + offset: Offset(${effect.offset['x']}, ${effect.offset['y']}), + blurRadius: ${effect.radius}, + ), + '''; + } + }); + if (shadows.isNotEmpty) { + return ''' + shadows: [ + $shadows + ], + '''; + } + return ''; + } } diff --git a/lib/generation/generators/writers/pb_flutter_writer.dart b/lib/generation/generators/writers/pb_flutter_writer.dart index 7cd10a1f..6001e846 100644 --- a/lib/generation/generators/writers/pb_flutter_writer.dart +++ b/lib/generation/generators/writers/pb_flutter_writer.dart @@ -98,22 +98,30 @@ class MyApp extends StatelessWidget { /// Add assets if (modifiableyaml.containsKey('flutter')) { - /// Create `assets` entry if does not exist - if (!modifiableyaml['flutter'].containsKey('assets')) { - modifiableyaml['flutter']['assets'] = []; - } + var assets = _getAssetFileNames(); - var yamlAssets = - (modifiableyaml['flutter']['assets'] as List).cast(); + /// If there are no assets to add, simply return. + if (assets.isEmpty) { + return; + } - var assets = _getAssetFileNames(); + /// Add only elements that are not already in the yaml + if (modifiableyaml['flutter'].containsKey('assets') && + modifiableyaml['flutter']['assets'] != null) { + var existingAssets = (modifiableyaml['flutter']['assets'] as List); + assets.forEach((asset) { + if (!existingAssets.any((e) => e.endsWith('/$asset'))) { + existingAssets + .add('packages/${MainInfo().projectName}/assets/images/$asset'); + } + }); + } - /// Add dependency for each asset - for (var assetName in assets) { - if (!yamlAssets.any((str) => str.endsWith('/$assetName'))) { - yamlAssets.add( - 'packages/${MainInfo().projectName}/assets/images/$assetName'); - } + /// Add all elements to the yaml + else { + modifiableyaml['flutter']['assets'] = assets + .map((e) => 'packages/${MainInfo().projectName}/assets/images/$e') + .toList(); } } @@ -127,7 +135,7 @@ class MyApp extends StatelessWidget { // Return names inside image reference storage return ImageReferenceStorage() .names - .map((imageName) => '${imageName.replaceAll(':', '_')}.png') + .map((imageName) => '${imageName}.png') .toList(); } catch (e) { return []; diff --git a/lib/interpret_and_optimize/entities/alignments/injected_positioned.dart b/lib/interpret_and_optimize/entities/alignments/injected_positioned.dart index 735d11d0..c96507f1 100644 --- a/lib/interpret_and_optimize/entities/alignments/injected_positioned.dart +++ b/lib/interpret_and_optimize/entities/alignments/injected_positioned.dart @@ -11,7 +11,11 @@ class InjectedPositioned extends PBIntermediateNode @override ChildrenStrategy childrenStrategy = OneChildStrategy('child'); + @override + String name; + InjectedPositioned( + this.name, String UUID, Rectangle3D frame, { this.valueHolder, diff --git a/lib/interpret_and_optimize/entities/inherited_bitmap.dart b/lib/interpret_and_optimize/entities/inherited_bitmap.dart index 1f37eae1..bffef89b 100644 --- a/lib/interpret_and_optimize/entities/inherited_bitmap.dart +++ b/lib/interpret_and_optimize/entities/inherited_bitmap.dart @@ -1,4 +1,5 @@ import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inherited_intermediate.dart'; @@ -44,9 +45,10 @@ class InheritedBitmap extends PBVisualIntermediateNode }) : super(UUID, frame, name, constraints: constraints) { generator = PBBitmapGenerator(); childrenStrategy = NoChildStrategy(); - if (name != null && name.isNotEmpty) { - ImageReferenceStorage() - .addReference(UUID, '${MainInfo().outputPath}assets/images'); + if (referenceImage != null && referenceImage.isNotEmpty) { + ImageReferenceStorage().addReference( + referenceImage.split('.').first.replaceAll('images/', ''), + '${MainInfo().outputPath}assets/images'); } } diff --git a/lib/interpret_and_optimize/entities/inherited_circle.dart b/lib/interpret_and_optimize/entities/inherited_circle.dart index c7aff734..db86c369 100644 --- a/lib/interpret_and_optimize/entities/inherited_circle.dart +++ b/lib/interpret_and_optimize/entities/inherited_circle.dart @@ -3,7 +3,7 @@ import 'dart:math'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inherited_intermediate.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/intermediate_border_info.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border_info.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/group/group.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_constraints.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; @@ -46,8 +46,8 @@ class InheritedCircle extends PBVisualIntermediateNode generator = PBBitmapGenerator(); childrenStrategy = TempChildrenStrategy('child'); - auxiliaryData.borderInfo = IntermediateBorderInfo(); - auxiliaryData.borderInfo.shape = 'circle'; + // auxiliaryData.borderInfo = IntermediateBorderInfo(); + // auxiliaryData.borderInfo.shape = 'circle'; auxiliaryData.alignment = alignX != null && alignY != null ? {'alignX': alignX, 'alignY': alignY} : null; diff --git a/lib/interpret_and_optimize/entities/inherited_container.dart b/lib/interpret_and_optimize/entities/inherited_container.dart index d875445b..0cf1a980 100644 --- a/lib/interpret_and_optimize/entities/inherited_container.dart +++ b/lib/interpret_and_optimize/entities/inherited_container.dart @@ -70,8 +70,6 @@ class InheritedContainer extends PBVisualIntermediateNode static PBIntermediateNode fromJson(Map json) { var container = _$InheritedContainerFromJson(json)..originalRef = json; - container.auxiliaryData.borderInfo.borderRadius = json['fixedRadius']; - return container; } diff --git a/lib/interpret_and_optimize/entities/inherited_container.g.dart b/lib/interpret_and_optimize/entities/inherited_container.g.dart index aba711eb..8b56989a 100644 --- a/lib/interpret_and_optimize/entities/inherited_container.g.dart +++ b/lib/interpret_and_optimize/entities/inherited_container.g.dart @@ -46,8 +46,6 @@ Map _$InheritedContainerToJson(InheritedContainer instance) => 'prototypeNodeUUID': instance.prototypeNode, 'isBackgroundVisible': instance.isBackgroundVisible, 'type': instance.type, - 'showWidth': instance.showWidth, - 'showHeight': instance.showHeight, }; T _$enumDecode( diff --git a/lib/interpret_and_optimize/entities/inherited_oval.dart b/lib/interpret_and_optimize/entities/inherited_oval.dart index f513df95..3d7327c7 100644 --- a/lib/interpret_and_optimize/entities/inherited_oval.dart +++ b/lib/interpret_and_optimize/entities/inherited_oval.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_shape_path.dart'; @@ -49,7 +50,7 @@ class InheritedOval extends PBVisualIntermediateNode generator = PBBitmapGenerator(); if (image != null) { ImageReferenceStorage().addReferenceAndWrite( - UUID, '${MainInfo().outputPath}assets/images', image); + name, '${MainInfo().outputPath}assets/images', image); } } diff --git a/lib/interpret_and_optimize/entities/inherited_polygon.dart b/lib/interpret_and_optimize/entities/inherited_polygon.dart index cdfe6c08..3d47b2f4 100644 --- a/lib/interpret_and_optimize/entities/inherited_polygon.dart +++ b/lib/interpret_and_optimize/entities/inherited_polygon.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_shape_path.dart'; @@ -52,7 +53,7 @@ class InheritedPolygon extends PBVisualIntermediateNode if (image != null) { ImageReferenceStorage().addReferenceAndWrite( - UUID, '${MainInfo().outputPath}assets/images', image); + name, '${MainInfo().outputPath}assets/images', image); } } diff --git a/lib/interpret_and_optimize/entities/inherited_shape_group.dart b/lib/interpret_and_optimize/entities/inherited_shape_group.dart index d4f53063..f806521e 100644 --- a/lib/interpret_and_optimize/entities/inherited_shape_group.dart +++ b/lib/interpret_and_optimize/entities/inherited_shape_group.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inherited_intermediate.dart'; @@ -50,7 +51,7 @@ class InheritedShapeGroup extends PBVisualIntermediateNode childrenStrategy = NoChildStrategy(); if (image != null) { ImageReferenceStorage().addReferenceAndWrite( - UUID, p.join(MainInfo().outputPath, 'assets/images'), image); + name, p.join(MainInfo().outputPath, 'assets/images'), image); } } diff --git a/lib/interpret_and_optimize/entities/inherited_shape_path.dart b/lib/interpret_and_optimize/entities/inherited_shape_path.dart index 2806d38a..549e581b 100644 --- a/lib/interpret_and_optimize/entities/inherited_shape_path.dart +++ b/lib/interpret_and_optimize/entities/inherited_shape_path.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inherited_intermediate.dart'; @@ -49,9 +50,10 @@ class InheritedShapePath extends PBVisualIntermediateNode }) : super(UUID, frame, name, constraints: constraints) { generator = PBBitmapGenerator(); childrenStrategy = NoChildStrategy(); - - ImageReferenceStorage().addReferenceAndWrite( - UUID, '${MainInfo().outputPath}assets/images', image); + if (image != null) { + ImageReferenceStorage().addReferenceAndWrite( + name, '${MainInfo().outputPath}assets/images', image); + } // Detect shape path as container if applicable _detectLineAsContainer(); diff --git a/lib/interpret_and_optimize/entities/inherited_star.dart b/lib/interpret_and_optimize/entities/inherited_star.dart index 2aa6f7f7..3cebb00f 100644 --- a/lib/interpret_and_optimize/entities/inherited_star.dart +++ b/lib/interpret_and_optimize/entities/inherited_star.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_shape_path.dart'; @@ -48,9 +49,10 @@ class InheritedStar extends PBVisualIntermediateNode }) : super(UUID, frame, name, constraints: constraints) { generator = PBBitmapGenerator(); childrenStrategy = NoChildStrategy(); - - ImageReferenceStorage().addReferenceAndWrite( - UUID, '${MainInfo().outputPath}assets/images', image); + if (image != null) { + ImageReferenceStorage().addReferenceAndWrite( + name, '${MainInfo().outputPath}assets/images', image); + } } static PBIntermediateNode fromJson(Map json) => diff --git a/lib/interpret_and_optimize/entities/inherited_text.dart b/lib/interpret_and_optimize/entities/inherited_text.dart index 32d08106..839514b1 100644 --- a/lib/interpret_and_optimize/entities/inherited_text.dart +++ b/lib/interpret_and_optimize/entities/inherited_text.dart @@ -1,4 +1,3 @@ -import 'dart:math'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_text_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_container.dart'; @@ -6,17 +5,12 @@ import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inhe import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_constraints.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visual_intermediate_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/align_strategy.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/child_strategy.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/abstract_intermediate_node_factory.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_auxillary_data.dart'; -import 'package:uuid/uuid.dart'; part 'inherited_text.g.dart'; @@ -41,18 +35,6 @@ class InheritedText extends PBVisualIntermediateNode @JsonKey(name: 'content') String text; - @JsonKey(ignore: true) - num fontSize; - @JsonKey(ignore: true) - String fontName; - @JsonKey(ignore: true) - String fontWeight; // one of the w100-w900 weights - @JsonKey(ignore: true) - String fontStyle; // normal, or italic - @JsonKey(ignore: true) - String textAlignment; - @JsonKey(ignore: true) - num letterSpacing; @override @JsonKey(ignore: true) @@ -64,15 +46,9 @@ class InheritedText extends PBVisualIntermediateNode this.originalRef, name, this.alignmenttype, - this.fontName, - this.fontSize, - this.fontStyle, - this.fontWeight, this.isTextParameter, - this.letterSpacing, this.prototypeNode, this.text, - this.textAlignment, }) : super( UUID, frame, @@ -91,16 +67,7 @@ class InheritedText extends PBVisualIntermediateNode } static PBIntermediateNode fromJson(Map json) => - _$InheritedTextFromJson(json) - ..originalRef = json - ..fontSize = InheritedTextPBDLHelper.fontSizeFromJson(json) - ..fontName = InheritedTextPBDLHelper.fontNameFromJson(json) - ..fontWeight = InheritedTextPBDLHelper.fontWeightFromJson(json) - ..fontStyle = InheritedTextPBDLHelper.fontStyleFromJson(json) - ..textAlignment = InheritedTextPBDLHelper.textAlignmentFromJson(json) - ..letterSpacing = InheritedTextPBDLHelper.letterSpacingFromJson(json) - ..auxiliaryData.color = - PBColor.fromJson(json['style']['textStyle']['fontColor']); + _$InheritedTextFromJson(json)..originalRef = json; @override PBIntermediateNode createIntermediateNode(Map json, diff --git a/lib/interpret_and_optimize/entities/inherited_triangle.dart b/lib/interpret_and_optimize/entities/inherited_triangle.dart index c6ee1bfd..fe5f8a99 100644 --- a/lib/interpret_and_optimize/entities/inherited_triangle.dart +++ b/lib/interpret_and_optimize/entities/inherited_triangle.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_shape_path.dart'; @@ -49,9 +50,10 @@ class InheritedTriangle extends PBVisualIntermediateNode }) : super(UUID, frame, name, constraints: constraints) { generator = PBBitmapGenerator(); childrenStrategy = NoChildStrategy(); - - ImageReferenceStorage().addReferenceAndWrite( - UUID, '${MainInfo().outputPath}assets/images', image); + if (image != null) { + ImageReferenceStorage().addReferenceAndWrite( + name, '${MainInfo().outputPath}assets/images', image); + } } static PBIntermediateNode fromJson(Map json) => diff --git a/lib/interpret_and_optimize/entities/intermediate_border_info.dart b/lib/interpret_and_optimize/entities/intermediate_border_info.dart deleted file mode 100644 index acce94d0..00000000 --- a/lib/interpret_and_optimize/entities/intermediate_border_info.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_constraints.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'intermediate_border_info.g.dart'; - -@JsonSerializable() -class IntermediateBorderInfo { - num borderRadius; - - PBColor color; - - num thickness; - - String shape; - - /// Whether `color`, `thickness` and `shape` are available. - /// - /// Note that `borderRadius` should always be enabled - @JsonKey(name: 'isEnabled') - bool isBorderOutlineVisible; - - IntermediateBorderInfo({ - this.borderRadius, - this.color, - this.thickness, - this.shape, - this.isBorderOutlineVisible, - }); - - factory IntermediateBorderInfo.fromJson(Map json) => - _$IntermediateBorderInfoFromJson(json); - - Map toJson() => _$IntermediateBorderInfoToJson(this); -} diff --git a/lib/interpret_and_optimize/entities/intermediate_border_info.g.dart b/lib/interpret_and_optimize/entities/intermediate_border_info.g.dart deleted file mode 100644 index 73d8fe2f..00000000 --- a/lib/interpret_and_optimize/entities/intermediate_border_info.g.dart +++ /dev/null @@ -1,30 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'intermediate_border_info.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -IntermediateBorderInfo _$IntermediateBorderInfoFromJson( - Map json) { - return IntermediateBorderInfo( - borderRadius: json['borderRadius'] as num, - color: json['color'] == null - ? null - : PBColor.fromJson(json['color'] as Map), - thickness: json['thickness'] as num, - shape: json['shape'] as String, - isBorderOutlineVisible: json['isEnabled'] as bool, - ); -} - -Map _$IntermediateBorderInfoToJson( - IntermediateBorderInfo instance) => - { - 'borderRadius': instance.borderRadius, - 'color': instance.color, - 'thickness': instance.thickness, - 'shape': instance.shape, - 'isEnabled': instance.isBorderOutlineVisible, - }; diff --git a/lib/interpret_and_optimize/entities/layouts/auto_layout_align_strategy.dart b/lib/interpret_and_optimize/entities/layouts/auto_layout_align_strategy.dart index 6328e903..97bbb977 100644 --- a/lib/interpret_and_optimize/entities/layouts/auto_layout_align_strategy.dart +++ b/lib/interpret_and_optimize/entities/layouts/auto_layout_align_strategy.dart @@ -86,6 +86,7 @@ class AutoLayoutAlignStrategy extends AlignStrategy { var wrapper = InjectedContainer( null, child.frame, + name: child.name, pointValueHeight: isVertical ? child.layoutMainAxisSizing == ParentLayoutSizing.INHERIT : child.layoutCrossAxisSizing == ParentLayoutSizing.INHERIT, diff --git a/lib/interpret_and_optimize/entities/layouts/column.g.dart b/lib/interpret_and_optimize/entities/layouts/column.g.dart index 16df64d6..2e933d6a 100644 --- a/lib/interpret_and_optimize/entities/layouts/column.g.dart +++ b/lib/interpret_and_optimize/entities/layouts/column.g.dart @@ -28,7 +28,6 @@ PBIntermediateColumnLayout _$PBIntermediateColumnLayoutFromJson( ..prototypeNode = json['prototypeNode'] == null ? null : PrototypeNode.fromJson(json['prototypeNode'] as Map) - ..alignment = json['alignment'] as Map ..layoutProperties = json['autoLayoutOptions'] == null ? null : LayoutProperties.fromJson( @@ -49,7 +48,6 @@ Map _$PBIntermediateColumnLayoutToJson( 'style': instance.auxiliaryData, 'name': instance.name, 'prototypeNode': instance.prototypeNode, - 'alignment': instance.alignment, 'autoLayoutOptions': instance.layoutProperties, 'type': instance.type, }; diff --git a/lib/interpret_and_optimize/entities/layouts/group/base_group.g.dart b/lib/interpret_and_optimize/entities/layouts/group/base_group.g.dart index 23fc0dec..fcd3d25b 100644 --- a/lib/interpret_and_optimize/entities/layouts/group/base_group.g.dart +++ b/lib/interpret_and_optimize/entities/layouts/group/base_group.g.dart @@ -27,7 +27,6 @@ BaseGroup _$BaseGroupFromJson(Map json) { ? null : IntermediateAuxiliaryData.fromJson( json['style'] as Map) - ..alignment = json['alignment'] as Map ..type = json['type'] as String; } @@ -42,7 +41,6 @@ Map _$BaseGroupToJson(BaseGroup instance) => { 'boundaryRectangle': Rectangle3D.toJson(instance.frame), 'style': instance.auxiliaryData, 'name': instance.name, - 'alignment': instance.alignment, 'prototypeNodeUUID': instance.prototypeNode, 'type': instance.type, }; diff --git a/lib/interpret_and_optimize/entities/layouts/group/frame_group.dart b/lib/interpret_and_optimize/entities/layouts/group/frame_group.dart index 83ac0bc0..e30c5058 100644 --- a/lib/interpret_and_optimize/entities/layouts/group/frame_group.dart +++ b/lib/interpret_and_optimize/entities/layouts/group/frame_group.dart @@ -1,13 +1,10 @@ import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_container.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inherited_intermediate.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/intermediate_border_info.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/group/group.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_constraints.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/abstract_intermediate_node_factory.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_auxillary_data.dart'; @@ -39,47 +36,27 @@ class FrameGroup extends Group PBIntermediateNode parent, PBIntermediateTree tree) { var tempFrame = _$FrameGroupFromJson(json); - var tempChild = injectAContainer(json, tempFrame.frame) - ..constraints = tempFrame.constraints.copyWith(); + // var tempChild = injectAContainer(json, tempFrame.frame); - if (tempChild != null) { - tree.addEdges(tempFrame, [tempChild]); - } + // if (tempChild != null) { + // tempChild.constraints = tempFrame.constraints.copyWith(); + // tree.addEdges(tempFrame, [tempChild]); + // } return tempFrame ..mapRawChildren(json, tree) ..originalRef = json; } - PBIntermediateNode injectAContainer( - Map json, Rectangle3D parentFrame) { - var tempChild = InjectedContainer( - null, - Rectangle3D(parentFrame.left, parentFrame.top, parentFrame.width, - parentFrame.height, 0), - name: json['name'], - ); - var gateKeeper = false; - if (json['style']['borderOptions']['cornerRadius'] != null) { - tempChild.auxiliaryData.borderInfo = IntermediateBorderInfo( - borderRadius: json['style']['borderOptions']['cornerRadius']); - tempChild.auxiliaryData.borderInfo.isBorderOutlineVisible = true; - gateKeeper = true; - } - if (json['style']['backgroundColor'] != null) { - tempChild.auxiliaryData.color = - PBColor.fromJson(json['style']['backgroundColor']); - gateKeeper = true; - } - if (json['style']['borders'][0]['isEnabled']) { - tempChild.auxiliaryData.borderInfo ??= IntermediateBorderInfo(); - tempChild.auxiliaryData.borderInfo.isBorderOutlineVisible = true; - tempChild.auxiliaryData.borderInfo.color = - PBColor.fromJson(json['style']['borders'][0]['color']); - tempChild.auxiliaryData.borderInfo.thickness = - json['style']['borders'][0]['thickness']; - gateKeeper = true; - } - - return gateKeeper ? tempChild : null; - } + // PBIntermediateNode injectAContainer( + // Map json, Rectangle3D parentFrame) { + // var tempChild = InjectedContainer( + // null, + // Rectangle3D(parentFrame.left, parentFrame.top, parentFrame.width, + // parentFrame.height, 0), + // name: json['name'], + // ); + // var gateKeeper = false; + + // return gateKeeper ? tempChild : null; + // } } diff --git a/lib/interpret_and_optimize/entities/layouts/group/frame_group.g.dart b/lib/interpret_and_optimize/entities/layouts/group/frame_group.g.dart index b35c73cf..12844a62 100644 --- a/lib/interpret_and_optimize/entities/layouts/group/frame_group.g.dart +++ b/lib/interpret_and_optimize/entities/layouts/group/frame_group.g.dart @@ -27,7 +27,6 @@ FrameGroup _$FrameGroupFromJson(Map json) { ? null : IntermediateAuxiliaryData.fromJson( json['style'] as Map) - ..alignment = json['alignment'] as Map ..type = json['type'] as String; } @@ -43,7 +42,6 @@ Map _$FrameGroupToJson(FrameGroup instance) => 'boundaryRectangle': Rectangle3D.toJson(instance.frame), 'style': instance.auxiliaryData, 'name': instance.name, - 'alignment': instance.alignment, 'prototypeNodeUUID': instance.prototypeNode, 'type': instance.type, }; diff --git a/lib/interpret_and_optimize/entities/layouts/row.g.dart b/lib/interpret_and_optimize/entities/layouts/row.g.dart index 54b904ab..2cc89cb5 100644 --- a/lib/interpret_and_optimize/entities/layouts/row.g.dart +++ b/lib/interpret_and_optimize/entities/layouts/row.g.dart @@ -26,7 +26,6 @@ PBIntermediateRowLayout _$PBIntermediateRowLayoutFromJson( ? null : IntermediateAuxiliaryData.fromJson( json['style'] as Map) - ..alignment = json['alignment'] as Map ..prototypeNode = json['prototypeNode'] == null ? null : PrototypeNode.fromJson(json['prototypeNode'] as Map) @@ -49,7 +48,6 @@ Map _$PBIntermediateRowLayoutToJson( 'boundaryRectangle': Rectangle3D.toJson(instance.frame), 'style': instance.auxiliaryData, 'name': instance.name, - 'alignment': instance.alignment, 'prototypeNode': instance.prototypeNode, 'autoLayoutOptions': instance.layoutProperties, 'type': instance.type, diff --git a/lib/interpret_and_optimize/entities/layouts/stack.dart b/lib/interpret_and_optimize/entities/layouts/stack.dart index f6640245..7890cc30 100644 --- a/lib/interpret_and_optimize/entities/layouts/stack.dart +++ b/lib/interpret_and_optimize/entities/layouts/stack.dart @@ -1,17 +1,11 @@ -import 'dart:math'; - import 'package:parabeac_core/generation/generators/layouts/pb_stack_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/alignments/injected_positioned.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/rules/axis_comparison_rules.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/rules/layout_rule.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_constraints.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_layout_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/align_strategy.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; -import 'package:path/path.dart'; -import 'package:uuid/uuid.dart'; ///Row contains nodes that are all `overlapping` to each other, without overlapping eachother diff --git a/lib/interpret_and_optimize/entities/pb_shared_master_node.dart b/lib/interpret_and_optimize/entities/pb_shared_master_node.dart index 52dc82b0..d85fdd25 100644 --- a/lib/interpret_and_optimize/entities/pb_shared_master_node.dart +++ b/lib/interpret_and_optimize/entities/pb_shared_master_node.dart @@ -83,7 +83,8 @@ class PBSharedMasterNode extends PBVisualIntermediateNode PBIntermediateNode createIntermediateNode(Map json, PBIntermediateNode parent, PBIntermediateTree tree) { PBSharedMasterNode master = PBSharedMasterNode.fromJson(json) - ..mapRawChildren(json, tree); + ..mapRawChildren(json, tree) + ..parent = parent; /// Map overridableProperties which need parent and tree master.overridableProperties = (json['overrideProperties'] as List) @@ -110,6 +111,7 @@ class PBSharedMasterNode extends PBVisualIntermediateNode @JsonSerializable() class PBMasterOverride { + @JsonKey(name: 'pbdlType') final String type; @JsonKey(ignore: true) @@ -149,4 +151,9 @@ class PBMasterOverride { static String _propertyNameFromJson(String name) => name.replaceAll(RegExp(r'[^A-Za-z0-9]'), '').camelCase; + + /// Generated the given [PBMasterOverride] + String generateOverride() { + return 'widget.$propertyName ?? '; + } } diff --git a/lib/interpret_and_optimize/entities/pb_shared_master_node.g.dart b/lib/interpret_and_optimize/entities/pb_shared_master_node.g.dart index 41d48be8..a39ac5e3 100644 --- a/lib/interpret_and_optimize/entities/pb_shared_master_node.g.dart +++ b/lib/interpret_and_optimize/entities/pb_shared_master_node.g.dart @@ -91,7 +91,7 @@ const _$ParentLayoutSizingEnumMap = { PBMasterOverride _$PBMasterOverrideFromJson(Map json) { return PBMasterOverride( - json['type'] as String, + json['pbdlType'] as String, PBMasterOverride._propertyNameFromJson(json['name'] as String), json['UUID'] as String, ); @@ -99,7 +99,7 @@ PBMasterOverride _$PBMasterOverrideFromJson(Map json) { Map _$PBMasterOverrideToJson(PBMasterOverride instance) => { - 'type': instance.type, + 'pbdlType': instance.type, 'name': instance.propertyName, 'UUID': instance.UUID, }; diff --git a/lib/interpret_and_optimize/helpers/abstract_intermediate_node_factory.dart b/lib/interpret_and_optimize/helpers/abstract_intermediate_node_factory.dart index 0a22a4b3..b5060ae5 100644 --- a/lib/interpret_and_optimize/helpers/abstract_intermediate_node_factory.dart +++ b/lib/interpret_and_optimize/helpers/abstract_intermediate_node_factory.dart @@ -23,7 +23,7 @@ import 'package:parabeac_core/interpret_and_optimize/helpers/pb_plugin_list_help import 'package:parabeac_core/tags/custom_tag/custom_tag.dart'; class AbstractIntermediateNodeFactory { - static final String INTERMEDIATE_TYPE = 'type'; + static final String INTERMEDIATE_TYPE = 'pbdlType'; static final Set _intermediateNodes = { InheritedBitmap('$InheritedBitmap', null), @@ -60,16 +60,7 @@ class AbstractIntermediateNodeFactory { PBPluginListHelper().returnAllowListNodeIfExists(iNode, tree); // Return tag if it exists if (tag != null) { - /// TODO: Each Tag could potentially implement how it should handle converting from PBIntermediate to a PBTag - if (tag is CustomTag) { - return tag.handleIntermediateNode(iNode, parent, tag, tree); - } else { - // [iNode] needs a parent and has not been added to the [tree] by [tree.addEdges] - iNode.parent = parent; - tree.replaceNode(iNode, tag, acceptChildren: true); - - return tag; - } + return tag.handleIntermediateNode(iNode, parent, tag, tree); } if (parent != null && iNode != null) { tree.addEdges(parent, [iNode]); diff --git a/lib/interpret_and_optimize/helpers/align_strategy.dart b/lib/interpret_and_optimize/helpers/align_strategy.dart index bf255c61..3711705e 100644 --- a/lib/interpret_and_optimize/helpers/align_strategy.dart +++ b/lib/interpret_and_optimize/helpers/align_strategy.dart @@ -89,15 +89,19 @@ class PositionedAlignment extends AlignStrategy { nodeChildren.forEach((child) { var centerY = false; var centerX = false; - var injectedPositioned = InjectedPositioned(null, child.frame, - constraints: child.constraints.copyWith(), - valueHolder: PositionedValueHolder( - top: child.frame.topLeft.y - node.frame.topLeft.y, - bottom: node.frame.bottomRight.y - child.frame.bottomRight.y, - left: child.frame.topLeft.x - node.frame.topLeft.x, - right: node.frame.bottomRight.x - child.frame.bottomRight.x, - width: child.frame.width, - height: child.frame.height)); + var injectedPositioned = InjectedPositioned( + child.name, + null, + child.frame, + constraints: child.constraints.copyWith(), + valueHolder: PositionedValueHolder( + top: child.frame.topLeft.y - node.frame.topLeft.y, + bottom: node.frame.bottomRight.y - child.frame.bottomRight.y, + left: child.frame.topLeft.x - node.frame.topLeft.x, + right: node.frame.bottomRight.x - child.frame.bottomRight.x, + width: child.frame.width, + height: child.frame.height), + ); if ((!child.constraints.pinLeft && !child.constraints.pinRight) && child.constraints.fixedWidth) { injectedPositioned.constraints.fixedWidth = false; @@ -121,6 +125,7 @@ class PositionedAlignment extends AlignStrategy { var container = InjectedContainer( null, child.frame.boundingBox(child.frame), + name: child.name, pointValueHeight: centerY, pointValueWidth: centerX, constraints: child.constraints.copyWith(), diff --git a/lib/interpret_and_optimize/helpers/pb_color.dart b/lib/interpret_and_optimize/helpers/pb_color.dart index 3bd77ee8..c9edd96d 100644 --- a/lib/interpret_and_optimize/helpers/pb_color.dart +++ b/lib/interpret_and_optimize/helpers/pb_color.dart @@ -69,4 +69,14 @@ class ColorUtils { } return null; } + + // static List getColorListFromJsonFIlls(List> json){ + // var tempList = []; + + // for(var fill in json){ + // tempList + // } + + // return tempList; + // } } diff --git a/lib/interpret_and_optimize/helpers/pb_configuration.g.dart b/lib/interpret_and_optimize/helpers/pb_configuration.g.dart index 3565ed49..e364051f 100644 --- a/lib/interpret_and_optimize/helpers/pb_configuration.g.dart +++ b/lib/interpret_and_optimize/helpers/pb_configuration.g.dart @@ -8,13 +8,6 @@ part of 'pb_configuration.dart'; PBConfiguration _$PBConfigurationFromJson(Map json) { return PBConfiguration( - // Temporary Fix till null safety migration. - // json['widgetStyle'] as String ?? 'Material', - // json['widgetType'] as String ?? 'Stateless', - // json['widgetSpacing'] as String ?? 'Expanded', - // json['state-management'] as String ?? 'None', - // (json['layoutPrecedence'] as List)?.map((e) => e as String)?.toList() ?? - // ['column', 'row', 'stack'], json['breakpoints'] as Map, json['scaling'] as bool ?? true, json['enablePrototyping'] as bool ?? false, @@ -24,12 +17,8 @@ PBConfiguration _$PBConfigurationFromJson(Map json) { Map _$PBConfigurationToJson(PBConfiguration instance) => { - 'widgetStyle': instance.widgetStyle, 'scaling': instance.scaling, - 'widgetType': instance.widgetType, - 'widgetSpacing': instance.widgetSpacing, - 'state-management': instance.stateManagement, - 'layoutPrecedence': instance.layoutPrecedence, 'breakpoints': instance.breakpoints, 'enablePrototyping': instance.enablePrototyping, + 'componentIsolation': instance.componentIsolation, }; diff --git a/lib/interpret_and_optimize/helpers/pb_context.dart b/lib/interpret_and_optimize/helpers/pb_context.dart index 1dcadf2e..aea2e69f 100644 --- a/lib/interpret_and_optimize/helpers/pb_context.dart +++ b/lib/interpret_and_optimize/helpers/pb_context.dart @@ -119,6 +119,9 @@ enum SizingValueContext { /// Should conform to the Layout Builder code, usually used when calling views. LayoutBuilderValue, + /// Same as LayoutBuilderValue, but gets constraints from the parent. + LayoutBuilderStatefulValue, + /// TODO: Remove AppBarChild, } diff --git a/lib/interpret_and_optimize/services/pb_alignment_generation_service.dart b/lib/interpret_and_optimize/services/pb_alignment_generation_service.dart index 3805d13a..de823a7a 100644 --- a/lib/interpret_and_optimize/services/pb_alignment_generation_service.dart +++ b/lib/interpret_and_optimize/services/pb_alignment_generation_service.dart @@ -1,10 +1,7 @@ import 'package:parabeac_core/controllers/interpret.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_layout_intermediate_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visual_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; -import 'package:quick_log/quick_log.dart'; /// PBAlignmentGenerationService: /// Interpret the alignment relationship between a child node and a parent Visual or Layout Node. After interpretation, inject the proper alignment whether that’s Padding based or Flex-based. @@ -27,18 +24,22 @@ class PBAlignGenerationService extends AITHandler { if (element is PBIntermediateNode && (element.parent?.constraints?.fixedHeight ?? false)) { element.constraints.fixedHeight = true; - element.constraints.pinTop = true; - element.constraints.pinBottom = false; + if (!element.constraints.pinTop && !element.constraints.pinBottom) { + element.constraints.pinTop = true; + element.constraints.pinBottom = false; + } } if (element is PBIntermediateNode && (element.parent?.constraints?.fixedWidth ?? false)) { element.constraints.fixedWidth = true; - element.constraints.pinLeft = true; - element.constraints.pinRight = false; + if (!element.constraints.pinLeft && !element.constraints.pinRight) { + element.constraints.pinLeft = true; + element.constraints.pinRight = false; + } } }); tree.rootNode.align(context); - + return Future.value(tree); } diff --git a/lib/interpret_and_optimize/services/pb_layout_generation_service.dart b/lib/interpret_and_optimize/services/pb_layout_generation_service.dart index 087abf77..d4573196 100644 --- a/lib/interpret_and_optimize/services/pb_layout_generation_service.dart +++ b/lib/interpret_and_optimize/services/pb_layout_generation_service.dart @@ -100,6 +100,7 @@ class PBLayoutGenerationService extends AITHandler { var wrapper = InjectedContainer( null, tempGroup.frame.copyWith(), + name: tempGroup.name, // Add padding padding: InjectedPadding( left: tempLayout.layoutProperties.leftPadding, @@ -153,16 +154,34 @@ class PBLayoutGenerationService extends AITHandler { /// Transforming the [Group] into regular [PBLayoutIntermediateNode] void _transformGroup(PBIntermediateTree tree) { tree.whereType().forEach((tempGroup) { + var newStack = PBIntermediateStackLayout( + name: tempGroup.name, + constraints: tempGroup.constraints.copyWith(), + ) + ..auxiliaryData = tempGroup.auxiliaryData + ..frame = tempGroup.frame.copyWith() + ..layoutCrossAxisSizing = tempGroup.layoutCrossAxisSizing + ..layoutMainAxisSizing = tempGroup.layoutMainAxisSizing; + tree.replaceNode( - tempGroup, - PBIntermediateStackLayout( - name: tempGroup.name, - constraints: tempGroup.constraints.copyWith(), - ) - ..frame = tempGroup.frame - ..layoutCrossAxisSizing = tempGroup.layoutCrossAxisSizing - ..layoutMainAxisSizing = tempGroup.layoutMainAxisSizing, - acceptChildren: true); + tempGroup, + newStack, + acceptChildren: true, + ); + + if (tempGroup.auxiliaryData.colors != null) { + var tempContainer = InjectedContainer( + null, + tempGroup.frame.copyWith(), + constraints: tempGroup.constraints.copyWith(), + name: tempGroup.name, + ) + ..auxiliaryData = tempGroup.auxiliaryData + ..layoutCrossAxisSizing = tempGroup.layoutCrossAxisSizing + ..layoutMainAxisSizing = tempGroup.layoutMainAxisSizing; + + tree.wrapNode(tempContainer, newStack); + } }); } diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border.dart new file mode 100644 index 00000000..03bfa4e5 --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border.dart @@ -0,0 +1,31 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart'; + +part 'intermediate_border.g.dart'; + +@JsonSerializable(explicitToJson: true) +class PBBorder { + String blendMode; + + String type; + + PBColor color; + + @JsonKey(defaultValue: true) + bool visible; + + final pbdlType = 'border'; + + PBBorder({ + this.blendMode, + this.type, + this.color, + this.visible, + }); + + factory PBBorder.fromJson(Map json) { + return _$PBBorderFromJson(json); + } + @override + Map toJson() => _$PBBorderToJson(this); +} diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border.g.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border.g.dart new file mode 100644 index 00000000..09f592d6 --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'intermediate_border.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +PBBorder _$PBBorderFromJson(Map json) { + return PBBorder( + blendMode: json['blendMode'] as String, + type: json['type'] as String, + color: json['color'] == null + ? null + : PBColor.fromJson(json['color'] as Map), + visible: json['visible'] as bool ?? true, + ); +} + +Map _$PBBorderToJson(PBBorder instance) => { + 'blendMode': instance.blendMode, + 'type': instance.type, + 'color': instance.color?.toJson(), + 'visible': instance.visible, + }; diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border_info.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border_info.dart new file mode 100644 index 00000000..2bbf4e4b --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border_info.dart @@ -0,0 +1,60 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart'; +import 'intermediate_border.dart'; + +part 'intermediate_border_info.g.dart'; + +/// Class that represents the border information for a node. +/// +/// We are operating under the assumption that every [PBIntermediateNode] +/// can only have a single border. +@JsonSerializable(explicitToJson: true) +class IntermediateBorderInfo { + /// TODO: Consider removing this class and simplifying the structure of PBDL to + /// lay out all border options insde a single class. + @JsonKey(fromJson: _borderFromJson, name: 'borders') + PBBorder border; + + @JsonKey(name: 'strokeWeight') + num thickness; + + String strokeAlign; + + String strokeJoin; + + List strokeDashes; + + @JsonKey(name: 'cornerRadius') + num borderRadius; + + final pbdlType = 'border_options'; + + /// These gets are used in order to not break existing tag files + /// that use these attributes directly. We can deprecate these over time + /// or rethink the way borders is structured. + String get blendMode => border?.blendMode; + + String get type => border?.type; + + PBColor get color => border?.color; + + bool get visible => border?.visible ?? false; + + IntermediateBorderInfo({ + this.border, + this.thickness, + this.strokeAlign, + this.strokeJoin, + this.strokeDashes, + this.borderRadius, + }); + + @override + factory IntermediateBorderInfo.fromJson(Map json) => + _$IntermediateBorderInfoFromJson(json); + + Map toJson() => _$IntermediateBorderInfoToJson(this); + + static PBBorder _borderFromJson(List borders) => + borders == null || borders.isEmpty ? null : PBBorder.fromJson(borders[0]); +} diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border_info.g.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border_info.g.dart new file mode 100644 index 00000000..06b42918 --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border_info.g.dart @@ -0,0 +1,30 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'intermediate_border_info.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +IntermediateBorderInfo _$IntermediateBorderInfoFromJson( + Map json) { + return IntermediateBorderInfo( + border: IntermediateBorderInfo._borderFromJson(json['borders'] as List), + thickness: json['strokeWeight'] as num, + strokeAlign: json['strokeAlign'] as String, + strokeJoin: json['strokeJoin'] as String, + strokeDashes: json['strokeDashes'] as List, + borderRadius: json['cornerRadius'] as num, + ); +} + +Map _$IntermediateBorderInfoToJson( + IntermediateBorderInfo instance) => + { + 'borders': instance.border?.toJson(), + 'strokeWeight': instance.thickness, + 'strokeAlign': instance.strokeAlign, + 'strokeJoin': instance.strokeJoin, + 'strokeDashes': instance.strokeDashes, + 'cornerRadius': instance.borderRadius, + }; diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_effect.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_effect.dart new file mode 100644 index 00000000..c22583bd --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_effect.dart @@ -0,0 +1,31 @@ +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'intermediate_effect.g.dart'; + +@JsonSerializable(explicitToJson: true) +class PBEffect { + String type; + bool visible; + num radius; + PBColor color; + String blendMode; + Map offset; + bool showShadowBehindNode; + + var pbdlType = 'effect'; + + PBEffect({ + this.type, + this.visible, + this.radius, + this.color, + this.blendMode, + this.offset, + this.showShadowBehindNode, + }); + + Map toJson() => _$PBEffectToJson(this); + factory PBEffect.fromJson(Map json) => + _$PBEffectFromJson(json); +} diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_effect.g.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_effect.g.dart new file mode 100644 index 00000000..95c50ed4 --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_effect.g.dart @@ -0,0 +1,32 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'intermediate_effect.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +PBEffect _$PBEffectFromJson(Map json) { + return PBEffect( + type: json['type'] as String, + visible: json['visible'] as bool, + radius: json['radius'] as num, + color: json['color'] == null + ? null + : PBColor.fromJson(json['color'] as Map), + blendMode: json['blendMode'] as String, + offset: json['offset'] as Map, + showShadowBehindNode: json['showShadowBehindNode'] as bool, + )..pbdlType = json['pbdlType'] as String; +} + +Map _$PBEffectToJson(PBEffect instance) => { + 'type': instance.type, + 'visible': instance.visible, + 'radius': instance.radius, + 'color': instance.color?.toJson(), + 'blendMode': instance.blendMode, + 'offset': instance.offset, + 'showShadowBehindNode': instance.showShadowBehindNode, + 'pbdlType': instance.pbdlType, + }; diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_fill.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_fill.dart new file mode 100644 index 00000000..687752fc --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_fill.dart @@ -0,0 +1,77 @@ +import 'dart:math'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'intermediate_fill.g.dart'; + +@JsonSerializable(explicitToJson: true) +class PBFill { + List gradientStops; + @JsonKey(fromJson: _pointsFromJson, toJson: _pointsToJson) + List gradientHandlePositions; + + // String that tidentifies the ID of the image + String imageRef; + + PBColor color; + + @JsonKey(defaultValue: 100) + num opacity; + + String blendMode; + + String type; + + @JsonKey(defaultValue: true) + bool isEnabled; + + final pbdlType = 'fill'; + + PBFill({ + this.opacity, + this.blendMode, + this.type, + this.isEnabled, + this.color, + this.imageRef, + }); + + @override + factory PBFill.fromJson(Map json) => _$PBFillFromJson(json); + + Map toJson() => _$PBFillToJson(this); + + static List _pointsFromJson(List points) { + var objPoints = []; + for (var point in points) { + objPoints.add(Point(point['x'], point['y'])); + } + return objPoints; + } + + static List _pointsToJson(List points) { + var maps = []; + if (points != null) { + for (var p in points) { + maps.add({'x': p.x, 'y': p.y}); + } + } + return maps; + } +} + +@JsonSerializable() +class PBGradientStop { + PBColor color; + num position; + + PBGradientStop({ + this.color, + this.position, + }); + + factory PBGradientStop.fromJson(Map json) => + _$PBGradientStopFromJson(json); + + Map toJson() => _$PBGradientStopToJson(this); +} diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_fill.g.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_fill.g.dart new file mode 100644 index 00000000..1f6052f4 --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_fill.g.dart @@ -0,0 +1,55 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'intermediate_fill.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +PBFill _$PBFillFromJson(Map json) { + return PBFill( + opacity: json['opacity'] as num ?? 100, + blendMode: json['blendMode'] as String, + type: json['type'] as String, + isEnabled: json['isEnabled'] as bool ?? true, + color: json['color'] == null + ? null + : PBColor.fromJson(json['color'] as Map), + imageRef: json['imageRef'] as String, + ) + ..gradientStops = (json['gradientStops'] as List) + ?.map((e) => e == null + ? null + : PBGradientStop.fromJson(e as Map)) + ?.toList() + ..gradientHandlePositions = + PBFill._pointsFromJson(json['gradientHandlePositions'] as List); +} + +Map _$PBFillToJson(PBFill instance) => { + 'gradientStops': + instance.gradientStops?.map((e) => e?.toJson())?.toList(), + 'gradientHandlePositions': + PBFill._pointsToJson(instance.gradientHandlePositions), + 'imageRef': instance.imageRef, + 'color': instance.color?.toJson(), + 'opacity': instance.opacity, + 'blendMode': instance.blendMode, + 'type': instance.type, + 'isEnabled': instance.isEnabled, + }; + +PBGradientStop _$PBGradientStopFromJson(Map json) { + return PBGradientStop( + color: json['color'] == null + ? null + : PBColor.fromJson(json['color'] as Map), + position: json['position'] as num, + ); +} + +Map _$PBGradientStopToJson(PBGradientStop instance) => + { + 'color': instance.color, + 'position': instance.position, + }; diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_text_style.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_text_style.dart new file mode 100644 index 00000000..c4065086 --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_text_style.dart @@ -0,0 +1,91 @@ +import 'package:pbdl/pbdl.dart'; + +import 'package:json_annotation/json_annotation.dart'; + +part 'intermediate_text_style.g.dart'; + +@JsonSerializable(explicitToJson: true) +class PBTextStyle { + String fontFamily; + + String fontPostScriptName; + + @JsonKey(defaultValue: 0) + num paragraphSpacing; + + @JsonKey(defaultValue: 0) + num paragraphIndent; + + @JsonKey(defaultValue: 0) + num listSpacing; + + bool italics; + + num fontWeight; + + num fontSize; + + @JsonKey(defaultValue: 'ORIGINAL') + String textCase; + + @JsonKey(defaultValue: 'NONE') + String textDecoration; + + @JsonKey(defaultValue: 'NONE') + String textAutoResize; + + String textAlignHorizontal; + + String textAlignVertical; + + num letterSpacing; + + List fills; + + String hyperLink; + + @JsonKey(defaultValue: {}) + Map opentypeFlags; + + num lineHeightPx; + + @JsonKey(defaultValue: 100) + num lineHeightPercent; + + num lineHeightPercentFontSize; + + String lineHeightUnit; + + @override + final pbdlType = 'text_style'; + + PBTextStyle({ + this.fontFamily, + this.fontPostScriptName, + this.paragraphSpacing, + this.paragraphIndent, + this.listSpacing, + this.italics, + this.fontWeight, + this.fontSize, + this.textCase, + this.textDecoration, + this.textAutoResize, + this.textAlignHorizontal, + this.textAlignVertical, + this.letterSpacing, + this.fills, + this.hyperLink, + this.opentypeFlags, + this.lineHeightPx, + this.lineHeightPercent, + this.lineHeightPercentFontSize, + this.lineHeightUnit, + }); + + @override + factory PBTextStyle.fromJson(Map json) => + _$PBTextStyleFromJson(json); + @override + Map toJson() => _$PBTextStyleToJson(this); +} diff --git a/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_text_style.g.dart b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_text_style.g.dart new file mode 100644 index 00000000..acdbdccd --- /dev/null +++ b/lib/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_text_style.g.dart @@ -0,0 +1,64 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'intermediate_text_style.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +PBTextStyle _$PBTextStyleFromJson(Map json) { + return PBTextStyle( + fontFamily: json['fontFamily'] as String, + fontPostScriptName: json['fontPostScriptName'] as String, + paragraphSpacing: json['paragraphSpacing'] as num ?? 0, + paragraphIndent: json['paragraphIndent'] as num ?? 0, + listSpacing: json['listSpacing'] as num ?? 0, + italics: json['italics'] as bool, + fontWeight: json['fontWeight'] as num, + fontSize: json['fontSize'] as num, + textCase: json['textCase'] as String ?? 'ORIGINAL', + textDecoration: json['textDecoration'] as String ?? 'NONE', + textAutoResize: json['textAutoResize'] as String ?? 'NONE', + textAlignHorizontal: json['textAlignHorizontal'] as String, + textAlignVertical: json['textAlignVertical'] as String, + letterSpacing: json['letterSpacing'] as num, + fills: (json['fills'] as List) + ?.map((e) => + e == null ? null : PBDLFill.fromJson(e as Map)) + ?.toList(), + hyperLink: json['hyperLink'] as String, + opentypeFlags: (json['opentypeFlags'] as Map)?.map( + (k, e) => MapEntry(k, e as num), + ) ?? + {}, + lineHeightPx: json['lineHeightPx'] as num, + lineHeightPercent: json['lineHeightPercent'] as num ?? 100, + lineHeightPercentFontSize: json['lineHeightPercentFontSize'] as num, + lineHeightUnit: json['lineHeightUnit'] as String, + ); +} + +Map _$PBTextStyleToJson(PBTextStyle instance) => + { + 'fontFamily': instance.fontFamily, + 'fontPostScriptName': instance.fontPostScriptName, + 'paragraphSpacing': instance.paragraphSpacing, + 'paragraphIndent': instance.paragraphIndent, + 'listSpacing': instance.listSpacing, + 'italics': instance.italics, + 'fontWeight': instance.fontWeight, + 'fontSize': instance.fontSize, + 'textCase': instance.textCase, + 'textDecoration': instance.textDecoration, + 'textAutoResize': instance.textAutoResize, + 'textAlignHorizontal': instance.textAlignHorizontal, + 'textAlignVertical': instance.textAlignVertical, + 'letterSpacing': instance.letterSpacing, + 'fills': instance.fills?.map((e) => e?.toJson())?.toList(), + 'hyperLink': instance.hyperLink, + 'opentypeFlags': instance.opentypeFlags, + 'lineHeightPx': instance.lineHeightPx, + 'lineHeightPercent': instance.lineHeightPercent, + 'lineHeightPercentFontSize': instance.lineHeightPercentFontSize, + 'lineHeightUnit': instance.lineHeightUnit, + }; diff --git a/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.dart b/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.dart index aba0e99b..eb6b0c3e 100644 --- a/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.dart +++ b/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.dart @@ -1,7 +1,11 @@ -import 'package:parabeac_core/interpret_and_optimize/entities/intermediate_border_info.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_border_info.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'auxilary_data_helpers/intermediate_effect.dart'; +import 'auxilary_data_helpers/intermediate_fill.dart'; +import 'auxilary_data_helpers/intermediate_text_style.dart'; + part 'intermediate_auxillary_data.g.dart'; @JsonSerializable(explicitToJson: true) @@ -9,24 +13,106 @@ class IntermediateAuxiliaryData { /// Info relating to the alignment of an element, currently just in a map format. Map alignment; + /// All colors that may be needed + @JsonKey(name: 'fills') + List colors; + /// Info relating to a elements borders. - @JsonKey(ignore: true) + @JsonKey(name: 'borderOptions') IntermediateBorderInfo borderInfo; - /// The background color of the element. - @JsonKey(fromJson: ColorUtils.pbColorFromJsonFills, name: 'fills') + /// Effect for widgets + List effects; + + /// Style for text + @JsonKey(name: 'textStyle') + PBTextStyle intermediateTextStyle; + + /// Blended color + @JsonKey(ignore: true) PBColor color; IntermediateAuxiliaryData({ - this.color, - }); + this.colors, + this.borderInfo, + this.effects, + this.intermediateTextStyle, + }) { + if (colors != null) { + color = _calculateBlendColor(); + } + } factory IntermediateAuxiliaryData.fromJson(Map json) => - _$IntermediateAuxiliaryDataFromJson(json) - ..borderInfo = json['borders'].isNotEmpty - ? IntermediateBorderInfo.fromJson(json['borders'][0]) - : IntermediateBorderInfo( - isBorderOutlineVisible: false, borderRadius: 0); + _$IntermediateAuxiliaryDataFromJson(json); Map toJson() => _$IntermediateAuxiliaryDataToJson(this); + + // Calculate just one color from all fills + PBColor _calculateBlendColor() { + var tempColor = []; + if (colors.isNotEmpty) { + colors.forEach((fill) { + if (fill.isEnabled) { + if (fill.type == 'SOLID') { + if (tempColor.isEmpty) { + tempColor = _colorToList(fill); + } else { + var temp = _colorToList(fill); + tempColor = _addColors(tempColor, temp); + } + } + } + }); + // In case tempColor never gets data + if (tempColor.isEmpty) { + return null; + } + return PBColor(tempColor[3], tempColor[0], tempColor[1], tempColor[2]); + } + // In case colors is empty + else { + return null; + } + } + + // This method takes two PBDL Colors in list form and adds them + List _addColors(List base, List added) { + var tempColor = []; + + var calculatedPercentage = (added[3] + base[3]) / 100; + + var addedPercentage = (added[3] / calculatedPercentage) / 100; + + var basePercentage = (base[3] / calculatedPercentage) / 100; + + var calculatedAlpha = 1 - (1 - added[3]) * (1 - base[3]); + + tempColor.add((added[0] * addedPercentage) + (base[0] * basePercentage)); + tempColor.add((added[1] * addedPercentage) + (base[1] * basePercentage)); + tempColor.add((added[2] * addedPercentage) + (base[2] * basePercentage)); + tempColor.add(calculatedAlpha); + + return tempColor; + } + + // Returns a pbdl fill to a list of double + List _colorToList(PBFill fill) { + var alpha = _getAlpha(fill.opacity); + var temp = []; + temp.add(fill.color.r); + temp.add(fill.color.g); + temp.add(fill.color.b); + temp.add(alpha); + return temp; + } + + // Calculates the alpha of a fill + double _getAlpha(num opacity) { + if (opacity > 1) { + return (opacity / 100).toDouble(); + } else { + return opacity.toDouble(); + } + } } diff --git a/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.g.dart b/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.g.dart index b54d94c0..cc7f8834 100644 --- a/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.g.dart +++ b/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.g.dart @@ -9,8 +9,21 @@ part of 'intermediate_auxillary_data.dart'; IntermediateAuxiliaryData _$IntermediateAuxiliaryDataFromJson( Map json) { return IntermediateAuxiliaryData( - color: ColorUtils.pbColorFromJsonFills( - json['fills'] as List>), + colors: (json['fills'] as List) + ?.map((e) => + e == null ? null : PBFill.fromJson(e as Map)) + ?.toList(), + borderInfo: json['borderOptions'] == null + ? null + : IntermediateBorderInfo.fromJson( + json['borderOptions'] as Map), + effects: (json['effects'] as List) + ?.map((e) => + e == null ? null : PBEffect.fromJson(e as Map)) + ?.toList(), + intermediateTextStyle: json['textStyle'] == null + ? null + : PBTextStyle.fromJson(json['textStyle'] as Map), )..alignment = json['alignment'] as Map; } @@ -18,5 +31,8 @@ Map _$IntermediateAuxiliaryDataToJson( IntermediateAuxiliaryData instance) => { 'alignment': instance.alignment, - 'fills': instance.color?.toJson(), + 'fills': instance.colors?.map((e) => e?.toJson())?.toList(), + 'borderOptions': instance.borderInfo?.toJson(), + 'effects': instance.effects?.map((e) => e?.toJson())?.toList(), + 'textStyle': instance.intermediateTextStyle?.toJson(), }; diff --git a/lib/main.dart b/lib/main.dart index a5435362..d1ec724f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -227,7 +227,7 @@ Future> treeHasMaster(PBIntermediateTree tree) async { if (element is PBSharedMasterNode && element.parent != null) { var tempTree = PBIntermediateTree(name: element.name) ..rootNode = element - ..tree_type = TREE_TYPE.SCREEN + ..tree_type = TREE_TYPE.VIEW ..generationViewData = PBGenerationViewData(); var stack = []; @@ -401,7 +401,8 @@ void addToAmplitude() async { /// types of intake to parabeac-core bool hasTooManyArgs(ArgResults args) { var hasSketch = args['path'] != null; - var hasFigma = args['figKey'] != null || args['fig'] != null || args['oauth'] != null; + var hasFigma = + args['figKey'] != null || args['fig'] != null || args['oauth'] != null; var hasPbdl = args['pbdl-in'] != null; var hasAll = hasSketch && hasFigma && hasPbdl; diff --git a/lib/tags/custom_tag/custom_tag.dart b/lib/tags/custom_tag/custom_tag.dart index 802d99e6..ee64eae1 100644 --- a/lib/tags/custom_tag/custom_tag.dart +++ b/lib/tags/custom_tag/custom_tag.dart @@ -1,4 +1,3 @@ -import 'package:directed_graph/directed_graph.dart'; import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/generation/generators/import_generator.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; @@ -17,7 +16,6 @@ import 'package:parabeac_core/interpret_and_optimize/helpers/override_helper.dar import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; -import 'package:parabeac_core/tags/custom_tag/custom_tag_bloc_generator.dart'; import 'package:uuid/uuid.dart'; import 'package:recase/recase.dart'; @@ -25,6 +23,9 @@ class CustomTag extends PBTag implements PBInjectedIntermediate { @override String semanticName = ''; + @override + String name; + @override ParentLayoutSizing layoutCrossAxisSizing; @override @@ -32,7 +33,7 @@ class CustomTag extends PBTag implements PBInjectedIntermediate { CustomTag( String UUID, Rectangle3D frame, - String name, { + this.name, { PBIntermediateConstraints constraints, this.layoutCrossAxisSizing, this.layoutMainAxisSizing, @@ -63,59 +64,13 @@ class CustomTag extends PBTag implements PBInjectedIntermediate { PBIntermediateTree tree) { return CustomTag( null, - frame, + frame.copyWith(), originalRef.name.replaceAll('', '').pascalCase + 'Custom', constraints: originalRef.constraints.copyWith(), layoutCrossAxisSizing: originalRef.layoutCrossAxisSizing, layoutMainAxisSizing: originalRef.layoutMainAxisSizing, ); } - - /// Handles `iNode` to convert into a [CustomTag]. - /// - /// Returns the [PBIntermediateNode] that should go into the [PBIntermediateTree] - PBIntermediateNode handleIntermediateNode( - PBIntermediateNode iNode, - PBIntermediateNode parent, - CustomTag tag, - PBIntermediateTree tree, - ) { - iNode.name = iNode.name.replaceAll('', ''); - - // If `iNode` is [PBSharedMasterNode] we need to place the [CustomEgg] betweeen the - // [PBSharedMasterNode] and the [PBSharedMasterNode]'s children. That is why we are returing - // `iNode` at the end. - if (iNode is PBSharedMasterNode) { - // TODO: temporal fix, uncomment later - // tree.addEdges( - // newTag, tree.childrenOf(iNode).cast>()); - - // tree.replaceChildrenOf(iNode, [tag]); - return iNode; - } else if (iNode is PBSharedInstanceIntermediateNode) { - iNode.parent = parent; - - tree.replaceNode(iNode, tag); - - tree.addEdges(tag, [iNode]); - - return tag; - } else { - // [iNode] needs a parent and has not been added to the [tree] by [tree.addEdges] - iNode.parent = parent; - // If `iNode` has no children, it likely means we want to wrap `iNode` in [CustomEgg] - if (tree.childrenOf(iNode).isEmpty || iNode is PBLayoutIntermediateNode) { - /// Wrap `iNode` in `newTag` and make `newTag` child of `parent`. - tree.removeEdges(iNode.parent, [iNode]); - tree.addEdges(tag, [iNode]); - tree.addEdges(parent, [tag]); - return tag; - } - tree.replaceNode(iNode, tag, acceptChildren: true); - - return tag; - } - } } class CustomTagGenerator extends PBGenerator { diff --git a/pbdl b/pbdl deleted file mode 160000 index 39cb9497..00000000 --- a/pbdl +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 39cb949751312d0e34a4a25c6b57949eef676ee1 diff --git a/pubspec.yaml b/pubspec.yaml index 6af18201..14754fca 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: parabeac_core description: A starting point for Dart libraries or applications. -version: 2.4.1 +version: 2.5.0 # homepage: https://www.example.com environment: @@ -11,19 +11,21 @@ dependencies: archive: ^3.1.2 json_serializable: ^3.5.0 build_runner: ^1.10.0 - mockito: ^4.1.1 + mockito: ^5.0.7 hex: ^0.1.2 build: ^1.3.0 - logger: ^0.8.3 + logger: ^1.1.0 uuid: ^3.0.0 quick_log: ^1.1.3 http2: ^1.0.1 recase: "^3.0.0" - tuple: ^1.0.3 + tuple: ^2.0.0 path: ^1.6.0 file: ^6.1.2 pbdl: - path: ./pbdl + git: + url: https://github.com/Parabeac/pbdl.git + ref: master directed_graph: ^0.2.3 sentry: ^6.2.2 yaml_modify: ^1.0.1 diff --git a/test/lib/interpret_and_optimize/services/interpret_test.dart b/test/lib/interpret_and_optimize/services/interpret_test.dart index ccd26774..e64b95f9 100644 --- a/test/lib/interpret_and_optimize/services/interpret_test.dart +++ b/test/lib/interpret_and_optimize/services/interpret_test.dart @@ -98,9 +98,9 @@ void main() { when(mockGroup.name).thenReturn('testGroup'); when(container.name).thenReturn('testContainer'); - when(artboard.type).thenReturn('artboard'); - when(mockGroup.type).thenReturn('group'); - when(container.type).thenReturn('text'); + when(artboard.pbdlType).thenReturn('artboard'); + when(mockGroup.pbdlType).thenReturn('group'); + when(container.pbdlType).thenReturn('text'); when(page.name).thenReturn('testName'); when(mockGroup.children).thenReturn([container]);