From f7b8747c61e53c0af2324babc8f5b7aa26f9f320 Mon Sep 17 00:00:00 2001 From: Eduardo Herrera Date: Tue, 19 Jan 2021 10:50:04 -0700 Subject: [PATCH] FIX merge conflicts --- .circleci/config.yml | 27 -- .github/workflows/dart.yml | 30 +- lib/configurations/configurations.json | 19 +- lib/controllers/figma_controller.dart | 25 +- lib/controllers/interpret.dart | 163 +++++++---- lib/controllers/main_info.dart | 3 +- lib/controllers/sketch_controller.dart | 35 ++- lib/design_logic/color.dart | 13 + lib/eggs/injected_app_bar.dart | 11 +- lib/eggs/injected_back_arrow.dart | 4 +- lib/eggs/injected_tab.dart | 13 +- lib/eggs/injected_tab_bar.dart | 9 +- .../flutter_project_builder.dart | 174 ++++------- .../fluttter_page_builder.dart | 76 ----- .../pb_attribute_gen_helper.dart | 3 +- .../pb_box_decoration_gen_helper.dart | 21 +- .../attribute-helper/pb_color_gen_helper.dart | 29 +- .../pb_generator_context.dart | 7 + .../attribute-helper/pb_size_helper.dart | 89 +++--- .../generators/helpers/pb_gen_helper.dart | 3 +- .../generators/helpers/pb_layout_helper.dart | 11 +- .../helpers/pb_visual_gen_helper.dart | 0 .../generators/layouts/pb_column_gen.dart | 8 +- .../generators/layouts/pb_layout_gen.dart | 3 +- .../generators/layouts/pb_row_gen.dart | 11 +- .../generators/layouts/pb_scaffold_gen.dart | 32 ++- .../generators/layouts/pb_stack_gen.dart | 10 +- .../layouts/pb_v_scrollview_gen.dart | 11 - .../generators/middleware/middleware.dart | 23 ++ .../state_management/bloc_middleware.dart | 123 ++++++++ .../state_management/provider_middleware.dart | 68 +++++ .../state_management/stateful_middleware.dart | 77 +++++ .../generators/pb_flutter_generator.dart | 207 +++++--------- .../generators/pb_generation_manager.dart | 32 +++ lib/generation/generators/pb_generator.dart | 35 ++- lib/generation/generators/pb_variable.dart | 5 + .../generators/pb_widget_manager.dart | 58 ---- lib/generation/generators/screen_builder.dart | 19 +- .../symbols/pb_instancesym_gen.dart | 58 +++- .../generators/symbols/pb_mastersym_gen.dart | 83 +----- .../symbols/pb_sym_mas_param_gen.dart | 4 +- .../util/pb_generation_project_data.dart | 6 + .../util/pb_generation_view_data.dart | 103 +++++++ .../generators/util/pb_input_formatter.dart | 2 + .../bloc_file_structure_strategy.dart | 9 + .../flutter_file_structure_strategy.dart | 9 + .../pb_file_structure_strategy.dart | 98 +++++++ .../provider_file_structure_strategy.dart | 37 +++ .../bloc_generation_configuration.dart | 21 ++ .../pb_generation_configuration.dart | 162 +++++++++++ .../provider_generation_configuration.dart | 20 ++ .../stateful_generation_configuration.dart | 17 ++ .../value_objects/generator_adapter.dart | 13 + .../bloc_state_template_strategy.dart | 47 +++ .../empty_page_template_strategy.dart | 12 + .../inline_template_strategy.dart | 15 + .../pb_template_strategy.dart | 23 ++ .../stateful_template_strategy.dart | 35 +++ .../stateless_template_strategy.dart | 38 +++ .../visual-widgets/pb_align_gen.dart | 10 +- .../visual-widgets/pb_bitmap_gen.dart | 12 +- .../visual-widgets/pb_container_gen.dart | 21 +- .../pb_cupertino_search_bar.dart | 27 -- .../visual-widgets/pb_flexible_gen.dart | 11 +- .../visual-widgets/pb_padding_gen.dart | 44 +-- .../visual-widgets/pb_positioned_gen.dart | 39 ++- .../visual-widgets/pb_shape_group_gen.dart | 4 +- .../visual-widgets/pb_spacer_gen.dart | 18 +- .../visual-widgets/pb_text_gen.dart | 43 +-- .../{ => writers}/pb_flutter_writer.dart | 12 +- .../{ => writers}/pb_page_writer.dart | 0 .../writers/pb_traversal_adapter_writer.dart | 17 ++ .../pre_generation_service.dart | 27 ++ .../prototyping/pb_prototype_gen.dart | 10 +- .../entities/abstract_figma_node_factory.dart | 2 + .../figma/entities/layers/component.dart | 24 +- .../entities/layers/regular_polygon.dart | 10 +- lib/input/helper/node_tree.dart | 7 + lib/input/helper/page.dart | 2 +- .../entities/layers/abstract_layer.dart | 2 +- .../sketch/entities/layers/sketch_text.dart | 9 +- .../entities/layers/symbol_instance.dart | 21 +- .../sketch/entities/layers/symbol_master.dart | 31 +- .../sketch/entities/style/shared_style.dart | 83 ++++++ .../sketch/entities/style/shared_style.g.dart | 26 ++ lib/input/sketch/helper/sketch_node_tree.dart | 51 +++- .../sketch/helper/symbol_node_mixin.dart | 72 ++++- lib/input/sketch/services/input_design.dart | 4 +- .../entities/alignments/flexible.dart | 15 +- .../entities/alignments/flexible.g.dart | 33 --- .../{ => alignments}/injected_align.dart | 0 .../alignments/injected_positioned.dart | 14 +- .../alignments/injected_positioned.g.dart | 48 ---- .../entities/alignments/padding.dart | 13 +- .../entities/alignments/padding.g.dart | 45 --- .../entities/alignments/spacer.dart | 9 - .../entities/alignments/spacer.g.dart | 37 --- .../entities/cross_axis_alignment.dart | 17 -- .../entities/inherited_bitmap.dart | 25 +- .../entities/inherited_bitmap.g.dart | 44 --- .../entities/inherited_circle.dart | 54 +--- .../entities/inherited_circle.g.dart | 42 --- .../entities/inherited_container.dart | 57 +--- .../entities/inherited_container.g.dart | 44 --- .../entities/inherited_oval.dart | 34 +-- .../entities/inherited_oval.g.dart | 44 --- .../entities/inherited_polygon.dart | 30 +- .../entities/inherited_polygon.g.dart | 44 --- .../entities/inherited_scaffold.dart | 43 +-- .../entities/inherited_scaffold.g.dart | 54 ---- .../entities/inherited_shape_group.dart | 33 +-- .../entities/inherited_shape_group.g.dart | 45 --- .../entities/inherited_shape_path.dart | 59 +--- .../entities/inherited_shape_path.g.dart | 44 --- .../entities/inherited_star.dart | 29 +- .../entities/inherited_star.g.dart | 44 --- .../entities/inherited_text.dart | 27 +- .../entities/inherited_text.g.dart | 58 ---- .../entities/inherited_triangle.dart | 29 +- .../entities/inherited_triangle.g.dart | 44 --- .../entities/injected_container.dart | 51 +--- .../entities/injected_container.g.dart | 48 ---- .../entities/layouts/column.dart | 21 +- .../entities/layouts/column.g.dart | 34 --- .../entities/layouts/row.dart | 21 +- .../entities/layouts/row.g.dart | 34 --- .../rules/container_constraint_rule.dart | 2 +- .../entities/layouts/stack.dart | 17 +- .../entities/layouts/stack.g.dart | 42 --- .../entities/main_axis_alignment.dart | 18 -- .../entities/pb_deny_list_node.dart | 3 +- .../entities/pb_shared_instance.dart | 70 ++--- .../entities/pb_shared_instance.g.dart | 52 ---- .../entities/pb_shared_master_node.dart | 47 ++- .../entities/pb_shared_master_node.g.dart | 50 ---- .../entities/plugins/plugin_container.dart | 121 -------- .../entities/plugins/plugin_container.g.dart | 50 ---- .../subclasses/pb_intermediate_node.dart | 33 +-- .../pb_layout_intermediate_node.dart | 39 +-- .../pb_visual_intermediate_node.dart | 6 +- .../helpers/pb_configuration.dart | 7 +- .../helpers/pb_context.dart | 11 +- .../helpers/pb_intermediate_group.dart | 17 -- .../helpers/pb_intermediate_item.dart | 17 -- .../helpers/pb_intermediate_node_tree.dart | 21 +- .../helpers/pb_plugin_list_helper.dart | 4 - .../helpers/pb_project.dart | 28 ++ .../helpers/pb_state_management_helper.dart | 48 ++++ .../helpers/pb_state_management_linker.dart | 73 +++++ .../helpers/pb_symbol_storage.dart | 6 + .../services/intermediate_writer.dart | 82 ------ .../pb_alignment_generation_service.dart | 15 +- .../pb_layout_generation_service.dart | 269 ++++++++++-------- .../services/pb_plugin_control_service.dart | 7 +- .../pb_shared_aggregation_service.dart | 5 +- .../services/pb_symbol_linker_service.dart | 13 +- .../pb_visual_generation_service.dart | 43 ++- .../directed_state_graph.dart | 9 + .../intermediate_auxillary_data.dart | 22 ++ .../state_management/intermediate_state.dart | 14 + .../intermediate_variation.dart | 7 + .../state_management/intermediate_vertex.dart | 1 + .../pb_symbol_instance_overridable_value.dart | 12 +- ...b_symbol_instance_overridable_value.g.dart | 24 -- .../pb_symbol_master_overridable_prop.dart | 12 - .../pb_symbol_master_overridable_prop.g.dart | 22 -- .../pb_symbol_master_params.dart | 14 +- .../pb_symbol_master_params.g.dart | 58 ---- .../value_objects/point.dart | 8 - .../value_objects/point.g.dart | 19 -- pubspec.yaml | 1 + test/lib/generation/generator_test.dart | 20 +- .../input_services/input_to_pbdl_test.dart | 2 +- .../padding_dynamic_size_test.dart | 14 +- .../services/interpret_test.dart | 17 +- .../pb_layout_generation_service_test.dart | 89 ------ .../pb_shared_aggregation_service_test.dart | 3 + .../services/pb_visual_generation_test.dart | 15 +- test/lib/layouts/layout_generation_test.dart | 19 +- .../dependency_writer_test.dart | 8 +- .../output_services/flutter_writer_test.dart | 2 +- .../output_services/project_builder_test.dart | 57 ++-- 182 files changed, 2755 insertions(+), 3235 deletions(-) delete mode 100644 .circleci/config.yml delete mode 100644 lib/generation/flutter_project_builder/fluttter_page_builder.dart create mode 100644 lib/generation/generators/attribute-helper/pb_generator_context.dart delete mode 100644 lib/generation/generators/helpers/pb_visual_gen_helper.dart delete mode 100644 lib/generation/generators/layouts/pb_v_scrollview_gen.dart create mode 100644 lib/generation/generators/middleware/middleware.dart create mode 100644 lib/generation/generators/middleware/state_management/bloc_middleware.dart create mode 100644 lib/generation/generators/middleware/state_management/provider_middleware.dart create mode 100644 lib/generation/generators/middleware/state_management/stateful_middleware.dart create mode 100644 lib/generation/generators/pb_generation_manager.dart delete mode 100644 lib/generation/generators/pb_widget_manager.dart create mode 100644 lib/generation/generators/util/pb_generation_project_data.dart create mode 100644 lib/generation/generators/util/pb_generation_view_data.dart create mode 100644 lib/generation/generators/value_objects/file_structure_strategy.dart/bloc_file_structure_strategy.dart create mode 100644 lib/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart create mode 100644 lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart create mode 100644 lib/generation/generators/value_objects/file_structure_strategy.dart/provider_file_structure_strategy.dart create mode 100644 lib/generation/generators/value_objects/generation_configuration/bloc_generation_configuration.dart create mode 100644 lib/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart create mode 100644 lib/generation/generators/value_objects/generation_configuration/provider_generation_configuration.dart create mode 100644 lib/generation/generators/value_objects/generation_configuration/stateful_generation_configuration.dart create mode 100644 lib/generation/generators/value_objects/generator_adapter.dart create mode 100644 lib/generation/generators/value_objects/template_strategy/bloc_state_template_strategy.dart create mode 100644 lib/generation/generators/value_objects/template_strategy/empty_page_template_strategy.dart create mode 100644 lib/generation/generators/value_objects/template_strategy/inline_template_strategy.dart create mode 100644 lib/generation/generators/value_objects/template_strategy/pb_template_strategy.dart create mode 100644 lib/generation/generators/value_objects/template_strategy/stateful_template_strategy.dart create mode 100644 lib/generation/generators/value_objects/template_strategy/stateless_template_strategy.dart delete mode 100644 lib/generation/generators/visual-widgets/pb_cupertino_search_bar.dart rename lib/generation/generators/{ => writers}/pb_flutter_writer.dart (82%) rename lib/generation/generators/{ => writers}/pb_page_writer.dart (100%) create mode 100644 lib/generation/generators/writers/pb_traversal_adapter_writer.dart create mode 100644 lib/generation/pre-generation/pre_generation_service.dart create mode 100644 lib/input/sketch/entities/style/shared_style.dart create mode 100644 lib/input/sketch/entities/style/shared_style.g.dart delete mode 100644 lib/interpret_and_optimize/entities/alignments/flexible.g.dart rename lib/interpret_and_optimize/entities/{ => alignments}/injected_align.dart (100%) delete mode 100644 lib/interpret_and_optimize/entities/alignments/injected_positioned.g.dart delete mode 100644 lib/interpret_and_optimize/entities/alignments/padding.g.dart delete mode 100644 lib/interpret_and_optimize/entities/alignments/spacer.g.dart delete mode 100644 lib/interpret_and_optimize/entities/cross_axis_alignment.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_bitmap.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_circle.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_container.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_oval.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_polygon.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_scaffold.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_shape_group.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_shape_path.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_star.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_text.g.dart delete mode 100644 lib/interpret_and_optimize/entities/inherited_triangle.g.dart delete mode 100644 lib/interpret_and_optimize/entities/injected_container.g.dart delete mode 100644 lib/interpret_and_optimize/entities/layouts/column.g.dart delete mode 100644 lib/interpret_and_optimize/entities/layouts/row.g.dart delete mode 100644 lib/interpret_and_optimize/entities/layouts/stack.g.dart delete mode 100644 lib/interpret_and_optimize/entities/main_axis_alignment.dart delete mode 100644 lib/interpret_and_optimize/entities/pb_shared_instance.g.dart delete mode 100644 lib/interpret_and_optimize/entities/pb_shared_master_node.g.dart delete mode 100644 lib/interpret_and_optimize/entities/plugins/plugin_container.dart delete mode 100644 lib/interpret_and_optimize/entities/plugins/plugin_container.g.dart delete mode 100644 lib/interpret_and_optimize/helpers/pb_intermediate_group.dart delete mode 100644 lib/interpret_and_optimize/helpers/pb_intermediate_item.dart create mode 100644 lib/interpret_and_optimize/helpers/pb_project.dart create mode 100644 lib/interpret_and_optimize/helpers/pb_state_management_helper.dart create mode 100644 lib/interpret_and_optimize/helpers/pb_state_management_linker.dart delete mode 100644 lib/interpret_and_optimize/services/intermediate_writer.dart create mode 100644 lib/interpret_and_optimize/state_management/directed_state_graph.dart create mode 100644 lib/interpret_and_optimize/state_management/intermediate_auxillary_data.dart create mode 100644 lib/interpret_and_optimize/state_management/intermediate_state.dart create mode 100644 lib/interpret_and_optimize/state_management/intermediate_variation.dart create mode 100644 lib/interpret_and_optimize/state_management/intermediate_vertex.dart delete mode 100644 lib/interpret_and_optimize/value_objects/pb_symbol_instance_overridable_value.g.dart delete mode 100644 lib/interpret_and_optimize/value_objects/pb_symbol_master_overridable_prop.g.dart delete mode 100644 lib/interpret_and_optimize/value_objects/pb_symbol_master_params.g.dart delete mode 100644 lib/interpret_and_optimize/value_objects/point.g.dart delete mode 100644 test/lib/interpret_and_optimize/services/pb_layout_generation_service_test.dart diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 88054180..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: 2 -jobs: - build: - branches: - only: master - docker: - - image: google/dart - steps: - - checkout - - run: - name: Get Dependencies - command: | - pub get - - run: - name: Runing Parabeac Core tests - command: | - pub run test - test: - docker: - - image: google/dart - steps: - - checkouts - - run: - name: Parabeac Core Test - command: pub run test - - \ No newline at end of file diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index d7850bce..dcfcca79 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -2,30 +2,28 @@ name: Dart CI on: push: - branches: [ stable, dev ] + branches: [stable, dev] pull_request: - branches: [ stable, dev ] + branches: [stable, dev] jobs: - build: - runs-on: ubuntu-latest services: sketch_asset_converter: image: parabeac/sac - ports: + ports: - 4000:4000 steps: - - uses: actions/checkout@v2 - - name: Flutter action - uses: subosito/flutter-action@v1.4.0 - - - name: Install dependencies - run: flutter pub get - - name: Run tests - run: flutter pub run test - env: - FIG_API_KEY: ${{ secrets.FIG_API_KEY }} - PB_IS_GITHUB_TEST: true + - uses: actions/checkout@v2 + - name: Flutter action + uses: subosito/flutter-action@v1.4.0 + + - name: Install dependencies + run: flutter pub get + - name: Run tests + run: flutter pub run test + env: + FIG_API_KEY: ${{ secrets.FIG_API_KEY }} + PB_IS_GITHUB_TEST: true diff --git a/lib/configurations/configurations.json b/lib/configurations/configurations.json index 0608268d..4114a0a7 100644 --- a/lib/configurations/configurations.json +++ b/lib/configurations/configurations.json @@ -3,18 +3,11 @@ "widgetStyle": "Material", "widgetType": "Stateless", "widgetSpacing": "Expanded", - "layoutPrecedence" : ["column", "row", "stack"] + "layoutPrecedence": [ + "column", + "row", + "stack" + ] }, - "stack": { - "widgetStyle": "Material", - "widgetType": "Stateless", - "widgetSpacing": "Expanded", - "layoutPrecedence" : ["stack"] - }, - "This will be replaced by a Object ID to determine specific configurations for each page": { - "widgetStyle": "Material", - "widgetType": "Stateless", - "widgetSpacing": "Expanded" - }, - "root": "AC2E7423-4609-4F37-8BCA-7E915944FFE2" + "state-management": "provider" } \ No newline at end of file diff --git a/lib/controllers/figma_controller.dart b/lib/controllers/figma_controller.dart index 6dad7249..e6a70dd2 100644 --- a/lib/controllers/figma_controller.dart +++ b/lib/controllers/figma_controller.dart @@ -1,5 +1,9 @@ import 'package:parabeac_core/controllers/controller.dart'; import 'package:parabeac_core/generation/flutter_project_builder/flutter_project_builder.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_flutter_writer.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_traversal_adapter_writer.dart'; +import 'package:parabeac_core/generation/pre-generation/pre_generation_service.dart'; import 'package:parabeac_core/input/figma/entities/layers/frame.dart'; import 'package:parabeac_core/input/figma/helper/figma_node_tree.dart'; import 'package:quick_log/quick_log.dart'; @@ -24,12 +28,25 @@ class FigmaController extends Controller { Interpret().init(outputPath); - var mainTree = await Interpret().interpretAndOptimize(figmaNodeTree); + var pbProject = await Interpret().interpretAndOptimize(figmaNodeTree); - var fpb = - FlutterProjectBuilder(projectName: outputPath, mainTree: mainTree); + pbProject.forest.forEach((tree) => tree.data = PBGenerationViewData()); - fpb.convertToFlutterProject(); + await PreGenerationService( + projectName: outputPath, + mainTree: pbProject, + pageWriter: PBTraversalAdapterWriter(), + ).convertToFlutterProject(); + + //Making the data immutable for writing into the file + pbProject.forest.forEach((tree) => tree.data.lockData()); + + var fpb = FlutterProjectBuilder( + projectName: outputPath, + mainTree: pbProject, + pageWriter: PBFlutterWriter()); + + await fpb.convertToFlutterProject(); } FigmaNodeTree generateFigmaTree(var jsonFigma, var projectname) { diff --git a/lib/controllers/interpret.dart b/lib/controllers/interpret.dart index 4a869209..509c62c2 100644 --- a/lib/controllers/interpret.dart +++ b/lib/controllers/interpret.dart @@ -1,6 +1,6 @@ import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/design_logic/design_node.dart'; -import 'package:parabeac_core/generation/generators/pb_widget_manager.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_linker_service.dart'; import 'package:parabeac_core/input/helper/node_tree.dart'; import 'package:parabeac_core/input/helper/page.dart'; @@ -10,9 +10,8 @@ import 'package:parabeac_core/interpret_and_optimize/entities/layouts/temp_group 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:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_group.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_item.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; import 'package:parabeac_core/interpret_and_optimize/services/pb_alignment_generation_service.dart'; import 'package:parabeac_core/interpret_and_optimize/services/pb_layout_generation_service.dart'; import 'package:parabeac_core/interpret_and_optimize/services/pb_plugin_control_service.dart'; @@ -36,7 +35,7 @@ class Interpret { @visibleForTesting String projectName; - PBIntermediateTree _pb_intermediate_tree; + PBProject _pb_project; PBSymbolLinkerService _pbSymbolLinkerService; PBPrototypeLinkerService _pbPrototypeLinkerService; PBGenerationManager _generationManager; @@ -48,58 +47,56 @@ class Interpret { _interpret._pbPrototypeLinkerService = PBPrototypeLinkerService(); } - Future interpretAndOptimize(NodeTree tree) async { - _pb_intermediate_tree = PBIntermediateTree(projectName); + Future interpretAndOptimize(NodeTree tree) async { + _pb_project = PBProject(projectName, tree.sharedStyles); ///3rd Party Symbols if (tree.miscPages != null) { for (var i = 0; i < tree.miscPages?.length; i++) { - _pb_intermediate_tree.groups - .add((await _generateGroup(tree.miscPages[i]))); + _pb_project.forest.addAll((await _generateGroup(tree.miscPages[i]))); } } /// Main Pages if (tree.pages != null) { for (var i = 0; i < tree.pages?.length; i++) { - _pb_intermediate_tree.groups.add((await _generateGroup(tree.pages[i]))); + _pb_project.forest.addAll((await _generateGroup(tree.pages[i]))); } } - return _pb_intermediate_tree; + return _pb_project; } - Future _generateGroup(Page group) async { - var intermediateGroup = PBIntermediateGroup(group.name.toLowerCase()); + Future> _generateGroup(Page group) async { + var tempForest = []; var pageItems = group.getPageItems(); for (var i = 0; i < pageItems.length; i++) { var item = await _generateScreen(pageItems[i]); - String itemType; - if (item is InheritedScaffold) { - itemType = 'SCREEN'; - } else if (item is PBSharedMasterNode) { - itemType = 'SHARED'; - } else { - itemType = 'MISC'; - } - - if (item != null) { - log.fine( - 'Processed \'${item.name}\' in group \'${group.name}\' with item type: \'${itemType}\''); + if (item != null && item.rootNode != null) { + var tempTree = item; + tempTree.name = group.name; + + if (item.rootNode is InheritedScaffold) { + tempTree.tree_type = TREE_TYPE.SCREEN; + } else if (item.rootNode is PBSharedMasterNode) { + tempTree.tree_type = TREE_TYPE.VIEW; + } else { + tempTree.tree_type = TREE_TYPE.MISC; + } - var newItem = PBIntermediateItem(item, itemType); + if (item != null) { + log.fine( + 'Processed \'${item.name}\' in group \'${group.name}\' with item type: \'${tempTree.tree_type}\''); - ///Searching for the root item. - if (newItem.node is InheritedScaffold) { - _pb_intermediate_tree.rootItem ??= newItem; + tempTree.rootNode; + tempForest.add(tempTree); } - intermediateGroup.addItem(newItem); } } - return intermediateGroup; + return tempForest; } - Future _generateScreen(PageItem item) async { + Future _generateScreen(PageItem item) async { var currentContext = PBContext( jsonConfigurations: MainInfo().configurations ?? MainInfo().defaultConfigs); @@ -109,7 +106,10 @@ class Interpret { var stopwatch = Stopwatch()..start(); /// VisualGenerationService - var parentVisualIntermediateNode = await _visualGenerationService( + var intermediateTree = PBIntermediateTree(item.root.name); + currentContext.treeRoot = intermediateTree; + currentContext.project = _pb_project; + intermediateTree.rootNode = await visualGenerationService( parentComponent, currentContext, stopwatch); /// @@ -117,23 +117,23 @@ class Interpret { /// NOTE Disabled Plugin Control Service for right now /// var stopwatch1 = Stopwatch()..start(); - var parentPreLayoutIntermediateNode = await _pluginService( - parentVisualIntermediateNode, currentContext, stopwatch1); + intermediateTree.rootNode = await pluginService( + intermediateTree.rootNode, currentContext, stopwatch1); var stopwatch2 = Stopwatch()..start(); /// LayoutGenerationService - var parentLayoutIntermediateNode = await _layoutGenerationService( - parentPreLayoutIntermediateNode, currentContext, stopwatch2); + intermediateTree.rootNode = await layoutGenerationService( + intermediateTree.rootNode, currentContext, stopwatch2); var stopwatch3 = Stopwatch()..start(); /// AlignGenerationService - var parentAlignIntermediateNode = await _alignGenerationService( - parentLayoutIntermediateNode, currentContext, stopwatch3); + intermediateTree.rootNode = await alignGenerationService( + intermediateTree.rootNode, currentContext, stopwatch3); - return parentAlignIntermediateNode; + return intermediateTree; } Future generateNonRootItem(DesignNode root) async { @@ -141,57 +141,93 @@ class Interpret { jsonConfigurations: MainInfo().configurations ?? MainInfo().defaultConfigs); - PBIntermediateNode parentVisualIntermediateNode; + PBIntermediateNode rootNode; /// VisualGenerationService try { - parentVisualIntermediateNode = + rootNode = await PBVisualGenerationService(root, currentContext: currentContext) .getIntermediateTree(); } catch (e, stackTrace) { - // await MainInfo().sentry.captureException( - // exception: e, - // stackTrace: stackTrace, - // ); + await MainInfo().sentry.captureException( + exception: e, + stackTrace: stackTrace, + ); log.error(e.toString()); + log.error('at PBVisualGenerationService from generateNonRootItem'); } /// /// pre-layout generation service for plugin nodes. /// - var stopwatch1 = Stopwatch()..start(); - var parentPreLayoutIntermediateNode = await _pluginService( - parentVisualIntermediateNode, currentContext, stopwatch1); + PBIntermediateNode parentPreLayoutIntermediateNode; + try { + parentPreLayoutIntermediateNode = + PBPluginControlService(rootNode, currentContext: currentContext) + .convertAndModifyPluginNodeTree(); + } catch (e, stackTrace) { + await MainInfo().sentry.captureException( + exception: e, + stackTrace: stackTrace, + ); + log.error(e.toString()); + log.error('at PBPluginControlService from generateNonRootItem'); + parentPreLayoutIntermediateNode = + rootNode; //parentVisualIntermediateNode; + } var stopwatch2 = Stopwatch()..start(); /// LayoutGenerationService - - var parentLayoutIntermediateNode = await _layoutGenerationService( - parentPreLayoutIntermediateNode, currentContext, stopwatch2); - - var stopwatch3 = Stopwatch()..start(); + try { + parentPreLayoutIntermediateNode = + PBLayoutGenerationService(currentContext: currentContext) + .extractLayouts(parentPreLayoutIntermediateNode); + } catch (e, stackTrace) { + await MainInfo().sentry.captureException( + exception: e, + stackTrace: stackTrace, + ); + log.error(e.toString()); + log.error('at PBLayoutGenerationService from generateNonRootItem'); + } + var parentAlignIntermediateNode; /// AlignGenerationService - var parentAlignIntermediateNode = await _alignGenerationService( - parentLayoutIntermediateNode, currentContext, stopwatch3); + try { + parentAlignIntermediateNode = PBAlignGenerationService( + parentPreLayoutIntermediateNode, + currentContext: currentContext) + .addAlignmentToLayouts(); + } catch (e, stackTrace) { + await MainInfo().sentry.captureException( + exception: e, + stackTrace: stackTrace, + ); + log.error(e.toString()); + log.error('at PBAlignGenerationService from generateNonRootItem'); + } return parentAlignIntermediateNode; } - Future zz( - var component, var context, var stopwatch) async { + // TODO: refactor this method and/or `getIntermediateTree` + // to not take the [ignoreStates] variable. + Future visualGenerationService( + var component, var context, var stopwatch, + {bool ignoreStates = false}) async { /// VisualGenerationService PBIntermediateNode node; try { node = await PBVisualGenerationService(component, currentContext: context) - .getIntermediateTree(); + .getIntermediateTree(ignoreStates: ignoreStates); } catch (e, stackTrace) { await MainInfo().sentry.captureException( exception: e, stackTrace: stackTrace, ); log.error(e.toString()); + log.error('at PBVisualGenerationService'); } // print( // 'Visual Generation Service executed in ${stopwatch.elapsedMilliseconds} milliseconds.'); @@ -200,7 +236,7 @@ class Interpret { return node; } - Future _pluginService( + Future pluginService( PBIntermediateNode parentnode, var context, var stopwatch1) async { PBIntermediateNode node; try { @@ -212,6 +248,7 @@ class Interpret { stackTrace: stackTrace, ); log.error(e.toString()); + log.error('at PBPluginControlService'); node = parentnode; } // print( @@ -220,18 +257,19 @@ class Interpret { return node; } - Future _layoutGenerationService( + Future layoutGenerationService( PBIntermediateNode parentNode, var context, var stopwatch2) async { PBIntermediateNode node; try { node = PBLayoutGenerationService(currentContext: context) - .injectNodes(parentNode); + .extractLayouts(parentNode); } catch (e, stackTrace) { await MainInfo().sentry.captureException( exception: e, stackTrace: stackTrace, ); log.error(e.toString()); + log.error('at PBLayoutGenerationService'); node = parentNode; } @@ -242,7 +280,7 @@ class Interpret { return node; } - Future _alignGenerationService( + Future alignGenerationService( PBIntermediateNode parentnode, var context, var stopwatch3) async { PBIntermediateNode node; @@ -260,6 +298,7 @@ class Interpret { stackTrace: stackTrace, ); log.error(e.toString()); + log.error('at PBAlignGenerationService'); node = parentnode; } // print( diff --git a/lib/controllers/main_info.dart b/lib/controllers/main_info.dart index 0059f3c1..609a096e 100644 --- a/lib/controllers/main_info.dart +++ b/lib/controllers/main_info.dart @@ -38,7 +38,8 @@ class MainInfo { 'widgetStyle': 'Material', 'widgetType': 'Stateless', 'widgetSpacing': 'Expanded', - 'layoutPrecedence': ['columns', 'rows', 'stack'] + 'layoutPrecedence': ['columns', 'rows', 'stack'], + 'state-management': 'None' } }; diff --git a/lib/controllers/sketch_controller.dart b/lib/controllers/sketch_controller.dart index dbfea3ac..c8691e5f 100644 --- a/lib/controllers/sketch_controller.dart +++ b/lib/controllers/sketch_controller.dart @@ -1,9 +1,10 @@ -import 'dart:convert'; -import 'dart:io'; -import 'package:archive/archive_io.dart'; import 'package:parabeac_core/controllers/controller.dart'; import 'package:parabeac_core/controllers/interpret.dart'; import 'package:parabeac_core/generation/flutter_project_builder/flutter_project_builder.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_flutter_writer.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_traversal_adapter_writer.dart'; +import 'package:parabeac_core/generation/pre-generation/pre_generation_service.dart'; import 'package:parabeac_core/input/sketch/helper/sketch_node_tree.dart'; import 'package:parabeac_core/input/sketch/services/input_design.dart'; import 'package:quick_log/quick_log.dart'; @@ -24,24 +25,38 @@ class SketchController extends Controller { ///INTAKE var ids = InputDesignService(fileAbsPath); var sketchNodeTree = generateSketchNodeTree( - ids.archive, ids.metaFileJson['pagesAndArtboards'], projectPath); + ids, ids.metaFileJson['pagesAndArtboards'], projectPath); ///INTERPRETATION Interpret().init(projectPath); - var mainTree = await Interpret().interpretAndOptimize( + var pbProject = await Interpret().interpretAndOptimize( sketchNodeTree, ); + pbProject.forest.forEach((tree) => tree.data = PBGenerationViewData()); + + ///PRE-GENERATION SERVICE + var pgs = PreGenerationService( + projectName: projectPath, + mainTree: pbProject, + pageWriter: PBTraversalAdapterWriter(), + ); + await pgs.convertToFlutterProject(); + + //Making the data immutable for writing into the file + pbProject.forest.forEach((tree) => tree.data.lockData()); ///GENERATE FLUTTER CODE - var fpb = - FlutterProjectBuilder(projectName: projectPath, mainTree: mainTree); - fpb.convertToFlutterProject(); + var fpb = FlutterProjectBuilder( + projectName: projectPath, + mainTree: pbProject, + pageWriter: PBFlutterWriter()); + await fpb.convertToFlutterProject(); } SketchNodeTree generateSketchNodeTree( - Archive archive, Map pagesAndArtboards, projectName) { + InputDesignService ids, Map pagesAndArtboards, projectName) { try { - return SketchNodeTree(archive, pagesAndArtboards, projectName); + return SketchNodeTree(ids, pagesAndArtboards, projectName); } catch (e, stackTrace) { MainInfo().sentry.captureException( exception: e, diff --git a/lib/design_logic/color.dart b/lib/design_logic/color.dart index 85eb9521..4007bb4c 100644 --- a/lib/design_logic/color.dart +++ b/lib/design_logic/color.dart @@ -29,4 +29,17 @@ mixin PBColorMixin { return '0x' + HEX.encode([0, 0, 0, 0]); } } + + String findDefaultColor(String hex) { + switch (hex) { + case '0xffffffff': + return 'Colors.white'; + break; + case '0xff000000': + return 'Colors.black'; + break; + } + return null; + } + } diff --git a/lib/eggs/injected_app_bar.dart b/lib/eggs/injected_app_bar.dart index ced8c4af..fd931377 100644 --- a/lib/eggs/injected_app_bar.dart +++ b/lib/eggs/injected_app_bar.dart @@ -1,5 +1,6 @@ import 'package:parabeac_core/controllers/interpret.dart'; import 'package:parabeac_core/design_logic/design_node.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/generation/generators/plugins/pb_plugin_node.dart'; @@ -84,24 +85,26 @@ class PBAppBarGenerator extends PBGenerator { PBAppBarGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { + generatorContext.sizingContext = SizingValueContext.PointValue; if (source is InjectedNavbar) { var buffer = StringBuffer(); buffer.write('AppBar('); if (source.leadingItem != null) { buffer.write( - 'leading: ${manager.generate(source.leadingItem, type: source.builder_type ?? BUILDER_TYPE.BODY)},'); + 'leading: ${source.leadingItem.generator.generate(source.leadingItem, generatorContext)},'); } if (source.middleItem != null) { buffer.write( - 'title: ${manager.generate(source.middleItem, type: source.builder_type ?? BUILDER_TYPE.SCAFFOLD_BODY)},'); + 'title: ${source.middleItem.generator.generate(source.middleItem, generatorContext)},'); } if (source.trailingItem != null) { var trailingItem = ''; trailingItem = - '${manager.generate(source.trailingItem, type: source.builder_type ?? BUILDER_TYPE.SCAFFOLD_BODY)}'; + '${source.trailingItem.generator.generate(source.trailingItem, generatorContext)}'; buffer.write('actions: [$trailingItem],'); } diff --git a/lib/eggs/injected_back_arrow.dart b/lib/eggs/injected_back_arrow.dart index f2dda16f..e8f26f1e 100644 --- a/lib/eggs/injected_back_arrow.dart +++ b/lib/eggs/injected_back_arrow.dart @@ -1,4 +1,5 @@ import 'package:parabeac_core/design_logic/design_node.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/generation/generators/plugins/pb_plugin_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_injected_intermediate.dart'; @@ -45,7 +46,8 @@ class PBBackArrowGenerator extends PBGenerator { PBBackArrowGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is InjectedBackArrow) { return 'BackButton()'; } diff --git a/lib/eggs/injected_tab.dart b/lib/eggs/injected_tab.dart index 321ea2cf..e10c3dad 100644 --- a/lib/eggs/injected_tab.dart +++ b/lib/eggs/injected_tab.dart @@ -1,4 +1,5 @@ import 'package:parabeac_core/design_logic/design_node.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; @@ -13,8 +14,6 @@ import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; import 'package:uuid/uuid.dart'; class Tab extends PBEgg implements PBInjectedIntermediate { - PBContext currentContext; - PrototypeNode prototypeNode; Tab( @@ -22,7 +21,7 @@ class Tab extends PBEgg implements PBInjectedIntermediate { Point bottomRightCorner, String name, { UUID, - this.currentContext, + PBContext currentContext, this.prototypeNode, }) : super(topLeftCorner, bottomRightCorner, currentContext, name, UUID: UUID) { @@ -96,16 +95,18 @@ class PBTabGenerator extends PBGenerator { PBTabGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is Tab) { - if (source.child != null) {} var buffer = StringBuffer(); buffer.write('BottomNavigationBarItem('); buffer.write(source.child != null - ? 'icon: ${manager.generate(source.child, type: BUILDER_TYPE.BODY)}' + ? 'icon: ${source.child.generator.generate(source.child, generatorContext)}' : ''); buffer.write(')'); return buffer.toString(); + } else { + return ''; } } } diff --git a/lib/eggs/injected_tab_bar.dart b/lib/eggs/injected_tab_bar.dart index c1814b8d..b9cd1633 100644 --- a/lib/eggs/injected_tab_bar.dart +++ b/lib/eggs/injected_tab_bar.dart @@ -1,5 +1,6 @@ import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/design_logic/design_node.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/generation/generators/plugins/pb_plugin_node.dart'; @@ -68,7 +69,9 @@ class PBTabBarGenerator extends PBGenerator { PBTabBarGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { + generatorContext.sizingContext = SizingValueContext.PointValue; if (source is InjectedTabBar) { var buffer = StringBuffer(); buffer.write('BottomNavigationBar('); @@ -77,8 +80,8 @@ class PBTabBarGenerator extends PBGenerator { buffer.write('items:['); for (var i = 0; i < source.tabs.length; i++) { buffer.write('BottomNavigationBarItem('); - var res = - manager.generate(source.tabs[i].child, type: BUILDER_TYPE.BODY); + var res = source.tabs[i].child.generator + .generate(source.tabs[i].child, generatorContext); buffer.write('icon: $res,'); buffer.write('title: Text(""),'); buffer.write('),'); diff --git a/lib/generation/flutter_project_builder/flutter_project_builder.dart b/lib/generation/flutter_project_builder/flutter_project_builder.dart index 6eb8e489..8ac4b23a 100644 --- a/lib/generation/flutter_project_builder/flutter_project_builder.dart +++ b/lib/generation/flutter_project_builder/flutter_project_builder.dart @@ -1,16 +1,15 @@ import 'dart:convert'; import 'dart:io'; - import 'package:archive/archive.dart'; -import 'package:recase/recase.dart'; import 'package:parabeac_core/controllers/main_info.dart'; -import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; -import 'package:parabeac_core/generation/generators/pb_flutter_writer.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/inherited_scaffold.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_gen_cache.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/bloc_generation_configuration.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/provider_generation_configuration.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/stateful_generation_configuration.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_state_management_linker.dart'; import 'package:quick_log/quick_log.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; import 'package:parabeac_core/input/figma/helper/image_helper.dart' as image_helper; @@ -20,27 +19,40 @@ String pathToFlutterProject = '${MainInfo().outputPath}/temp/'; class FlutterProjectBuilder { String projectName; - String pathToIntermiateFile; - PBIntermediateTree mainTree; + PBProject mainTree; var log = Logger('Project Builder'); - ///For right now we are placing all [PBSharedMasterNode]s in a single page - final bool _symbolsSinglePage = true; - final String SYMBOL_DIR_NAME = 'symbols'; - FlutterProjectBuilder( - {this.projectName, this.pathToIntermiateFile, this.mainTree}) { + ///The [GenerationConfiguration] that is going to be use in the generation of the code + /// + ///This is going to be defaulted to [GenerationConfiguration] if nothing else is specified. + GenerationConfiguration generationConfiguration; + + Map configurations = { + 'provider': ProviderGenerationConfiguration(), + 'bloc': BLoCGenerationConfiguration(), + 'none': StatefulGenerationConfiguration(), + }; + + final DEFAULT_CONFIGURATION = StatefulGenerationConfiguration(); + + PBPageWriter pageWriter; + + FlutterProjectBuilder({this.projectName, this.mainTree, this.pageWriter}) { pathToFlutterProject = '${projectName}/'; - if (pathToIntermiateFile == null) { - log.info( - 'Flutter Project Builder must have a JSON file in intermediate format passed to `pathToIntermediateFile`'); - return; - } + generationConfiguration = configurations[MainInfo() + .configurations['state-management'] + .toString() + .toLowerCase()] ?? + DEFAULT_CONFIGURATION; + generationConfiguration.pageWriter = pageWriter; + mainTree.projectName = projectName; + mainTree.projectAbsPath = pathToFlutterProject; } - void convertToFlutterProject({List rawImages}) async { + Future convertToFlutterProject({List rawImages}) async { try { var createResult = Process.runSync('flutter', ['create', '$projectName'], workingDirectory: MainInfo().outputPath); @@ -56,6 +68,7 @@ class FlutterProjectBuilder { ); log.error(error.toString()); } + // Add Pubspec Assets Lines. var list = File('${pathToFlutterProject}pubspec.yaml').readAsLinesSync(); list.replaceRange(42, 44, [' assets:', ' - assets/images/']); @@ -102,11 +115,27 @@ class FlutterProjectBuilder { } } - ///First traversal here (Add imports) - await _traverseTree(true); - - ///Second traversal here (Find imports) - await _traverseTree(false); + // generate shared Styles if any found + if (mainTree.sharedStyles != null && mainTree.sharedStyles.isNotEmpty) { + await Directory('${pathToFlutterProject}lib/document/') + .create(recursive: true) + .then((value) { + var s = File('${pathToFlutterProject}lib/document/shared_props.g.dart') + .openWrite(mode: FileMode.write, encoding: utf8); + s.write('''import 'dart:ui'; + import 'package:flutter/material.dart'; + + '''); + for (var sharedStyle in mainTree.sharedStyles) { + s.write(sharedStyle.generate() + '\n'); + } + s.close(); + }).catchError((e) { + log.error(e.toString()); + }); + } + await Future.wait(PBStateManagementLinker().stateQueue, eagerError: true); + await generationConfiguration.generateProject(mainTree); var l = File('${pathToFlutterProject}lib/main.dart').readAsLinesSync(); var s = File('${pathToFlutterProject}lib/main.dart') @@ -144,97 +173,4 @@ class FlutterProjectBuilder { .stdout, ); } - - /// Method that traverses the tree to add imports on the first traversal, - /// and retrieve imports and write the file the second time - void _traverseTree(bool isFirstTraversal) async { - var pageWriter = PBFlutterWriter(); - - for (var directory in mainTree.groups) { - var directoryName = directory.name.snakeCase; - var flutterGenerator; - var importSet = []; - var bodyBuffer, constructorBuffer; - var isSymbolsDir = - directory.name == SYMBOL_DIR_NAME && _symbolsSinglePage; - - if (!isFirstTraversal) { - await Directory('${projectName}/lib/screens/${directoryName}') - .create(recursive: true); - } - - // Create single FlutterGenerator for all symbols - if (isSymbolsDir) { - flutterGenerator = PBFlutterGenerator(pageWriter); - bodyBuffer = StringBuffer(); - } - - for (var intermediateItem in directory.items) { - var fileName = intermediateItem.node.name ?? 'defaultName'; - - var name = isSymbolsDir ? SYMBOL_DIR_NAME : fileName; - var symbolFilePath = - '${projectName}/lib/screens/${directoryName}/${name.snakeCase}.dart'; - var fileNamePath = - '${projectName}/lib/screens/${directoryName}/${fileName.snakeCase}.dart'; - // TODO: Need FlutterGenerator for each page because otherwise - // we'd add all imports to every single dart page. Discuss alternatives - if (!isSymbolsDir) { - flutterGenerator = PBFlutterGenerator(pageWriter); - } - - // Add to cache if node is scaffold or symbol master - if (intermediateItem.node is InheritedScaffold && isFirstTraversal) { - PBGenCache().addToCache(intermediateItem.node.UUID, symbolFilePath); - } else if (intermediateItem.node is PBSharedMasterNode && - isFirstTraversal) { - PBGenCache().addToCache( - (intermediateItem.node as PBSharedMasterNode).SYMBOL_ID, - symbolFilePath); - } - - // Check if there are any imports needed for this screen - if (!isFirstTraversal) { - isSymbolsDir - ? importSet.addAll(ImportHelper.findImports( - intermediateItem.node, symbolFilePath)) - : flutterGenerator.imports.addAll(ImportHelper.findImports( - intermediateItem.node, fileNamePath)); - - // Check if [InheritedScaffold] is the homescreen - if (intermediateItem.node is InheritedScaffold && - (intermediateItem.node as InheritedScaffold).isHomeScreen) { - var relPath = PBGenCache().getRelativePath( - '${projectName}/lib/main.dart', intermediateItem.node.UUID); - await pageWriter.writeMainScreenWithHome(intermediateItem.node.name, - '${projectName}/lib/main.dart', relPath); - } - - var page = flutterGenerator.generate(intermediateItem.node); - - // If writing symbols, write to buffer, otherwise write a file - isSymbolsDir - ? bodyBuffer.write(page) - : pageWriter.write(page, fileNamePath); - } - } - if (!isFirstTraversal) { - if (isSymbolsDir) { - var symbolPath = - '${projectName}/lib/screens/${directoryName}/symbols.dart'; - importSet.add(flutterGenerator.generateImports()); - - var importBuffer = StringBuffer(); - importSet.toSet().toList().forEach(importBuffer.write); - - pageWriter.write( - (importBuffer?.toString() ?? '') + - (constructorBuffer?.toString() ?? '') + - bodyBuffer.toString(), - symbolPath); - } - pageWriter.submitDependencies(projectName + '/pubspec.yaml'); - } - } - } } diff --git a/lib/generation/flutter_project_builder/fluttter_page_builder.dart b/lib/generation/flutter_project_builder/fluttter_page_builder.dart deleted file mode 100644 index 83443421..00000000 --- a/lib/generation/flutter_project_builder/fluttter_page_builder.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; - -class FlutterPageBuilder { - String pathToFlutterProject; - String pathToIntermiateFile; - String _kPathToLib; - - FlutterPageBuilder({this.pathToFlutterProject, this.pathToIntermiateFile}) { - _kPathToLib = '${pathToFlutterProject}lib'; - } - - void generatePage() async { - var intermediate = - jsonDecode(File(pathToIntermiateFile).readAsStringSync()); - var intermediateGroups = intermediate['pages']; - - // Generate Groups - for (var i = 0; i < intermediateGroups.length; i++) { - var pageName = - intermediateGroups[i]['name'].toLowerCase().replaceAll(' ', '_'); - - await Directory('${pathToFlutterProject}lib/screens/${pageName}') - .create(recursive: true); - - for (var j = 0; j < intermediateGroups[i]['screens'].length; j++) { - _generateScreen(pageName, intermediateGroups[i]['screens'][j], j); - } - for (var j = 0; j < intermediateGroups[i]['shared'].length; j++) { - _generateItem( - pageName, intermediateGroups[i]['shared'][j], j, 'shared'); - } - for (var j = 0; j < intermediateGroups[i]['misc'].length; j++) { - _generateItem(pageName, intermediateGroups[i]['misc'][j], j, 'misc'); - } - } - } - - void _generateScreen(String groupName, Map item, int iteratorValue) { - var screenName = item['name'] ?? 'some_screen$iteratorValue'; - - var output = File( - '$_kPathToLib/screens/$groupName/${screenName.toString().replaceAll(" ", "_").toLowerCase()}.f.json'); - output.createSync(); - output.writeAsStringSync(jsonEncode(item)); - } - - void _generateItem( - String groupName, Map item, int iteratorValue, String type) { - var sharedFileName = - '${groupName}_${type.toLowerCase()}' ?? 'group_${type.toLowerCase()}'; - var path = - '$_kPathToLib/screens/$groupName/${sharedFileName.toString().replaceAll(" ", "_").toLowerCase()}.f.json'; - var alreadyExists = FileSystemEntity.isFileSync(path); - var output = File(path); - - String str; - if (alreadyExists) { - str = output.readAsStringSync(); - var json = jsonDecode(str); - (json['items'] as List).add(jsonEncode(item).toString()); - } else { - var map = {}; - map['items'] = []; - map['type'] = type; - str = jsonEncode(map); - } - var json = jsonDecode(str); - var listCopy = []; - listCopy.addAll(json['items']); - listCopy.add(item); - json['items'] = listCopy; - - output.writeAsStringSync(jsonEncode(json)); - } -} diff --git a/lib/generation/generators/attribute-helper/pb_attribute_gen_helper.dart b/lib/generation/generators/attribute-helper/pb_attribute_gen_helper.dart index e0d859a9..1c1afeaa 100644 --- a/lib/generation/generators/attribute-helper/pb_attribute_gen_helper.dart +++ b/lib/generation/generators/attribute-helper/pb_attribute_gen_helper.dart @@ -1,3 +1,4 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; @@ -5,5 +6,5 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_inte abstract class PBAttributesHelper extends PBGenerator { PBAttributesHelper() : super(); @override - String generate(PBIntermediateNode source); + String generate(PBIntermediateNode source, GeneratorContext generatorContext); } 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 39ad351e..aca43a24 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,19 +1,21 @@ 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/generation/generators/attribute-helper/pb_generator_context.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'; class PBBoxDecorationHelper extends PBAttributesHelper { PBBoxDecorationHelper() : super(); - @override - String generate(PBIntermediateNode source) { + @override + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is InheritedContainer) { final buffer = StringBuffer(); buffer.write('decoration: BoxDecoration('); - var borderInfo = source.borderInfo; - if (source.color != null) { - buffer.write(PBColorGenHelper().generate(source)); + var borderInfo = source.auxiliaryData.borderInfo; + if (source.auxiliaryData.color != null) { + buffer.write(PBColorGenHelper().generate(source, generatorContext)); } if (borderInfo != null) { if (borderInfo['shape'] == 'circle') { @@ -21,15 +23,14 @@ class PBBoxDecorationHelper extends PBAttributesHelper { } else if (borderInfo['borderRadius'] != null) { buffer.write( 'borderRadius: BorderRadius.all(Radius.circular(${borderInfo['borderRadius']})),'); - if ((borderInfo['borderColorHex'] != null) || (borderInfo['borderThickness'] != null)) { + if ((borderInfo['borderColorHex'] != null) || + (borderInfo['borderThickness'] != null)) { buffer.write('border: Border.all('); if (borderInfo['borderColorHex'] != null) { - buffer.write( - 'color: Color(${borderInfo['borderColorHex']}),'); + buffer.write('color: Color(${borderInfo['borderColorHex']}),'); } if (borderInfo['borderThickness'] != null) { - buffer.write( - 'width: ${borderInfo['borderThickness']},'); + buffer.write('width: ${borderInfo['borderThickness']},'); } buffer.write('),'); // end of Border.all( } 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 8a135154..e0a65d45 100644 --- a/lib/generation/generators/attribute-helper/pb_color_gen_helper.dart +++ b/lib/generation/generators/attribute-helper/pb_color_gen_helper.dart @@ -1,4 +1,5 @@ import 'package:parabeac_core/generation/generators/attribute-helper/pb_attribute_gen_helper.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; 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'; @@ -7,32 +8,32 @@ class PBColorGenHelper extends PBAttributesHelper { PBColorGenHelper() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { var statement = ''; if (source == null) { return statement; } if (source is InheritedScaffold) { - var scaffold = source as InheritedScaffold; - if (scaffold.color == null && scaffold.backgroundColor == null) { + var scaffold = source; + if (scaffold.auxiliaryData.color == null) { statement = ''; } else { - statement = findDefaultColor(scaffold.backgroundColor) != null - ? 'backgroundColor: ${findDefaultColor(scaffold.backgroundColor)},' - : 'backgroundColor: Color(${scaffold.backgroundColor}),\n'; + statement = findDefaultColor(scaffold.auxiliaryData.color) != null + ? 'backgroundColor: ${findDefaultColor(scaffold.auxiliaryData.color)},' + : 'backgroundColor: Color(${scaffold.auxiliaryData.color}),\n'; } - } - if (source.color == null) { + } else if (source.auxiliaryData.color == null) { statement = ''; } else { if (source is! InheritedContainer) { - statement = findDefaultColor(source.color) != null - ? 'color: ${findDefaultColor(source.color)},' - : 'color: Color(${source.color}),\n'; + statement = findDefaultColor(source.auxiliaryData.color) != null + ? 'color: ${findDefaultColor(source.auxiliaryData.color)},' + : 'color: Color(${source.auxiliaryData.color}),\n'; } else if ((source as InheritedContainer).isBackgroundVisible) { - statement = findDefaultColor(source.color) != null - ? 'color: ${findDefaultColor(source.color)},' - : 'color: Color(${source.color}),\n'; + statement = findDefaultColor(source.auxiliaryData.color) != null + ? 'color: ${findDefaultColor(source.auxiliaryData.color)},' + : 'color: Color(${source.auxiliaryData.color}),\n'; } else { statement = ''; } diff --git a/lib/generation/generators/attribute-helper/pb_generator_context.dart b/lib/generation/generators/attribute-helper/pb_generator_context.dart new file mode 100644 index 00000000..82a6ca23 --- /dev/null +++ b/lib/generation/generators/attribute-helper/pb_generator_context.dart @@ -0,0 +1,7 @@ +/// This class is responsible for sharing contextual data needed throughout the generation process. Generators will pass this information to it's children. +class GeneratorContext { + GeneratorContext({this.sizingContext}); + SizingValueContext sizingContext = SizingValueContext.PointValue; +} + +enum SizingValueContext { PointValue, MediaQueryValue, LayoutBuilderValue } diff --git a/lib/generation/generators/attribute-helper/pb_size_helper.dart b/lib/generation/generators/attribute-helper/pb_size_helper.dart index cf5034c8..9282dc53 100644 --- a/lib/generation/generators/attribute-helper/pb_size_helper.dart +++ b/lib/generation/generators/attribute-helper/pb_size_helper.dart @@ -1,73 +1,62 @@ import 'package:parabeac_core/generation/generators/attribute-helper/pb_attribute_gen_helper.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/inherited_scaffold.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 '../pb_flutter_generator.dart'; - class PBSizeHelper extends PBAttributesHelper { PBSizeHelper() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { + if (source.currentContext == null) { + print('Tried generating a size but couldn\'t retrieve [currentContext]'); + return ''; + } + final buffer = StringBuffer(); - Map body = source.size ?? {}; + var body = source.size ?? {}; double height = body['height']; double width = body['width']; //Add relative sizing if the widget has context - if (source.builder_type != null && - source.builder_type == BUILDER_TYPE.SCAFFOLD_BODY) { - var screenWidth; - var screenHeight; - if (source.currentContext?.screenTopLeftCorner?.y != null && - source.currentContext?.screenBottomRightCorner?.y != null) { - screenHeight = - ((source.currentContext.screenTopLeftCorner.y as double) - - (source.currentContext.screenBottomRightCorner.y as double)) - .abs(); - } - if (source.currentContext?.screenTopLeftCorner?.x != null && - source.currentContext?.screenBottomRightCorner?.x != null) { - screenWidth = ((source.currentContext?.screenTopLeftCorner?.x - as double) - - (source.currentContext?.screenBottomRightCorner?.x as double)) - .abs(); - } + var screenWidth = ((source.currentContext.screenTopLeftCorner.x) - + (source.currentContext.screenBottomRightCorner.x)) + .abs(); + var screenHeight = ((source.currentContext.screenTopLeftCorner.y) - + (source.currentContext.screenBottomRightCorner.y)) + .abs(); - height = (height != null && screenHeight != null && screenHeight > 0.0) - ? height / screenHeight - : height; - width = (width != null && screenWidth != null && screenWidth > 0.0) - ? width / screenWidth - : width; + height = (height != null && screenHeight != null && screenHeight > 0.0) + ? height / screenHeight + : height; + width = (width != null && screenWidth != null && screenWidth > 0.0) + ? width / screenWidth + : width; - if (width != null) { - if (source.topLeftCorner.x != null && - source.bottomRightCorner.x != null && - screenWidth != null) { - buffer.write( - 'width : MediaQuery.of(context).size.width * ${width.toStringAsFixed(3)},'); - } else { - buffer.write('width :${width.toStringAsFixed(2)},'); - } - } - if (height != null) { - if (source.topLeftCorner.y != null && - source.bottomRightCorner.y != null && - screenHeight != null) { - buffer.write( - ' height : MediaQuery.of(context).size.height * ${height.toStringAsFixed(3)},'); - } else { - buffer.write('height : ${height.toStringAsFixed(2)},'); - } - } + if (generatorContext.sizingContext == SizingValueContext.MediaQueryValue) { + buffer.write( + 'width: MediaQuery.of(context).size.width * ${width.toStringAsFixed(3)},'); + buffer.write( + 'height: MediaQuery.of(context).size.height * ${height.toStringAsFixed(3)},'); + } else if (generatorContext.sizingContext == + SizingValueContext.LayoutBuilderValue) { + buffer + .write('width: constraints.maxWidth * ${width.toStringAsFixed(3)},'); + buffer.write( + 'height: constraints.maxHeight * ${height.toStringAsFixed(3)},'); } else { + height = body['height']; + width = body['width']; if (width != null) { - buffer.write('width :${width.toStringAsFixed(2)},'); + buffer.write('width: ${width.toStringAsFixed(3)},'); } if (height != null) { - buffer.write('height : ${height.toStringAsFixed(2)},'); + buffer.write('height: ${height.toStringAsFixed(3)},'); } } + return buffer.toString(); } } diff --git a/lib/generation/generators/helpers/pb_gen_helper.dart b/lib/generation/generators/helpers/pb_gen_helper.dart index 463ef27f..084afdca 100644 --- a/lib/generation/generators/helpers/pb_gen_helper.dart +++ b/lib/generation/generators/helpers/pb_gen_helper.dart @@ -1,7 +1,8 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; abstract class PBGenHelper { - String generate(PBIntermediateNode source); + String generate(PBIntermediateNode source, GeneratorContext context); bool containsIntermediateNode(PBIntermediateNode node); void registerIntemediateNode(PBIntermediateNode generator); } diff --git a/lib/generation/generators/helpers/pb_layout_helper.dart b/lib/generation/generators/helpers/pb_layout_helper.dart index b960dae3..2cb4fc9a 100644 --- a/lib/generation/generators/helpers/pb_layout_helper.dart +++ b/lib/generation/generators/helpers/pb_layout_helper.dart @@ -1,3 +1,4 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/helpers/pb_gen_helper.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'; @@ -6,7 +7,8 @@ class PBLayoutManager implements PBGenHelper { final List _registeredGenLayouts = []; @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source == null) { throw NullThrownError(); } @@ -15,7 +17,7 @@ class PBLayoutManager implements PBGenHelper { var body = _registeredGenLayouts .firstWhere((layout) => layout.runtimeType == source.runtimeType) .generator - .generate(source); + .generate(source, generatorContext); buffer.write(body); return buffer.toString(); @@ -24,8 +26,9 @@ class PBLayoutManager implements PBGenHelper { } @override - bool containsIntermediateNode(PBIntermediateNode node) => _registeredGenLayouts - .any((layout) => layout.runtimeType == node.runtimeType); + bool containsIntermediateNode(PBIntermediateNode node) => + _registeredGenLayouts + .any((layout) => layout.runtimeType == node.runtimeType); @override void registerIntemediateNode(PBIntermediateNode generator) { diff --git a/lib/generation/generators/helpers/pb_visual_gen_helper.dart b/lib/generation/generators/helpers/pb_visual_gen_helper.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/generation/generators/layouts/pb_column_gen.dart b/lib/generation/generators/layouts/pb_column_gen.dart index 37d8991b..71cbbae3 100644 --- a/lib/generation/generators/layouts/pb_column_gen.dart +++ b/lib/generation/generators/layouts/pb_column_gen.dart @@ -1,3 +1,4 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/layouts/pb_layout_gen.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/column.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; @@ -8,7 +9,8 @@ class PBColumnGenerator extends PBLayoutGenerator { PBColumnGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is PBIntermediateColumnLayout) { var buffer = StringBuffer(); buffer.write('Column('); @@ -24,8 +26,8 @@ class PBColumnGenerator extends PBLayoutGenerator { } buffer.write('\nchildren: ['); for (var index = 0; index < source.children.length; index++) { - var element = manager.generate(source.children[index], - type: source.builder_type ?? BUILDER_TYPE.BODY); + var element = source.children[index].generator + .generate(source.children[index], generatorContext); buffer.write(element); var endingChar = element != null && element.isEmpty ? '' : ','; buffer.write(endingChar); diff --git a/lib/generation/generators/layouts/pb_layout_gen.dart b/lib/generation/generators/layouts/pb_layout_gen.dart index dd7b1393..4979c244 100644 --- a/lib/generation/generators/layouts/pb_layout_gen.dart +++ b/lib/generation/generators/layouts/pb_layout_gen.dart @@ -1,3 +1,4 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; @@ -5,7 +6,7 @@ abstract class PBLayoutGenerator extends PBGenerator { PBLayoutGenerator() : super(); @override - String generate(PBIntermediateNode source); + String generate(PBIntermediateNode source, GeneratorContext generatorContext); String generateBodyBoilerplate(String body, {String layoutName = 'Column', String crossAxisAlignment = ''}) { diff --git a/lib/generation/generators/layouts/pb_row_gen.dart b/lib/generation/generators/layouts/pb_row_gen.dart index ddd87e35..9a0653cc 100644 --- a/lib/generation/generators/layouts/pb_row_gen.dart +++ b/lib/generation/generators/layouts/pb_row_gen.dart @@ -1,22 +1,21 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/layouts/pb_layout_gen.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/row.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; -import '../pb_flutter_generator.dart'; - class PBRowGenerator extends PBLayoutGenerator { PBRowGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is PBIntermediateRowLayout) { var buffer = StringBuffer(); var counter = 0; List children = source.children; - for (PBIntermediateNode child in children) { - buffer.write(manager.generate(child, - type: source.builder_type ?? BUILDER_TYPE.BODY)); + for (var child in children) { + buffer.write(child.generator.generate(child, generatorContext)); var trailing_comma = (counter + 1) == children.length ? '' : ','; buffer.write(trailing_comma); counter++; diff --git a/lib/generation/generators/layouts/pb_scaffold_gen.dart b/lib/generation/generators/layouts/pb_scaffold_gen.dart index 871594b1..9fc3d082 100644 --- a/lib/generation/generators/layouts/pb_scaffold_gen.dart +++ b/lib/generation/generators/layouts/pb_scaffold_gen.dart @@ -1,32 +1,40 @@ import 'package:parabeac_core/generation/generators/attribute-helper/pb_color_gen_helper.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/stateful_template_strategy.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 '../pb_flutter_generator.dart'; - class PBScaffoldGenerator extends PBGenerator { - PBScaffoldGenerator() : super(); + PBScaffoldGenerator() : super(strategy: StatefulTemplateStrategy()); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { + generatorContext.sizingContext = SizingValueContext.MediaQueryValue; if (source is InheritedScaffold) { var buffer = StringBuffer(); buffer.write('Scaffold(\n'); - if (source.backgroundColor != null) { - var str = PBColorGenHelper().generate(source); + + if (source.auxiliaryData.color != null) { + var str = PBColorGenHelper().generate(source, generatorContext); buffer.write(str); } if (source.navbar != null) { buffer.write('appBar: '); - var appbar = - manager.generate(source.navbar, type: BUILDER_TYPE.SCAFFOLD_BODY); + var newGeneratorContext = + GeneratorContext(sizingContext: SizingValueContext.PointValue); + var appbar = source.navbar.generator + .generate(source.navbar, newGeneratorContext); + buffer.write('$appbar,\n'); } if (source.tabbar != null) { buffer.write('bottomNavigationBar: '); - var navigationBar = - manager.generate(source.tabbar, type: BUILDER_TYPE.SCAFFOLD_BODY); + var newGeneratorContext = + GeneratorContext(sizingContext: SizingValueContext.PointValue); + var navigationBar = source.tabbar.generator + .generate(source.tabbar, newGeneratorContext); buffer.write('$navigationBar, \n'); } @@ -34,11 +42,13 @@ class PBScaffoldGenerator extends PBGenerator { // hack to pass screen width and height to the child buffer.write('body: '); var body = - manager.generate(source.child, type: BUILDER_TYPE.SCAFFOLD_BODY); + source.child.generator.generate(source.child, generatorContext); buffer.write('$body, \n'); } buffer.write(')'); return buffer.toString(); + } else { + return ''; } } } diff --git a/lib/generation/generators/layouts/pb_stack_gen.dart b/lib/generation/generators/layouts/pb_stack_gen.dart index e63c086d..0d6e4cd4 100644 --- a/lib/generation/generators/layouts/pb_stack_gen.dart +++ b/lib/generation/generators/layouts/pb_stack_gen.dart @@ -1,22 +1,22 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/stack.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; -import '../pb_flutter_generator.dart'; - class PBStackGenerator extends PBGenerator { PBStackGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is PBIntermediateStackLayout) { var buffer = StringBuffer(); buffer.write('Stack('); if (source.children.isNotEmpty) { buffer.write('\nchildren: ['); for (var index = 0; index < source.children.length; index++) { - var element = manager.generate(source.children[index], - type: source.builder_type ?? BUILDER_TYPE.BODY); + var element = source.children[index].generator + .generate(source.children[index], generatorContext); buffer.write(element); var endingChar = element != null && element.isEmpty ? '' : ','; buffer.write(endingChar); diff --git a/lib/generation/generators/layouts/pb_v_scrollview_gen.dart b/lib/generation/generators/layouts/pb_v_scrollview_gen.dart deleted file mode 100644 index acc4398a..00000000 --- a/lib/generation/generators/layouts/pb_v_scrollview_gen.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:parabeac_core/generation/generators/layouts/pb_layout_gen.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; - -class PBVerticalScrollViewGen extends PBLayoutGenerator { - PBVerticalScrollViewGen() : super(); -// PBIntermediateColumnLayout - @override - String generate(PBIntermediateNode source) { - return ''; - } -} diff --git a/lib/generation/generators/middleware/middleware.dart b/lib/generation/generators/middleware/middleware.dart new file mode 100644 index 00000000..9dc723d3 --- /dev/null +++ b/lib/generation/generators/middleware/middleware.dart @@ -0,0 +1,23 @@ +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; +import 'package:recase/recase.dart'; + +abstract class Middleware { + PBGenerationManager generationManager; + + Middleware(this.generationManager); + + String getNameOfNode(PBIntermediateNode node) { + var name = node.name; + return getName(name); + } + + String getName(String name) { + var index = name.indexOf('/'); + // Remove everything after the /. So if the name is SignUpButton/Default, we end up with SignUpButton as the name we produce. + return name.replaceRange(index, name.length, '').pascalCase; + } + + Future applyMiddleware(PBIntermediateNode node) => + Future.value(node); +} diff --git a/lib/generation/generators/middleware/state_management/bloc_middleware.dart b/lib/generation/generators/middleware/state_management/bloc_middleware.dart new file mode 100644 index 00000000..380baa71 --- /dev/null +++ b/lib/generation/generators/middleware/state_management/bloc_middleware.dart @@ -0,0 +1,123 @@ +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generator_adapter.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/bloc_state_template_strategy.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; +import 'package:recase/recase.dart'; +import '../../pb_generation_manager.dart'; +import '../middleware.dart'; + +class BLoCMiddleware extends Middleware { + final PACKAGE_NAME = 'flutter_bloc'; + final PACKAGE_VERSION = '^6.1.1'; + + BLoCMiddleware(PBGenerationManager generationManager) + : super(generationManager); + + @override + Future applyMiddleware(PBIntermediateNode node) async { + var managerData = node.managerData; + node.currentContext.project.genProjectData + .addDependencies(PACKAGE_NAME, PACKAGE_VERSION); + managerData.addImport('package:flutter_bloc/flutter_bloc.dart'); + var fileStrategy = node.currentContext.project.fileStructureStrategy + as FlutterFileStructureStrategy; + + /// Incase of SymbolInstance + if (node is PBSharedInstanceIntermediateNode) { + var genericName = node.functionCallName + .substring(0, node.functionCallName.lastIndexOf('/')); + var variableName = node.functionCallName.snakeCase; + var generalName = genericName.snakeCase; + var parentDirectory = generalName + '_bloc'; + + await managerData.replaceImport( + variableName, '${parentDirectory}/${generalName}_bloc.dart'); + node.generator = StringGeneratorAdapter(''' + BlocBuilder<${genericName.pascalCase}Bloc, ${genericName.pascalCase}State>( + builder: (context, state) => state.widget + ) + '''); + return node; + } + var parentState = getNameOfNode(node); + var generalName = parentState.snakeCase; + var parentDirectory = generalName + '_bloc'; + var states = [node]; + + var stateBuffer = StringBuffer(); + + await node?.auxiliaryData?.stateGraph?.states?.forEach((state) { + states.add(state.variation.node); + }); + + var isFirst = true; + await states.forEach((element) { + element.generator.templateStrategy = BLoCStateTemplateStrategy( + isFirst: isFirst, + abstractClassName: parentState, + ); + stateBuffer.write(generationManager.generate(element)); + isFirst = false; + }); + + /// Creates state page + await fileStrategy.generatePage( + stateBuffer.toString(), + '${parentDirectory}/${generalName}_state', + args: 'VIEW', + ); + + /// Creates event page + await fileStrategy.generatePage( + _createEventPage(parentState), + '${parentDirectory}/${generalName}_event', + args: 'VIEW', + ); + + /// Creates bloc page + await fileStrategy.generatePage( + _createBlocPage(parentState, node.name), + '${parentDirectory}/${generalName}_bloc', + args: 'VIEW', + ); + + return node; + } + + String _createBlocPage(String name, String initialStateName) { + var pascalName = name.pascalCase; + var snakeName = name.snakeCase; + return ''' + import 'dart:async'; + + import 'package:flutter_bloc/flutter_bloc.dart'; + import 'package:meta/meta.dart'; + import 'package:flutter/material.dart'; + + part '${snakeName}_event.dart'; + part '${snakeName}_state.dart'; + + class ${pascalName}Bloc extends Bloc<${pascalName}Event, ${pascalName}State> { + ${pascalName}Bloc() : super(${initialStateName.pascalCase}State()); + + @override + Stream<${pascalName}State> mapEventToState( + ${pascalName}Event event, + ) async* { + // TODO: implement mapEventToState + } + } + '''; + } + + String _createEventPage(String name) { + var pascalName = name.pascalCase; + return ''' + part of '${name.snakeCase}_bloc.dart'; + + @immutable + abstract class ${pascalName}Event {} + '''; + } +} diff --git a/lib/generation/generators/middleware/state_management/provider_middleware.dart b/lib/generation/generators/middleware/state_management/provider_middleware.dart new file mode 100644 index 00000000..e09a7f29 --- /dev/null +++ b/lib/generation/generators/middleware/state_management/provider_middleware.dart @@ -0,0 +1,68 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/middleware/middleware.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/pb_variable.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/provider_file_structure_strategy.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; +import 'package:recase/recase.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generator_adapter.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; + +class ProviderMiddleware extends Middleware { + final PACKAGE_NAME = 'provider'; + final PACKAGE_VERSION = '^4.3.2+3'; + + ProviderMiddleware(PBGenerationManager generationManager) + : super(generationManager); + + @override + Future applyMiddleware(PBIntermediateNode node) async { + String watcherName; + var managerData = node.managerData; + var fileStrategy = node.currentContext.project.fileStructureStrategy + as ProviderFileStructureStrategy; + + if (node is PBSharedInstanceIntermediateNode) { + node.currentContext.project.genProjectData + .addDependencies(PACKAGE_NAME, PACKAGE_VERSION); + managerData.addImport('package:provider/provider.dart'); + watcherName = node.functionCallName.snakeCase; + var watcher = PBVariable(watcherName, 'final ', true, 'watch(context)'); + managerData.addMethodVariable(watcher); + node.generator = StringGeneratorAdapter(watcherName); + return node; + } + watcherName = getNameOfNode(node); + + // Iterating through states + var stateBuffer = StringBuffer(); + stateBuffer.write(_generateProviderVariable(node)); + node.auxiliaryData.stateGraph.states.forEach((state) async { + var variationNode = state.variation.node; + + stateBuffer.write(_generateProviderVariable(variationNode)); + }); + + var code = _generateProviderClass( + stateBuffer.toString(), watcherName, generationManager); + fileStrategy.writeProviderModelFile(code, node.name.snakeCase); + } + + String _generateProviderClass( + String states, String defaultStateName, PBGenerationManager manager) { + return ''' + import 'package:provider/provider.dart'; + import 'package:flutter/material.dart'; + class ${defaultStateName} extends ChangeNotifierProvider { + ${states} + } + '''; + } + + String _generateProviderVariable(PBIntermediateNode node) { + return 'var ${node.name.camelCase} = ' + + node?.generator?.generate(node ?? '', + GeneratorContext(sizingContext: SizingValueContext.PointValue)) + + ';'; + } +} diff --git a/lib/generation/generators/middleware/state_management/stateful_middleware.dart b/lib/generation/generators/middleware/state_management/stateful_middleware.dart new file mode 100644 index 00000000..b56ce534 --- /dev/null +++ b/lib/generation/generators/middleware/state_management/stateful_middleware.dart @@ -0,0 +1,77 @@ +import 'package:parabeac_core/generation/generators/middleware/middleware.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generator_adapter.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/helpers/pb_symbol_storage.dart'; +import 'package:recase/recase.dart'; + +import '../../pb_variable.dart'; + +class StatefulMiddleware extends Middleware { + StatefulMiddleware(PBGenerationManager generationManager) + : super(generationManager); + + @override + Future applyMiddleware(PBIntermediateNode node) async { + var managerData = node.managerData; + var fileStrategy = node.currentContext.project.fileStructureStrategy + as FlutterFileStructureStrategy; + + if (node is PBSharedInstanceIntermediateNode) { + managerData.addAllMethodVariable(await _getVariables(node)); + node.generator = StringGeneratorAdapter(await _generateInstance(node)); + return node; + } + var states = [node]; + var parentDirectory = node.name.snakeCase; + + await node?.auxiliaryData?.stateGraph?.states?.forEach((state) { + states.add(state.variation.node); + }); + + await states.forEach((element) async { + await fileStrategy.generatePage( + await generationManager.generate(element), + '${parentDirectory}/${element.name.snakeCase}', + args: 'VIEW', + ); + }); + + return node; + } + + Future> _getVariables(PBIntermediateNode node) async { + List variables = []; + var symbolMaster; + if (node is PBSharedInstanceIntermediateNode) { + symbolMaster = + PBSymbolStorage().getSharedMasterNodeBySymbolID(node.SYMBOL_ID); + } else if (node is PBSharedMasterNode) { + symbolMaster = node; + } + var states = [symbolMaster]; + await symbolMaster?.auxiliaryData?.stateGraph?.states?.forEach((state) { + states.add(state.variation.node); + }); + await states.forEach((state) { + var tempNode = state; + var tempVar = PBVariable( + tempNode.name.snakeCase, + 'final ', + true, + tempNode.name == symbolMaster.name + ? '${tempNode.name.pascalCase}()' + : null, + ); + variables.add(tempVar); + }); + return variables; + } + + String _generateInstance(PBSharedInstanceIntermediateNode node) { + return node.functionCallName.snakeCase; + } +} diff --git a/lib/generation/generators/pb_flutter_generator.dart b/lib/generation/generators/pb_flutter_generator.dart index f1baea6f..f411727b 100644 --- a/lib/generation/generators/pb_flutter_generator.dart +++ b/lib/generation/generators/pb_flutter_generator.dart @@ -1,179 +1,104 @@ -import 'package:parabeac_core/generation/generators/pb_variable.dart'; -import 'package:parabeac_core/generation/generators/pb_widget_manager.dart'; -import 'package:parabeac_core/generation/generators/util/pb_input_formatter.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/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/empty_page_template_strategy.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:quick_log/quick_log.dart'; -enum BUILDER_TYPE { - STATEFUL_WIDGET, - SYMBOL_MASTER, - SYMBOL_INSTANCE, - STATELESS_WIDGET, - BODY, - SCAFFOLD_BODY, - EMPTY_PAGE -} - class PBFlutterGenerator extends PBGenerationManager { var log = Logger('Flutter Generator'); - PBFlutterGenerator(pageWriter) : super(pageWriter) { + final DEFAULT_STRATEGY = EmptyPageTemplateStrategy(); + PBFlutterGenerator({PBGenerationViewData data}) : super(data: data) { body = StringBuffer(); } - String generateStatefulWidget(String body, String name) { - var widgetName = _generateWidgetName(name); - var constructorName = '_$name'; - return ''' -${generateImports()} - -class ${widgetName} extends StatefulWidget{ - const ${widgetName}() : super(); - @override - _${widgetName} createState() => _${widgetName}(); -} - -class _${widgetName} extends State<${widgetName}>{ - ${generateInstanceVariables()} - ${generateConstructor(constructorName)} - - @override - Widget build(BuildContext context){ - return ${body}; - } -}'''; - } - - String generateStatelessWidget(String body, String name) { - var widgetName = _generateWidgetName(name); - var constructorName = '_$name'; - return ''' -${generateImports()} - -class ${widgetName} extends StatelessWidget{ - const ${widgetName}({Key key}) : super(key : key); - ${generateInstanceVariables()} - ${generateConstructor(constructorName)} - + ///Generates a constructor given a name and `constructorVariable` @override - Widget build(BuildContext context){ - return ${body}; - } -}'''; - } - - String _generateWidgetName(name) => PBInputFormatter.formatLabel( - name, - isTitle: true, - space_to_underscore: false, - ); - String generateConstructor(name) { - if (constructorVariables == null || constructorVariables.isEmpty) { + if (data.constructorVariables == null) { return ''; } - List variables = []; - List optionalVariables = []; - constructorVariables.forEach((param) { - // Only accept constructor variable if they are - // part of the variable instances - if (param.isRequired && instanceVariables.contains(param)) { - variables.add(param); - } else if (instanceVariables.contains(param)) { - optionalVariables.add(param); - } else {} // Do nothing - }); var stringBuffer = StringBuffer(); stringBuffer.write(name + '('); - variables.forEach((p) { - stringBuffer.write('this.' + p.variableName + ','); - }); - stringBuffer.write('{'); - optionalVariables.forEach((o) { - stringBuffer.write('this.' + o.variableName + ','); - }); - stringBuffer.write('});'); + var param; + var it = data.constructorVariables; + while (it.moveNext()) { + param = it.current; + if (param.isRequired) { + stringBuffer.write('this.' + param.variableName + ','); + } + param = it.current; + } + + var counter = 0; + var optionalParamBuffer = StringBuffer(); + optionalParamBuffer.write('{'); + it = data.constructorVariables; + while (it.moveNext()) { + param = data.constructorVariables.current; + if (!param.isRequired) { + optionalParamBuffer.write('this.' + param.variableName + ','); + counter++; + } + } + optionalParamBuffer.write('}'); + if (counter >= 1) { + stringBuffer.write(optionalParamBuffer.toString()); + } + stringBuffer.write(');'); return stringBuffer.toString(); } - String generateInstanceVariables() { - if (instanceVariables == null || instanceVariables.isEmpty) { + ///Generate global variables + @override + String generateGlobalVariables() { + if (data.globalVariables == null) { return ''; } var stringBuffer = StringBuffer(); - instanceVariables.forEach((param) { - stringBuffer.write(param.type + ' ' + param.variableName + ';\n'); - }); - + var param; + var it = data.globalVariables; + while (it.moveNext()) { + param = it.current; + stringBuffer.write(param.type + + ' ' + + param.variableName + + (param.defaultValue == null ? '' : ' = ${param.defaultValue}') + + ';\n'); + } return stringBuffer.toString(); } - /// Formats and returns imports in the list + /// Generates the imports + @override String generateImports() { - StringBuffer buffer = StringBuffer(); + var buffer = StringBuffer(); buffer.write('import \'package:flutter/material.dart\';\n'); - - for (String import in imports) { - buffer.write('import \'$import\';\n'); + var it = data.imports; + while (it.moveNext()) { + buffer.write('import \'${it.current}\';\n'); } return buffer.toString(); } @override - String generate(PBIntermediateNode rootNode, - {type = BUILDER_TYPE.STATEFUL_WIDGET}) { + String generate( + PBIntermediateNode rootNode, + ) { if (rootNode == null) { return null; } - - ///Automatically assign type for symbols - if (rootNode is PBSharedMasterNode) { - type = BUILDER_TYPE.SYMBOL_MASTER; - } else if (rootNode is PBSharedInstanceIntermediateNode) { - type = BUILDER_TYPE.SYMBOL_INSTANCE; - } - rootNode.builder_type = type; - rootNode.generator.manager = this; - - var gen = rootNode.generator; - - if (gen != null) { - switch (type) { - case BUILDER_TYPE.STATEFUL_WIDGET: - return generateStatefulWidget(gen.generate(rootNode), rootNode.name); - break; - case BUILDER_TYPE.STATELESS_WIDGET: - return generateStatelessWidget( - gen.generate(rootNode), rootNode.name); - break; - case BUILDER_TYPE.EMPTY_PAGE: - return generateImports() + body.toString(); - break; - case BUILDER_TYPE.SYMBOL_MASTER: - case BUILDER_TYPE.SYMBOL_INSTANCE: - case BUILDER_TYPE.BODY: - default: - return gen.generate(rootNode); - } - } else { + if (rootNode.generator == null) { log.error('Generator not registered for ${rootNode}'); } - return null; + return rootNode.generator?.templateStrategy?.generateTemplate( + rootNode, + this, + GeneratorContext(sizingContext: SizingValueContext.PointValue)) ?? + + ///if there is no [TemplateStrategy] we are going to use `DEFAULT_STRATEGY` + DEFAULT_STRATEGY.generateTemplate(rootNode, this, + GeneratorContext(sizingContext: SizingValueContext.PointValue)); } - - @override - void addDependencies(String packageName, String version) { - pageWriter.addDependency(packageName, version); - } - - @override - void addInstanceVariable(PBVariable param) => instanceVariables.add(param); - - @override - void addConstructorVariable(PBVariable param) => constructorVariables.add(param); - - @override - void addImport(String value) => imports.add(value); } diff --git a/lib/generation/generators/pb_generation_manager.dart b/lib/generation/generators/pb_generation_manager.dart new file mode 100644 index 00000000..72ce366b --- /dev/null +++ b/lib/generation/generators/pb_generation_manager.dart @@ -0,0 +1,32 @@ +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_gen_cache.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; + +/// Resposible for generating the code of a [PBIntermediateNode] Tree. +/// +/// Furthermore, it provides a set of method that allows [PBIntermediateNode]s to add +/// imports, dependencies, etc. +abstract class PBGenerationManager { + ///* Keep track of the current page body + StringBuffer body; + + Type rootType; + + PBGenerationViewData _data; + PBGenerationViewData get data => _data; + set data(PBGenerationViewData data) => _data = data; + + PBGenerationManager({data}) { + _data = data; + } + + String generate(PBIntermediateNode rootNode); + + String getPath(String uuid) => PBGenCache().getPath(uuid); + + String generateImports(); + + String generateGlobalVariables(); + + String generateConstructor(String name); +} diff --git a/lib/generation/generators/pb_generator.dart b/lib/generation/generators/pb_generator.dart index 8b0baf3e..80f491bd 100644 --- a/lib/generation/generators/pb_generator.dart +++ b/lib/generation/generators/pb_generator.dart @@ -1,20 +1,35 @@ -import 'package:parabeac_core/generation/generators/pb_widget_manager.dart'; +import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/inline_template_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/pb_template_strategy.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; +import 'attribute-helper/pb_generator_context.dart'; + abstract class PBGenerator { - @Deprecated('Widget Indentifier is not being used anymore') - final String WIDGET_TYPE_IDENTIFIER = 'widgetType'; final String OBJECTID = 'UUID'; - PBGenerationManager _manager; + + ///The [TemplateStrategy] that is going to be used to generate the boilerplate code around the node. + /// + ///The `default` [TemplateStrategy] is going to be [InlineTemplateStrategy] + TemplateStrategy _templateStrategy; + TemplateStrategy get templateStrategy => _templateStrategy; + set templateStrategy(TemplateStrategy strategy) => + _templateStrategy = strategy; + + PBGenerationManager _manager = + PBFlutterGenerator(data: PBGenerationViewData()); set manager(PBGenerationManager generationManager) => _manager = generationManager; PBGenerationManager get manager => _manager; - PBGenerator(); - String generate(PBIntermediateNode source); + PBGenerationViewData get data => _manager.data; + + PBGenerator({TemplateStrategy strategy}) { + _templateStrategy = strategy; + _templateStrategy ??= InlineTemplateStrategy(); + } - ///Generating just a line in the code; this is used when to 'special' handleing is - @Deprecated('Widget Indentifier is not being used anymore') - String generateMapEntry(String key, String value) => - value == null || key == WIDGET_TYPE_IDENTIFIER ? '' : '$key : $value,'; + String generate(PBIntermediateNode source, GeneratorContext generatorContext); } diff --git a/lib/generation/generators/pb_variable.dart b/lib/generation/generators/pb_variable.dart index e3f0e81f..91ed4b1e 100644 --- a/lib/generation/generators/pb_variable.dart +++ b/lib/generation/generators/pb_variable.dart @@ -1,12 +1,17 @@ class PBVariable { + ///Name of the variable String variableName; + + ///static type of the variable. String type; bool isRequired; + String defaultValue; PBVariable( this.variableName, this.type, this.isRequired, + this.defaultValue, ); @override diff --git a/lib/generation/generators/pb_widget_manager.dart b/lib/generation/generators/pb_widget_manager.dart deleted file mode 100644 index 8e52b32f..00000000 --- a/lib/generation/generators/pb_widget_manager.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:parabeac_core/generation/generators/pb_generator.dart'; -import 'package:parabeac_core/generation/generators/pb_page_writer.dart'; -import 'package:parabeac_core/generation/generators/pb_variable.dart'; -import 'package:parabeac_core/generation/generators/visual-widgets/pb_bitmap_gen.dart'; -import 'package:parabeac_core/generation/generators/visual-widgets/pb_shape_group_gen.dart'; -import 'package:parabeac_core/generation/generators/visual-widgets/pb_spacer_gen.dart'; -import 'package:parabeac_core/generation/generators/visual-widgets/pb_text_gen.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_gen_cache.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; - -import 'pb_variable.dart'; - -/** - * The caller of the method `generate()` is going to look at the configurations and decide if the page is - * going to become `STATEFUL_WIDGET` or `STATELESS_WIDGET`. - */ -abstract class PBGenerationManager { - // final bool debug; - List _registeredGenerators = [ - PBTextGen(), - PBBitmapGenerator(), - PBSpacerGenerator(), - PBShapeGroupGen(), - ]; - // final PBSymbolModel _symbolModel = PBSymbolModel(); - - ///* In charge of who will write the output of the file - PBPageWriter pageWriter; - // PBContext context; - - ///* Keep track of the imports the current page may have - List imports = []; - - ///* Keep track of the current page body - StringBuffer body; - - ///* Keep track of the instance variable a class may have - /// I think the following three may be only for Flutter (?) - - List constructorVariables = []; - List instanceVariables = []; - Map dependencies = {}; - - PBGenerationManager( - this.pageWriter, - ); - void addImport(String value); - - String generate(PBIntermediateNode rootNode, {type}); - - void addDependencies(String packageName, String version); - - String getPath(String uuid) => PBGenCache().getPath(uuid); - - void addConstructorVariable(PBVariable param); - - void addInstanceVariable(PBVariable variable); -} diff --git a/lib/generation/generators/screen_builder.dart b/lib/generation/generators/screen_builder.dart index c611ccfa..2faf823e 100644 --- a/lib/generation/generators/screen_builder.dart +++ b/lib/generation/generators/screen_builder.dart @@ -4,7 +4,6 @@ import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; Builder simpleBuilder(BuilderOptions options) => SimpleBuilder(); class SimpleBuilder extends Builder { - // PBGenerationManager manager = PBGenerationManager(debug: true); final String GLOBAL_SYMBOL_KEY = 'globalSymbols'; @override @@ -16,33 +15,17 @@ class SimpleBuilder extends Builder { Future build(BuildStep buildStep) async { print('GENERATING CODE'); Map source; - final AssetId outputId = buildStep.inputId.changeExtension('.dart'); + final outputId = buildStep.inputId.changeExtension('.dart'); if (source.containsKey(GLOBAL_SYMBOL_KEY)) { _generateArray(source[GLOBAL_SYMBOL_KEY], outputId, buildStep); } } - ///Getting the output type based on jsonfile contents - BUILDER_TYPE _getType(Map jsonFile) { - for (var entry in jsonFile.entries) { - var value = entry.value.toString(); - if (value.contains('Scaffold')) { - return BUILDER_TYPE.STATEFUL_WIDGET; - } else if (value.contains(GLOBAL_SYMBOL_KEY) || - value.contains('PBSymbolMaster')) { - return BUILDER_TYPE.SYMBOL_MASTER; - } else { - return BUILDER_TYPE.STATEFUL_WIDGET; - } - } - } - void _generateArray(List data, var output_id, var build_step) { data ??= []; var buffer = StringBuffer(); buffer.write("import \'package:flutter/material.dart\';\n"); - print('DATA:' + data.toString()); _generateCode(output_id, buffer.toString(), build_step); } diff --git a/lib/generation/generators/symbols/pb_instancesym_gen.dart b/lib/generation/generators/symbols/pb_instancesym_gen.dart index ecb14ce4..4c7a7693 100644 --- a/lib/generation/generators/symbols/pb_instancesym_gen.dart +++ b/lib/generation/generators/symbols/pb_instancesym_gen.dart @@ -1,8 +1,14 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; +import 'package:parabeac_core/input/sketch/entities/style/shared_style.dart'; +import 'package:parabeac_core/input/sketch/entities/style/text_style.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/inherited_bitmap.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:quick_log/quick_log.dart'; +import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:recase/recase.dart'; class PBSymbolInstanceGenerator extends PBGenerator { PBSymbolInstanceGenerator() : super(); @@ -10,30 +16,52 @@ class PBSymbolInstanceGenerator extends PBGenerator { var log = Logger('Symbol Instance Generator'); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is PBSharedInstanceIntermediateNode) { - String method_signature = source.functionCallName; + var method_signature = source.functionCallName; if (method_signature == null) { log.error(' Could not find master name on: $source'); return 'Container(/** This Symbol was not found **/)'; } method_signature = PBInputFormatter.formatLabel(method_signature, destroy_digits: false, space_to_underscore: false, isTitle: false); + method_signature = method_signature.pascalCase; var buffer = StringBuffer(); - method_signature = method_signature[0].toLowerCase() + - method_signature.substring(1, method_signature.length); - + buffer.write('LayoutBuilder( \n'); + buffer.write(' builder: (context, constraints) {\n'); + buffer.write(' return '); buffer.write(method_signature); - buffer.write('(context, '); - // TODO: Add this once PCQ-03 is fixed - // for (var param in source.sharedParamValues ?? []) { - // var text = param.value != null && param.value is String - // ? '\"${param.value}\"' - // : '${param.value}'; - // if (text.isNotEmpty) { - // buffer.write((text + ',')); - // } - // } + buffer.write('('); + buffer.write('constraints,'); + for (var param in source.sharedParamValues ?? []) { + switch (param.type) { + case PBSharedParameterValue: + //PBSharedParameterValue pbspv = param; + //switch (pbpsv.) + // TODO, maybe this points to static instances? Like Styles.g.dart that will be eventually generated, + // but what about prototype links? + break; + case InheritedBitmap: + buffer.write('${param.name}: \"assets/${param.value["_ref"]}\",'); + break; + case TextStyle: + // hack to include import + source.generator.manager.data.addImport( + 'package:${MainInfo().projectName}/document/shared_props.g.dart'); + buffer.write( + '${param.name}: ${SharedStyle_UUIDToName[param.value] ?? "TextStyle()"},'); + break; + default: + buffer.write('${param.name}: \"${param.value}\",'); + break; + } + } + // end of return function(); + buffer.write(');\n'); + // end of builder: (context, constraints) { + buffer.write('}\n'); + // end of LayoutBuilder() buffer.write(')'); return buffer.toString(); } diff --git a/lib/generation/generators/symbols/pb_mastersym_gen.dart b/lib/generation/generators/symbols/pb_mastersym_gen.dart index 5be4d41d..d4c6a6b1 100644 --- a/lib/generation/generators/symbols/pb_mastersym_gen.dart +++ b/lib/generation/generators/symbols/pb_mastersym_gen.dart @@ -1,71 +1,19 @@ import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; 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/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/value_objects/pb_symbol_master_params.dart'; import 'package:quick_log/quick_log.dart'; -import '../pb_flutter_generator.dart'; - class PBMasterSymbolGenerator extends PBGenerator { - final _parametersType = { - 'image': 'var', - 'stringValue': 'var', - 'symbolID': 'var', - 'layerStyle': 'var' - }; - List _parameterDefinition = []; - - PBMasterSymbolGenerator() : super(); - - ///Generating the parameters of the symbol master, keeping [definitions] so - ///we can replace the generic names of the paramters by that of the real overridable node's name. - ///However, they need to be established in all the nodes. - String _generateParameters(List signatures, - List definitions) { - if (signatures == null || definitions.isEmpty) { - return ''; - } - var buffer = StringBuffer(); - for (var i = 0; i < signatures.length; i++) { - var signature = signatures[i]; - var overridableType = - signature.type?.toString()?.replaceAll(RegExp('.+_'), ''); - var type = _parametersType.containsKey(overridableType) - ? _parametersType[overridableType] - : 'var'; - - if (signature.canOverride) { - var name = definitions[i] != null ? definitions[i].propertyName : null; - if (name == null) { - continue; - } - var objectId = - definitions[i] != null ? definitions[i].parameterID : name; - var defenition = - definitions[i] != null ? definitions[i].parameterDefinition : null; - - buffer.write(('$type $name,')); - } - } - return buffer.toString(); - } - - String _generateParametersBody(PBIntermediateNode source) { - var buffer = StringBuffer(); - _parameterDefinition.forEach((param) { - var body = manager.generate(param, - type: source.builder_type ?? BUILDER_TYPE.SCAFFOLD_BODY); - if (body != null && body.isNotEmpty) { - buffer.writeln('${param.propertyName} ??= $body;'); - } - }); - return buffer.toString(); - } + PBMasterSymbolGenerator() : super(strategy: StatelessTemplateStrategy()); var log = Logger('Symbol Master Generator'); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { + generatorContext.sizingContext ??= SizingValueContext.LayoutBuilderValue; var buffer = StringBuffer(); if (source is PBSharedMasterNode) { if (source.child == null) { @@ -86,21 +34,16 @@ class PBMasterSymbolGenerator extends PBGenerator { ); log.error(e.toString()); } - buffer.write('Widget ${name}(BuildContext context,'); - var parameters = _generateParameters((source.overridableProperties ?? []), - (source.parametersDefinition ?? [])); - buffer.write(parameters); - buffer.write('){'); - var parameterBody = _generateParametersBody(source); - buffer.write(parameterBody); - buffer.write('Widget widget = '); - var generatedWidget = manager.generate(source.child, - type: source.builder_type ?? BUILDER_TYPE.SCAFFOLD_BODY); - if (generatedWidget == null || generatedWidget.isEmpty) return ''; + var generatedWidget = + source.child.generator.generate(source.child, generatorContext); + if (generatedWidget == null || generatedWidget.isEmpty) { + return ''; + } buffer.write(generatedWidget); - buffer.write(';\nreturn widget;\n}'); return buffer.toString(); + } else { + return ''; } } } diff --git a/lib/generation/generators/symbols/pb_sym_mas_param_gen.dart b/lib/generation/generators/symbols/pb_sym_mas_param_gen.dart index a73fecc0..ffab6fa4 100644 --- a/lib/generation/generators/symbols/pb_sym_mas_param_gen.dart +++ b/lib/generation/generators/symbols/pb_sym_mas_param_gen.dart @@ -1,3 +1,4 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/generation/generators/pb_variable.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; @@ -6,7 +7,8 @@ class PBSymbolMasterParamGen extends PBGenerator { PBSymbolMasterParamGen() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { //TODO: is PBParam correct here? var name = (source as PBVariable).variableName; diff --git a/lib/generation/generators/util/pb_generation_project_data.dart b/lib/generation/generators/util/pb_generation_project_data.dart new file mode 100644 index 00000000..5700eb45 --- /dev/null +++ b/lib/generation/generators/util/pb_generation_project_data.dart @@ -0,0 +1,6 @@ +import 'package:parabeac_core/generation/generators/writers/pb_flutter_writer.dart'; + +class PBGenerationProjectData { + void addDependencies(String packageName, String version) => + PBFlutterWriter().addDependency(packageName, version); +} diff --git a/lib/generation/generators/util/pb_generation_view_data.dart b/lib/generation/generators/util/pb_generation_view_data.dart new file mode 100644 index 00000000..87c422fb --- /dev/null +++ b/lib/generation/generators/util/pb_generation_view_data.dart @@ -0,0 +1,103 @@ +import 'package:parabeac_core/generation/generators/pb_variable.dart'; +import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; + +class PBGenerationViewData { + final Set _globalVariables = {}; + final Set _constructorVariables = {}; + final Set _methodVariables = {}; + final Set _imports = {}; + bool _isDataLocked = false; + + PBGenerationViewData(); + + Iterator get globalVariables => _globalVariables.iterator; + + Iterator get constructorVariables => + _constructorVariables.iterator; + + ///The [PBVariable]s that need to be added in between the method definition and its return statement + Iterator get methodVariables => _methodVariables.iterator; + + ///Imports for the current page + Iterator get imports => _imports.iterator; + + String get methodVariableStr { + var buffer = StringBuffer(); + var it = _methodVariables.iterator; + while (it.moveNext()) { + var param = it.current; + buffer.writeln( + '${param.type} ${PBInputFormatter.formatLabel(param.variableName)} = ${param.defaultValue};'); + } + return buffer.toString(); + } + + void lockData() => _isDataLocked = true; + + void addImport(String import) { + if (!_isDataLocked && import != null && import.isNotEmpty) { + _imports.add(import); + } + } + + void addConstructorVariable(PBVariable parameter) { + if (!_isDataLocked && parameter != null) { + _constructorVariables.add(parameter); + } + } + + void addGlobalVariable(PBVariable variable) { + if (!_isDataLocked && variable != null) { + _globalVariables.add(variable); + } + } + + void addAllGlobalVariable(Iterable variable) => + _globalVariables.addAll(variable); + + void addMethodVariable(PBVariable variable) { + if (!_isDataLocked && variable != null) { + _methodVariables.add(variable); + } + } + + void addAllMethodVariable(Iterable variables) { + if (!_isDataLocked && variables != null) { + _methodVariables.addAll(variables); + } + } + + Future removeImportThatContains(String pattern) async { + for (var import in _imports) { + if (import is String && import.contains(pattern)) { + _imports.remove(import); + return import; + } + } + return ''; + } + + Future replaceImport(String oldImport, String newImport) async { + var oldVersion = await removeImportThatContains(oldImport); + if (oldVersion == '') { + return null; + } + var tempList = oldVersion.split('/'); + tempList.removeLast(); + tempList.add(newImport); + var tempList2 = tempList; + _imports.add(await _makeImport(tempList2)); + } + + Future _makeImport(List tempList) async { + var tempString = tempList.removeAt(0); + for (var item in tempList) { + tempString += '/${item}'; + if (item == 'view') { + tempString += '/${tempList.removeLast()}'; + break; + } + } + return tempString; + } +} diff --git a/lib/generation/generators/util/pb_input_formatter.dart b/lib/generation/generators/util/pb_input_formatter.dart index 37c02ccc..e151f69f 100644 --- a/lib/generation/generators/util/pb_input_formatter.dart +++ b/lib/generation/generators/util/pb_input_formatter.dart @@ -7,6 +7,8 @@ class PBInputFormatter { bool destroy_special_sym = false}) { assert(input != null); var result = input; + // TODO: set a temporal name + result = (result.isEmpty) ? 'tempName' : result; result = _removeFirstDigits(result); result = result.trim(); var space_char = (space_to_underscore) ? '_' : ''; diff --git a/lib/generation/generators/value_objects/file_structure_strategy.dart/bloc_file_structure_strategy.dart b/lib/generation/generators/value_objects/file_structure_strategy.dart/bloc_file_structure_strategy.dart new file mode 100644 index 00000000..cd58225e --- /dev/null +++ b/lib/generation/generators/value_objects/file_structure_strategy.dart/bloc_file_structure_strategy.dart @@ -0,0 +1,9 @@ +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; + +class BLoCFileStructureStrategy extends FileStructureStrategy { + BLoCFileStructureStrategy( + String genProjectPath, PBPageWriter pageWriter, PBProject pbProject) + : super(genProjectPath, pageWriter, pbProject); +} diff --git a/lib/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart b/lib/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart new file mode 100644 index 00000000..cde8f668 --- /dev/null +++ b/lib/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart @@ -0,0 +1,9 @@ +import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; + +class FlutterFileStructureStrategy extends FileStructureStrategy { + FlutterFileStructureStrategy( + String genProjectPath, PBPageWriter pageWriter, PBProject pbProject) + : super(genProjectPath, pageWriter, pbProject); +} diff --git a/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart b/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart new file mode 100644 index 00000000..73a379f4 --- /dev/null +++ b/lib/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart @@ -0,0 +1,98 @@ +import 'dart:io'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; +import 'package:quick_log/quick_log.dart'; +import 'package:recase/recase.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_gen_cache.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; + +///Responsible for creating a particular file structure depending in the structure +/// +///For example, in the provider strategy, there would be a directory for the models and the providers, +///while something like BLoC will assign a directory to a single +abstract class FileStructureStrategy { + ///The path of where all the views are going to be generated. + /// + ///The views is anything that is not a screen, for example, symbol masters + ///are going to be generated in this folder if not specified otherwise. + final RELATIVE_VIEW_PATH = 'lib/view/'; + + ///The path of where all the screens are going to be generated. + final RELATIVE_SCREEN_PATH = 'lib/screens/'; + + Logger logger; + + ///Path of where the project is generated + final String GENERATED_PROJECT_PATH; + + final PBProject _pbProject; + + ///The page writer used to generated the actual files. + final PBPageWriter _pageWriter; + PBPageWriter get pageWriter => _pageWriter; + + ///Indicator that signals if the required directories are constructed. + /// + ///Before generating any files, the caller must call the [setUpDirectories] + bool isSetUp = false; + + String _screenDirectoryPath; + String _viewDirectoryPath; + + FileStructureStrategy( + this.GENERATED_PROJECT_PATH, this._pageWriter, this._pbProject) { + logger = Logger(runtimeType.toString()); + } + + ///Setting up the required directories for the [FileStructureStrategy] to write the corresponding files. + /// + ///Default directories that are going to be generated is the + ///[RELATIVE_VIEW_PATH] and [RELATIVE_SCREEN_PATH]. + Future setUpDirectories() async { + if (!isSetUp) { + _screenDirectoryPath = '${GENERATED_PROJECT_PATH}${RELATIVE_SCREEN_PATH}'; + _viewDirectoryPath = '${GENERATED_PROJECT_PATH}${RELATIVE_VIEW_PATH}'; + _pbProject.forest.forEach((dir) { + if (dir.rootNode != null) { + _addImportsInfo(dir); + } + }); + Directory(_screenDirectoryPath).createSync(recursive: true); + Directory(_viewDirectoryPath).createSync(recursive: true); + isSetUp = true; + } + } + + ///Add the import information to correctly generate them in the corresponding files. + void _addImportsInfo(PBIntermediateTree directory) { + var intermediateItem = directory; + // Add to cache if node is scaffold or symbol master + var node = intermediateItem.rootNode; + var name = node?.name?.snakeCase; + if (name != null) { + var uuid = node is PBSharedMasterNode ? node.SYMBOL_ID : node.UUID; + var path = node is PBSharedMasterNode + ? '${_viewDirectoryPath}${directory.name.snakeCase}/${name}.g.dart' + : '${_screenDirectoryPath}${directory.name.snakeCase}/${name}.dart'; + PBGenCache().addToCache(uuid, path); + } else { + logger.warning( + 'The following intermediateNode was missing a name: ${intermediateItem.toString()}'); + } + } + + ///Writig the code to the actual file + /// + ///The default computation of the function will foward the `code` to the + ///`_pageWriter`. The [PBPageWriter] will then generate the file with the code inside + Future generatePage(String code, String fileName, {var args}) { + if (args is String) { + var path = args == 'SCREEN' + ? '${_screenDirectoryPath}${fileName}.dart' + : '${_viewDirectoryPath}${fileName}.g.dart'; + pageWriter.write(code, path); + } + return Future.value(); + } +} diff --git a/lib/generation/generators/value_objects/file_structure_strategy.dart/provider_file_structure_strategy.dart b/lib/generation/generators/value_objects/file_structure_strategy.dart/provider_file_structure_strategy.dart new file mode 100644 index 00000000..bd80d8ea --- /dev/null +++ b/lib/generation/generators/value_objects/file_structure_strategy.dart/provider_file_structure_strategy.dart @@ -0,0 +1,37 @@ +import 'dart:io'; + +import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; + +class ProviderFileStructureStrategy extends FileStructureStrategy { + final RELATIVE_PROVIDER_PATH = 'lib/providers/'; + final RELATIVE_MODEL_PATH = 'lib/models/'; + var _providersPath; + var _modelsPath; + + ProviderFileStructureStrategy( + String genProjectPath, PBPageWriter pageWriter, PBProject pbProject) + : super(genProjectPath, pageWriter, pbProject) { + _providersPath = '${genProjectPath}${RELATIVE_PROVIDER_PATH}'; + _modelsPath = '${genProjectPath}${RELATIVE_MODEL_PATH}'; + } + + @override + Future setUpDirectories() async { + if (!isSetUp) { + await Future.wait( + [super.setUpDirectories(), _generateMissingDirectories()]); + isSetUp = true; + } + } + + Future _generateMissingDirectories() async { + Directory(_providersPath).createSync(recursive: true); + Directory(_modelsPath).createSync(recursive: true); + } + + void writeProviderModelFile(String code, String fileName) { + super.pageWriter.write(code, '${_modelsPath}${fileName}.g.dart'); + } +} diff --git a/lib/generation/generators/value_objects/generation_configuration/bloc_generation_configuration.dart b/lib/generation/generators/value_objects/generation_configuration/bloc_generation_configuration.dart new file mode 100644 index 00000000..2ac7c6bd --- /dev/null +++ b/lib/generation/generators/value_objects/generation_configuration/bloc_generation_configuration.dart @@ -0,0 +1,21 @@ +import 'package:parabeac_core/generation/generators/middleware/state_management/bloc_middleware.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart'; +import 'package:quick_log/quick_log.dart'; + +class BLoCGenerationConfiguration extends GenerationConfiguration { + BLoCGenerationConfiguration(); + + @override + Future setUpConfiguration() async { + logger = Logger('BLoC'); + logger.info( + '\nThanks for trying our state management configuration that is now in Beta!\nIf you run into any issues please feel free to post it in Github or in our Discord!\n'); + fileStructureStrategy = FlutterFileStructureStrategy( + pbProject.projectAbsPath, pageWriter, pbProject); + registerMiddleware(BLoCMiddleware(generationManager)); + logger.info('Setting up the directories'); + await fileStructureStrategy.setUpDirectories(); + return super.setUpConfiguration(); + } +} diff --git a/lib/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart b/lib/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart new file mode 100644 index 00000000..9f0244d9 --- /dev/null +++ b/lib/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart @@ -0,0 +1,162 @@ +import 'package:parabeac_core/generation/flutter_project_builder/import_helper.dart'; +import 'package:parabeac_core/generation/generators/middleware/middleware.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_flutter_writer.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/pb_generator.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/inherited_scaffold.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.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/generation/generators/pb_flutter_generator.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_symbol_storage.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; +import 'package:quick_log/quick_log.dart'; +import 'package:recase/recase.dart'; + +abstract class GenerationConfiguration { + FileStructureStrategy fileStructureStrategy; + + Logger logger; + + final Set _middleware = {}; + + ///The project that contains the node for all the pages. + PBProject pbProject; + + ///The manager in charge of the independent [PBGenerator]s by providing an interface for adding imports, global variables, etc. + /// + ///The default [PBGenerationManager] will be [PBFlutterGenerator] + PBGenerationManager _generationManager; + + /// PageWriter to be used for generation + PBPageWriter _pageWriter = PBFlutterWriter(); // Default to Flutter + PBPageWriter get pageWriter => _pageWriter; + + set pageWriter(PBPageWriter pageWriter) => _pageWriter = pageWriter; + + GenerationConfiguration() { + logger = Logger(runtimeType.toString()); + _generationManager = PBFlutterGenerator(data: PBGenerationViewData()); + } + + PBGenerationManager get generationManager => _generationManager; + set generationManager(PBGenerationManager manager) => + _generationManager = manager; + + final Map _dependencies = {}; + Iterable> get dependencies => _dependencies.entries; + + ///This is going to modify the [PBIntermediateNode] in order to affect the structural patterns or file structure produced. + Future applyMiddleware(PBIntermediateNode node) async { + var it = _middleware.iterator; + while (it.moveNext()) { + node = await it.current.applyMiddleware(node); + } + return node; + } + + Future conditionsToApplyMiddleware( + PBIntermediateNode node) async { + if ((node is PBSharedInstanceIntermediateNode && _isMasterState(node)) || + (node?.auxiliaryData?.stateGraph?.states?.isNotEmpty ?? false)) { + return await applyMiddleware(node); + } + return node; + } + + bool _isMasterState(PBSharedInstanceIntermediateNode node) { + if (node.isMasterState) { + return true; + } + var symbolMaster = + PBSymbolStorage().getSharedMasterNodeBySymbolID(node.SYMBOL_ID); + return symbolMaster?.auxiliaryData?.stateGraph?.states?.isNotEmpty ?? false; + } + + Future _iterateNode(PBIntermediateNode node) async { + var stack = [node]; + while (stack.isNotEmpty) { + var currentNode = stack.removeLast(); + + /// Add all children to the stack + if (currentNode.child != null) { + stack.add(currentNode.child); + } else if (currentNode is PBLayoutIntermediateNode) { + currentNode.children.forEach((node) { + stack.add(node); + }); + } + + /// Apply incoming function to all nodes + await conditionsToApplyMiddleware(currentNode); + } + return node; + } + + ///generates the Project based on the [pb_project] + Future generateProject(PBProject pb_project) async { + pbProject = pb_project; + + await setUpConfiguration(); + pbProject.fileStructureStrategy = fileStructureStrategy; + for (var tree in pbProject.forest) { + _generationManager.data = tree.data; + var fileName = tree.rootNode?.name?.snakeCase ?? 'no_name_found'; + _commitImports(tree.rootNode, tree.name.snakeCase, fileName); + await _iterateNode(tree.rootNode); + + await _generateNode(tree.rootNode, '${tree.name.snakeCase}/${fileName}'); + } + await _commitDependencies(pb_project.projectName); + } + + void registerMiddleware(Middleware middleware) { + if (middleware != null) { + middleware.generationManager = _generationManager; + _middleware.add(middleware); + } + } + + Future setUpConfiguration() async { + fileStructureStrategy = FlutterFileStructureStrategy( + pbProject.projectAbsPath, _pageWriter, pbProject); + logger.info('Setting up the directories'); + await fileStructureStrategy.setUpDirectories(); + } + + void _commitImports( + PBIntermediateNode node, String directoryName, String fileName) { + var screenFilePath = + '${pbProject.projectName}/lib/screens/${directoryName}/${fileName.snakeCase}.dart'; + var viewFilePath = + '${pbProject.projectName}/lib/views/${directoryName}/${fileName.snakeCase}.g.dart'; + var imports = ImportHelper.findImports( + node, node is InheritedScaffold ? screenFilePath : viewFilePath); + imports.forEach((import) { + node.managerData.addImport(import); + }); + } + + Future _commitDependencies(String projectName) async { + var writer = _pageWriter; + if (writer is PBFlutterWriter) { + writer.submitDependencies(projectName + '/pubspec.yaml'); + } + } + + Future _generateNode(PBIntermediateNode node, String filename) async { + if (node?.auxiliaryData?.stateGraph?.states?.isNotEmpty ?? false) { + /// Since these nodes are being processed on the middlewares + /// we can ignore them here + /// TODO: change it + } else { + await pbProject.fileStructureStrategy.generatePage( + await _generationManager.generate(node), filename, + args: node is InheritedScaffold ? 'SCREEN' : 'VIEW'); + } + } +} diff --git a/lib/generation/generators/value_objects/generation_configuration/provider_generation_configuration.dart b/lib/generation/generators/value_objects/generation_configuration/provider_generation_configuration.dart new file mode 100644 index 00000000..67c5c48a --- /dev/null +++ b/lib/generation/generators/value_objects/generation_configuration/provider_generation_configuration.dart @@ -0,0 +1,20 @@ +import 'package:parabeac_core/generation/generators/middleware/state_management/provider_middleware.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/provider_file_structure_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart'; +import 'package:quick_log/quick_log.dart'; + +class ProviderGenerationConfiguration extends GenerationConfiguration { + ProviderGenerationConfiguration(); + + @override + Future setUpConfiguration() async { + logger = Logger('Provider'); + logger.info( + '\nThanks for trying our state management configuration that is now in Beta!\nIf you run into any issues please feel free to post it in Github or in our Discord!\n'); + fileStructureStrategy = ProviderFileStructureStrategy( + pbProject.projectAbsPath, pageWriter, pbProject); + registerMiddleware(ProviderMiddleware(generationManager)); + logger.info('Setting up the directories'); + await fileStructureStrategy.setUpDirectories(); + } +} diff --git a/lib/generation/generators/value_objects/generation_configuration/stateful_generation_configuration.dart b/lib/generation/generators/value_objects/generation_configuration/stateful_generation_configuration.dart new file mode 100644 index 00000000..62f15bb0 --- /dev/null +++ b/lib/generation/generators/value_objects/generation_configuration/stateful_generation_configuration.dart @@ -0,0 +1,17 @@ +import 'package:parabeac_core/generation/generators/middleware/state_management/stateful_middleware.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart'; + +class StatefulGenerationConfiguration extends GenerationConfiguration { + StatefulGenerationConfiguration(); + + @override + Future setUpConfiguration() async { + fileStructureStrategy = FlutterFileStructureStrategy( + pbProject.projectAbsPath, pageWriter, pbProject); + registerMiddleware(StatefulMiddleware(generationManager)); + logger.info('Setting up the directories'); + await fileStructureStrategy.setUpDirectories(); + return super.setUpConfiguration(); + } +} diff --git a/lib/generation/generators/value_objects/generator_adapter.dart b/lib/generation/generators/value_objects/generator_adapter.dart new file mode 100644 index 00000000..b90c6349 --- /dev/null +++ b/lib/generation/generators/value_objects/generator_adapter.dart @@ -0,0 +1,13 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/pb_generator.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; + +///An Adapter that allows custom string to be injected into a generator instead of a [PBIntermediateNode] +class StringGeneratorAdapter extends PBGenerator { + final String overridenString; + StringGeneratorAdapter(this.overridenString); + @override + String generate(PBIntermediateNode source, GeneratorContext context) { + return overridenString; + } +} diff --git a/lib/generation/generators/value_objects/template_strategy/bloc_state_template_strategy.dart b/lib/generation/generators/value_objects/template_strategy/bloc_state_template_strategy.dart new file mode 100644 index 00000000..57697d14 --- /dev/null +++ b/lib/generation/generators/value_objects/template_strategy/bloc_state_template_strategy.dart @@ -0,0 +1,47 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/pb_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:recase/recase.dart'; + +class BLoCStateTemplateStrategy extends TemplateStrategy { + bool isFirst = true; + String abstractClassName; + BLoCStateTemplateStrategy({this.isFirst, this.abstractClassName}); + @override + String generateTemplate(PBIntermediateNode node, PBGenerationManager manager, + GeneratorContext generatorContext, + {args}) { + var widgetName = retrieveNodeName(node); + var returnStatement = node.generator.generate(node, generatorContext); + var overrides = ''; + var overrideVars = ''; + if (node is PBSharedMasterNode && node.overridableProperties.isNotEmpty) { + node.overridableProperties.forEach((prop) { + overrides += 'this.${prop.friendlyName}, '; + overrideVars += 'final ${prop.friendlyName};'; + }); + } + return ''' +${isFirst ? _getHeader(manager) : ''} + +class ${node.name.pascalCase}State extends ${abstractClassName.pascalCase}State{ + + @override + Widget get widget => ${returnStatement}; + +}'''; + } + + String _getHeader(manager) { + return ''' + part of '${abstractClassName.snakeCase}_bloc.dart'; + + @immutable + abstract class ${abstractClassName.pascalCase}State{ + Widget get widget; + } + '''; + } +} diff --git a/lib/generation/generators/value_objects/template_strategy/empty_page_template_strategy.dart b/lib/generation/generators/value_objects/template_strategy/empty_page_template_strategy.dart new file mode 100644 index 00000000..10ceb5b3 --- /dev/null +++ b/lib/generation/generators/value_objects/template_strategy/empty_page_template_strategy.dart @@ -0,0 +1,12 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/pb_template_strategy.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; + +class EmptyPageTemplateStrategy extends TemplateStrategy { + @override + String generateTemplate(PBIntermediateNode node, PBGenerationManager manager, + GeneratorContext generatorContext, + {var args}) => + args is String ? args : ''; +} diff --git a/lib/generation/generators/value_objects/template_strategy/inline_template_strategy.dart b/lib/generation/generators/value_objects/template_strategy/inline_template_strategy.dart new file mode 100644 index 00000000..d57f1b62 --- /dev/null +++ b/lib/generation/generators/value_objects/template_strategy/inline_template_strategy.dart @@ -0,0 +1,15 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/pb_template_strategy.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; + +class InlineTemplateStrategy extends TemplateStrategy { + @override + String generateTemplate(PBIntermediateNode node, PBGenerationManager manager, + GeneratorContext generatorContext, + {var args}) { + return node is String + ? node + : node.generator.generate(node, generatorContext); + } +} diff --git a/lib/generation/generators/value_objects/template_strategy/pb_template_strategy.dart b/lib/generation/generators/value_objects/template_strategy/pb_template_strategy.dart new file mode 100644 index 00000000..98dec6a4 --- /dev/null +++ b/lib/generation/generators/value_objects/template_strategy/pb_template_strategy.dart @@ -0,0 +1,23 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/util/pb_input_formatter.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; + +abstract class TemplateStrategy { + String generateTemplate(PBIntermediateNode node, PBGenerationManager manager, + GeneratorContext generatorContext, + {var args}); + String retrieveNodeName(var node) { + var formatter = (name) => PBInputFormatter.formatLabel(name, + isTitle: true, space_to_underscore: false); + var widgetName; + if (node is PBIntermediateNode) { + widgetName = formatter(node.name); + } else if (node is String) { + widgetName = formatter(node); + } else { + widgetName = node; + } + return widgetName; + } +} 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 new file mode 100644 index 00000000..d2d6111a --- /dev/null +++ b/lib/generation/generators/value_objects/template_strategy/stateful_template_strategy.dart @@ -0,0 +1,35 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/pb_template_strategy.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; + +///Generating a [StatefulWidget] +class StatefulTemplateStrategy extends TemplateStrategy { + @override + String generateTemplate(PBIntermediateNode node, PBGenerationManager manager, + GeneratorContext generatorContext, + {args}) { + var widgetName = retrieveNodeName(node); + var constructorName = '$widgetName'; + var returnStatement = node.generator.generate(node, generatorContext); + return ''' +${manager.generateImports()} + +class ${widgetName} extends StatefulWidget{ + const ${widgetName}() : super(); + @override + _${widgetName} createState() => _${widgetName}(); +} + +class _${widgetName} extends State<${widgetName}>{ + ${manager.generateGlobalVariables()} + _${manager.generateConstructor(constructorName)} + + @override + Widget build(BuildContext context){ + ${manager.data.methodVariableStr} + return ${returnStatement}; + } +}'''; + } +} diff --git a/lib/generation/generators/value_objects/template_strategy/stateless_template_strategy.dart b/lib/generation/generators/value_objects/template_strategy/stateless_template_strategy.dart new file mode 100644 index 00000000..7b08f8d3 --- /dev/null +++ b/lib/generation/generators/value_objects/template_strategy/stateless_template_strategy.dart @@ -0,0 +1,38 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/pb_generation_manager.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/pb_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:recase/recase.dart'; + +class StatelessTemplateStrategy extends TemplateStrategy { + @override + String generateTemplate(PBIntermediateNode node, PBGenerationManager manager, + GeneratorContext generatorContext, + {args}) { + var widgetName = node.name; + var returnStatement = node.generator.generate(node, generatorContext); + var overrides = ''; + var overrideVars = ''; + if (node is PBSharedMasterNode && node.overridableProperties.isNotEmpty) { + node.overridableProperties.forEach((prop) { + overrides += 'this.${prop.friendlyName}, '; + overrideVars += 'final ${prop.friendlyName};'; + }); + } + return ''' +${manager.generateImports()} + +class ${widgetName.pascalCase} extends StatelessWidget{ + ${node is PBSharedMasterNode ? 'final constraints;' : ''} + ${overrideVars.isNotEmpty ? overrideVars : ''} + const ${widgetName.pascalCase}(${node is PBSharedMasterNode ? 'this.constraints,' : ''} {Key key, ${overrides.isNotEmpty ? overrides : ''}}) : super(key : key); + ${manager.generateGlobalVariables()} + + @override + Widget build(BuildContext context){ + return ${returnStatement}; + } +}'''; + } +} diff --git a/lib/generation/generators/visual-widgets/pb_align_gen.dart b/lib/generation/generators/visual-widgets/pb_align_gen.dart index 9d5ab83f..f77033b4 100644 --- a/lib/generation/generators/visual-widgets/pb_align_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_align_gen.dart @@ -1,17 +1,17 @@ import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_align.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/alignments/injected_align.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:quick_log/quick_log.dart'; -import '../pb_flutter_generator.dart'; - class PBAlignGenerator extends PBGenerator { var log = Logger('Align Generator'); PBAlignGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is InjectedAlign) { var buffer = StringBuffer(); buffer.write('Align('); @@ -23,7 +23,7 @@ class PBAlignGenerator extends PBGenerator { try { buffer.write( - 'child: ${manager.generate(source.child, type: source.builder_type ?? BUILDER_TYPE.BODY)},'); + 'child: ${source.child.generator.generate(source.child, generatorContext)},'); } catch (e, stackTrace) { MainInfo().sentry.captureException( exception: e, diff --git a/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart b/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart index 6a957b82..d05bb693 100644 --- a/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart @@ -1,5 +1,8 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.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/input/sketch/helper/symbol_node_mixin.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/inherited_bitmap.dart'; @@ -11,10 +14,15 @@ class PBBitmapGenerator extends PBGenerator { } @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { var buffer = StringBuffer(); + buffer.write('Image.asset('); + if(SN_UUIDtoVarName.containsKey('${source.UUID}_image')){ + buffer.write('${SN_UUIDtoVarName[source.UUID + '_image']} ?? '); + } buffer.write( - 'Image.asset(\'assets/${source is InheritedBitmap ? source.referenceImage : ('images/' + source.UUID + '.png')}\', ${_sizehelper.generate(source)})'); + '\'assets/${source is InheritedBitmap ? source.referenceImage : ('images/' + source.UUID + '.png')}\', ${_sizehelper.generate(source, generatorContext)})'); return buffer.toString(); } } diff --git a/lib/generation/generators/visual-widgets/pb_container_gen.dart b/lib/generation/generators/visual-widgets/pb_container_gen.dart index e5a00801..2a69305c 100644 --- a/lib/generation/generators/visual-widgets/pb_container_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_container_gen.dart @@ -1,33 +1,34 @@ import 'package:parabeac_core/generation/generators/attribute-helper/pb_box_decoration_gen_helper.dart'; import 'package:parabeac_core/generation/generators/attribute-helper/pb_color_gen_helper.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.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/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import '../pb_flutter_generator.dart'; - class PBContainerGenerator extends PBGenerator { String color; PBContainerGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { var buffer = StringBuffer(); buffer.write('Container('); - buffer.write(PBSizeHelper().generate(source)); + buffer.write(PBSizeHelper().generate(source, generatorContext)); - if (source.borderInfo != null && source.borderInfo.isNotEmpty) { - buffer.write(PBBoxDecorationHelper().generate(source)); + if (source.auxiliaryData.borderInfo != null && + source.auxiliaryData.borderInfo.isNotEmpty) { + buffer.write(PBBoxDecorationHelper().generate(source, generatorContext)); } else { - buffer.write(PBColorGenHelper().generate(source)); + buffer.write(PBColorGenHelper().generate(source, generatorContext)); } - if (source.alignment != null) { + if (source.auxiliaryData.alignment != null) { buffer.write( - 'alignment: Alignment(${(source.alignment['alignX'] as double).toStringAsFixed(2)}, ${(source.alignment['alignY'] as double).toStringAsFixed(2)}),'); + 'alignment: Alignment(${(source.auxiliaryData.alignment['alignX'] as double).toStringAsFixed(2)}, ${(source.auxiliaryData.alignment['alignY'] as double).toStringAsFixed(2)}),'); } if (source.child != null) { @@ -36,7 +37,7 @@ class PBContainerGenerator extends PBGenerator { source.child.bottomRightCorner = Point(source.bottomRightCorner.x, source.bottomRightCorner.y); var statement = source.child != null - ? 'child: ${manager.generate(source.child, type: source.builder_type ?? BUILDER_TYPE.BODY)}' + ? 'child: ${source.child.generator.generate(source.child, generatorContext)}' : ''; buffer.write(statement); } diff --git a/lib/generation/generators/visual-widgets/pb_cupertino_search_bar.dart b/lib/generation/generators/visual-widgets/pb_cupertino_search_bar.dart deleted file mode 100644 index b95dd4ab..00000000 --- a/lib/generation/generators/visual-widgets/pb_cupertino_search_bar.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:parabeac_core/eggs/injected_app_bar.dart'; -import 'package:parabeac_core/generation/generators/pb_generator.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; - -class PBCupertinoSearchBar extends PBGenerator { - PBCupertinoSearchBar() : super(); - - @override - String generate(PBIntermediateNode source) { - if (source is InjectedNavbar) { - var buffer = StringBuffer(); - buffer.write('AppBar('); - if (source.leadingItem != null) { - buffer.write('leading: ${source.leadingItem}'); - } - if (source.middleItem != null) { - buffer.write('middleItem: ${source.middleItem}'); - } - if (source.trailingItem) { - buffer.write('trailingItem: ${source.trailingItem}'); - } - buffer.write(')'); - return buffer.toString(); - } - return ''; - } -} diff --git a/lib/generation/generators/visual-widgets/pb_flexible_gen.dart b/lib/generation/generators/visual-widgets/pb_flexible_gen.dart index 2672bf1a..720f2f33 100644 --- a/lib/generation/generators/visual-widgets/pb_flexible_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_flexible_gen.dart @@ -1,25 +1,24 @@ -import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/alignments/flexible.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:quick_log/quick_log.dart'; -import '../pb_flutter_generator.dart'; - class PBFlexibleGenerator extends PBGenerator { var log = Logger('Flexible Generator'); PBFlexibleGenerator() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is Flexible) { var buffer = StringBuffer(); buffer.write('Flexible('); buffer.write('flex: ${source.flex},'); try { buffer.write( - 'child: ${manager.generate(source.child, type: source.builder_type ?? BUILDER_TYPE.BODY)},'); - } catch (e, stackTrace) { + 'child: ${source.child.generator.generate(source.child, generatorContext)},'); + } catch (e) { log.error(e.toString()); } buffer.write(')'); diff --git a/lib/generation/generators/visual-widgets/pb_padding_gen.dart b/lib/generation/generators/visual-widgets/pb_padding_gen.dart index af1264ec..c2aaa7fe 100644 --- a/lib/generation/generators/visual-widgets/pb_padding_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_padding_gen.dart @@ -1,28 +1,30 @@ import 'dart:mirrors'; - +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/pb_template_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/template_strategy/stateless_template_strategy.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/alignments/padding.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 '../pb_flutter_generator.dart'; import '../pb_generator.dart'; class PBPaddingGen extends PBGenerator { PBPaddingGen() : super(); - String relativePadding(BUILDER_TYPE type, bool isVertical, double value) { + String relativePadding( + TemplateStrategy strategy, bool isVertical, double value) { var fixedValue = value.toStringAsFixed(2); - if ((type != null) && (type != BUILDER_TYPE.SYMBOL_MASTER)) { - var property = isVertical ? 'height' : 'width'; - return 'MediaQuery.of(context).size.$property * $fixedValue'; + if (strategy is StatelessTemplateStrategy) { + return 'constraints.max' + + (isVertical ? 'Height' : 'Width') + + ' * $fixedValue'; } - - return '$fixedValue'; + return 'MediaQuery.of(context).size.' + + (isVertical ? 'height' : 'width') + + ' * $fixedValue'; } @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (!(source is Padding)) { return ''; } @@ -31,9 +33,10 @@ class PBPaddingGen extends PBGenerator { buffer.write('Padding('); buffer.write('padding: EdgeInsets.only('); - final paddingPositions = ['left', 'right', 'bottom', 'top']; + final paddingPositionsW = ['left', 'right']; + final paddingPositionsH = ['bottom', 'top']; var reflectedPadding = reflect(padding); - for (var position in paddingPositions) { + for (var position in paddingPositionsW) { var value = reflectedPadding.getField(Symbol(position)).reflectee; var isVertical = false; if (position == 'top' || position == 'bottom') { @@ -41,14 +44,23 @@ class PBPaddingGen extends PBGenerator { } if (value != null) { buffer.write( - '$position: ${relativePadding(source.builder_type ?? BUILDER_TYPE.BODY, isVertical, value)},'); + '$position: ${relativePadding(source.generator.templateStrategy, isVertical, value)},'); + } + } + + for (var position in paddingPositionsH) { + var value = reflectedPadding.getField(Symbol(position)).reflectee; + if (value != null) { + buffer.write( + '$position: ${relativePadding(source.generator.templateStrategy, true, value)},'); } } + buffer.write('),'); if (source.child != null) { buffer.write( - 'child: ${manager.generate(source.child, type: source.builder_type ?? BUILDER_TYPE.BODY)}'); + 'child: ${source.child.generator.generate(source.child, generatorContext)}'); } buffer.write(')'); diff --git a/lib/generation/generators/visual-widgets/pb_positioned_gen.dart b/lib/generation/generators/visual-widgets/pb_positioned_gen.dart index 638ddb0f..a7253c5d 100644 --- a/lib/generation/generators/visual-widgets/pb_positioned_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_positioned_gen.dart @@ -1,33 +1,60 @@ import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; 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/interpret_and_optimize/entities/alignments/injected_positioned.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:quick_log/quick_log.dart'; -import '../pb_flutter_generator.dart'; - class PBPositionedGenerator extends PBGenerator { PBPositionedGenerator() : super(); var log = Logger('Positioned Generator'); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is InjectedPositioned) { var buffer = StringBuffer(); buffer.write('Positioned('); + var hAlignValue = source.horizontalAlignValue; + var vAlignValue = source.verticalAlignValue; + var multStringH = ''; + var multStringV = ''; + + // TODO: this should be for all widgets once LayoutBuilder and constraints are used + if (source.generator.templateStrategy is StatelessTemplateStrategy) { + if (source.currentContext?.screenTopLeftCorner?.x != null && + source.currentContext?.screenBottomRightCorner?.x != null) { + var screenWidth = ((source.currentContext?.screenTopLeftCorner?.x) - + (source.currentContext?.screenBottomRightCorner?.x)) + .abs(); + multStringH = 'constraints.maxWidth * '; + hAlignValue = hAlignValue / screenWidth; + } + + if (source.currentContext?.screenTopLeftCorner?.y != null && + source.currentContext?.screenBottomRightCorner?.y != null) { + var screenHeight = ((source.currentContext.screenTopLeftCorner.y) - + (source.currentContext.screenBottomRightCorner.y)) + .abs(); + multStringV = 'constraints.maxHeight * '; + vAlignValue = vAlignValue / screenHeight; + } + } + if (source.horizontalAlignValue != null) { buffer.write( - '${source.horizontalAlignType} :${source.horizontalAlignValue},'); + '${source.horizontalAlignType}: ${multStringH}${hAlignValue},'); } if (source.verticalAlignValue != null) { buffer.write( - '${source.verticalAlignType} :${source.verticalAlignValue},'); + '${source.verticalAlignType} :${multStringV}${vAlignValue},'); } try { buffer.write( - 'child: ${manager.generate(source.child, type: source.builder_type ?? BUILDER_TYPE.BODY)},'); + 'child: ${source.child.generator.generate(source.child, generatorContext)},'); } catch (e, stackTrace) { MainInfo().sentry.captureException( exception: e, diff --git a/lib/generation/generators/visual-widgets/pb_shape_group_gen.dart b/lib/generation/generators/visual-widgets/pb_shape_group_gen.dart index 824455a9..fc8418fd 100644 --- a/lib/generation/generators/visual-widgets/pb_shape_group_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_shape_group_gen.dart @@ -1,3 +1,4 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.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/inherited_shape_group.dart'; @@ -10,7 +11,8 @@ class PBShapeGroupGen extends PBGenerator { } @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is InheritedShapeGroup) { var buffer = StringBuffer(); buffer.write( diff --git a/lib/generation/generators/visual-widgets/pb_spacer_gen.dart b/lib/generation/generators/visual-widgets/pb_spacer_gen.dart index dc1a4470..24ecc350 100644 --- a/lib/generation/generators/visual-widgets/pb_spacer_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_spacer_gen.dart @@ -1,16 +1,20 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/alignments/spacer.dart'; + class PBSpacerGenerator extends PBGenerator { PBSpacerGenerator() : super(); @override - String generate(PBIntermediateNode source) { - if(source is Spacer){ - var buffer = StringBuffer(); - buffer.write('Spacer('); - buffer.write('flex: ${source.flex},'); - buffer.write(')'); - return buffer.toString();} + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { + if (source is Spacer) { + var buffer = StringBuffer(); + buffer.write('Spacer('); + buffer.write('flex: ${source.flex},'); + buffer.write(')'); + return buffer.toString(); + } } } diff --git a/lib/generation/generators/visual-widgets/pb_text_gen.dart b/lib/generation/generators/visual-widgets/pb_text_gen.dart index 9d000dca..27df99bb 100644 --- a/lib/generation/generators/visual-widgets/pb_text_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_text_gen.dart @@ -1,12 +1,17 @@ +import 'package:parabeac_core/design_logic/color.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; +import 'package:parabeac_core/input/sketch/helper/symbol_node_mixin.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_text.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'; -class PBTextGen extends PBGenerator { +class PBTextGen extends PBGenerator with PBColorMixin { PBTextGen() : super(); @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { if (source is InheritedText) { var buffer = StringBuffer(); buffer.write('Text(\n'); @@ -15,10 +20,18 @@ class PBTextGen extends PBGenerator { var text = source.text; buffer.write('$text, \n'); } else { + if (SN_UUIDtoVarName.containsKey('${source.UUID}_stringValue')) { + buffer.write('${SN_UUIDtoVarName[source.UUID + '_stringValue']} ?? '); + } buffer .write(('\'${source.text?.replaceAll('\n', ' ') ?? ''}\'') + ',\n'); } - buffer.write('style: TextStyle(\n'); + buffer.write('style: '); + if(SN_UUIDtoVarName.containsKey('${source.UUID}_textStyle')){ + buffer.write(SN_UUIDtoVarName[source.UUID + '_textStyle']); + } + + buffer.write('TextStyle(\n'); if (source.fontName != null) { buffer.write('fontFamily: \'${source.fontName}\',\n'); } @@ -26,7 +39,8 @@ class PBTextGen extends PBGenerator { buffer.write('fontSize: ${source.fontSize.toString()},\n'); } if (source.fontWeight != null) { - buffer.write('fontWeight: FontWeight.${source.fontWeight.toString()},\n'); + buffer + .write('fontWeight: FontWeight.${source.fontWeight.toString()},\n'); } if (source.fontStyle != null) { buffer.write('fontStyle: FontStyle.${source.fontStyle},\n'); @@ -34,11 +48,12 @@ class PBTextGen extends PBGenerator { if (source.letterSpacing != null) { buffer.write('letterSpacing: ${source.letterSpacing},\n'); } - if (source.color != null) { - if (findDefaultColor(source.color) == null) { - buffer.write('color: Color(${source.color}),'); + if (source.auxiliaryData.color != null) { + if (findDefaultColor(source.auxiliaryData.color) == null) { + buffer.write('color: Color(${source.auxiliaryData.color}),'); } else { - buffer.write('color: ${findDefaultColor(source.color)},'); + buffer + .write('color: ${findDefaultColor(source.auxiliaryData.color)},'); } } @@ -52,16 +67,4 @@ class PBTextGen extends PBGenerator { } return ''; } - - String findDefaultColor(String hex) { - switch (hex) { - case '0xffffffff': - return 'Colors.white'; - break; - case '0xff000000': - return 'Colors.black'; - break; - } - return null; - } } diff --git a/lib/generation/generators/pb_flutter_writer.dart b/lib/generation/generators/writers/pb_flutter_writer.dart similarity index 82% rename from lib/generation/generators/pb_flutter_writer.dart rename to lib/generation/generators/writers/pb_flutter_writer.dart index 5825f5b2..b4dd8718 100644 --- a/lib/generation/generators/pb_flutter_writer.dart +++ b/lib/generation/generators/writers/pb_flutter_writer.dart @@ -1,8 +1,15 @@ import 'dart:io'; import 'package:parabeac_core/controllers/main_info.dart'; -import 'package:parabeac_core/generation/generators/pb_page_writer.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +///Responsible for writing code into files in the desired folder structure class PBFlutterWriter implements PBPageWriter { + PBFlutterWriter._internal(); + + static final PBFlutterWriter _instance = PBFlutterWriter._internal(); + + factory PBFlutterWriter() => _instance; + @override Map dependencies = {}; @override @@ -12,7 +19,7 @@ class PBFlutterWriter implements PBPageWriter { ///[fileAbsPath] should be the absolute path of the file @override void write(String code, String fileAbsPath) { - File(fileAbsPath).createSync(); + File(fileAbsPath).createSync(recursive: true); var writer = File(fileAbsPath); writer.writeAsStringSync(code); } @@ -66,6 +73,7 @@ class MyApp extends StatelessWidget { writeYaml.writeln(readYaml[i]); } await writeYaml.flush(); + dependencies.clear(); // Clear dependencies to prevent duplicates } } } diff --git a/lib/generation/generators/pb_page_writer.dart b/lib/generation/generators/writers/pb_page_writer.dart similarity index 100% rename from lib/generation/generators/pb_page_writer.dart rename to lib/generation/generators/writers/pb_page_writer.dart diff --git a/lib/generation/generators/writers/pb_traversal_adapter_writer.dart b/lib/generation/generators/writers/pb_traversal_adapter_writer.dart new file mode 100644 index 00000000..67987ac4 --- /dev/null +++ b/lib/generation/generators/writers/pb_traversal_adapter_writer.dart @@ -0,0 +1,17 @@ +import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; + +/// Adapter used to traverse trees using generation +/// without actually writing to the tree itself. +/// +/// TODO: add more detail to purpose of empty methods. +class PBTraversalAdapterWriter extends PBPageWriter { + @override + void addDependency(String packageName, String version) { + return; + } + + @override + void write(String code, String fileName) { + return; + } +} diff --git a/lib/generation/pre-generation/pre_generation_service.dart b/lib/generation/pre-generation/pre_generation_service.dart new file mode 100644 index 00000000..b94ae273 --- /dev/null +++ b/lib/generation/pre-generation/pre_generation_service.dart @@ -0,0 +1,27 @@ +import 'package:archive/archive.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/flutter_project_builder.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_state_management_linker.dart'; + +/// Singleton class that leverages the traversal adapter +/// to traverse and save metadata to the Tree +class PreGenerationService extends FlutterProjectBuilder { + PreGenerationService({ + String projectName, + PBProject mainTree, + PBPageWriter pageWriter, + }) : super( + projectName: projectName, + mainTree: mainTree, + pageWriter: pageWriter, + ); + + @override + Future convertToFlutterProject({List rawImages}) async { + // TODO: This could be moved one level up to Controllers since + // it is currently in here and FlutterProjectBuilder + await Future.wait(PBStateManagementLinker().stateQueue); + await generationConfiguration.generateProject(mainTree); + } +} diff --git a/lib/generation/prototyping/pb_prototype_gen.dart b/lib/generation/prototyping/pb_prototype_gen.dart index 86656d1a..63246a23 100644 --- a/lib/generation/prototyping/pb_prototype_gen.dart +++ b/lib/generation/prototyping/pb_prototype_gen.dart @@ -1,4 +1,4 @@ -import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_storage.dart'; @@ -13,7 +13,8 @@ class PBPrototypeGenerator extends PBGenerator { } @override - String generate(PBIntermediateNode source) { + String generate( + PBIntermediateNode source, GeneratorContext generatorContext) { var name = _storage.getPageNodeById(prototypeNode.destinationUUID)?.name; if (name != null && name.isNotEmpty) { return '''GestureDetector( @@ -23,11 +24,10 @@ class PBPrototypeGenerator extends PBGenerator { MaterialPageRoute(builder: (context) => ${name}()), ); }, - child: ${manager.generate(source.child, type: source.builder_type ?? BUILDER_TYPE.BODY)}, + child: ${source.child.generator.generate(source.child, generatorContext)}, )'''; } else { - return manager.generate(source.child, - type: source.builder_type ?? BUILDER_TYPE.BODY); + return source.child.generator.generate(source.child, generatorContext); } } } diff --git a/lib/input/figma/entities/abstract_figma_node_factory.dart b/lib/input/figma/entities/abstract_figma_node_factory.dart index 24f23a5e..00dcecdf 100644 --- a/lib/input/figma/entities/abstract_figma_node_factory.dart +++ b/lib/input/figma/entities/abstract_figma_node_factory.dart @@ -12,6 +12,7 @@ import 'package:parabeac_core/input/figma/entities/layers/star.dart'; import 'package:parabeac_core/input/figma/entities/layers/text.dart'; import 'layers/figma_node.dart'; +import 'layers/regular_polygon.dart'; import 'layers/vector.dart'; class AbstractFigmaNodeFactory { @@ -31,6 +32,7 @@ class AbstractFigmaNodeFactory { FigmaStar(), FigmaText(), FigmaVector(), + FigmaRegularPolygon(), ]; AbstractFigmaNodeFactory(); diff --git a/lib/input/figma/entities/layers/component.dart b/lib/input/figma/entities/layers/component.dart index 9210c145..fc81e2dd 100644 --- a/lib/input/figma/entities/layers/component.dart +++ b/lib/input/figma/entities/layers/component.dart @@ -81,12 +81,26 @@ class Component extends FigmaFrame @override Map toJson() => _$ComponentToJson(this); - List _extractParameters() => - overrideProperties?.map((prop) { + List _extractParameters() { + Set ovrNames = {}; + List sharedParameters = []; + overrideProperties ??= []; + for (var prop in overrideProperties) { + if (!ovrNames.contains(prop.overrideName)) { var properties = extractParameter(prop.overrideName); - return PBSharedParameterProp( - properties[0], null, prop.canOverride, name, properties[1]); - })?.toList(); + sharedParameters.add(PBSharedParameterProp( + name, + properties['type'], + null, + prop.canOverride, + prop.overrideName, + properties['uuid'], + properties['default_value'])); + ovrNames.add(prop.overrideName); + } + } + return sharedParameters; + } @override Future interpretNode(PBContext currentContext) { diff --git a/lib/input/figma/entities/layers/regular_polygon.dart b/lib/input/figma/entities/layers/regular_polygon.dart index c1b404de..9e40b05f 100644 --- a/lib/input/figma/entities/layers/regular_polygon.dart +++ b/lib/input/figma/entities/layers/regular_polygon.dart @@ -1,6 +1,7 @@ import 'package:parabeac_core/input/figma/entities/abstract_figma_node_factory.dart'; import 'package:parabeac_core/input/figma/entities/layers/vector.dart'; import 'package:parabeac_core/input/sketch/entities/objects/frame.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/inherited_bitmap.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:json_annotation/json_annotation.dart'; @@ -57,7 +58,12 @@ class FigmaRegularPolygon extends FigmaVector @override Future interpretNode(PBContext currentContext) { - // TODO: implement interpretNode - throw UnimplementedError(); + imageReference = addToImageQueue(UUID); + + return Future.value( + InheritedBitmap(this, name, currentContext: currentContext)); } + + @override + String imageReference; } diff --git a/lib/input/helper/node_tree.dart b/lib/input/helper/node_tree.dart index 2de786d3..16fc5be6 100644 --- a/lib/input/helper/node_tree.dart +++ b/lib/input/helper/node_tree.dart @@ -1,4 +1,5 @@ import 'package:parabeac_core/input/helper/page.dart'; +import 'package:parabeac_core/input/sketch/entities/style/shared_style.dart'; import 'package:quick_log/quick_log.dart'; abstract class NodeTree { @@ -8,6 +9,7 @@ abstract class NodeTree { List pages = []; List miscPages = []; + List sharedStyles = []; Map toJson() { var result = {}; @@ -18,6 +20,11 @@ abstract class NodeTree { for (var page in miscPages) { result.addAll(page.toJson()); } + + for (var sharedStyle in sharedStyles) { + result.addAll(sharedStyle.toJson()); + } + return result; } } diff --git a/lib/input/helper/page.dart b/lib/input/helper/page.dart index 6f499eba..94bdbc0c 100644 --- a/lib/input/helper/page.dart +++ b/lib/input/helper/page.dart @@ -18,7 +18,7 @@ class Page { } List getPageItems() { - log.info('We encountered a page that has 0 page items.'); + log.info('We encountered a page that has ${_pageItems.length} page items.'); return _pageItems; } diff --git a/lib/input/sketch/entities/layers/abstract_layer.dart b/lib/input/sketch/entities/layers/abstract_layer.dart index 852d1154..92a6dc72 100644 --- a/lib/input/sketch/entities/layers/abstract_layer.dart +++ b/lib/input/sketch/entities/layers/abstract_layer.dart @@ -33,7 +33,7 @@ abstract class SketchNode implements DesignNode { final bool nameIsFixed; final dynamic resizingConstraint; final dynamic resizingType; - final double rotation; + final num rotation; final dynamic sharedStyleID; final bool shouldBreakMaskChain; final bool hasClippingMask; diff --git a/lib/input/sketch/entities/layers/sketch_text.dart b/lib/input/sketch/entities/layers/sketch_text.dart index bd475ac4..d0375dbd 100644 --- a/lib/input/sketch/entities/layers/sketch_text.dart +++ b/lib/input/sketch/entities/layers/sketch_text.dart @@ -4,12 +4,13 @@ import 'package:parabeac_core/input/sketch/entities/layers/abstract_layer.dart'; import 'package:parabeac_core/input/sketch/entities/layers/flow.dart'; import 'package:parabeac_core/input/sketch/entities/objects/frame.dart'; import 'package:parabeac_core/input/sketch/entities/style/style.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/inherited_container.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_text.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:json_annotation/json_annotation.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; +import 'package:uuid/uuid.dart'; part 'sketch_text.g.dart'; @@ -123,12 +124,12 @@ class SketchText extends SketchNode implements SketchNodeFactory, Text { @override Future interpretNode(PBContext currentContext) => - Future.value(InheritedContainer( - this, - Point(boundaryRectangle.x, boundaryRectangle.y), + Future.value(InjectedContainer( Point(boundaryRectangle.x + boundaryRectangle.width, boundaryRectangle.y + boundaryRectangle.height), + Point(boundaryRectangle.x, boundaryRectangle.y), name, + Uuid().v4(), currentContext: currentContext, )..addChild( InheritedText(this, name, currentContext: currentContext), diff --git a/lib/input/sketch/entities/layers/symbol_instance.dart b/lib/input/sketch/entities/layers/symbol_instance.dart index d4938571..dcd278f9 100644 --- a/lib/input/sketch/entities/layers/symbol_instance.dart +++ b/lib/input/sketch/entities/layers/symbol_instance.dart @@ -10,6 +10,7 @@ import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; + part 'symbol_instance.g.dart'; // title: Symbol Instance Layer @@ -114,16 +115,28 @@ class SymbolInstance extends SketchNode @override SketchNode createSketchNode(Map json) => SymbolInstance.fromJson(json); + factory SymbolInstance.fromJson(Map json) => _$SymbolInstanceFromJson(json); + @override Map toJson() => _$SymbolInstanceToJson(this); ///Converting the [OverridableValue] into [PBSharedParameterValue] to be processed in intermediate phase. - List _extractParameters() => overrideValues?.map((e) { - var properties = extractParameter(e.overrideName); - return PBSharedParameterValue(properties[0], e.value, properties[1]); - })?.toList(); + List _extractParameters() { + Set ovrNames = {}; + List sharedParameters = []; + for (var overrideValue in overrideValues) { + if (!ovrNames.contains(overrideValue.overrideName)) { + var properties = extractParameter(overrideValue.overrideName); + sharedParameters.add(PBSharedParameterValue( + properties['type'], overrideValue.value, properties['uuid'], overrideValue.overrideName)); + ovrNames.add(overrideValue.overrideName); + } + } + + return sharedParameters; + } @override Future interpretNode(PBContext currentContext) { diff --git a/lib/input/sketch/entities/layers/symbol_master.dart b/lib/input/sketch/entities/layers/symbol_master.dart index 817997d8..56555d63 100644 --- a/lib/input/sketch/entities/layers/symbol_master.dart +++ b/lib/input/sketch/entities/layers/symbol_master.dart @@ -140,9 +140,9 @@ class SymbolMaster extends AbstractGroupLayer userInfo, style, maintainScrollPosition) { - this.name = name - ?.replaceAll(RegExp(r'[\W]'), '') - ?.replaceFirst(RegExp(r'^([\d]|_)+'), ''); + this.name = name?.replaceAll(RegExp(r'[\d\s_\+]'), ''); + // ?.replaceFirst(RegExp(r'^([\d]|_)+'), ''); + // someElement/default } @override @@ -157,12 +157,25 @@ class SymbolMaster extends AbstractGroupLayer Map toJson() => _$SymbolMasterToJson(this); ///Converting the [OverridableProperty] into [PBSharedParameterProp] to be processed in intermediate phase. - List _extractParameters() => - overrideProperties?.map((prop) { - var properties = extractParameter(prop.overrideName); - return PBSharedParameterProp( - properties[0], null, prop.canOverride, name, properties[1]); - })?.toList(); + List _extractParameters() { + Set ovrNames = {}; + List sharedParameters = []; + for (var prop in overrideProperties) { + if (!ovrNames.contains(prop.overrideName)) { + var properties = AddMasterSymbolName(prop.overrideName, children); + sharedParameters.add(PBSharedParameterProp( + properties['name'], + properties['type'], + null, + prop.canOverride, + prop.overrideName, + properties['uuid'], + properties['default_value'])); + ovrNames.add(prop.overrideName); + } + } + return sharedParameters; + } @override Future interpretNode(PBContext currentContext) { diff --git a/lib/input/sketch/entities/style/shared_style.dart b/lib/input/sketch/entities/style/shared_style.dart new file mode 100644 index 00000000..5f6bf21f --- /dev/null +++ b/lib/input/sketch/entities/style/shared_style.dart @@ -0,0 +1,83 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:parabeac_core/design_logic/color.dart'; +import 'package:parabeac_core/input/sketch/entities/style/font_descriptor.dart'; +import 'package:parabeac_core/input/sketch/entities/style/style.dart'; +import 'package:recase/recase.dart'; + +part 'shared_style.g.dart'; + +Map SharedStyle_UUIDToName = {}; + +@JsonSerializable(nullable: true) +class SharedStyle with PBColorMixin { + @JsonKey(name: '_class') + final String classField; + @override + @JsonKey(name: 'do_objectID') + String UUID; + @JsonKey(name: 'name') + String name; + @JsonKey(name: 'value') + Style style; + + SharedStyle({ + this.classField, + this.UUID, + this.name, + this.style, + }) { + name = name.pascalCase; + SharedStyle_UUIDToName[UUID] = name.replaceAll(RegExp(r'[^A-Za-z0-9_]',), ''); + } + + String generate() { + + var buffer = StringBuffer(); + + if (style != null) { + // TODO: implement SharedStyle.style to flutter style parameters. + if (style.textStyle != null) { + var source = style.textStyle; + var fontDescriptor = source.fontDescriptor as FontDescriptor; + buffer.write('TextStyle ${name} = TextStyle(\n'); + if (fontDescriptor.fontName != null) { + buffer.write('fontFamily: \'${source.fontDescriptor.fontName}\',\n'); + } + if (fontDescriptor.fontSize != null) { + buffer.write('fontSize: ${fontDescriptor.fontSize.toString()},\n'); + } + if (fontDescriptor.fontWeight != null) { + buffer.write( + 'fontWeight: FontWeight.${fontDescriptor.fontWeight + .toString()},\n'); + } + + if (fontDescriptor.fontStyle != null) { + buffer.write('fontStyle: FontStyle.${fontDescriptor.fontStyle},\n'); + } + if (fontDescriptor.letterSpacing != null) { + buffer.write('letterSpacing: ${fontDescriptor.letterSpacing},\n'); + } + + if (source.fontColor != null) { + var color = toHex(source.fontColor); + var defColor = findDefaultColor(color); + if (defColor == null) { + buffer.write('color: Color(${color}),'); + } else { + buffer.write('color: ${defColor},'); + } + } + + buffer.write(');\n'); + } + } + + return buffer.toString(); + + } + + factory SharedStyle.fromJson(Map json) => _$SharedStyleFromJson(json); + Map toJson() => _$SharedStyleToJson(this); + +} diff --git a/lib/input/sketch/entities/style/shared_style.g.dart b/lib/input/sketch/entities/style/shared_style.g.dart new file mode 100644 index 00000000..7588e51c --- /dev/null +++ b/lib/input/sketch/entities/style/shared_style.g.dart @@ -0,0 +1,26 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'shared_style.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +SharedStyle _$SharedStyleFromJson(Map json) { + return SharedStyle( + classField: json['_class'] as String, + UUID: json['do_objectID'] as String, + name: json['name'] as String, + style: json['value'] == null + ? null + : Style.fromJson(json['value'] as Map), + ); +} + +Map _$SharedStyleToJson(SharedStyle instance) => + { + '_class': instance.classField, + 'do_objectID': instance.UUID, + 'name': instance.name, + 'value': instance.style, + }; diff --git a/lib/input/sketch/helper/sketch_node_tree.dart b/lib/input/sketch/helper/sketch_node_tree.dart index 22059ce7..2abb5ced 100644 --- a/lib/input/sketch/helper/sketch_node_tree.dart +++ b/lib/input/sketch/helper/sketch_node_tree.dart @@ -1,12 +1,17 @@ import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/controllers/sketch_controller.dart'; import 'package:parabeac_core/input/helper/node_tree.dart'; import 'package:parabeac_core/input/sketch/entities/documents/document.dart'; import 'package:parabeac_core/input/sketch/entities/layers/page.dart'; import 'package:parabeac_core/input/sketch/entities/objects/foreign_symbol.dart'; +import 'package:parabeac_core/input/sketch/entities/style/shared_style.dart'; +import 'package:parabeac_core/input/sketch/entities/style/style.dart'; +import 'package:parabeac_core/input/sketch/entities/style/text_style.dart'; import 'package:parabeac_core/input/sketch/helper/sketch_page.dart'; import 'package:parabeac_core/input/sketch/helper/sketch_page_item.dart'; import 'dart:convert'; import 'package:archive/archive.dart'; +import 'package:parabeac_core/input/sketch/services/input_design.dart'; import 'package:quick_log/quick_log.dart'; class SketchNodeTree extends NodeTree { @@ -19,22 +24,56 @@ class SketchNodeTree extends NodeTree { @override bool debug = false; - final Archive _originalArchive; + final InputDesignService _ids; + Archive _originalArchive; final Map _pagesAndArtboards; - SketchNodeTree( - this._originalArchive, this._pagesAndArtboards, this.projectName) { + SketchNodeTree(this._ids, this._pagesAndArtboards, this.projectName) { + _originalArchive = _ids.archive; miscPages.add(_setThirdPartySymbols()); + sharedStyles = _setSharedStyles(); pages.addAll(_setConventionalPages(_pagesAndArtboards)); if (debug) { print(pages); } } + List _setSharedStyles() { + try { + List sharedStyles = []; + var jsonData = _ids.documentFile; + var doc = Document.fromJson(jsonData); + if (doc.layerStyles != null) { + var LayerStyles = doc.layerStyles['objects'] ?? []; + for (var sharedStyle in LayerStyles) { + var layerStyle = SharedStyle.fromJson(sharedStyle); + sharedStyles.add(layerStyle); + } + } + + if (doc.layerTextStyles != null) { + var LayerTextStyles = doc.layerTextStyles['objects'] ?? []; + + for (var sharedStyle in LayerTextStyles) { + var layerTextStyle = SharedStyle.fromJson(sharedStyle); + sharedStyles.add(layerTextStyle); + } + } + + return sharedStyles; + } catch (e, stackTrace) { + MainInfo().sentry.captureException( + exception: e, + stackTrace: stackTrace, + ); + log.error(e.toString()); + return null; + } + + } + SketchPage _setThirdPartySymbols() { try { - var doc_page = _originalArchive.findFile('document.json').content; - assert(doc_page != null, "Document page from Sketch doesn't exist."); - var jsonData = json.decode(utf8.decode(doc_page)); + var jsonData = _ids.documentFile; var doc = Document.fromJson(jsonData); var foreignLayers = doc.foreignSymbols ?? []; var pg = SketchPage('third_party_widgets'); diff --git a/lib/input/sketch/helper/symbol_node_mixin.dart b/lib/input/sketch/helper/symbol_node_mixin.dart index 7eb70796..144057c6 100644 --- a/lib/input/sketch/helper/symbol_node_mixin.dart +++ b/lib/input/sketch/helper/symbol_node_mixin.dart @@ -1,12 +1,73 @@ +import 'dart:core'; +import 'package:parabeac_core/input/sketch/entities/layers/abstract_group_layer.dart'; +import 'package:parabeac_core/input/sketch/entities/layers/abstract_layer.dart'; +import 'package:parabeac_core/input/sketch/entities/style/style.dart'; +import 'package:parabeac_core/input/sketch/entities/style/text_style.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_bitmap.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; +import 'package:recase/recase.dart'; + +// both need to be global because a symbol instance could have multiple master symbols with name conflicts +Map SN_UUIDtoVarName = {}; +Map varNameCount = {}; mixin SymbolNodeMixin { + final Map typeToAbbreviation = { + TextStyle: 'ts', + String: 'str', + Style: 'sty', + InheritedBitmap: 'bm', + PBSharedParameterValue: 'sv', + }; + + // should have been a Map but iterate slowly through the list + String FindName(String uuid, List children, Type type) { + for (var child in children) { + if (child.UUID == uuid) { + var name = ((typeToAbbreviation[type] ?? 'un') + ' ' + (child.name ?? 'var')).camelCase; + return name.replaceAll(RegExp(r'[^A-Za-z0-9_]',), ''); + } + else if (child is AbstractGroupLayer){ + var found = FindName(uuid, child.children, type); + if (found != null) { + return found; + } + } + } + // return null to indicate not found + return null; + } + + Map AddMasterSymbolName(String overrideName, List children){ + + var varName; + var parmInfo = extractParameter(overrideName); + var uuid = parmInfo['uuid']; + + var nodeName = FindName(uuid, children, parmInfo['type']) ?? 'var'; + // only increase count, make new varName if unique UUID + if (!SN_UUIDtoVarName.containsKey(overrideName)) { + var count = varNameCount[nodeName] ?? 0; + varName = nodeName; + varNameCount[nodeName] = count + 1; + // first one doesn't have appended number + if (count > 0) { + varName += count.toString(); + } + SN_UUIDtoVarName[overrideName] = varName; + } else { + varName = SN_UUIDtoVarName[overrideName]; + } + + return {'name': varName, 'type': parmInfo['type'], 'uuid': uuid }; + + } + ///Extracting the UUID of the parameter either from the [SymbolInstance] ///or the [SymbolMaster]. ///The first element in the [List] is going to be the UUID, while ///the second element is going to be the [Type]. - List extractParameter(String overrideName) { + Map extractParameter(String overrideName) { var properties = overrideName.split('_'); assert(properties.length > 1, 'The symbol ($overrideName) parameter does not contain sufficient data'); @@ -22,9 +83,16 @@ mixin SymbolNodeMixin { case 'image': type = InheritedBitmap; break; + case 'textStyle': + type = TextStyle; + break; + case 'style': + type = Style; + break; default: type = String; } - return [type, uuid]; + + return { 'type': type, 'uuid': uuid}; } } diff --git a/lib/input/sketch/services/input_design.dart b/lib/input/sketch/services/input_design.dart index d6745a50..bafe28c7 100644 --- a/lib/input/sketch/services/input_design.dart +++ b/lib/input/sketch/services/input_design.dart @@ -33,7 +33,9 @@ class InputDesignService { Map get documentFile { final doc_page = archive.findFile('document.json').content; - return json.decode(utf8.decode(doc_page)); + assert(doc_page != null, "Document page from Sketch doesn't exist."); + final doc_map = json.decode(utf8.decode(doc_page)); + return doc_map; } ///Getting the images in the sketch file and adding them to the png folder. diff --git a/lib/interpret_and_optimize/entities/alignments/flexible.dart b/lib/interpret_and_optimize/entities/alignments/flexible.dart index 8cefe101..7b4050b6 100644 --- a/lib/interpret_and_optimize/entities/alignments/flexible.dart +++ b/lib/interpret_and_optimize/entities/alignments/flexible.dart @@ -3,23 +3,16 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_inte import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visual_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'flexible.g.dart'; - -@JsonSerializable(nullable: true) class Flexible extends PBVisualIntermediateNode { int flex; var child; @override - @JsonKey(ignore: true) var currentContext; final String UUID; @override - @JsonKey(nullable: true, ignore: false) - //TODO: Find a way to make currentContext required //without breaking the json serializable @@ -40,9 +33,8 @@ class Flexible extends PBVisualIntermediateNode { generator = PBFlexibleGenerator(); } - @JsonKey(ignore: true) Point topLeftCorner; - @JsonKey(ignore: true) + Point bottomRightCorner; @override @@ -51,11 +43,6 @@ class Flexible extends PBVisualIntermediateNode { child = node; } - factory Flexible.fromJson(Map json) => - _$FlexibleFromJson(json); - - Map toJson() => _$FlexibleToJson(this); - @override void alignChild() {} } diff --git a/lib/interpret_and_optimize/entities/alignments/flexible.g.dart b/lib/interpret_and_optimize/entities/alignments/flexible.g.dart deleted file mode 100644 index 597104c3..00000000 --- a/lib/interpret_and_optimize/entities/alignments/flexible.g.dart +++ /dev/null @@ -1,33 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'flexible.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Flexible _$FlexibleFromJson(Map json) { - return Flexible( - json['UUID'] as String, - child: json['child'], - flex: json['flex'] as int, - ) - ..subsemantic = json['subsemantic'] as String - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..name = json['name'] as String - ..color = json['color'] as String; -} - -Map _$FlexibleToJson(Flexible instance) => { - 'subsemantic': instance.subsemantic, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'flex': instance.flex, - 'child': instance.child, - 'UUID': instance.UUID, - }; diff --git a/lib/interpret_and_optimize/entities/injected_align.dart b/lib/interpret_and_optimize/entities/alignments/injected_align.dart similarity index 100% rename from lib/interpret_and_optimize/entities/injected_align.dart rename to lib/interpret_and_optimize/entities/alignments/injected_align.dart diff --git a/lib/interpret_and_optimize/entities/alignments/injected_positioned.dart b/lib/interpret_and_optimize/entities/alignments/injected_positioned.dart index 27ca6966..1d3cff34 100644 --- a/lib/interpret_and_optimize/entities/alignments/injected_positioned.dart +++ b/lib/interpret_and_optimize/entities/alignments/injected_positioned.dart @@ -3,23 +3,16 @@ import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inje 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:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'injected_positioned.g.dart'; - -@JsonSerializable(nullable: true) class InjectedPositioned extends PBIntermediateNode implements PBInjectedIntermediate { - @JsonKey(ignore: true) final PositioningHolder positionedHolder; - @JsonKey(ignore: true) + PBContext currentContext; var child; final String UUID; - - double horizontalAlignValue, verticalAlignValue; String horizontalAlignType, verticalAlignType; @@ -39,11 +32,6 @@ class InjectedPositioned extends PBIntermediateNode 'Tried assigning multiple children to class [InjectedPositioned]'); child = node; } - - factory InjectedPositioned.fromJson(Map json) => - _$InjectedPositionedFromJson(json); - - Map toJson() => _$InjectedPositionedToJson(this); } /// A object to help us communicate positioning type & value. diff --git a/lib/interpret_and_optimize/entities/alignments/injected_positioned.g.dart b/lib/interpret_and_optimize/entities/alignments/injected_positioned.g.dart deleted file mode 100644 index 941998de..00000000 --- a/lib/interpret_and_optimize/entities/alignments/injected_positioned.g.dart +++ /dev/null @@ -1,48 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'injected_positioned.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InjectedPositioned _$InjectedPositionedFromJson(Map json) { - return InjectedPositioned( - json['UUID'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..color = json['color'] as String - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..name = json['name'] as String - ..child = json['child'] - ..horizontalAlignValue = (json['horizontalAlignValue'] as num)?.toDouble() - ..verticalAlignValue = (json['verticalAlignValue'] as num)?.toDouble() - ..horizontalAlignType = json['horizontalAlignType'] as String - ..verticalAlignType = json['verticalAlignType'] as String; -} - -Map _$InjectedPositionedToJson(InjectedPositioned instance) => - { - 'subsemantic': instance.subsemantic, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'color': instance.color, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'child': instance.child, - 'UUID': instance.UUID, - 'horizontalAlignValue': instance.horizontalAlignValue, - 'verticalAlignValue': instance.verticalAlignValue, - 'horizontalAlignType': instance.horizontalAlignType, - 'verticalAlignType': instance.verticalAlignType, - }; diff --git a/lib/interpret_and_optimize/entities/alignments/padding.dart b/lib/interpret_and_optimize/entities/alignments/padding.dart index 40683ad2..e3b2e0e2 100644 --- a/lib/interpret_and_optimize/entities/alignments/padding.dart +++ b/lib/interpret_and_optimize/entities/alignments/padding.dart @@ -3,11 +3,7 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_inte 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/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'padding.g.dart'; - -@JsonSerializable(nullable: true) class Padding extends PBVisualIntermediateNode { var child; double left, right, top, bottom, screenWidth, screenHeight; @@ -16,14 +12,10 @@ class Padding extends PBVisualIntermediateNode { Map padding; @override - @JsonKey(ignore: true) PBContext currentContext; - - - @JsonKey(ignore: true) Point topLeftCorner; - @JsonKey(ignore: true) + Point bottomRightCorner; Padding(this.UUID, @@ -80,9 +72,6 @@ class Padding extends PBVisualIntermediateNode { } } - factory Padding.fromJson(Map json) => _$PaddingFromJson(json); - Map toJson() => _$PaddingToJson(this); - @override void alignChild() {} } diff --git a/lib/interpret_and_optimize/entities/alignments/padding.g.dart b/lib/interpret_and_optimize/entities/alignments/padding.g.dart deleted file mode 100644 index 28f71967..00000000 --- a/lib/interpret_and_optimize/entities/alignments/padding.g.dart +++ /dev/null @@ -1,45 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'padding.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Padding _$PaddingFromJson(Map json) { - return Padding( - json['UUID'] as String, - left: (json['left'] as num)?.toDouble(), - right: (json['right'] as num)?.toDouble(), - top: (json['top'] as num)?.toDouble(), - bottom: (json['bottom'] as num)?.toDouble(), - ) - ..subsemantic = json['subsemantic'] as String - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..name = json['name'] as String - ..color = json['color'] as String - ..child = json['child'] - ..screenWidth = (json['screenWidth'] as num)?.toDouble() - ..screenHeight = (json['screenHeight'] as num)?.toDouble() - ..padding = json['padding'] as Map; -} - -Map _$PaddingToJson(Padding instance) => { - 'subsemantic': instance.subsemantic, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'child': instance.child, - 'left': instance.left, - 'right': instance.right, - 'top': instance.top, - 'bottom': instance.bottom, - 'screenWidth': instance.screenWidth, - 'screenHeight': instance.screenHeight, - 'UUID': instance.UUID, - 'padding': instance.padding, - }; diff --git a/lib/interpret_and_optimize/entities/alignments/spacer.dart b/lib/interpret_and_optimize/entities/alignments/spacer.dart index 501847bb..617161ad 100644 --- a/lib/interpret_and_optimize/entities/alignments/spacer.dart +++ b/lib/interpret_and_optimize/entities/alignments/spacer.dart @@ -2,18 +2,12 @@ import 'package:parabeac_core/generation/generators/visual-widgets/pb_spacer_gen 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/pb_context.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'spacer.g.dart'; - -@JsonSerializable(nullable: true) class Spacer extends PBVisualIntermediateNode { int flex; final String UUID; - @override - @JsonKey(ignore: true) PBContext currentContext; Spacer(topLeftCorner, bottomRightCorner, this.UUID, @@ -28,9 +22,6 @@ class Spacer extends PBVisualIntermediateNode { assert(false, 'Spacer cannot accept any children.'); } - factory Spacer.fromJson(Map json) => _$SpacerFromJson(json); - Map toJson() => _$SpacerToJson(this); - @override void alignChild() {} } diff --git a/lib/interpret_and_optimize/entities/alignments/spacer.g.dart b/lib/interpret_and_optimize/entities/alignments/spacer.g.dart deleted file mode 100644 index 195e991c..00000000 --- a/lib/interpret_and_optimize/entities/alignments/spacer.g.dart +++ /dev/null @@ -1,37 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'spacer.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Spacer _$SpacerFromJson(Map json) { - return Spacer( - json['topLeftCorner'], - json['bottomRightCorner'], - json['UUID'] as String, - flex: json['flex'] as int, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..name = json['name'] as String - ..color = json['color'] as String; -} - -Map _$SpacerToJson(Spacer instance) => { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'flex': instance.flex, - 'UUID': instance.UUID, - }; diff --git a/lib/interpret_and_optimize/entities/cross_axis_alignment.dart b/lib/interpret_and_optimize/entities/cross_axis_alignment.dart deleted file mode 100644 index fa269b49..00000000 --- a/lib/interpret_and_optimize/entities/cross_axis_alignment.dart +++ /dev/null @@ -1,17 +0,0 @@ -// import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; -// import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; - -// class CrossAxisAligment extends PBIntermediateNode{ -// CrossAxisAligment(Point topLeftCorner, Point bottomRightCorner) : super(topLeftCorner, bottomRightCorner); - -// @override -// generateIntermediate() { -// // TODO: implement generateIntermediate -// return null; -// } - -// @override -// void addChild(PBIntermediateNode node) { -// // TODO: implement addChild -// } -// } \ No newline at end of file diff --git a/lib/interpret_and_optimize/entities/inherited_bitmap.dart b/lib/interpret_and_optimize/entities/inherited_bitmap.dart index 4e816547..b95bb026 100644 --- a/lib/interpret_and_optimize/entities/inherited_bitmap.dart +++ b/lib/interpret_and_optimize/entities/inherited_bitmap.dart @@ -9,37 +9,24 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_image_reference_storage.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; import 'package:quick_log/quick_log.dart'; -part 'inherited_bitmap.g.dart'; - -@JsonSerializable(nullable: true) class InheritedBitmap extends PBVisualIntermediateNode implements PBInheritedIntermediate { @override final originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @override - String UUID; - - @JsonKey(ignore: true) var log = Logger('Inherited Bitmap'); - @override - @JsonKey(ignore: true) - PBContext currentContext; - String referenceImage; InheritedBitmap( this.originalRef, String name, { - this.currentContext, + PBContext currentContext, this.referenceImage, }) : super( Point(originalRef.boundaryRectangle.x, @@ -50,7 +37,8 @@ class InheritedBitmap extends PBVisualIntermediateNode originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height), currentContext, - name) { + name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } @@ -60,13 +48,12 @@ class InheritedBitmap extends PBVisualIntermediateNode (originalRef as Image).imageReference == null) { log.debug('NULL BITMAP'); } - UUID = originalRef.UUID; name = (originalRef as Image).imageReference; size = { 'width': originalRef.boundaryRectangle.width, 'height': originalRef.boundaryRectangle.height }; - this.referenceImage = (originalRef as Image).imageReference; + referenceImage = (originalRef as Image).imageReference; ImageReferenceStorage().addReference( originalRef.UUID, '${MainInfo().outputPath}assets/images'); } @@ -81,8 +68,4 @@ class InheritedBitmap extends PBVisualIntermediateNode void alignChild() { return; } - - factory InheritedBitmap.fromJson(Map json) => - _$InheritedBitmapFromJson(json); - Map toJson() => _$InheritedBitmapToJson(this); } diff --git a/lib/interpret_and_optimize/entities/inherited_bitmap.g.dart b/lib/interpret_and_optimize/entities/inherited_bitmap.g.dart deleted file mode 100644 index 6cff06e7..00000000 --- a/lib/interpret_and_optimize/entities/inherited_bitmap.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_bitmap.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedBitmap _$InheritedBitmapFromJson(Map json) { - return InheritedBitmap( - json['originalRef'], - json['name'] as String, - referenceImage: json['referenceImage'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..UUID = json['UUID'] as String; -} - -Map _$InheritedBitmapToJson(InheritedBitmap instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'UUID': instance.UUID, - 'referenceImage': instance.referenceImage, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_circle.dart b/lib/interpret_and_optimize/entities/inherited_circle.dart index 0309ff9b..da19fb5f 100644 --- a/lib/interpret_and_optimize/entities/inherited_circle.dart +++ b/lib/interpret_and_optimize/entities/inherited_circle.dart @@ -1,71 +1,40 @@ import 'package:parabeac_core/design_logic/design_node.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/injected_align.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/alignments/injected_align.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inherited_intermediate.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/temp_group_layout_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_visual_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'inherited_circle.g.dart'; - -@JsonSerializable(nullable: true) class InheritedCircle extends PBVisualIntermediateNode implements PBInheritedIntermediate { @override final originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @override - final Point bottomRightCorner; - - @override - final Point topLeftCorner; - - @override - String UUID; - - Map size; - - /// Used for setting the alignment of it's children - @JsonKey(ignore: true) - double alignX; - @JsonKey(ignore: true) - double alignY; - - Map borderInfo; - - @JsonKey(ignore: true) - PBContext currentContext; - - Map alignment; - - InheritedCircle( - this.originalRef, this.bottomRightCorner, this.topLeftCorner, String name, - {this.currentContext, this.alignX, this.alignY}) - : super(topLeftCorner, bottomRightCorner, currentContext, name) { + InheritedCircle(this.originalRef, Point bottomRightCorner, + Point topLeftCorner, String name, + {PBContext currentContext, Point alignX, Point alignY}) + : super(topLeftCorner, bottomRightCorner, currentContext, name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } generator = PBBitmapGenerator(); - UUID = originalRef.UUID; - size = { 'width': originalRef.boundaryRectangle.width, 'height': originalRef.boundaryRectangle.height, }; - borderInfo = {}; - borderInfo['shape'] = 'circle'; - - alignment = alignX != null && alignY != null + auxiliaryData.borderInfo = {}; + auxiliaryData.borderInfo['shape'] = 'circle'; + auxiliaryData.alignment = alignX != null && alignY != null ? {'alignX': alignX, 'alignY': alignY} : null; } @@ -97,9 +66,4 @@ class InheritedCircle extends PBVisualIntermediateNode align.alignChild(); child = align; } - - Map toJson() => _$InheritedCircleToJson(this); - - factory InheritedCircle.fromJson(Map json) => - _$InheritedCircleFromJson(json); } diff --git a/lib/interpret_and_optimize/entities/inherited_circle.g.dart b/lib/interpret_and_optimize/entities/inherited_circle.g.dart deleted file mode 100644 index 4e01877a..00000000 --- a/lib/interpret_and_optimize/entities/inherited_circle.g.dart +++ /dev/null @@ -1,42 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_circle.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedCircle _$InheritedCircleFromJson(Map json) { - return InheritedCircle( - json['originalRef'], - json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map), - json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map), - json['name'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..color = json['color'] as String - ..UUID = json['UUID'] as String - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map; -} - -Map _$InheritedCircleToJson(InheritedCircle instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'bottomRightCorner': instance.bottomRightCorner, - 'topLeftCorner': instance.topLeftCorner, - 'UUID': instance.UUID, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_container.dart b/lib/interpret_and_optimize/entities/inherited_container.dart index 2e0b76fd..6a57713a 100644 --- a/lib/interpret_and_optimize/entities/inherited_container.dart +++ b/lib/interpret_and_optimize/entities/inherited_container.dart @@ -2,18 +2,14 @@ import 'package:parabeac_core/design_logic/color.dart'; import 'package:parabeac_core/design_logic/design_node.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_container_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_align.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/alignments/injected_align.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inherited_intermediate.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/temp_group_layout_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_visual_intermediate_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'inherited_container.g.dart'; - -@JsonSerializable(nullable: true) class InheritedContainer extends PBVisualIntermediateNode with PBColorMixin implements PBInheritedIntermediate { @@ -21,53 +17,28 @@ class InheritedContainer extends PBVisualIntermediateNode final originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - final Point bottomRightCorner; - - @override - final Point topLeftCorner; - - @JsonKey(ignore: true) - PBContext currentContext; - - @override - String UUID; - /// Used for setting the alignment of it's children - @JsonKey(ignore: true) - double alignX; - @JsonKey(ignore: true) - double alignY; - - Map size; - - Map alignment; - - @JsonKey(nullable: true) - Map borderInfo; - - @JsonKey(nullable: true) bool isBackgroundVisible = true; InheritedContainer( this.originalRef, - this.topLeftCorner, - this.bottomRightCorner, + Point topLeftCorner, + Point bottomRightCorner, String name, { - this.alignX, - this.alignY, - this.currentContext, - this.borderInfo, + double alignX, + double alignY, + PBContext currentContext, + Map borderInfo, this.isBackgroundVisible = true, - }) : super(topLeftCorner, bottomRightCorner, currentContext, name) { + }) : super(topLeftCorner, bottomRightCorner, currentContext, name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } generator = PBContainerGenerator(); borderInfo ??= {}; - UUID = originalRef.UUID ?? ''; size = { 'width': originalRef.boundaryRectangle.width, @@ -77,14 +48,16 @@ class InheritedContainer extends PBVisualIntermediateNode if (originalRef.style != null && originalRef.style.fills.isNotEmpty) { for (var fill in originalRef.style.fills) { if (fill.isEnabled) { - color = toHex(fill.color); + auxiliaryData.color = toHex(fill.color); } } } - alignment = alignX != null && alignY != null + auxiliaryData.alignment = alignX != null && alignY != null ? {'alignX': alignX, 'alignY': alignY} : null; + auxiliaryData.borderInfo = borderInfo; + assert(originalRef != null, 'A null original reference was sent to an PBInheritedIntermediate Node'); } @@ -116,8 +89,4 @@ class InheritedContainer extends PBVisualIntermediateNode align.alignChild(); child = align; } - - factory InheritedContainer.fromJson(Map json) => - _$InheritedContainerFromJson(json); - Map toJson() => _$InheritedContainerToJson(this); } diff --git a/lib/interpret_and_optimize/entities/inherited_container.g.dart b/lib/interpret_and_optimize/entities/inherited_container.g.dart deleted file mode 100644 index c23b39f3..00000000 --- a/lib/interpret_and_optimize/entities/inherited_container.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_container.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedContainer _$InheritedContainerFromJson(Map json) { - return InheritedContainer( - json['originalRef'], - json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map), - json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map), - json['name'] as String, - borderInfo: json['borderInfo'] as Map, - isBackgroundVisible: json['isBackgroundVisible'] as bool, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..color = json['color'] as String - ..UUID = json['UUID'] as String - ..size = json['size'] as Map - ..alignment = json['alignment'] as Map; -} - -Map _$InheritedContainerToJson(InheritedContainer instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'bottomRightCorner': instance.bottomRightCorner, - 'topLeftCorner': instance.topLeftCorner, - 'UUID': instance.UUID, - 'size': instance.size, - 'alignment': instance.alignment, - 'borderInfo': instance.borderInfo, - 'isBackgroundVisible': instance.isBackgroundVisible, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_oval.dart b/lib/interpret_and_optimize/entities/inherited_oval.dart index 33fdc1e9..1f39fb2e 100644 --- a/lib/interpret_and_optimize/entities/inherited_oval.dart +++ b/lib/interpret_and_optimize/entities/inherited_oval.dart @@ -10,34 +10,19 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_image_reference_storage.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; +import 'package:quick_log/quick_log.dart'; -part 'inherited_oval.g.dart'; - -@JsonSerializable(nullable: true) class InheritedOval extends PBVisualIntermediateNode implements PBInheritedIntermediate { @override var originalRef; + var log = Logger('Layout Generation Service'); @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @JsonKey(ignore: true) - Uint8List image; - - @override - String UUID; - - @JsonKey(ignore: true) - PBContext currentContext; - - Map size; - - String referenceImage; InheritedOval(this.originalRef, String name, - {this.image, this.currentContext}) + {Uint8List image, PBContext currentContext}) : super( Point(originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y), @@ -47,7 +32,8 @@ class InheritedOval extends PBVisualIntermediateNode originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height), currentContext, - name) { + name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } @@ -57,7 +43,6 @@ class InheritedOval extends PBVisualIntermediateNode 'width': originalRef.boundaryRectangle.width, 'height': originalRef.boundaryRectangle.height }; - UUID = originalRef.UUID; name = originalRef.name; @@ -71,17 +56,12 @@ class InheritedOval extends PBVisualIntermediateNode if (node is InheritedShapePath) { return; } - assert(false, + log.error( 'Child with type ${node.runtimeType} could not be added as a child.'); - return; } @override void alignChild() { - // TODO: implement alignChild + // Images don't have children. } - - factory InheritedOval.fromJson(Map json) => - _$InheritedOvalFromJson(json); - Map toJson() => _$InheritedOvalToJson(this); } diff --git a/lib/interpret_and_optimize/entities/inherited_oval.g.dart b/lib/interpret_and_optimize/entities/inherited_oval.g.dart deleted file mode 100644 index 4751b593..00000000 --- a/lib/interpret_and_optimize/entities/inherited_oval.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_oval.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedOval _$InheritedOvalFromJson(Map json) { - return InheritedOval( - json['originalRef'], - json['name'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..UUID = json['UUID'] as String - ..size = json['size'] as Map - ..referenceImage = json['referenceImage'] as String; -} - -Map _$InheritedOvalToJson(InheritedOval instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'UUID': instance.UUID, - 'size': instance.size, - 'referenceImage': instance.referenceImage, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_polygon.dart b/lib/interpret_and_optimize/entities/inherited_polygon.dart index 6d8818c4..04e419b4 100644 --- a/lib/interpret_and_optimize/entities/inherited_polygon.dart +++ b/lib/interpret_and_optimize/entities/inherited_polygon.dart @@ -10,34 +10,17 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_image_reference_storage.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'inherited_polygon.g.dart'; - -@JsonSerializable(nullable: true) class InheritedPolygon extends PBVisualIntermediateNode implements PBInheritedIntermediate { @override var originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @JsonKey(ignore: true) - Uint8List image; - - @override - String UUID; - - @JsonKey(ignore: true) - PBContext currentContext; - - Map size; - - String referenceImage; InheritedPolygon(this.originalRef, String name, - {this.image, this.currentContext}) + {Uint8List image, PBContext currentContext}) : super( Point(originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y), @@ -47,7 +30,8 @@ class InheritedPolygon extends PBVisualIntermediateNode originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height), currentContext, - name) { + name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } @@ -57,8 +41,6 @@ class InheritedPolygon extends PBVisualIntermediateNode 'width': originalRef.boundaryRectangle.width, 'height': originalRef.boundaryRectangle.height }; - UUID = originalRef.UUID; - name = originalRef.name; ImageReferenceStorage().addReferenceAndWrite( @@ -78,10 +60,6 @@ class InheritedPolygon extends PBVisualIntermediateNode @override void alignChild() { - // TODO: implement alignChild + // Images don't hae children. } - - factory InheritedPolygon.fromJson(Map json) => - _$InheritedPolygonFromJson(json); - Map toJson() => _$InheritedPolygonToJson(this); } diff --git a/lib/interpret_and_optimize/entities/inherited_polygon.g.dart b/lib/interpret_and_optimize/entities/inherited_polygon.g.dart deleted file mode 100644 index 262074c5..00000000 --- a/lib/interpret_and_optimize/entities/inherited_polygon.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_polygon.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedPolygon _$InheritedPolygonFromJson(Map json) { - return InheritedPolygon( - json['originalRef'], - json['name'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..UUID = json['UUID'] as String - ..size = json['size'] as Map - ..referenceImage = json['referenceImage'] as String; -} - -Map _$InheritedPolygonToJson(InheritedPolygon instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'UUID': instance.UUID, - 'size': instance.size, - 'referenceImage': instance.referenceImage, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_scaffold.dart b/lib/interpret_and_optimize/entities/inherited_scaffold.dart index d8a3f054..53c7a35f 100644 --- a/lib/interpret_and_optimize/entities/inherited_scaffold.dart +++ b/lib/interpret_and_optimize/entities/inherited_scaffold.dart @@ -4,7 +4,7 @@ import 'package:parabeac_core/eggs/injected_app_bar.dart'; import 'package:parabeac_core/eggs/injected_tab_bar.dart'; import 'package:parabeac_core/generation/generators/layouts/pb_scaffold_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_align.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/alignments/injected_align.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/temp_group_layout_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; @@ -14,11 +14,6 @@ import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; import 'interfaces/pb_inherited_intermediate.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'inherited_scaffold.g.dart'; - -@JsonSerializable(nullable: true) class InheritedScaffold extends PBVisualIntermediateNode with PBColorMixin @@ -27,30 +22,21 @@ class InheritedScaffold extends PBVisualIntermediateNode @override var originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @JsonSerializable(nullable: true) + var navbar; - @JsonSerializable(nullable: true) + var tabbar; - @JsonSerializable(nullable: true) - String backgroundColor; bool isHomeScreen = false; - @override - String UUID; - var body; - @JsonKey(ignore: true) - PBContext currentContext; - InheritedScaffold(this.originalRef, {Point topLeftCorner, Point bottomRightCorner, String name, - this.currentContext, + PBContext currentContext, this.isHomeScreen}) : super( Point(originalRef.boundaryRectangle.x, @@ -61,7 +47,8 @@ class InheritedScaffold extends PBVisualIntermediateNode originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height), currentContext, - name) { + name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } @@ -71,16 +58,7 @@ class InheritedScaffold extends PBVisualIntermediateNode generator = PBScaffoldGenerator(); - this.currentContext.screenBottomRightCorner = Point( - originalRef.boundaryRectangle.x + originalRef.boundaryRectangle.width, - originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height); - - this.currentContext.screenTopLeftCorner = - Point(originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y); - - UUID = originalRef.UUID; - - backgroundColor = toHex(originalRef.backgroundColor); + auxiliaryData.color = toHex(originalRef.backgroundColor); } @override @@ -88,9 +66,6 @@ class InheritedScaffold extends PBVisualIntermediateNode return layer; } - @override - String semanticName; - @override void addChild(PBIntermediateNode node) { if (node is PBSharedInstanceIntermediateNode) { @@ -136,8 +111,4 @@ class InheritedScaffold extends PBVisualIntermediateNode align.alignChild(); child = align; } - - Map toJson() => _$InheritedScaffoldToJson(this); - factory InheritedScaffold.fromJson(Map json) => - _$InheritedScaffoldFromJson(json); } diff --git a/lib/interpret_and_optimize/entities/inherited_scaffold.g.dart b/lib/interpret_and_optimize/entities/inherited_scaffold.g.dart deleted file mode 100644 index 2d69c8e4..00000000 --- a/lib/interpret_and_optimize/entities/inherited_scaffold.g.dart +++ /dev/null @@ -1,54 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_scaffold.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedScaffold _$InheritedScaffoldFromJson(Map json) { - return InheritedScaffold( - json['originalRef'], - topLeftCorner: json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map), - bottomRightCorner: json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map), - name: json['name'] as String, - isHomeScreen: json['isHomeScreen'] as bool, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..navbar = json['navbar'] - ..tabbar = json['tabbar'] - ..backgroundColor = json['backgroundColor'] as String - ..UUID = json['UUID'] as String - ..body = json['body'] - ..semanticName = json['semanticName'] as String; -} - -Map _$InheritedScaffoldToJson(InheritedScaffold instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'navbar': instance.navbar, - 'tabbar': instance.tabbar, - 'backgroundColor': instance.backgroundColor, - 'isHomeScreen': instance.isHomeScreen, - 'UUID': instance.UUID, - 'body': instance.body, - 'semanticName': instance.semanticName, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_shape_group.dart b/lib/interpret_and_optimize/entities/inherited_shape_group.dart index 2de76ec5..6badf7f4 100644 --- a/lib/interpret_and_optimize/entities/inherited_shape_group.dart +++ b/lib/interpret_and_optimize/entities/inherited_shape_group.dart @@ -10,36 +10,17 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_image_reference_storage.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'inherited_shape_group.g.dart'; - -@JsonSerializable(nullable: true) class InheritedShapeGroup extends PBVisualIntermediateNode implements PBInheritedIntermediate { @override var originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - ///Represents the location of the png file. - @JsonKey(ignore: true) - Uint8List image; - - @override - String UUID; - - @JsonKey(ignore: true) - PBContext currentContext; - - String referenceImage; - - Map size; - InheritedShapeGroup(this.originalRef, String name, - {this.image, this.currentContext}) + {Uint8List image, PBContext currentContext}) : super( Point(originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y), @@ -49,14 +30,13 @@ class InheritedShapeGroup extends PBVisualIntermediateNode originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height), currentContext, - name) { + name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } generator = PBBitmapGenerator(); - UUID = originalRef.UUID; - size = { 'width': originalRef.boundaryRectangle.width, 'height': originalRef.boundaryRectangle.height @@ -73,11 +53,6 @@ class InheritedShapeGroup extends PBVisualIntermediateNode @override void alignChild() { - // TODO: implement alignChild + // Images don't have children. } - - factory InheritedShapeGroup.fromJson(Map json) => - _$InheritedShapeGroupFromJson(json); - - Map toJson() => _$InheritedShapeGroupToJson(this); } diff --git a/lib/interpret_and_optimize/entities/inherited_shape_group.g.dart b/lib/interpret_and_optimize/entities/inherited_shape_group.g.dart deleted file mode 100644 index 2cae7637..00000000 --- a/lib/interpret_and_optimize/entities/inherited_shape_group.g.dart +++ /dev/null @@ -1,45 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_shape_group.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedShapeGroup _$InheritedShapeGroupFromJson(Map json) { - return InheritedShapeGroup( - json['originalRef'], - json['name'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..UUID = json['UUID'] as String - ..referenceImage = json['referenceImage'] as String - ..size = json['size'] as Map; -} - -Map _$InheritedShapeGroupToJson( - InheritedShapeGroup instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'UUID': instance.UUID, - 'referenceImage': instance.referenceImage, - 'size': instance.size, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_shape_path.dart b/lib/interpret_and_optimize/entities/inherited_shape_path.dart index 68b7990c..6758df28 100644 --- a/lib/interpret_and_optimize/entities/inherited_shape_path.dart +++ b/lib/interpret_and_optimize/entities/inherited_shape_path.dart @@ -13,37 +13,17 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_image_reference_storage.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'inherited_shape_path.g.dart'; - -@JsonSerializable(nullable: true) class InheritedShapePath extends PBVisualIntermediateNode with PBColorMixin implements PBInheritedIntermediate { @override var originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @override - String UUID; - - ///Represents the location of the png file. - @JsonKey(ignore: true) - Uint8List image; - - @JsonKey(ignore: true) - PBContext currentContext; - - String referenceImage; - - Map size; - - InheritedShapePath(this.originalRef, String name, - {this.image, this.currentContext}) + {Uint8List image, PBContext currentContext}) : super( Point(originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y), @@ -53,14 +33,13 @@ class InheritedShapePath extends PBVisualIntermediateNode originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height), currentContext, - name) { + name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } generator = PBBitmapGenerator(); - UUID = originalRef.UUID; - size = { 'width': originalRef.boundaryRectangle.width, 'height': originalRef.boundaryRectangle.height @@ -76,35 +55,27 @@ class InheritedShapePath extends PBVisualIntermediateNode } void _detectLineAsContainer() { - ShapePath path = (originalRef as ShapePath); + var path = (originalRef as ShapePath); // Possible vertical or horizontal point if (path.points.length == 2) { //Parse the points - List p1Str = path.points[0]['point'] + var p1Str = path.points[0]['point'] .toString() .replaceAll('{', '') .replaceAll('}', '') .split(','); - List p2Str = path.points[1]['point'] + var p2Str = path.points[1]['point'] .toString() .replaceAll('{', '') .replaceAll('}', '') .split(','); - Point p1 = Point(double.parse(p1Str[0]), double.parse(p1Str[1])); - Point p2 = Point(double.parse(p2Str[0]), double.parse(p2Str[1])); + var p1 = Point(double.parse(p1Str[0]), double.parse(p1Str[1])); + var p2 = Point(double.parse(p2Str[0]), double.parse(p2Str[1])); if (_isEdgeAdjacent(p1, p2)) { - Point tlc = Point( - originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y); - Point brc = Point( - originalRef.boundaryRectangle.x + - originalRef.boundaryRectangle.width, - originalRef.boundaryRectangle.y + - originalRef.boundaryRectangle.height); - generator = PBContainerGenerator(); - color = toHex(originalRef.style.borders[0].color); + auxiliaryData.color = toHex(originalRef.style.borders[0].color); } } } @@ -115,8 +86,8 @@ class InheritedShapePath extends PBVisualIntermediateNode num deltaX = (p1.x - p2.x).abs(); num deltaY = (p1.y - p2.y).abs(); - bool isVertical = deltaX < 0.01 && deltaY > 0; - bool isHorizontal = deltaY < 0.01 && deltaX > 0; + var isVertical = deltaX < 0.01 && deltaY > 0; + var isHorizontal = deltaY < 0.01 && deltaX > 0; return isVertical || isHorizontal; } @@ -127,11 +98,5 @@ class InheritedShapePath extends PBVisualIntermediateNode } @override - void alignChild() { - // TODO: implement alignChild - } - - factory InheritedShapePath.fromJson(Map json) => - _$InheritedShapePathFromJson(json); - Map toJson() => _$InheritedShapePathToJson(this); + void alignChild() {} } diff --git a/lib/interpret_and_optimize/entities/inherited_shape_path.g.dart b/lib/interpret_and_optimize/entities/inherited_shape_path.g.dart deleted file mode 100644 index 7cc4a569..00000000 --- a/lib/interpret_and_optimize/entities/inherited_shape_path.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_shape_path.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedShapePath _$InheritedShapePathFromJson(Map json) { - return InheritedShapePath( - json['originalRef'], - json['name'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..UUID = json['UUID'] as String - ..referenceImage = json['referenceImage'] as String - ..size = json['size'] as Map; -} - -Map _$InheritedShapePathToJson(InheritedShapePath instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'UUID': instance.UUID, - 'referenceImage': instance.referenceImage, - 'size': instance.size, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_star.dart b/lib/interpret_and_optimize/entities/inherited_star.dart index 4f8460d3..3969b18e 100644 --- a/lib/interpret_and_optimize/entities/inherited_star.dart +++ b/lib/interpret_and_optimize/entities/inherited_star.dart @@ -10,34 +10,17 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_image_reference_storage.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'inherited_star.g.dart'; - -@JsonSerializable(nullable: true) class InheritedStar extends PBVisualIntermediateNode implements PBInheritedIntermediate { @override var originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @JsonKey(ignore: true) - Uint8List image; - - @override - String UUID; - - @JsonKey(ignore: true) - PBContext currentContext; - - Map size; - - String referenceImage; InheritedStar(this.originalRef, String name, - {this.image, this.currentContext}) + {Uint8List image, PBContext currentContext}) : super( Point(originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y), @@ -47,7 +30,8 @@ class InheritedStar extends PBVisualIntermediateNode originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height), currentContext, - name) { + name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } @@ -57,7 +41,6 @@ class InheritedStar extends PBVisualIntermediateNode 'width': originalRef.boundaryRectangle.width, 'height': originalRef.boundaryRectangle.height }; - UUID = originalRef.UUID; name = originalRef.name; @@ -78,10 +61,6 @@ class InheritedStar extends PBVisualIntermediateNode @override void alignChild() { - // TODO: implement alignChild + // Images don't have children. } - - factory InheritedStar.fromJson(Map json) => - _$InheritedStarFromJson(json); - Map toJson() => _$InheritedStarToJson(this); } diff --git a/lib/interpret_and_optimize/entities/inherited_star.g.dart b/lib/interpret_and_optimize/entities/inherited_star.g.dart deleted file mode 100644 index 79cccd93..00000000 --- a/lib/interpret_and_optimize/entities/inherited_star.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_star.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedStar _$InheritedStarFromJson(Map json) { - return InheritedStar( - json['originalRef'], - json['name'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..UUID = json['UUID'] as String - ..size = json['size'] as Map - ..referenceImage = json['referenceImage'] as String; -} - -Map _$InheritedStarToJson(InheritedStar instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'UUID': instance.UUID, - 'size': instance.size, - 'referenceImage': instance.referenceImage, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_text.dart b/lib/interpret_and_optimize/entities/inherited_text.dart index c3e91b11..d3135a06 100644 --- a/lib/interpret_and_optimize/entities/inherited_text.dart +++ b/lib/interpret_and_optimize/entities/inherited_text.dart @@ -8,43 +8,30 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_inte 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/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'inherited_text.g.dart'; - -@JsonSerializable(nullable: true) class InheritedText extends PBVisualIntermediateNode with PBColorMixin implements PBInheritedIntermediate { ///For the generator to strip out the quotation marks. bool isTextParameter = false; - @override - String UUID; - @override var originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @JsonKey(ignore: true) num alignmenttype; - @JsonKey(ignore: true) - PBContext currentContext; String text; - num fontSize; - String fontName; String fontWeight; // one of the w100-w900 weights String fontStyle; // normal, or italic String textAlignment; num letterSpacing; - InheritedText(this.originalRef, String name, {this.currentContext}) + InheritedText(this.originalRef, String name, {PBContext currentContext}) : super( Point(originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y), @@ -54,16 +41,16 @@ class InheritedText extends PBVisualIntermediateNode originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height), currentContext, - name) { + name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } generator = PBTextGen(); - UUID = originalRef.UUID; text = (originalRef as Text).content; fontSize = originalRef.style.textStyle.fontDescriptor.fontSize; - color = toHex(originalRef.style.textStyle.fontColor); + auxiliaryData.color = toHex(originalRef.style.textStyle.fontColor); fontName = originalRef.style.textStyle.fontDescriptor.fontName; fontWeight = originalRef.style.textStyle.fontDescriptor.fontWeight; fontStyle = originalRef.style.textStyle.fontDescriptor.fontStyle; @@ -89,10 +76,6 @@ class InheritedText extends PBVisualIntermediateNode @override void alignChild() { - // TODO: implement alignChild + // Text don't have children. } - - factory InheritedText.fromJson(Map json) => - _$InheritedTextFromJson(json); - Map toJson() => _$InheritedTextToJson(this); } diff --git a/lib/interpret_and_optimize/entities/inherited_text.g.dart b/lib/interpret_and_optimize/entities/inherited_text.g.dart deleted file mode 100644 index 8fce780e..00000000 --- a/lib/interpret_and_optimize/entities/inherited_text.g.dart +++ /dev/null @@ -1,58 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_text.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedText _$InheritedTextFromJson(Map json) { - return InheritedText( - json['originalRef'], - json['name'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..isTextParameter = json['isTextParameter'] as bool - ..UUID = json['UUID'] as String - ..text = json['text'] as String - ..fontSize = json['fontSize'] as num - ..fontName = json['fontName'] as String - ..fontWeight = json['fontWeight'] as String - ..fontStyle = json['fontStyle'] as String - ..textAlignment = json['textAlignment'] as String - ..letterSpacing = json['letterSpacing'] as num; -} - -Map _$InheritedTextToJson(InheritedText instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'isTextParameter': instance.isTextParameter, - 'UUID': instance.UUID, - 'originalRef': instance.originalRef, - 'text': instance.text, - 'fontSize': instance.fontSize, - 'fontName': instance.fontName, - 'fontWeight': instance.fontWeight, - 'fontStyle': instance.fontStyle, - 'textAlignment': instance.textAlignment, - 'letterSpacing': instance.letterSpacing, - }; diff --git a/lib/interpret_and_optimize/entities/inherited_triangle.dart b/lib/interpret_and_optimize/entities/inherited_triangle.dart index 8e7fba8f..3d2cc7f4 100644 --- a/lib/interpret_and_optimize/entities/inherited_triangle.dart +++ b/lib/interpret_and_optimize/entities/inherited_triangle.dart @@ -10,34 +10,17 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_image_reference_storage.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; -part 'inherited_triangle.g.dart'; - -@JsonSerializable(nullable: true) class InheritedTriangle extends PBVisualIntermediateNode implements PBInheritedIntermediate { @override var originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @JsonKey(ignore: true) - Uint8List image; - - @override - String UUID; - - @JsonKey(ignore: true) - PBContext currentContext; - - Map size; - - var referenceImage; InheritedTriangle(this.originalRef, String name, - {this.image, this.currentContext}) + {Uint8List image, PBContext currentContext}) : super( Point(originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y), @@ -47,7 +30,8 @@ class InheritedTriangle extends PBVisualIntermediateNode originalRef.boundaryRectangle.y + originalRef.boundaryRectangle.height), currentContext, - name) { + name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } @@ -57,7 +41,6 @@ class InheritedTriangle extends PBVisualIntermediateNode 'width': originalRef.boundaryRectangle.width, 'height': originalRef.boundaryRectangle.height }; - UUID = originalRef.UUID; name = originalRef.name; @@ -78,10 +61,6 @@ class InheritedTriangle extends PBVisualIntermediateNode @override void alignChild() { - // TODO: implement alignChild + // Images don't have children. } - - factory InheritedTriangle.fromJson(Map json) => - _$InheritedTriangleFromJson(json); - Map toJson() => _$InheritedTriangleToJson(this); } diff --git a/lib/interpret_and_optimize/entities/inherited_triangle.g.dart b/lib/interpret_and_optimize/entities/inherited_triangle.g.dart deleted file mode 100644 index e098aa3b..00000000 --- a/lib/interpret_and_optimize/entities/inherited_triangle.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'inherited_triangle.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InheritedTriangle _$InheritedTriangleFromJson(Map json) { - return InheritedTriangle( - json['originalRef'], - json['name'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..UUID = json['UUID'] as String - ..size = json['size'] as Map - ..referenceImage = json['referenceImage']; -} - -Map _$InheritedTriangleToJson(InheritedTriangle instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'originalRef': instance.originalRef, - 'UUID': instance.UUID, - 'size': instance.size, - 'referenceImage': instance.referenceImage, - }; diff --git a/lib/interpret_and_optimize/entities/injected_container.dart b/lib/interpret_and_optimize/entities/injected_container.dart index 2ac0e727..73bf4267 100644 --- a/lib/interpret_and_optimize/entities/injected_container.dart +++ b/lib/interpret_and_optimize/entities/injected_container.dart @@ -1,6 +1,6 @@ import 'package:parabeac_core/generation/generators/visual-widgets/pb_container_gen.dart'; import 'package:parabeac_core/generation/prototyping/pb_prototype_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_align.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/alignments/injected_align.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_injected_intermediate.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/temp_group_layout_node.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; @@ -8,58 +8,29 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'injected_container.g.dart'; - -@JsonSerializable(nullable: true) class InjectedContainer extends PBVisualIntermediateNode implements PBInjectedIntermediate { - /// Used for setting the alignment of it's children - double alignX; - double alignY; - - @JsonKey(ignore: true) - PBContext currentContext; - - @override - final String color; - var child; - Map size; - Map margins; - Map padding; - Map borderInfo; - Map alignment; - - @JsonKey(ignore: true) PrototypeNode prototypeNode; - final String UUID; - InjectedContainer( Point bottomRightCorner, Point topLeftCorner, String name, - this.UUID, { - this.alignX, - this.alignY, - this.color, - this.currentContext, - }) : super(topLeftCorner, bottomRightCorner, currentContext, name) { + String UUID, { + double alignX, + double alignY, + String color, + PBContext currentContext, + }) : super(topLeftCorner, bottomRightCorner, currentContext, name, + UUID: UUID) { generator = PBContainerGenerator(); - if (currentContext.screenBottomRightCorner == null && - currentContext.screenTopLeftCorner == null) { - this.currentContext.screenBottomRightCorner = bottomRightCorner; - this.currentContext.screenTopLeftCorner = topLeftCorner; - } - size = { 'width': (bottomRightCorner.x - topLeftCorner.x).abs(), 'height': (bottomRightCorner.y - topLeftCorner.y).abs(), }; - alignment = alignX != null && alignY != null + auxiliaryData.alignment = alignX != null && alignY != null ? {'alignX': alignX, 'alignY': alignY} : null; } @@ -91,8 +62,4 @@ class InjectedContainer extends PBVisualIntermediateNode align.alignChild(); child = align; } - - factory InjectedContainer.fromJson(Map json) => - _$InjectedContainerFromJson(json); - Map toJson() => _$InjectedContainerToJson(this); } diff --git a/lib/interpret_and_optimize/entities/injected_container.g.dart b/lib/interpret_and_optimize/entities/injected_container.g.dart deleted file mode 100644 index 8bd1a80a..00000000 --- a/lib/interpret_and_optimize/entities/injected_container.g.dart +++ /dev/null @@ -1,48 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'injected_container.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -InjectedContainer _$InjectedContainerFromJson(Map json) { - return InjectedContainer( - json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map), - json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map), - json['name'] as String, - json['UUID'] as String, - alignX: (json['alignX'] as num)?.toDouble(), - alignY: (json['alignY'] as num)?.toDouble(), - color: json['color'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..size = json['size'] as Map - ..margins = json['margins'] as Map - ..padding = json['padding'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map; -} - -Map _$InjectedContainerToJson(InjectedContainer instance) => - { - 'subsemantic': instance.subsemantic, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'name': instance.name, - 'alignX': instance.alignX, - 'alignY': instance.alignY, - 'color': instance.color, - 'child': instance.child, - 'size': instance.size, - 'margins': instance.margins, - 'padding': instance.padding, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'UUID': instance.UUID, - }; diff --git a/lib/interpret_and_optimize/entities/layouts/column.dart b/lib/interpret_and_optimize/entities/layouts/column.dart index 8ecd68d9..58cc8a43 100644 --- a/lib/interpret_and_optimize/entities/layouts/column.dart +++ b/lib/interpret_and_optimize/entities/layouts/column.dart @@ -12,19 +12,13 @@ import 'package:parabeac_core/interpret_and_optimize/entities/layouts/rules/hand import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; import 'package:uuid/uuid.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'column.g.dart'; - ///Colum contains nodes that are all `vertical` to each other, without overlapping eachother -@JsonSerializable(nullable: true) + class PBIntermediateColumnLayout extends PBLayoutIntermediateNode { - @JsonKey(ignore: true) static final List COLUMN_RULES = [ VerticalNodesLayoutRule(), ]; - @JsonKey(ignore: true) static final List COLUMN_EXCEPTIONS = [ ColumnOverlappingException(), ]; @@ -35,18 +29,9 @@ class PBIntermediateColumnLayout extends PBLayoutIntermediateNode { @override PBContext currentContext; - @override - @JsonKey(ignore: true) - Point topLeftCorner; - - @override - @JsonKey(ignore: true) - Point bottomRightCorner; - Map alignment = {}; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; PBIntermediateColumnLayout( @@ -121,8 +106,4 @@ class PBIntermediateColumnLayout extends PBLayoutIntermediateNode { @override void addChild(PBIntermediateNode node) => addChildToLayout(node); - - factory PBIntermediateColumnLayout.fromJson(Map json) => - _$PBIntermediateColumnLayoutFromJson(json); - Map toJson() => _$PBIntermediateColumnLayoutToJson(this); } diff --git a/lib/interpret_and_optimize/entities/layouts/column.g.dart b/lib/interpret_and_optimize/entities/layouts/column.g.dart deleted file mode 100644 index 513b1acd..00000000 --- a/lib/interpret_and_optimize/entities/layouts/column.g.dart +++ /dev/null @@ -1,34 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'column.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PBIntermediateColumnLayout _$PBIntermediateColumnLayoutFromJson( - Map json) { - return PBIntermediateColumnLayout( - json['name'] as String, - UUID: json['UUID'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..color = json['color'] as String - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map; -} - -Map _$PBIntermediateColumnLayoutToJson( - PBIntermediateColumnLayout instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'color': instance.color, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'name': instance.name, - 'UUID': instance.UUID, - 'alignment': instance.alignment, - }; diff --git a/lib/interpret_and_optimize/entities/layouts/row.dart b/lib/interpret_and_optimize/entities/layouts/row.dart index 3ea6e1ef..4124f29a 100644 --- a/lib/interpret_and_optimize/entities/layouts/row.dart +++ b/lib/interpret_and_optimize/entities/layouts/row.dart @@ -12,17 +12,11 @@ import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; import 'package:uuid/uuid.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'row.g.dart'; - ///Row contains nodes that are all `horizontal` to each other, without overlapping eachother -@JsonSerializable(nullable: true) + class PBIntermediateRowLayout extends PBLayoutIntermediateNode { - @JsonKey(ignore: true) static final List ROW_RULES = [HorizontalNodesLayoutRule()]; - @JsonKey(ignore: true) static final List ROW_EXCEPTIONS = [ RowOverlappingException() ]; @@ -34,17 +28,9 @@ class PBIntermediateRowLayout extends PBLayoutIntermediateNode { Map alignment = {}; @override - @JsonKey(ignore: true) PBContext currentContext; - @JsonKey(ignore: true) - Point topLeftCorner; - - @JsonKey(ignore: true) - Point bottomRightCorner; - @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; PBIntermediateRowLayout(String name, this.UUID, {this.currentContext}) @@ -111,11 +97,6 @@ class PBIntermediateRowLayout extends PBLayoutIntermediateNode { return row; } - factory PBIntermediateRowLayout.fromJson(Map json) => - _$PBIntermediateRowLayoutFromJson(json); - - Map toJson() => _$PBIntermediateRowLayoutToJson(this); - checkCrossAxisAlignment() { // TODO: this is the default for now alignment['crossAxisAlignment'] = diff --git a/lib/interpret_and_optimize/entities/layouts/row.g.dart b/lib/interpret_and_optimize/entities/layouts/row.g.dart deleted file mode 100644 index d3275370..00000000 --- a/lib/interpret_and_optimize/entities/layouts/row.g.dart +++ /dev/null @@ -1,34 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'row.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PBIntermediateRowLayout _$PBIntermediateRowLayoutFromJson( - Map json) { - return PBIntermediateRowLayout( - json['name'] as String, - json['UUID'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..color = json['color'] as String - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map; -} - -Map _$PBIntermediateRowLayoutToJson( - PBIntermediateRowLayout instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'color': instance.color, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'name': instance.name, - 'UUID': instance.UUID, - 'alignment': instance.alignment, - }; diff --git a/lib/interpret_and_optimize/entities/layouts/rules/container_constraint_rule.dart b/lib/interpret_and_optimize/entities/layouts/rules/container_constraint_rule.dart index a35602b9..c4ba48f4 100644 --- a/lib/interpret_and_optimize/entities/layouts/rules/container_constraint_rule.dart +++ b/lib/interpret_and_optimize/entities/layouts/rules/container_constraint_rule.dart @@ -10,7 +10,7 @@ class ContainerConstraintRule extends PostConditionRule { PBIntermediateNode currentNode, PBIntermediateNode nextNode) { if (testRule(currentNode, nextNode)) { var container = InjectedContainer(currentNode.bottomRightCorner, - currentNode.topLeftCorner, Uuid().v4(), '', + currentNode.topLeftCorner, currentNode.name, Uuid().v4(), currentContext: currentNode.currentContext); container.addChild(currentNode); return container; diff --git a/lib/interpret_and_optimize/entities/layouts/stack.dart b/lib/interpret_and_optimize/entities/layouts/stack.dart index 2a8c64cf..cc4dc70f 100644 --- a/lib/interpret_and_optimize/entities/layouts/stack.dart +++ b/lib/interpret_and_optimize/entities/layouts/stack.dart @@ -9,31 +9,20 @@ import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; import 'package:uuid/uuid.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'stack.g.dart'; - ///Row contains nodes that are all `overlapping` to each other, without overlapping eachother -@JsonSerializable(nullable: true) + class PBIntermediateStackLayout extends PBLayoutIntermediateNode { - @JsonKey(ignore: true) static final List STACK_RULES = [OverlappingNodesLayoutRule()]; @override - @JsonKey(ignore: true) PBContext currentContext; @override final String UUID; - Point topLeftCorner; - - Point bottomRightCorner; - Map alignment = {}; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; PBIntermediateStackLayout(String name, this.UUID, {this.currentContext}) @@ -96,8 +85,4 @@ class PBIntermediateStackLayout extends PBLayoutIntermediateNode { children.forEach((child) => stack.addChild(child)); return stack; } - - factory PBIntermediateStackLayout.fromJson(Map json) => - _$PBIntermediateStackLayoutFromJson(json); - Map toJson() => _$PBIntermediateStackLayoutToJson(this); } diff --git a/lib/interpret_and_optimize/entities/layouts/stack.g.dart b/lib/interpret_and_optimize/entities/layouts/stack.g.dart deleted file mode 100644 index 17dd6e56..00000000 --- a/lib/interpret_and_optimize/entities/layouts/stack.g.dart +++ /dev/null @@ -1,42 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'stack.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PBIntermediateStackLayout _$PBIntermediateStackLayoutFromJson( - Map json) { - return PBIntermediateStackLayout( - json['name'] as String, - json['UUID'] as String, - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..color = json['color'] as String - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..alignment = json['alignment'] as Map; -} - -Map _$PBIntermediateStackLayoutToJson( - PBIntermediateStackLayout instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'color': instance.color, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'name': instance.name, - 'UUID': instance.UUID, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'alignment': instance.alignment, - }; diff --git a/lib/interpret_and_optimize/entities/main_axis_alignment.dart b/lib/interpret_and_optimize/entities/main_axis_alignment.dart deleted file mode 100644 index 3ff85a88..00000000 --- a/lib/interpret_and_optimize/entities/main_axis_alignment.dart +++ /dev/null @@ -1,18 +0,0 @@ -// import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; -// import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; - -// class MainAxisAligment extends PBIntermediateNode{ -// MainAxisAligment(Point topLeftCorner, Point bottomRightCorner) : super(topLeftCorner, bottomRightCorner); - -// @override -// generateIntermediate() { -// // TODO: implement generateIntermediate -// return null; -// } - -// @override -// void addChild(PBIntermediateNode node) { -// // TODO: implement addChild -// } - -// } diff --git a/lib/interpret_and_optimize/entities/pb_deny_list_node.dart b/lib/interpret_and_optimize/entities/pb_deny_list_node.dart index c720afe0..0b01fd7a 100644 --- a/lib/interpret_and_optimize/entities/pb_deny_list_node.dart +++ b/lib/interpret_and_optimize/entities/pb_deny_list_node.dart @@ -4,10 +4,9 @@ import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; /// A node that should not be converted to intermediate. class PBDenyListNode extends PBIntermediateNode { - final String UUID; PBDenyListNode(Point topLeftCorner, Point bottomRightCorner, PBContext currentContext, String name, - {this.UUID}) + {String UUID}) : super( topLeftCorner, bottomRightCorner, diff --git a/lib/interpret_and_optimize/entities/pb_shared_instance.dart b/lib/interpret_and_optimize/entities/pb_shared_instance.dart index b1143f19..021ab219 100644 --- a/lib/interpret_and_optimize/entities/pb_shared_instance.dart +++ b/lib/interpret_and_optimize/entities/pb_shared_instance.dart @@ -3,25 +3,23 @@ import 'package:parabeac_core/generation/generators/symbols/pb_instancesym_gen.d 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/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/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/pb_symbol_instance_overridable_value.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; +import 'package:parabeac_core/input/sketch/helper/symbol_node_mixin.dart'; -part 'pb_shared_instance.g.dart'; +import 'alignments/injected_align.dart'; /// As some nodes are shared throughout the project, shared instances are pointers to shared master nodes with overridable properties. /// Superclass: PBSharedIntermediateNode -@JsonSerializable(nullable: true) -class PBSharedInstanceIntermediateNode extends PBIntermediateNode - implements PBInheritedIntermediate { - @override - String UUID; +class PBSharedInstanceIntermediateNode extends PBVisualIntermediateNode + implements PBInheritedIntermediate { final String SYMBOL_ID; ///The parameters that are going to be overriden in the [PBSharedMasterNode]. - @JsonKey(ignore: true) + List sharedParamValues; ///The name of the function call that the [PBSharedInstanceIntermediateNode] is @@ -30,17 +28,14 @@ class PBSharedInstanceIntermediateNode extends PBIntermediateNode bool foundMaster = false; + bool isMasterState = false; + @override var originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; - @override - @JsonKey(ignore: true) - PBContext currentContext; - List overrideValues; PBSharedInstanceIntermediateNode( @@ -49,26 +44,23 @@ class PBSharedInstanceIntermediateNode extends PBIntermediateNode this.sharedParamValues, Point topLeftCorner, Point bottomRightCorner, - this.currentContext, + PBContext currentContext, }) : super( - Point( - originalRef.boundaryRectangle.x, originalRef.boundaryRectangle.y), - Point( - (originalRef.boundaryRectangle.x + - originalRef.boundaryRectangle.width), - (originalRef.boundaryRectangle.y + - originalRef.boundaryRectangle.height)), - originalRef.UUID, - originalRef.name, - currentContext: currentContext, - ) { + Point(originalRef.boundaryRectangle.x, + originalRef.boundaryRectangle.y), + Point( + (originalRef.boundaryRectangle.x + + originalRef.boundaryRectangle.width), + (originalRef.boundaryRectangle.y + + originalRef.boundaryRectangle.height)), + currentContext, + originalRef.name, + UUID: originalRef.UUID) { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } generator = PBSymbolInstanceGenerator(); - UUID = originalRef.UUID; - overrideValues = sharedParamValues .map((v) => PBSymbolInstanceOverridableValue(v.UUID, v.value, v.type)) .toList() @@ -78,10 +70,14 @@ class PBSharedInstanceIntermediateNode extends PBIntermediateNode @override void addChild(PBIntermediateNode node) {} - factory PBSharedInstanceIntermediateNode.fromJson(Map json) => - _$PBSharedInstanceIntermediateNodeFromJson(json); - Map toJson() => - _$PBSharedInstanceIntermediateNodeToJson(this); + @override + void alignChild() { + var align = + InjectedAlign(topLeftCorner, bottomRightCorner, currentContext, ''); + align.addChild(child); + align.alignChild(); + child = align; + } } class PBSharedParameterValue { @@ -95,5 +91,15 @@ class PBSharedParameterValue { final String _UUID; String get UUID => _UUID; - PBSharedParameterValue(this._type, this._value, this._UUID); + final String _overrideName; + String get overrideName => _overrideName; + + String get name => SN_UUIDtoVarName[_overrideName]; + + PBSharedParameterValue( + this._type, + this._value, + this._UUID, + this._overrideName, + ); } diff --git a/lib/interpret_and_optimize/entities/pb_shared_instance.g.dart b/lib/interpret_and_optimize/entities/pb_shared_instance.g.dart deleted file mode 100644 index 99563acb..00000000 --- a/lib/interpret_and_optimize/entities/pb_shared_instance.g.dart +++ /dev/null @@ -1,52 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'pb_shared_instance.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PBSharedInstanceIntermediateNode _$PBSharedInstanceIntermediateNodeFromJson( - Map json) { - return PBSharedInstanceIntermediateNode( - json['originalRef'], - json['SYMBOL_ID'] as String, - topLeftCorner: json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map), - bottomRightCorner: json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map), - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..color = json['color'] as String - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..name = json['name'] as String - ..UUID = json['UUID'] as String - ..functionCallName = json['functionCallName'] as String - ..foundMaster = json['foundMaster'] as bool - ..overrideValues = json['overrideValues'] as List; -} - -Map _$PBSharedInstanceIntermediateNodeToJson( - PBSharedInstanceIntermediateNode instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'color': instance.color, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'UUID': instance.UUID, - 'SYMBOL_ID': instance.SYMBOL_ID, - 'functionCallName': instance.functionCallName, - 'foundMaster': instance.foundMaster, - 'originalRef': instance.originalRef, - 'overrideValues': instance.overrideValues, - }; 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 d09b9b0c..6bbc15e3 100644 --- a/lib/interpret_and_optimize/entities/pb_shared_master_node.dart +++ b/lib/interpret_and_optimize/entities/pb_shared_master_node.dart @@ -10,37 +10,19 @@ import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/pb_symbol_master_params.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'pb_shared_master_node.g.dart'; - -@JsonSerializable(nullable: true) class PBSharedMasterNode extends PBVisualIntermediateNode implements PBInheritedIntermediate { - @override - String UUID; - @override final originalRef; @override - @JsonKey(ignore: true) PrototypeNode prototypeNode; ///The unique symbol identifier of the [PBSharedMasterNode] final String SYMBOL_ID; - ///The name of the [PBSharedMasterNode] - final String name; - - @override - @JsonKey(ignore: true) - PBContext currentContext; - List parametersDefinition; - - ///The children that makes the UI of the [PBSharedMasterNode]. The children are going to be wrapped ///using a [TempGroupLayoutNode] as the root Node. set children(List children) { @@ -54,23 +36,22 @@ class PBSharedMasterNode extends PBVisualIntermediateNode } ///The properties that could be be overridable on a [PBSharedMasterNode] - @JsonKey(ignore: true) + List overridableProperties; PBSharedMasterNode( this.originalRef, this.SYMBOL_ID, - this.name, + String name, Point topLeftCorner, Point bottomRightCorner, { this.overridableProperties, - this.currentContext, - }) : super(topLeftCorner, bottomRightCorner, currentContext, name) { + PBContext currentContext, + }) : super(topLeftCorner, bottomRightCorner, currentContext, name, + UUID: originalRef.UUID ?? '') { if (originalRef is DesignNode && originalRef.prototypeNodeUUID != null) { prototypeNode = PrototypeNode(originalRef?.prototypeNodeUUID); } - UUID = originalRef.UUID; - generator = PBMasterSymbolGenerator(); this.currentContext.screenBottomRightCorner = Point( @@ -81,11 +62,13 @@ class PBSharedMasterNode extends PBVisualIntermediateNode parametersDefinition = overridableProperties .map((p) => PBSymbolMasterParameter( + p._friendlyName, p.type, p.UUID, p.canOverride, p.propertyName, - p.value?.toJson(), + /* Removed Parameter Defintion as it was accepting JSON?*/ + null, // TODO: @Eddie currentContext.screenTopLeftCorner.x, currentContext.screenTopLeftCorner.y, currentContext.screenBottomRightCorner.x, @@ -101,10 +84,6 @@ class PBSharedMasterNode extends PBVisualIntermediateNode @override void alignChild() {} - - factory PBSharedMasterNode.fromJson(Map json) => - _$PBSharedMasterNodeFromJson(json); - Map toJson() => _$PBSharedMasterNodeToJson(this); } class PBSharedParameterProp { @@ -123,6 +102,12 @@ class PBSharedParameterProp { final String _UUID; String get UUID => _UUID; - PBSharedParameterProp(this._type, this.value, this._canOverride, - this._propertyName, this._UUID); + final dynamic _initialValue; + dynamic get initialValue => _initialValue; + + final String _friendlyName; + String get friendlyName => _friendlyName; + + PBSharedParameterProp(this._friendlyName, this._type, this.value, + this._canOverride, this._propertyName, this._UUID, this._initialValue); } 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 deleted file mode 100644 index 65c7102f..00000000 --- a/lib/interpret_and_optimize/entities/pb_shared_master_node.g.dart +++ /dev/null @@ -1,50 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'pb_shared_master_node.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PBSharedMasterNode _$PBSharedMasterNodeFromJson(Map json) { - return PBSharedMasterNode( - json['originalRef'], - json['SYMBOL_ID'] as String, - json['name'] as String, - json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map), - json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map), - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..color = json['color'] as String - ..UUID = json['UUID'] as String - ..parametersDefinition = (json['parametersDefinition'] as List) - ?.map((e) => e == null - ? null - : PBSymbolMasterParameter.fromJson(e as Map)) - ?.toList(); -} - -Map _$PBSharedMasterNodeToJson(PBSharedMasterNode instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'color': instance.color, - 'UUID': instance.UUID, - 'originalRef': instance.originalRef, - 'SYMBOL_ID': instance.SYMBOL_ID, - 'name': instance.name, - 'parametersDefinition': instance.parametersDefinition, - }; diff --git a/lib/interpret_and_optimize/entities/plugins/plugin_container.dart b/lib/interpret_and_optimize/entities/plugins/plugin_container.dart deleted file mode 100644 index cb91ce2d..00000000 --- a/lib/interpret_and_optimize/entities/plugins/plugin_container.dart +++ /dev/null @@ -1,121 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; -import 'package:parabeac_core/design_logic/design_node.dart'; -import 'package:parabeac_core/generation/generators/plugins/pb_plugin_node.dart'; -import 'package:parabeac_core/generation/generators/visual-widgets/pb_container_gen.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_align.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/layouts/temp_group_layout_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_visual_intermediate_node.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; -import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; - -part 'plugin_container.g.dart'; - -@JsonSerializable(nullable: true) -class PluginContainer extends PBVisualIntermediateNode implements PBEgg { - @override - Point bottomRightCorner; - - @override - String semanticName; - - @override - String subsemantic; - - @override - Point topLeftCorner; - - /// Used for setting the alignment of it's children - double alignX; - double alignY; - - @override - final String color; - - @override - final String UUID; - - @override - @JsonKey(ignore: true) - PBContext currentContext; - - var child; - Map size; - Map margins; - Map padding; - Map borderInfo; - Map alignment; - - - PluginContainer( - Point topLeftCorner, - Point bottomRightCorner, - this.UUID, { - this.alignX, - this.alignY, - this.color, - this.currentContext, - String name, - }) : super(topLeftCorner, bottomRightCorner, currentContext, name) { - generator = PBContainerGenerator(); - size = { - 'width': (bottomRightCorner.x - topLeftCorner.x).abs(), - 'height': (bottomRightCorner.y - topLeftCorner.y).abs(), - }; - alignment = alignX != null && alignY != null - ? {'alignX': alignX, 'alignY': alignY} - : null; - } - - @override - void addChild(PBIntermediateNode node) { - if (child is TempGroupLayoutNode) { - child.addChild(node); - return; - } - // If there's multiple children add a temp group so that layout service lays the children out. - if (child != null) { - var temp = TempGroupLayoutNode(null, currentContext, name); - temp.addChild(child); - temp.addChild(node); - child = temp; - } - child = node; - } - - @override - PBEgg generatePluginNode( - Point topLeftCorner, Point bottomRightCorner, var originalRef) { - return PluginContainer(topLeftCorner, bottomRightCorner, UUID, - currentContext: currentContext); - } - - @override - List layoutInstruction(List layer) { - // TODO: implement layoutInstruction - return null; - } - - @override - void alignChild() { - var align = - InjectedAlign(topLeftCorner, bottomRightCorner, currentContext, ''); - align.addChild(child); - align.alignChild(); - child = align; - } - - factory PluginContainer.fromJson(Map json) => - _$PluginContainerFromJson(json); - Map toJson() { - alignment = alignX != null && alignY != null - ? {'alignX': alignX, 'alignY': alignY} - : null; - return _$PluginContainerToJson(this); - } - - @override - void extractInformation(DesignNode incomingNode) { - // TODO: implement extractInformation - } -} diff --git a/lib/interpret_and_optimize/entities/plugins/plugin_container.g.dart b/lib/interpret_and_optimize/entities/plugins/plugin_container.g.dart deleted file mode 100644 index 8bec9271..00000000 --- a/lib/interpret_and_optimize/entities/plugins/plugin_container.g.dart +++ /dev/null @@ -1,50 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'plugin_container.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PluginContainer _$PluginContainerFromJson(Map json) { - return PluginContainer( - json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map), - json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map), - json['UUID'] as String, - alignX: (json['alignX'] as num)?.toDouble(), - alignY: (json['alignY'] as num)?.toDouble(), - color: json['color'] as String, - name: json['name'] as String, - ) - ..semanticName = json['semanticName'] as String - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..size = json['size'] as Map - ..margins = json['margins'] as Map - ..padding = json['padding'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map; -} - -Map _$PluginContainerToJson(PluginContainer instance) => - { - 'name': instance.name, - 'bottomRightCorner': instance.bottomRightCorner, - 'semanticName': instance.semanticName, - 'subsemantic': instance.subsemantic, - 'topLeftCorner': instance.topLeftCorner, - 'alignX': instance.alignX, - 'alignY': instance.alignY, - 'color': instance.color, - 'UUID': instance.UUID, - 'child': instance.child, - 'size': instance.size, - 'margins': instance.margins, - 'padding': instance.padding, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - }; diff --git a/lib/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart b/lib/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart index 4cbf7196..c497f99c 100644 --- a/lib/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart +++ b/lib/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart @@ -1,22 +1,19 @@ -import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_auxillary_data.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; - -import 'package:json_annotation/json_annotation.dart'; +import 'package:quick_log/quick_log.dart'; /// PB’s representation of the intermediate representation for a sketch node. /// Usually, we work with its subclasses. We normalize several aspects of data that a sketch node presents in order to work better at the intermediate level. /// Sometimes, PBNode’s do not have a direct representation of a sketch node. For example, most layout nodes are primarily made through and understanding of a need for a layout. -@JsonSerializable(nullable: true) abstract class PBIntermediateNode { + static final logger = Logger('PBIntermediateNode'); + /// A subsemantic is contextual info to be analyzed in or in-between the visual generation & layout generation services. String subsemantic; - @JsonKey(ignore: true) - BUILDER_TYPE builder_type; - - @JsonKey(ignore: true) PBGenerator generator; final String UUID; @@ -25,14 +22,16 @@ abstract class PBIntermediateNode { Point topLeftCorner; Point bottomRightCorner; - @JsonKey(ignore: true) PBContext currentContext; - String color; + PBGenerationViewData get managerData => currentContext.treeRoot.data; + Map size; - Map borderInfo; - Map alignment; + /// Auxillary Data of the node. Contains properties such as BorderInfo, Alignment, Color & a directed graph of states relating to this element. + IntermediateAuxiliaryData auxiliaryData = IntermediateAuxiliaryData(); + + /// Name of the element if available. String name; PBIntermediateNode( @@ -46,14 +45,4 @@ abstract class PBIntermediateNode { /// Adds child to node. void addChild(PBIntermediateNode node); - - Map toJson() { - return {}; - } -} - -abstract class ChildrenListener { - ///the [convertedChildren] are updated. Used for subclasses that need their convertedChildren information - ///in order to assign some of their attributes. Left - void childrenUpdated(); } diff --git a/lib/interpret_and_optimize/entities/subclasses/pb_layout_intermediate_node.dart b/lib/interpret_and_optimize/entities/subclasses/pb_layout_intermediate_node.dart index b265892c..26952d09 100644 --- a/lib/interpret_and_optimize/entities/subclasses/pb_layout_intermediate_node.dart +++ b/lib/interpret_and_optimize/entities/subclasses/pb_layout_intermediate_node.dart @@ -6,13 +6,14 @@ import 'package:parabeac_core/interpret_and_optimize/entities/layouts/rules/layo 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:parabeac_core/interpret_and_optimize/value_objects/point.dart'; +import 'package:uuid/uuid.dart'; /// This represents a node that should be a Layout; it contains a set of children arranged in a specific manner. It is also responsible for understanding its main axis spacing, and crossAxisAlignment. /// Superclass: PBIntermediateNode abstract class PBLayoutIntermediateNode extends PBIntermediateNode implements PBInjectedIntermediate { /// LayoutNodes support 0 or multiple children. - List _children = []; + List _children = []; ///Getting the children List get children => List.from(_children); @@ -29,25 +30,26 @@ abstract class PBLayoutIntermediateNode extends PBIntermediateNode ///Getting the exceptions of the rules. List get exceptions => List.from(_exceptions); - final String UUID; - PrototypeNode prototypeNode; /// PBLayoutIntermediateNode(this._layoutRules, this._exceptions, PBContext currentContext, String name, - {topLeftCorner, bottomRightCorner, this.UUID, this.prototypeNode}) - : super(topLeftCorner, bottomRightCorner, UUID, name, + {topLeftCorner, bottomRightCorner, this.prototypeNode}) + : super(topLeftCorner, bottomRightCorner, Uuid().v4(), name, currentContext: currentContext); void alignChildren(); ///Replace the current children with the [children] void replaceChildren(List children) { - if (children != null || children.isNotEmpty) { + if (children.isNotEmpty) { _children = children; + _resize(); + } else { + PBIntermediateNode.logger.warning( + 'Trying to add a list of children to the $runtimeType that is either null or empty'); } - _resize(); } /// Replace the child at `index` for `replacement`. @@ -67,17 +69,20 @@ abstract class PBLayoutIntermediateNode extends PBIntermediateNode } void _resize() { - assert(_children.isNotEmpty, - 'There should be children in the layout so it can resize.'); - var minX = (_children[0] as PBIntermediateNode).topLeftCorner.x, - minY = (_children[0] as PBIntermediateNode).topLeftCorner.y, - maxX = (_children[0] as PBIntermediateNode).bottomRightCorner.x, - maxY = (_children[0] as PBIntermediateNode).bottomRightCorner.y; + if (_children.isEmpty) { + PBIntermediateNode.logger + .warning('There should be children in the layout so it can resize.'); + return; + } + var minX = (_children[0]).topLeftCorner.x, + minY = (_children[0]).topLeftCorner.y, + maxX = (_children[0]).bottomRightCorner.x, + maxY = (_children[0]).bottomRightCorner.y; for (var child in _children) { - minX = min((child as PBIntermediateNode).topLeftCorner.x, minX); - minY = min((child as PBIntermediateNode).topLeftCorner.y, minY); - maxX = max((child as PBIntermediateNode).bottomRightCorner.x, maxX); - maxY = max((child as PBIntermediateNode).bottomRightCorner.y, maxY); + minX = min((child).topLeftCorner.x, minX); + minY = min((child).topLeftCorner.y, minY); + maxX = max((child).bottomRightCorner.x, maxX); + maxY = max((child).bottomRightCorner.y, maxY); } topLeftCorner = Point(minX, minY); bottomRightCorner = Point(maxX, maxY); diff --git a/lib/interpret_and_optimize/entities/subclasses/pb_visual_intermediate_node.dart b/lib/interpret_and_optimize/entities/subclasses/pb_visual_intermediate_node.dart index 4da8e40d..6e95cbf3 100644 --- a/lib/interpret_and_optimize/entities/subclasses/pb_visual_intermediate_node.dart +++ b/lib/interpret_and_optimize/entities/subclasses/pb_visual_intermediate_node.dart @@ -5,12 +5,10 @@ import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; /// Represents a typical node that the end-user could see, it usually has properties such as size and color. It only contains a single child, unlike PBLayoutIntermediateNode that contains a set of children. /// Superclass: PBIntermediateNode abstract class PBVisualIntermediateNode extends PBIntermediateNode { - String color; - - final String UUID; + // final String UUID; PBVisualIntermediateNode(Point topLeftCorner, Point bottomRightCorner, - PBContext currentContext, String name, {this.UUID}) + PBContext currentContext, String name, {String UUID}) : super(topLeftCorner, bottomRightCorner, UUID, name, currentContext: currentContext); diff --git a/lib/interpret_and_optimize/helpers/pb_configuration.dart b/lib/interpret_and_optimize/helpers/pb_configuration.dart index 965439cb..9ce92d84 100644 --- a/lib/interpret_and_optimize/helpers/pb_configuration.dart +++ b/lib/interpret_and_optimize/helpers/pb_configuration.dart @@ -5,7 +5,9 @@ class PBConfiguration { widgetStyle = defaultConfig['widgetStyle']; widgetType = defaultConfig['widgetType']; widgetSpacing = defaultConfig['widgetSpacing']; - layoutPrecedence = defaultConfig['layoutPrecedence'] ?? ['column', 'row', 'stack']; + layoutPrecedence = + defaultConfig['layoutPrecedence'] ?? ['column', 'row', 'stack']; + stateManagement = defaultConfig['stateManagement'] ?? 'provider'; } String widgetStyle; @@ -14,11 +16,12 @@ class PBConfiguration { String widgetSpacing; + String stateManagement; + List layoutPrecedence; Map specificConfig; // not sure why setConfigurations(), so replaced with this class variable Map configurations; - } diff --git a/lib/interpret_and_optimize/helpers/pb_context.dart b/lib/interpret_and_optimize/helpers/pb_context.dart index 3669e8c1..4fc1fd08 100644 --- a/lib/interpret_and_optimize/helpers/pb_context.dart +++ b/lib/interpret_and_optimize/helpers/pb_context.dart @@ -1,19 +1,26 @@ import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_configuration.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; class PBContext { PBConfiguration configuration; Point screenTopLeftCorner, screenBottomRightCorner; Map jsonConfigurations; + PBIntermediateTree treeRoot; + PBProject project; + + PBGenerationViewData get managerData => treeRoot?.data; PBContext({this.jsonConfigurations}) { assert(jsonConfigurations != null); var copyConfig = {}..addAll(jsonConfigurations); copyConfig.remove('default'); - configuration = - PBConfiguration(jsonConfigurations[MainInfo().configurationType], jsonConfigurations); + configuration = PBConfiguration( + jsonConfigurations[MainInfo().configurationType], jsonConfigurations); configuration.configurations = jsonConfigurations; } } diff --git a/lib/interpret_and_optimize/helpers/pb_intermediate_group.dart b/lib/interpret_and_optimize/helpers/pb_intermediate_group.dart deleted file mode 100644 index 341bbf1c..00000000 --- a/lib/interpret_and_optimize/helpers/pb_intermediate_group.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_item.dart'; - -class PBIntermediateGroup { - final String name; - List subgroups = []; - List items = []; - - PBIntermediateGroup(this.name); - - void addItem(PBIntermediateItem item){ - items.add(item); - } - - void addSubgroup(PBIntermediateGroup subgroup){ - subgroups.add(subgroup); - } -} \ No newline at end of file diff --git a/lib/interpret_and_optimize/helpers/pb_intermediate_item.dart b/lib/interpret_and_optimize/helpers/pb_intermediate_item.dart deleted file mode 100644 index 3d08d704..00000000 --- a/lib/interpret_and_optimize/helpers/pb_intermediate_item.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; -///Currently not entirely sure this class is needed but basically hosts a specific intermediate node. -class PBIntermediateItem { - PBIntermediateNode node; - String _type; - PBIntermediateItem(this.node, String type){ - _type = type; - } - - set type(String type){ - assert(type != 'SCREEN' || type != 'SHARED' || type != 'MISC', 'Intermediate Item type is not supported yet'); - _type = type; - } - - String get type => _type; - -} \ No newline at end of file diff --git a/lib/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart b/lib/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart index 2f9dae5f..4079f099 100644 --- a/lib/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart +++ b/lib/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart @@ -1,9 +1,16 @@ -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_group.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_item.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; + +enum TREE_TYPE { + MISC, + SCREEN, + VIEW, +} class PBIntermediateTree { - String projectName; - PBIntermediateItem rootItem; - List groups = []; - PBIntermediateTree(this.projectName); -} \ No newline at end of file + PBGenerationViewData data; + PBIntermediateNode rootNode; + String name; + PBIntermediateTree(this.name); + TREE_TYPE tree_type = TREE_TYPE.SCREEN; +} diff --git a/lib/interpret_and_optimize/helpers/pb_plugin_list_helper.dart b/lib/interpret_and_optimize/helpers/pb_plugin_list_helper.dart index 223200ab..42dee1a5 100644 --- a/lib/interpret_and_optimize/helpers/pb_plugin_list_helper.dart +++ b/lib/interpret_and_optimize/helpers/pb_plugin_list_helper.dart @@ -14,9 +14,6 @@ class PBPluginListHelper { static final PBPluginListHelper _instance = PBPluginListHelper._internal(); void initPlugins(PBContext context) { allowListNames = { - '': InjectedBackArrow( - Point(0, 0), Point(0, 0), Uuid().v4(), '', - currentContext: context), '': InjectedTabBar(Point(0, 0), Point(0, 0), Uuid().v4(), '', currentContext: context), '': InjectedNavbar(Point(0, 0), Point(0, 0), Uuid().v4(), '', @@ -34,7 +31,6 @@ class PBPluginListHelper { /// List of static plugin names used for Amplitude static List names = [ - '', '', '', '', diff --git a/lib/interpret_and_optimize/helpers/pb_project.dart b/lib/interpret_and_optimize/helpers/pb_project.dart new file mode 100644 index 00000000..045e1332 --- /dev/null +++ b/lib/interpret_and_optimize/helpers/pb_project.dart @@ -0,0 +1,28 @@ +import 'package:parabeac_core/generation/generators/util/pb_generation_project_data.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart'; +import 'package:parabeac_core/input/sketch/entities/style/shared_style.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; + +class PBProject { + String projectName; + String projectAbsPath; + List forest = []; + List sharedStyles = []; + FileStructureStrategy _fileStructureStrategy; + PBGenerationProjectData _genProjectData; + + set genProjectData(PBGenerationProjectData projectData) => + _genProjectData = projectData; + PBGenerationProjectData get genProjectData => _genProjectData; + + set fileStructureStrategy(FileStructureStrategy strategy) => + _fileStructureStrategy = strategy; + + FileStructureStrategy get fileStructureStrategy => _fileStructureStrategy; + + PBProject(this.projectName, this.sharedStyles, + {FileStructureStrategy fileStructureStrategy}) { + _genProjectData = PBGenerationProjectData(); + _fileStructureStrategy = fileStructureStrategy; + } +} diff --git a/lib/interpret_and_optimize/helpers/pb_state_management_helper.dart b/lib/interpret_and_optimize/helpers/pb_state_management_helper.dart new file mode 100644 index 00000000..3355e555 --- /dev/null +++ b/lib/interpret_and_optimize/helpers/pb_state_management_helper.dart @@ -0,0 +1,48 @@ +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_state_management_linker.dart'; + +/// Class that interprets state management nodes +class PBStateManagementHelper { + static final PBStateManagementHelper _instance = + PBStateManagementHelper._internal(); + + factory PBStateManagementHelper() => _instance; + + PBStateManagementLinker linker; + + PBStateManagementHelper._internal() { + linker = PBStateManagementLinker(); + } + + void interpretStateManagementNode(PBIntermediateNode node) { + if (isValidStateNode(node.name)) { + var nodeName = _getNodeName(node.name); + // TODO: these states will be used for phase 2 of state management + var states = _getStates(node.name); + linker.processVariation(node, nodeName); + } + } + + /// Returns `true` if `node` is or would be the default node, + /// `false` otherwise + bool isDefaultNode(PBIntermediateNode node) => + !linker.containsElement(_getNodeName(node.name)); + + String _getNodeName(String fullName) { + if (!isValidStateNode(fullName)) { + return ''; + } + return fullName.split('/')[0]; + } + + List _getStates(String fullName) { + if (!isValidStateNode(fullName)) { + return []; + } + return fullName.split('/')[1].split(','); + } + + /// Returns true if `name` is a valid state management name + bool isValidStateNode(String name) => + RegExp(r'^\w*\/(\w*,?\s?)*[\w]$').hasMatch(name); +} diff --git a/lib/interpret_and_optimize/helpers/pb_state_management_linker.dart b/lib/interpret_and_optimize/helpers/pb_state_management_linker.dart new file mode 100644 index 00000000..1980f731 --- /dev/null +++ b/lib/interpret_and_optimize/helpers/pb_state_management_linker.dart @@ -0,0 +1,73 @@ +import 'package:parabeac_core/controllers/interpret.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/interfaces/pb_inherited_intermediate.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_symbol_storage.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_state.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_variation.dart'; + +class PBStateManagementLinker { + PBStateManagementLinker._internal() { + interpret = Interpret(); + _statemap = {}; + stateQueue = []; + } + + static final PBStateManagementLinker _instance = + PBStateManagementLinker._internal(); + + factory PBStateManagementLinker() => _instance; + + Interpret interpret; + + Map _statemap; + + List stateQueue; + + bool containsElement(String name) => _statemap.containsKey(name); + + /// Adds the `node` variation to the [DirectedStateGraph] of the + /// default [PBIntermediateNode], or sets up `node` as default + /// to receive [IntermediateStates] in its state graph. + void processVariation(PBIntermediateNode node, String rootNodeName) async { + // Assign `node` as default + if (!containsElement(rootNodeName)) { + _statemap[rootNodeName] = node; + } + // Add state to default node + else { + if (node is PBSharedMasterNode) { + var tempSym = + PBSymbolStorage().getSharedInstanceNodeBySymbolID(node.SYMBOL_ID); + tempSym?.isMasterState = true; + } + stateQueue.add(_interpretVariationNode(node).then((processedNode) { + var intermediateState = + IntermediateState(variation: IntermediateVariation(processedNode)); + _statemap[rootNodeName] + .auxiliaryData + .stateGraph + .addState(intermediateState); + })); + } + } + + /// Runs the state management [PBIntermediateNode] through + /// the necessary interpretation services. + Future _interpretVariationNode( + PBIntermediateNode node) async { + var visualServiceResult = await interpret.visualGenerationService( + (node as PBInheritedIntermediate).originalRef, + node.currentContext, + Stopwatch()..start(), + ignoreStates: true); + var pluginServiceResult = await interpret.pluginService( + visualServiceResult, node.currentContext, Stopwatch()..start()); + var layoutServiceResult = await interpret.layoutGenerationService( + pluginServiceResult, + pluginServiceResult.currentContext, + Stopwatch()..start()); + return await interpret.alignGenerationService(layoutServiceResult, + layoutServiceResult.currentContext, Stopwatch()..start()); + } +} diff --git a/lib/interpret_and_optimize/helpers/pb_symbol_storage.dart b/lib/interpret_and_optimize/helpers/pb_symbol_storage.dart index 07c500eb..c5f16c3e 100644 --- a/lib/interpret_and_optimize/helpers/pb_symbol_storage.dart +++ b/lib/interpret_and_optimize/helpers/pb_symbol_storage.dart @@ -96,6 +96,12 @@ class PBSymbolStorage { (element) => element.SYMBOL_ID == symbolID, orElse: () => null); + PBSharedInstanceIntermediateNode getSharedInstanceNodeBySymbolID( + String symbolID) => + _pbSharedInstanceNodes.values.firstWhere( + (element) => element.SYMBOL_ID == symbolID, + orElse: () => null); + PBSharedInstanceIntermediateNode getSharedInstaceNode(String id) => _pbSharedInstanceNodes['$id']; diff --git a/lib/interpret_and_optimize/services/intermediate_writer.dart b/lib/interpret_and_optimize/services/intermediate_writer.dart deleted file mode 100644 index 9ac6a106..00000000 --- a/lib/interpret_and_optimize/services/intermediate_writer.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:parabeac_core/controllers/errors/pre_generation_errors.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_group.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; -import '../../controllers/main_info.dart'; - -class IntermediateWriter { - PBIntermediateTree tree; - String _ouputDir; - IntermediateWriter( - this.tree, - ); - - /// Method that writes a `.json file` containing the [intermediate widgets]. - /// When passed an [outputDir], the `.json file` will be generated at that location, - /// otherwise it will be generated in the default directory. - void writeJsonFile(String filename, {String outputDir}) { - var formattedProjectName = tree.projectName - .trim() - .toLowerCase() - .replaceAll('.sketch', '') - .replaceAll(' ', '_') + - '.json'; - - var entities = _generateAllPages(); - if (tree.rootItem.node != null) { - entities['root'] = tree.rootItem.node.toJson(); - } else { - throw RootItemNotSetError(); - } - _ouputDir = - outputDir ?? '${MainInfo().outputPath}/out/${formattedProjectName}'; - - var output = File(outputDir != null - ? _ouputDir - : '${MainInfo().outputPath}/out/${formattedProjectName}'); - output.createSync(recursive: true); - output.writeAsStringSync(json.encode(entities)); - } - - String getOutputDir() { - return _ouputDir; - } - - /// Creates a map that contains both Symbols - /// and conventional pages in intermediate - /// json format ready to be written to a file - Map _generateAllPages() { - return {'pages': _generateConventionalPages(tree.groups)}; - } - - /// Generates the conventional pages in json - /// and return the Map - List _generateConventionalPages(List groups) { - var result = []; - - for (var group in groups) { - var tempMap = { - 'name': group.name, - 'screens': [], - 'shared': [], - 'misc': [], - }; - - // Generate screens - group.items.forEach((screen) { - if (screen.type == 'SCREEN') { - tempMap['screens'].add(screen.node.toJson()); - } else if (screen.type == 'SHARED') { - tempMap['shared'].add(screen.node.toJson()); - } else { - tempMap['misc'].add(screen.node.toJson()); - } - }); - // Add page entry to result map - result.add(tempMap); - } - return result; - } -} 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 5cd4d7e5..2f5ec20d 100644 --- a/lib/interpret_and_optimize/services/pb_alignment_generation_service.dart +++ b/lib/interpret_and_optimize/services/pb_alignment_generation_service.dart @@ -1,5 +1,4 @@ import 'package:parabeac_core/generation/prototyping/pb_dest_holder.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_align.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.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'; @@ -28,8 +27,11 @@ class PBAlignGenerationService implements PBGenerationService { /// Should find all layout nodes PBIntermediateNode addAlignmentToLayouts() { - assert(originalRoot != null, - '[VisualGenerationService] generate() attempted to generate a non-existing tree.'); + if (originalRoot == null) { + log.warning( + '[PBAlignmentGenerationService] generate() attempted to generate a non-existing tree'); + return null; + } var queue = []; queue.add(LayerTuple([originalRoot], null)); @@ -66,8 +68,13 @@ class PBAlignGenerationService implements PBGenerationService { currentIntermediateNode)); } else if (currentIntermediateNode is PBSharedInstanceIntermediateNode) { + if (currentIntermediateNode.child == null) { + continue; + } + queue.add(LayerTuple( + [currentIntermediateNode.child], currentIntermediateNode)); // Do not align Instance Nodes - continue; +// continue; } else { log.warning( 'We don\'t support class type ${currentIntermediateNode.runtimeType} for adding to the queue.'); 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 5586dd46..26e552ff 100644 --- a/lib/interpret_and_optimize/services/pb_layout_generation_service.dart +++ b/lib/interpret_and_optimize/services/pb_layout_generation_service.dart @@ -14,6 +14,7 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/services/pb_generation_service.dart'; import 'package:quick_log/quick_log.dart'; +import 'package:tuple/tuple.dart'; import 'package:uuid/uuid.dart'; /// PBLayoutGenerationService: @@ -22,7 +23,7 @@ import 'package:uuid/uuid.dart'; /// Output:PBIntermediateNode Tree class PBLayoutGenerationService implements PBGenerationService { ///The available Layouts that could be injected. - List _availableLayouts = []; + final List _availableLayouts = []; var log = Logger('Layout Generation Service'); @@ -36,8 +37,12 @@ class PBLayoutGenerationService implements PBGenerationService { @override PBContext currentContext; + ///Going to replace the [TempGroupLayoutNode]s by [PBLayoutIntermediateNode]s + ///The default [PBLayoutIntermediateNode] + PBLayoutIntermediateNode _defaultLayout; + PBLayoutGenerationService({this.currentContext}) { - Map layoutHandlers = { + var layoutHandlers = { 'column': PBIntermediateColumnLayout( '', currentContext: currentContext, @@ -57,69 +62,96 @@ class PBLayoutGenerationService implements PBGenerationService { } } - defaultLayout = _availableLayouts[0]; + _defaultLayout = _availableLayouts[0]; } - ///The default [PBLayoutIntermediateNode] - PBLayoutIntermediateNode defaultLayout; - - ///Going to replace the [TempGroupLayoutNode]s by [PBLayoutIntermediateNode]s - PBIntermediateNode injectNodes(PBIntermediateNode rootNode) { + PBIntermediateNode extractLayouts( + PBIntermediateNode rootNode, + ) { + if (rootNode == null) { + return rootNode; + } try { - var prototypeNode; - if (!(_containsChildren(rootNode))) { - return rootNode; - } else if (rootNode is PBVisualIntermediateNode) { - rootNode.child = injectNodes(rootNode.child); - return rootNode; - } else if (rootNode is TempGroupLayoutNode) { - // TODO: Refactor prototype node declaration before and after - prototypeNode = (rootNode as TempGroupLayoutNode).prototypeNode; - rootNode = _replaceGroupByLayout(rootNode); - (rootNode as PBLayoutIntermediateNode).prototypeNode = prototypeNode; - } + rootNode = _traverseLayersUtil(rootNode, (layer) { + return layer - if (rootNode is PBLayoutIntermediateNode) { - var children = rootNode.children; - children = children.map((child) => injectNodes(child)).toList(); - rootNode.replaceChildren(children); - } + ///Remove the `TempGroupLayout` nodes that only contain one node + .map(_removingMeaninglessGroup) + .map(_layoutConditionalReplacement) + .toList() - assert( - rootNode != null, 'Layout Generation Service produced a null node.'); - - // If we still have a temp group, this probably means this should be a container. - if (rootNode is TempGroupLayoutNode) { - assert(rootNode.children.length < 2, - 'TempGroupLayout was not converted and has multiple children.'); - // If this node is an unecessary temp group, just return the child. Ex: Designer put a group with one child that was a group and that group contained the visual nodes. - if (rootNode.children[0] is InjectedContainer) { - (rootNode.children[0] as InjectedContainer).prototypeNode = - prototypeNode; - return rootNode.children[0]; - } - var replacementNode = InjectedContainer( - rootNode.bottomRightCorner, - rootNode.topLeftCorner, - Uuid().v4(), - '', - currentContext: currentContext, - ); - replacementNode.prototypeNode = prototypeNode; - replacementNode.addChild(rootNode.children.first); - return replacementNode; - } - rootNode = _postConditionRules(rootNode); - return rootNode; + /// Filter out the elements that are null in the tree + ..removeWhere((element) => element == null); + }); + + ///After all the layouts are generated, the [PostConditionRules] are going + ///to be applyed to the layerss + return _applyPostConditionRules(rootNode); } catch (e, stackTrace) { MainInfo().sentry.captureException( exception: e, stackTrace: stackTrace, ); log.error(e.toString()); + } finally { + return rootNode; + } + } + + PBIntermediateNode _traverseLayersUtil( + PBIntermediateNode rootNode, + List Function(List layer) + transformation) { + ///The stack is going to saving the current layer of tree along with the parent of + ///the layer. It makes use of a `Tuple2()` to save the parent in the first index and a list + ///of nodes for the current layer in the second layer. + var stack = >>[]; + stack.add(Tuple2(null, [rootNode])); + + while (stack.isNotEmpty) { + var currentTuple = stack.removeLast(); + currentTuple = currentTuple.withItem2(transformation(currentTuple.item2)); + currentTuple.item2.forEach((currentNode) { + if (_containsChildren(currentNode)) { + currentNode is PBLayoutIntermediateNode + ? stack.add(Tuple2(currentNode, (currentNode).children)) + : stack.add(Tuple2(currentNode, [currentNode.child])); + } + }); + var node = currentTuple.item1; + if (node != null) { + node is PBLayoutIntermediateNode && node.children.isNotEmpty + ? node.replaceChildren(currentTuple.item2) + : node.child = + (currentTuple.item2.isNotEmpty ? currentTuple.item2[0] : null); + } else { + ///if the `currentTuple.item1` is null, that implies the `currentTuple.item2.first` is the + ///new `rootNode`. + rootNode = currentTuple.item2.first; + } } + return rootNode; } + /// If this node is an unecessary [TempGroupLayoutNode], just return the child or an + /// [InjectContainer] if the group is empty + /// + /// Ex: Designer put a group with one child that was a group + /// and that group contained the visual nodes. + PBIntermediateNode _removingMeaninglessGroup(PBIntermediateNode tempGroup) { + while (tempGroup is TempGroupLayoutNode && tempGroup.children.length <= 1) { + tempGroup = (tempGroup as TempGroupLayoutNode).children.isNotEmpty + ? _replaceNode( + tempGroup, (tempGroup as TempGroupLayoutNode).children[0]) + : _replaceNode( + tempGroup, + InjectedContainer(tempGroup.bottomRightCorner, + tempGroup.topLeftCorner, tempGroup.name, tempGroup.UUID)); + } + return tempGroup; + } + + ///If `node` contains a single or multiple [PBIntermediateNode]s bool _containsChildren(PBIntermediateNode node) => (node is PBVisualIntermediateNode && node.child != null) || (node is PBLayoutIntermediateNode && node.children.isNotEmpty); @@ -128,85 +160,100 @@ class PBLayoutGenerationService implements PBGenerationService { ///nodes should be considered into subsections. For example, if child 0 and child 1 statisfy the ///rule of a [Row] but not child 3, then child 0 and child 1 should be placed inside of a [Row]. Therefore, ///there could be many[IntermediateLayoutNodes] derived in the children level of the `group`. - PBLayoutIntermediateNode _replaceGroupByLayout(TempGroupLayoutNode group) { - var children = group.children; - PBLayoutIntermediateNode rootLayout; + PBIntermediateNode _layoutConditionalReplacement(PBIntermediateNode parent, + {depth = 1}) { + if (parent is PBLayoutIntermediateNode && depth >= 0) { + parent.sortChildren(); + var children = parent.children; + var childPointer = 0; + var reCheck = false; - if (children.length < 2) { - ///the last step is going to replace these layout that contain one child into containers - return group; - } - children = _arrangeChildren(group); - rootLayout = children.length == 1 - ? children[0] - : defaultLayout.generateLayout(children, currentContext, group.name); - return rootLayout; - } + while (childPointer < children.length - 1) { + var currentNode = children[childPointer]; + var nextNode = children[childPointer + 1]; - List _arrangeChildren(PBLayoutIntermediateNode parent) { - parent.sortChildren(); - var children = parent.children; - var childPointer = 0; - var reCheck = false; - - while (childPointer < children.length - 1) { - var currentNode = children[childPointer]; - var nextNode = children[childPointer + 1]; - - for (var layout in _availableLayouts) { - if (layout.satisfyRules(currentNode, nextNode) && - layout.runtimeType != parent.runtimeType) { - var generatedLayout; - - if (layout.runtimeType == currentNode.runtimeType) { - currentNode.addChild(nextNode); - (currentNode as PBLayoutIntermediateNode) - .replaceChildren(_arrangeChildren(currentNode)); - generatedLayout = currentNode; - } else if (layout.runtimeType == nextNode.runtimeType) { - nextNode.addChild(currentNode); - (nextNode as PBLayoutIntermediateNode) - .replaceChildren(_arrangeChildren(nextNode)); - generatedLayout = nextNode; - } + for (var layout in _availableLayouts) { + if (layout.satisfyRules(currentNode, nextNode) && + layout.runtimeType != parent.runtimeType) { + var generatedLayout; + + ///If either `currentNode` or `nextNode` is of the same `runtimeType` as the satified [PBLayoutIntermediateNode], + ///then its going to use either one instead of creating a new [PBLayoutIntermediateNode]. + if (layout.runtimeType == currentNode.runtimeType) { + currentNode.addChild(nextNode); + currentNode = + _layoutConditionalReplacement(currentNode, depth: depth - 1); + generatedLayout = currentNode; + } else if (layout.runtimeType == nextNode.runtimeType) { + nextNode.addChild(currentNode); + nextNode = + _layoutConditionalReplacement(nextNode, depth: depth - 1); + generatedLayout = nextNode; + } - /// Generated / Injected Layouts can have no names because they don't derive from a group, which means they would also not end up being a misc. node. - generatedLayout ??= layout - .generateLayout([currentNode, nextNode], currentContext, ''); - children - .replaceRange(childPointer, childPointer + 2, [generatedLayout]); - childPointer = 0; - reCheck = true; - break; + ///If neither of the current nodes are of the same `runtimeType` as the layout, we are going to use the actual + ///satified [PBLayoutIntermediateNode] to generate the layout. We place both of the nodes inside + ///of the generated layout. + generatedLayout ??= layout + .generateLayout([currentNode, nextNode], currentContext, ''); + var start = childPointer, end = childPointer + 2; + children.replaceRange( + start, + (end > children.length ? children.length : end), + [generatedLayout]); + childPointer = 0; + reCheck = true; + break; + } } + childPointer = reCheck ? 0 : childPointer + 1; + reCheck = false; } - childPointer = reCheck ? 0 : childPointer + 1; - reCheck = false; + parent.replaceChildren(children); + if (children.length == 1) { + return _replaceNode(parent, children[0]); + } else { + return parent is! TempGroupLayoutNode + ? parent + : _replaceNode( + parent, + _defaultLayout.generateLayout( + children, currentContext, parent.name)); + } + } + return parent; + } + + ///Makes sure all the necessary attributes are recovered before replacing a [PBIntermediateNode] + PBIntermediateNode _replaceNode( + PBIntermediateNode candidate, PBIntermediateNode replacement) { + if (candidate is PBLayoutIntermediateNode && + replacement is PBLayoutIntermediateNode) { + replacement.prototypeNode = candidate.prototypeNode; } - return children?.cast(); + return replacement; } ///Applying [PostConditionRule]s at the end of the [PBLayoutIntermediateNode] - PBIntermediateNode _postConditionRules(PBIntermediateNode node) { + PBIntermediateNode _applyPostConditionRules(PBIntermediateNode node) { if (node == null) { return node; } + if (node is PBLayoutIntermediateNode && node.children.isNotEmpty) { + node.replaceChildren( + node.children.map((node) => _applyPostConditionRules(node)).toList()); + } else if (node is PBVisualIntermediateNode) { + node.child = _applyPostConditionRules(node.child); + } + for (var postConditionRule in _postLayoutRules) { if (postConditionRule.testRule(node, null)) { var result = postConditionRule.executeAction(node, null); if (result != null) { - return result; + return _replaceNode(node, result); } } } - - if (node is PBLayoutIntermediateNode && node.children.isNotEmpty) { - node.replaceChildren(node.children - .map((node) => _postConditionRules(node as PBIntermediateNode)) - .toList()); - } else if (node is PBVisualIntermediateNode) { - node.child = _postConditionRules(node.child); - } return node; } } diff --git a/lib/interpret_and_optimize/services/pb_plugin_control_service.dart b/lib/interpret_and_optimize/services/pb_plugin_control_service.dart index 1090139b..b8beeb43 100644 --- a/lib/interpret_and_optimize/services/pb_plugin_control_service.dart +++ b/lib/interpret_and_optimize/services/pb_plugin_control_service.dart @@ -23,8 +23,11 @@ class PBPluginControlService implements PBGenerationService { /// Builds and returns intermediate tree by breadth depth first. /// @return Returns the root node of the intermediate tree. PBIntermediateNode convertAndModifyPluginNodeTree() { - assert(originalRoot != null, - '[VisualGenerationService] generate() attempted to generate a non-existing tree.'); + if (originalRoot == null) { + log.warning( + '[PBPluginControlService] generate() attempted to generate a non-existing tree.'); + return null; + } var queue = []; PBIntermediateNode rootIntermediateNode; diff --git a/lib/interpret_and_optimize/services/pb_shared_aggregation_service.dart b/lib/interpret_and_optimize/services/pb_shared_aggregation_service.dart index 4bbffb12..b101457e 100644 --- a/lib/interpret_and_optimize/services/pb_shared_aggregation_service.dart +++ b/lib/interpret_and_optimize/services/pb_shared_aggregation_service.dart @@ -84,9 +84,8 @@ class PBSharedInterAggregationService { instanceIntermediateNode.sharedParamValues = instanceIntermediateNode.sharedParamValues.map((v) { for (var symParam in masterNode.overridableProperties) { - if (symParam.UUID == v.UUID) { - return PBSharedParameterValue( - symParam.type, v.value, symParam.UUID); + if (symParam.propertyName == v.overrideName) { + return PBSharedParameterValue(symParam.type, v.value, symParam.UUID, symParam.propertyName); } } return null; diff --git a/lib/interpret_and_optimize/services/pb_symbol_linker_service.dart b/lib/interpret_and_optimize/services/pb_symbol_linker_service.dart index 97a9118d..497da1ed 100644 --- a/lib/interpret_and_optimize/services/pb_symbol_linker_service.dart +++ b/lib/interpret_and_optimize/services/pb_symbol_linker_service.dart @@ -6,23 +6,22 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_visu import 'package:parabeac_core/interpret_and_optimize/helpers/pb_symbol_storage.dart'; import 'package:parabeac_core/interpret_and_optimize/services/pb_shared_aggregation_service.dart'; -class PBSymbolLinkerService{ - +class PBSymbolLinkerService { PBSymbolStorage _symbolStorage; PBSharedInterAggregationService _aggregationService; - PBSymbolLinkerService(){ + PBSymbolLinkerService() { _symbolStorage = PBSymbolStorage(); _aggregationService = PBSharedInterAggregationService(); } - ///Linking [PBSharedMasterNode] and [PBSharedInsstanceIntermediateNode] together; linking its - ///parameter and values. +// /Linking [PBSharedMasterNode] and [PBSharedInsstanceIntermediateNode] together; linking its +// /parameter and values. Future linkSymbols(PBIntermediateNode rootNode) async{ if(rootNode == null){ return rootNode; } - + var stack = []; PBIntermediateNode rootIntermediateNode; stack.add(rootNode); @@ -48,4 +47,4 @@ class PBSymbolLinkerService{ } return rootIntermediateNode; } -} \ No newline at end of file +} diff --git a/lib/interpret_and_optimize/services/pb_visual_generation_service.dart b/lib/interpret_and_optimize/services/pb_visual_generation_service.dart index ae6713e1..f7b06968 100644 --- a/lib/interpret_and_optimize/services/pb_visual_generation_service.dart +++ b/lib/interpret_and_optimize/services/pb_visual_generation_service.dart @@ -11,6 +11,7 @@ import 'package:parabeac_core/interpret_and_optimize/helpers/node_tuple.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_deny_list_helper.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_plugin_list_helper.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_state_management_helper.dart'; import 'package:parabeac_core/interpret_and_optimize/services/pb_generation_service.dart'; /// Takes a SketchNodeTree and begins generating PBNode interpretations. For each node, the node is going to pass through the PBSemanticInterpretationService which checks if the node should generate a specific PBIntermediateNode based on the semantics that it contains. @@ -25,19 +26,22 @@ class PBVisualGenerationService implements PBGenerationService { @override PBContext currentContext; + PBStateManagementHelper smHelper; + /// Constructor for PBVisualGenerationService, must include the root SketchNode PBVisualGenerationService(originalRoot, {this.currentContext}) { _positionalCleansingService = PositionalCleansingService(); this.originalRoot = _positionalCleansingService.eliminateOffset(originalRoot); + smHelper = PBStateManagementHelper(); } /// Builds and returns intermediate tree by breadth depth first. /// @return Returns the root node of the intermediate tree. - Future getIntermediateTree() async { + Future getIntermediateTree( + {bool ignoreStates = false}) async { if (originalRoot == null) { - assert(true, - '[VisualGenerationService] generate() attempted to generate a non-existing tree.'); + return Future.value(null); } PBPluginListHelper().initPlugins(currentContext); @@ -52,13 +56,14 @@ class PBVisualGenerationService implements PBGenerationService { // Check semantics result = PBDenyListHelper() .returnDenyListNodeIfExist(currentNode.designNode); + if (result is PBDenyListNode) { } else { result = PBPluginListHelper() .returnAllowListNodeIfExists(currentNode.designNode); - // Generate general intermediate node if still null. - // needs to be assigned to [original], because [symbolMaster] needs to be registered to SymbolMaster + /// Generate general intermediate node if still null. + /// needs to be assigned to [original], because [symbolMaster] needs to be registered to SymbolMaster if (result == null || currentNode.designNode is PBSharedInstanceDesignNode || @@ -66,6 +71,20 @@ class PBVisualGenerationService implements PBGenerationService { result = await currentNode.designNode.interpretNode(currentContext); } + // Interpret state management node + if (!ignoreStates && + smHelper.isValidStateNode(result.name) && + currentNode.designNode.name != + currentNode.convertedParent?.name ?? + true) { + if (smHelper.isDefaultNode(result)) { + smHelper.interpretStateManagementNode(result); + } else { + smHelper.interpretStateManagementNode(result); + continue; + } + } + if (currentNode.convertedParent != null) { _addToParent(currentNode.convertedParent, result); } @@ -99,9 +118,23 @@ class PBVisualGenerationService implements PBGenerationService { destHolder.addChild(rootIntermediateNode); return destHolder; } + _extractScreenSize(rootIntermediateNode); return rootIntermediateNode; } + ///Sets the size of the UI element. + /// + ///We are assuming that since the [rootIntermediateNode] contains all of the nodes + ///then it should represent the biggest screen size that encapsulates the entire UI elements. + void _extractScreenSize(PBIntermediateNode rootIntermediateNode) { + if (currentContext.screenBottomRightCorner == null && + currentContext.screenTopLeftCorner == null) { + currentContext.screenBottomRightCorner = + rootIntermediateNode.bottomRightCorner; + currentContext.screenTopLeftCorner = rootIntermediateNode.topLeftCorner; + } + } + void _addToParent(PBIntermediateNode parentNode, PBIntermediateNode convertedChildNode) => parentNode.addChild(convertedChildNode); diff --git a/lib/interpret_and_optimize/state_management/directed_state_graph.dart b/lib/interpret_and_optimize/state_management/directed_state_graph.dart new file mode 100644 index 00000000..8e4941cb --- /dev/null +++ b/lib/interpret_and_optimize/state_management/directed_state_graph.dart @@ -0,0 +1,9 @@ +import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_state.dart'; + +class DirectedStateGraph { + List states = []; + + void addState(IntermediateState state) => states.add(state); + void removeState(String variationUuid) => + states.removeWhere((element) => element.variation.UUID == variationUuid); +} diff --git a/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.dart b/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.dart new file mode 100644 index 00000000..ad1c6abe --- /dev/null +++ b/lib/interpret_and_optimize/state_management/intermediate_auxillary_data.dart @@ -0,0 +1,22 @@ +import 'package:parabeac_core/interpret_and_optimize/state_management/directed_state_graph.dart'; + +class IntermediateAuxiliaryData { + DirectedStateGraph stateGraph; + + /// Info relating to a elements borders, currently just in a map format. + Map borderInfo; + + /// Info relating to the alignment of an element, currently just in a map format. + Map alignment; + + /// The background color of the element. + String color; + + IntermediateAuxiliaryData({ + this.stateGraph, + this.alignment, + this.color, + }) { + stateGraph ??= DirectedStateGraph(); + } +} diff --git a/lib/interpret_and_optimize/state_management/intermediate_state.dart b/lib/interpret_and_optimize/state_management/intermediate_state.dart new file mode 100644 index 00000000..a18cbcd9 --- /dev/null +++ b/lib/interpret_and_optimize/state_management/intermediate_state.dart @@ -0,0 +1,14 @@ +import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_variation.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_vertex.dart'; + +class IntermediateState { + IntermediateVariation variation; + List vertexes; + bool isAppState; + + IntermediateState({ + this.variation, + this.vertexes, + this.isAppState, + }); +} diff --git a/lib/interpret_and_optimize/state_management/intermediate_variation.dart b/lib/interpret_and_optimize/state_management/intermediate_variation.dart new file mode 100644 index 00000000..00177b64 --- /dev/null +++ b/lib/interpret_and_optimize/state_management/intermediate_variation.dart @@ -0,0 +1,7 @@ +import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; + +class IntermediateVariation { + String get UUID => node.UUID; + PBIntermediateNode node; + IntermediateVariation(this.node); +} diff --git a/lib/interpret_and_optimize/state_management/intermediate_vertex.dart b/lib/interpret_and_optimize/state_management/intermediate_vertex.dart new file mode 100644 index 00000000..dcccc762 --- /dev/null +++ b/lib/interpret_and_optimize/state_management/intermediate_vertex.dart @@ -0,0 +1 @@ +class IntermediateVertex {} diff --git a/lib/interpret_and_optimize/value_objects/pb_symbol_instance_overridable_value.dart b/lib/interpret_and_optimize/value_objects/pb_symbol_instance_overridable_value.dart index 33979995..c30de146 100644 --- a/lib/interpret_and_optimize/value_objects/pb_symbol_instance_overridable_value.dart +++ b/lib/interpret_and_optimize/value_objects/pb_symbol_instance_overridable_value.dart @@ -1,12 +1,9 @@ import 'package:json_annotation/json_annotation.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_intermediate_node.dart'; -part 'pb_symbol_instance_overridable_value.g.dart'; -@JsonSerializable(nullable: true) class PBSymbolInstanceOverridableValue { - @JsonKey(toJson: _typeToJson, fromJson: _typeFromJson) final Type type; - @JsonKey(name: 'do_objectID') + final String UUID; final dynamic value; @@ -20,11 +17,4 @@ class PBSymbolInstanceOverridableValue { //TODO: return a more specified Type return PBIntermediateNode; } - - factory PBSymbolInstanceOverridableValue.fromJson(Map json) => - _$PBSymbolInstanceOverridableValueFromJson(json); - - @override - Map toJson() => - _$PBSymbolInstanceOverridableValueToJson(this); } diff --git a/lib/interpret_and_optimize/value_objects/pb_symbol_instance_overridable_value.g.dart b/lib/interpret_and_optimize/value_objects/pb_symbol_instance_overridable_value.g.dart deleted file mode 100644 index 77032597..00000000 --- a/lib/interpret_and_optimize/value_objects/pb_symbol_instance_overridable_value.g.dart +++ /dev/null @@ -1,24 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'pb_symbol_instance_overridable_value.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PBSymbolInstanceOverridableValue _$PBSymbolInstanceOverridableValueFromJson( - Map json) { - return PBSymbolInstanceOverridableValue( - json['do_objectID'] as String, - json['value'], - PBSymbolInstanceOverridableValue._typeFromJson(json['type']), - ); -} - -Map _$PBSymbolInstanceOverridableValueToJson( - PBSymbolInstanceOverridableValue instance) => - { - 'type': PBSymbolInstanceOverridableValue._typeToJson(instance.type), - 'do_objectID': instance.UUID, - 'value': instance.value, - }; diff --git a/lib/interpret_and_optimize/value_objects/pb_symbol_master_overridable_prop.dart b/lib/interpret_and_optimize/value_objects/pb_symbol_master_overridable_prop.dart index f5483bc0..e3894d04 100644 --- a/lib/interpret_and_optimize/value_objects/pb_symbol_master_overridable_prop.dart +++ b/lib/interpret_and_optimize/value_objects/pb_symbol_master_overridable_prop.dart @@ -1,20 +1,8 @@ import 'package:json_annotation/json_annotation.dart'; -part 'pb_symbol_master_overridable_prop.g.dart'; -@JsonSerializable(nullable: true) class PBSymbolMasterOverridableProperty { final bool canOverride; final String overrideName; PBSymbolMasterOverridableProperty(this.canOverride, this.overrideName); - - factory PBSymbolMasterOverridableProperty.fromJson( - Map json) => - _$PBSymbolMasterOverridablePropertyFromJson(json); - - String get symbolId => overrideName?.replaceAll(RegExp('_.+'), ''); - - @override - Map toJson() => - _$PBSymbolMasterOverridablePropertyToJson(this); } diff --git a/lib/interpret_and_optimize/value_objects/pb_symbol_master_overridable_prop.g.dart b/lib/interpret_and_optimize/value_objects/pb_symbol_master_overridable_prop.g.dart deleted file mode 100644 index a8335af2..00000000 --- a/lib/interpret_and_optimize/value_objects/pb_symbol_master_overridable_prop.g.dart +++ /dev/null @@ -1,22 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'pb_symbol_master_overridable_prop.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PBSymbolMasterOverridableProperty _$PBSymbolMasterOverridablePropertyFromJson( - Map json) { - return PBSymbolMasterOverridableProperty( - json['canOverride'] as bool, - json['overrideName'] as String, - ); -} - -Map _$PBSymbolMasterOverridablePropertyToJson( - PBSymbolMasterOverridableProperty instance) => - { - 'canOverride': instance.canOverride, - 'overrideName': instance.overrideName, - }; diff --git a/lib/interpret_and_optimize/value_objects/pb_symbol_master_params.dart b/lib/interpret_and_optimize/value_objects/pb_symbol_master_params.dart index 65602d83..ca5727b2 100644 --- a/lib/interpret_and_optimize/value_objects/pb_symbol_master_params.dart +++ b/lib/interpret_and_optimize/value_objects/pb_symbol_master_params.dart @@ -4,13 +4,11 @@ import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pb_inte 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/value_objects/point.dart'; -part 'pb_symbol_master_params.g.dart'; ///TODO: Need another class for elements that generate but are not visuals. -@JsonSerializable(nullable: true) + class PBSymbolMasterParameter extends PBVisualIntermediateNode implements PBInjectedIntermediate { - @JsonKey(toJson: _typeToJson, fromJson: _typeFromJson) final Type type; final String parameterID; final bool canOverride; @@ -18,10 +16,10 @@ class PBSymbolMasterParameter extends PBVisualIntermediateNode final parameterDefinition; double topLeftX, topLeftY, bottomRightX, bottomRightY; - @JsonKey(ignore: true) PBContext context; PBSymbolMasterParameter( + String name, this.type, this.parameterID, this.canOverride, @@ -32,7 +30,7 @@ class PBSymbolMasterParameter extends PBVisualIntermediateNode this.bottomRightX, this.bottomRightY, {this.context}) - : super(Point(0, 0), Point(0, 0), context, propertyName); + : super(Point(0, 0), Point(0, 0), context, name); static String _typeToJson(type) { return type.toString(); @@ -43,12 +41,6 @@ class PBSymbolMasterParameter extends PBVisualIntermediateNode return PBIntermediateNode; } - factory PBSymbolMasterParameter.fromJson(Map json) => - _$PBSymbolMasterParameterFromJson(json); - - @override - Map toJson() => _$PBSymbolMasterParameterToJson(this); - @override void addChild(PBIntermediateNode node) {} diff --git a/lib/interpret_and_optimize/value_objects/pb_symbol_master_params.g.dart b/lib/interpret_and_optimize/value_objects/pb_symbol_master_params.g.dart deleted file mode 100644 index c0b74a23..00000000 --- a/lib/interpret_and_optimize/value_objects/pb_symbol_master_params.g.dart +++ /dev/null @@ -1,58 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'pb_symbol_master_params.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -PBSymbolMasterParameter _$PBSymbolMasterParameterFromJson( - Map json) { - return PBSymbolMasterParameter( - PBSymbolMasterParameter._typeFromJson(json['type']), - json['parameterID'] as String, - json['canOverride'] as bool, - json['propertyName'] as String, - json['parameterDefinition'], - (json['topLeftX'] as num)?.toDouble(), - (json['topLeftY'] as num)?.toDouble(), - (json['bottomRightX'] as num)?.toDouble(), - (json['bottomRightY'] as num)?.toDouble(), - ) - ..subsemantic = json['subsemantic'] as String - ..child = json['child'] - ..topLeftCorner = json['topLeftCorner'] == null - ? null - : Point.fromJson(json['topLeftCorner'] as Map) - ..bottomRightCorner = json['bottomRightCorner'] == null - ? null - : Point.fromJson(json['bottomRightCorner'] as Map) - ..size = json['size'] as Map - ..borderInfo = json['borderInfo'] as Map - ..alignment = json['alignment'] as Map - ..name = json['name'] as String - ..color = json['color'] as String; -} - -Map _$PBSymbolMasterParameterToJson( - PBSymbolMasterParameter instance) => - { - 'subsemantic': instance.subsemantic, - 'child': instance.child, - 'topLeftCorner': instance.topLeftCorner, - 'bottomRightCorner': instance.bottomRightCorner, - 'size': instance.size, - 'borderInfo': instance.borderInfo, - 'alignment': instance.alignment, - 'name': instance.name, - 'color': instance.color, - 'type': PBSymbolMasterParameter._typeToJson(instance.type), - 'parameterID': instance.parameterID, - 'canOverride': instance.canOverride, - 'propertyName': instance.propertyName, - 'parameterDefinition': instance.parameterDefinition, - 'topLeftX': instance.topLeftX, - 'topLeftY': instance.topLeftY, - 'bottomRightX': instance.bottomRightX, - 'bottomRightY': instance.bottomRightY, - }; diff --git a/lib/interpret_and_optimize/value_objects/point.dart b/lib/interpret_and_optimize/value_objects/point.dart index 8bd0b2eb..a4ab757e 100644 --- a/lib/interpret_and_optimize/value_objects/point.dart +++ b/lib/interpret_and_optimize/value_objects/point.dart @@ -1,9 +1,3 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'point.g.dart'; - -@JsonSerializable(nullable: true) - ///Geographical point on the canvas. class Point implements Comparable { ///absolue positions @@ -13,8 +7,6 @@ class Point implements Comparable { @override String toString() => ' X: $x, Y:$y'; - Map toJson() => _$PointToJson(this); - factory Point.fromJson(Map json) => _$PointFromJson(json); Point clone(Point point) => Point(point.x, point.y); diff --git a/lib/interpret_and_optimize/value_objects/point.g.dart b/lib/interpret_and_optimize/value_objects/point.g.dart deleted file mode 100644 index 8e55d9d0..00000000 --- a/lib/interpret_and_optimize/value_objects/point.g.dart +++ /dev/null @@ -1,19 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'point.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Point _$PointFromJson(Map json) { - return Point( - (json['x'] as num)?.toDouble(), - (json['y'] as num)?.toDouble(), - ); -} - -Map _$PointToJson(Point instance) => { - 'x': instance.x, - 'y': instance.y, - }; diff --git a/pubspec.yaml b/pubspec.yaml index 27aa67ca..ce21dd2b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,6 +19,7 @@ dependencies: sentry: ">=3.0.0 <4.0.0" http2: ^1.0.1 recase: "^3.0.0" + tuple: ^1.0.3 # path: ^1.6.0 dev_dependencies: diff --git a/test/lib/generation/generator_test.dart b/test/lib/generation/generator_test.dart index 7098a196..c338b97f 100644 --- a/test/lib/generation/generator_test.dart +++ b/test/lib/generation/generator_test.dart @@ -1,8 +1,10 @@ +import 'package:parabeac_core/generation/generators/attribute-helper/pb_generator_context.dart'; import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_container_gen.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_text_gen.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_container.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_text.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_auxillary_data.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; import 'package:test/test.dart'; import 'package:mockito/mockito.dart'; @@ -13,22 +15,33 @@ class MockInheritedText extends Mock implements InheritedText {} class MockManager extends Mock implements PBFlutterGenerator {} +class MockContext extends Mock implements GeneratorContext {} + +class MockData extends Mock implements IntermediateAuxiliaryData {} + void main() { - group('GGenerator test', () { + group('Generator test', () { var mockManager, mockGenerator, mockTextGenerator; var mockInheritedContainer, mockInheritedText; + var mockContext, mockData; setUp(() { mockInheritedContainer = MockInheritedContainer(); mockInheritedText = MockInheritedText(); + mockContext = MockContext(); + mockData = MockData(); when(mockInheritedContainer.child).thenReturn(mockInheritedText); + when((mockInheritedContainer as MockInheritedContainer).auxiliaryData) + .thenReturn(mockData); + when(mockInheritedContainer.topLeftCorner).thenReturn(Point(0, 0)); when(mockInheritedContainer.bottomRightCorner) .thenReturn(Point(100, 100)); when(mockInheritedText.name).thenReturn('Test Name'); + when(mockInheritedText.auxiliaryData).thenReturn(mockData); mockTextGenerator = PBTextGen(); @@ -38,14 +51,15 @@ void main() { when(mockInheritedText.text).thenReturn('Test Text'); - mockManager = PBFlutterGenerator(null); + mockManager = PBFlutterGenerator(); mockGenerator = PBContainerGenerator(); mockGenerator.manager = mockManager; }); test('', () { - var result = mockGenerator.generate(mockInheritedContainer); + var result = (mockGenerator as PBContainerGenerator) + .generate(mockInheritedContainer, mockContext); expect(result != null, true); expect(result is String, true); diff --git a/test/lib/input_services/input_to_pbdl_test.dart b/test/lib/input_services/input_to_pbdl_test.dart index 0ac11662..b88c2d3f 100644 --- a/test/lib/input_services/input_to_pbdl_test.dart +++ b/test/lib/input_services/input_to_pbdl_test.dart @@ -41,7 +41,7 @@ void main() { }); test('Sketch Test', () { var sketchNodeTree = SketchController().generateSketchNodeTree( - ids.archive, ids.metaFileJson['pagesAndArtboards'], outputPath); + ids, ids.metaFileJson['pagesAndArtboards'], outputPath); expect(sketchNodeTree != null, true); expect(sketchNodeTree is SketchNodeTree, true); diff --git a/test/lib/input_services/padding_dynamic_size_test.dart b/test/lib/input_services/padding_dynamic_size_test.dart index b68bda95..42499aec 100644 --- a/test/lib/input_services/padding_dynamic_size_test.dart +++ b/test/lib/input_services/padding_dynamic_size_test.dart @@ -1,6 +1,5 @@ import 'package:mockito/mockito.dart'; import 'package:parabeac_core/generation/generators/pb_flutter_generator.dart'; -import 'package:parabeac_core/generation/generators/pb_flutter_writer.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/alignments/padding.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'; @@ -21,8 +20,7 @@ void main() { currentContext = ContextMock(); when(currentContext.screenTopLeftCorner).thenReturn(Point(215, -295)); when(currentContext.screenBottomRightCorner).thenReturn(Point(590, 955)); - when(currentContext.generationManager) - .thenReturn(PBFlutterGenerator(PBFlutterWriter())); + when(currentContext.generationManager).thenReturn(PBFlutterGenerator()); currentChild = NodeMock(); when(currentChild.currentContext).thenReturn(currentContext); @@ -35,11 +33,11 @@ void main() { }); test('Calculating dynamic padding size', () { currentPadding.addChild(currentChild); - Map pbPadding = currentPadding.toJson(); - expect(pbPadding['left'], 0.04); - expect(pbPadding['top'], 0.012); - expect(pbPadding['right'], 0.04); - expect(pbPadding['bottom'], 0.012); + currentPadding = currentPadding as Padding; + expect(currentPadding.left, 0.04); + expect(currentPadding.top, 0.012); + expect(currentPadding.right, 0.04); + expect(currentPadding.bottom, 0.012); }); }); } diff --git a/test/lib/interpret_and_optimize/services/interpret_test.dart b/test/lib/interpret_and_optimize/services/interpret_test.dart index 8596fe4b..e9e5e3af 100644 --- a/test/lib/interpret_and_optimize/services/interpret_test.dart +++ b/test/lib/interpret_and_optimize/services/interpret_test.dart @@ -10,13 +10,11 @@ import 'package:parabeac_core/input/sketch/helper/sketch_node_tree.dart'; import 'package:parabeac_core/input/sketch/helper/sketch_page.dart'; import 'package:parabeac_core/input/sketch/helper/sketch_page_item.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_container.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_align.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_container.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/alignments/injected_align.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/temp_group_layout_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:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_item.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; import 'package:test/test.dart'; import 'package:mockito/mockito.dart'; @@ -128,11 +126,12 @@ void main() { nodeTree, ); expect(mainTree != null, true); - expect(mainTree is PBIntermediateTree, true); - expect(mainTree.rootItem is PBIntermediateItem, true); - expect(mainTree.rootItem.node is InheritedScaffold, true); - expect(mainTree.rootItem.node.child is InjectedAlign, true); - expect(mainTree.rootItem.node.child.child is InjectedContainer, true); + expect(mainTree is PBProject, true); + expect(mainTree.forest.first.rootNode is InheritedScaffold, true); + expect(mainTree.forest.first.rootNode.child is InjectedAlign, true); + + ///TODO: Check the type of the leaf node + expect(mainTree.forest.first.rootNode.child.child != null, true); }); }); } diff --git a/test/lib/interpret_and_optimize/services/pb_layout_generation_service_test.dart b/test/lib/interpret_and_optimize/services/pb_layout_generation_service_test.dart deleted file mode 100644 index 8b0547a2..00000000 --- a/test/lib/interpret_and_optimize/services/pb_layout_generation_service_test.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:mockito/mockito.dart'; -import 'package:parabeac_core/controllers/main_info.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_configuration.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; -import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; -import 'package:parabeac_core/interpret_and_optimize/services/pb_layout_generation_service.dart'; -import 'package:test/test.dart'; -import 'package:parabeac_core/input/sketch/entities/objects/frame.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/layouts/temp_group_layout_node.dart'; -import 'package:parabeac_core/input/sketch/entities/layers/group.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/injected_container.dart'; -import 'package:parabeac_core/interpret_and_optimize/entities/layouts/column.dart'; -import 'package:uuid/uuid.dart'; - -class MockContext extends Mock implements PBContext { - @override - PBConfiguration configuration; - - @override - Map jsonConfigurations; - - @override - Point screenBottomRightCorner; - - @override - Point screenTopLeftCorner; -} - -class MockContainer extends Mock implements InjectedContainer {} - -void main() { - var jsonConfigurations = { - 'default': { - 'widgetStyle': 'Material', - 'widgetType': 'Stateless', - 'widgetSpacing': 'Expanded', - 'layoutPrecedence': ['column', 'row', 'stack'] - }, - 'This will be replaced by a Object ID to determine specific configurations for each page': - { - 'widgetStyle': 'Material', - 'widgetType': 'Stateless', - 'widgetSpacing': 'Expanded' - }, - 'root': 'AC2E7423-4609-4F37-8BCA-7E915944FFE2' - }; - TempGroupLayoutNode root; - - /// Test-driven development. - group('Test that children of layouts create the proper sizing.', () { - ///Test for inside of a artboard. - - MainInfo().configurationType = 'default'; - var context = PBContext(jsonConfigurations: jsonConfigurations); - setUp(() async { - context.screenTopLeftCorner = Point(0, 0); - context.screenBottomRightCorner = Point(414, 896); - var gm = Group(); - gm.boundaryRectangle = Frame(x: 0, y: 46, width: 414, height: 850); - root = await gm.interpretNode(context); - - var gm2 = Group(); - gm2.boundaryRectangle = Frame(x: 0, y: 86, width: 414, height: 100); - var row = await gm2.interpretNode(context); - root.addChild(row); - - row.addChild(InjectedContainer( - Point(100, 186), Point(0, 86), 'testingContainer0', Uuid().v4(), - currentContext: context)); - row.addChild(InjectedContainer( - Point(250, 186), Point(150, 86), 'testingContainer1', Uuid().v4(), - currentContext: context)); - - root.addChild(InjectedContainer( - Point(50, 50), Point(0, 0), 'testingContainer2', Uuid().v4(), - currentContext: context)); - }); - - test('', () { - var result = - PBLayoutGenerationService(currentContext: context).injectNodes(root); - expect(result.child.runtimeType, PBIntermediateColumnLayout); - expect(0, result.topLeftCorner.x); - expect(0, result.topLeftCorner.y); - expect(250, result.bottomRightCorner.x); - expect(186, result.bottomRightCorner.y); - }); - }); -} diff --git a/test/lib/interpret_and_optimize/services/pb_shared_aggregation_service_test.dart b/test/lib/interpret_and_optimize/services/pb_shared_aggregation_service_test.dart index 1c941047..16a0bafe 100644 --- a/test/lib/interpret_and_optimize/services/pb_shared_aggregation_service_test.dart +++ b/test/lib/interpret_and_optimize/services/pb_shared_aggregation_service_test.dart @@ -47,16 +47,19 @@ void main() { for (var i = 0; i < 2; i++) { var masterParameter = PBSharedParameterProp( + 'masterParam', parameterAlternator ? String : PBSharedInstanceIntermediateNode, parameterAlternator ? null : instanceNode0, true, parameterAlternator ? 'test0' : 'test1', parameterAlternator ? 'uuid0' : INSTANCE0_UUID, + null, ); var instaceParameter = PBSharedParameterValue( parameterAlternator ? String : PBSharedInstanceIntermediateNode, parameterAlternator ? 'test' : instanceNode0, null, + 'instanceParam', ); instaceValues.add(instaceParameter); diff --git a/test/lib/interpret_and_optimize/services/pb_visual_generation_test.dart b/test/lib/interpret_and_optimize/services/pb_visual_generation_test.dart index a2f2c919..81d7d80f 100644 --- a/test/lib/interpret_and_optimize/services/pb_visual_generation_test.dart +++ b/test/lib/interpret_and_optimize/services/pb_visual_generation_test.dart @@ -11,12 +11,7 @@ import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/services/pb_visual_generation_service.dart'; import 'package:test/test.dart'; -class MockSketchNode extends Mock implements SketchNode { - // @override - // Future interpretNode(currentContext) => - // Future.value(InheritedContainer(MockSketchNode(), null, null, - // currentContext: currentContext)); -} +class MockSketchNode extends Mock implements SketchNode {} class ContextMock extends Mock implements PBContext {} @@ -43,14 +38,6 @@ void main() { expect(response, isNotNull); }); - // test('VisualGenerationService should not produce any alignment nodes.', (){ - // var queue = []; - // queue.add(response); - // while(queue.isNotEmpty){ - - // } - // }); - /// This test relies on previous tests running. test( 'PBIntermediateNode Tree depth should be the same as the original sketch node tree depth', diff --git a/test/lib/layouts/layout_generation_test.dart b/test/lib/layouts/layout_generation_test.dart index c4e3651a..3ff634c7 100644 --- a/test/lib/layouts/layout_generation_test.dart +++ b/test/lib/layouts/layout_generation_test.dart @@ -1,7 +1,9 @@ import 'package:mockito/mockito.dart'; import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/layouts/column.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/layouts/temp_group_layout_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/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/services/pb_layout_generation_service.dart'; import 'package:parabeac_core/interpret_and_optimize/value_objects/point.dart'; @@ -68,14 +70,15 @@ void main() { test('', () { var result = PBLayoutGenerationService(currentContext: currentContext) - .injectNodes(tempGroup); - expect(result.child != null, true); - expect(result.child.children != null && result.child.children.isNotEmpty, - true); - expect(result.child.children[0].topLeftCorner, Point(0, 0)); - expect(result.child.children[0].bottomRightCorner, Point(100, 100)); - expect(result.child.children[1].topLeftCorner, Point(0, 150)); - expect(result.child.children[1].bottomRightCorner, Point(200, 250)); + .extractLayouts(tempGroup); + expect(result.runtimeType, PBIntermediateColumnLayout); + if (result is PBLayoutIntermediateNode) { + expect(result.children != null && result.children.isNotEmpty, true); + expect(result.children[0].topLeftCorner, Point(0, 0)); + expect(result.children[0].bottomRightCorner, Point(100, 100)); + expect(result.children[1].topLeftCorner, Point(0, 150)); + expect(result.children[1].bottomRightCorner, Point(200, 250)); + } }); }); } diff --git a/test/lib/output_services/dependency_writer_test.dart b/test/lib/output_services/dependency_writer_test.dart index db45ce6f..502fe46a 100644 --- a/test/lib/output_services/dependency_writer_test.dart +++ b/test/lib/output_services/dependency_writer_test.dart @@ -1,14 +1,14 @@ import 'dart:io'; import 'package:test/test.dart'; -import 'package:parabeac_core/generation/generators/pb_flutter_writer.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_flutter_writer.dart'; void main() { group('Dependency writer test', () { var writer; var yamlAbsPath = - '${Directory.current.path}/test/lib/output_services/tempTest/pubspec.yaml'; + '${Directory.current.path}/test/lib/output_services/tmptst/pubspec.yaml'; setUp(() async { - Process.runSync('flutter', ['create', 'tempTest'], + Process.runSync('flutter', ['create', 'tmptst'], workingDirectory: '${Directory.current.path}/test/lib/output_services/'); writer = PBFlutterWriter(); @@ -26,7 +26,7 @@ void main() { expect(lineShelf >= 0, true); }); tearDownAll(() { - Process.runSync('rm', ['-r', 'tempTest'], + Process.runSync('rm', ['-r', 'tmptst'], workingDirectory: '${Directory.current.path}/test/lib/output_services/'); }); diff --git a/test/lib/output_services/flutter_writer_test.dart b/test/lib/output_services/flutter_writer_test.dart index dad0108c..c1d422a7 100644 --- a/test/lib/output_services/flutter_writer_test.dart +++ b/test/lib/output_services/flutter_writer_test.dart @@ -1,4 +1,4 @@ -import 'package:parabeac_core/generation/generators/pb_flutter_writer.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_flutter_writer.dart'; import 'package:test/test.dart'; import 'dart:io'; diff --git a/test/lib/output_services/project_builder_test.dart b/test/lib/output_services/project_builder_test.dart index c643a799..672ae633 100644 --- a/test/lib/output_services/project_builder_test.dart +++ b/test/lib/output_services/project_builder_test.dart @@ -2,75 +2,96 @@ import 'dart:io'; import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/generation/flutter_project_builder/flutter_project_builder.dart'; import 'package:parabeac_core/generation/generators/layouts/pb_scaffold_gen.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/flutter_file_structure_strategy.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy.dart/pb_file_structure_strategy.dart'; import 'package:parabeac_core/generation/generators/visual-widgets/pb_container_gen.dart'; +import 'package:parabeac_core/generation/generators/writers/pb_flutter_writer.dart'; 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/helpers/pb_intermediate_group.dart'; -import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_item.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; +import 'package:parabeac_core/interpret_and_optimize/state_management/intermediate_auxillary_data.dart'; import 'package:test/test.dart'; import 'package:mockito/mockito.dart'; class MockIntermediateTree extends Mock implements PBIntermediateTree {} -class MockIntermediateGroup extends Mock implements PBIntermediateGroup {} - -class MockIntermediateItem extends Mock implements PBIntermediateItem {} - class MockScaffold extends Mock implements InheritedScaffold {} class MockContainer extends Mock implements InheritedContainer {} +class MockProject extends Mock implements PBProject {} + +class MockData extends Mock implements IntermediateAuxiliaryData {} + void main() { group('Project Builder Test', () { var projectBuilder; - var outputPath = '${Directory.current.path}/test/lib/output_services/temp2'; + var outputPath = + '${Directory.current.path}/test/lib/output_services/temp2/'; MockIntermediateTree intermediateTree; - MockIntermediateGroup intermediateGroup; - - MockIntermediateItem intermediateItem; - MockScaffold scaffold; MockContainer container; + MockProject project; + PBContainerGenerator containerGenerator; PBScaffoldGenerator scaffoldGenerator; + MockData mockData; + + FileStructureStrategy fss; + setUp(() async { MainInfo().cwd = Directory.current; MainInfo().outputPath = '${Directory.current.path}/test/lib/output_services/'; + project = MockProject(); intermediateTree = MockIntermediateTree(); - intermediateGroup = MockIntermediateGroup(); - intermediateItem = MockIntermediateItem(); scaffold = MockScaffold(); container = MockContainer(); + mockData = MockData(); containerGenerator = PBContainerGenerator(); scaffoldGenerator = PBScaffoldGenerator(); - when(intermediateTree.groups).thenReturn([intermediateGroup]); + MainInfo().configurations = {'state-management': 'none'}; - when(intermediateGroup.items).thenReturn([intermediateItem]); - when(intermediateGroup.name).thenReturn('intermediateTest'); + when(intermediateTree.rootNode).thenReturn(scaffold); + when(intermediateTree.name).thenReturn('testTree'); + when(intermediateTree.data).thenReturn(PBGenerationViewData()); - when(intermediateItem.node).thenReturn(scaffold); + when(project.projectName).thenReturn('intermediateTest'); + when(project.forest).thenReturn([intermediateTree]); + when(project.projectAbsPath).thenReturn(outputPath); when(scaffold.child).thenReturn(container); when(scaffold.isHomeScreen).thenReturn(false); when(scaffold.generator).thenReturn(scaffoldGenerator); when(scaffold.name).thenReturn('testingPage'); + when(scaffold.managerData).thenReturn(PBGenerationViewData()); + when(scaffold.auxiliaryData).thenReturn(mockData); when(container.generator).thenReturn(containerGenerator); + when(container.auxiliaryData).thenReturn(mockData); + when(container.managerData).thenReturn(PBGenerationViewData()); + + fss = + FlutterFileStructureStrategy(outputPath, PBFlutterWriter(), project); + await fss.setUpDirectories(); + when(project.fileStructureStrategy).thenReturn(fss); projectBuilder = await FlutterProjectBuilder( - projectName: outputPath, mainTree: intermediateTree); + projectName: outputPath, + mainTree: project, + pageWriter: PBFlutterWriter()); }); test('', () async { /// Check that the Dart file was created