Skip to content
This repository has been archived by the owner on Jan 25, 2024. It is now read-only.

Commit

Permalink
Merge pull request #615 from Parabeac/feat/dashbook
Browse files Browse the repository at this point in the history
Feat/dashbook
  • Loading branch information
ivan-015 committed Mar 13, 2022
2 parents c1ade51 + c5a5b11 commit a0f1cd0
Show file tree
Hide file tree
Showing 10 changed files with 229 additions and 16 deletions.
33 changes: 20 additions & 13 deletions lib/controllers/interpret.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,19 +58,26 @@ class Interpret {
/// This is a workaround for adding missing information to either the [PBContext] or any of the
/// [PBIntermediateNode]s.
aitServiceBuilder.addTransformation(
(PBContext context, PBIntermediateNode node, PBIntermediateTree tree) {
elementStorage.treeUUIDs[tree.UUID] = tree;
elementStorage.elementToTree[node.UUID] = tree.UUID;
return Future.value(node);
}, index: 0, id: 'Indexing ${tree.name}').addTransformation(
(PBContext context, PBIntermediateTree tree) async {
//
var baseGroupList = tree.whereType<BaseGroup>();

baseGroupList.forEach((group) => tree.remove(group, keepChildren: true));

return Future.value(tree);
}, index: 1, id: 'Removing the $BaseGroup from ${tree.name}');
(PBContext context, PBIntermediateNode node, PBIntermediateTree tree) {
elementStorage.treeUUIDs[tree.UUID] = tree;
elementStorage.elementToTree[node.UUID] = tree.UUID;
return Future.value(node);
},
index: 0,
id: 'Indexing ${tree.name}',
).addTransformation(
(PBContext context, PBIntermediateTree tree) async {
//
var baseGroupList = tree.whereType<BaseGroup>();

baseGroupList
.forEach((group) => tree.remove(group, keepChildren: true));

return Future.value(tree);
},
index: 1,
id: 'Removing the $BaseGroup from ${tree.name}',
);

// TODO: We should dynamically add the [PBPrototypeLinkerService] to `aitHandlers`
// somewhere else so that it does not check the configuration every time
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import 'package:parabeac_core/controllers/main_info.dart';
import 'package:parabeac_core/generation/flutter_project_builder/import_helper.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_generator.dart';
import 'package:parabeac_core/generation/generators/import_generator.dart';
import 'package:parabeac_core/generation/generators/util/pb_generation_project_data.dart';
import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/dashbook_service.dart';

class DashbookGenerator implements ComponentIsolationGenerator {
@override
String fileName = 'main_dashbook.dart';

DashbookGenerator(this.projectData) {
projectData.addDependencies('dashbook', '^0.1.6');
}

@override
PBGenerationProjectData projectData;

@override
String generateCode(ImportHelper helper) {
var book = DashbookService.book;
var treeIds = DashbookService.treeIds;
var generatedCode = book.generate();

var imports = treeIds
.map(
(id) => helper
.getFormattedImports(
id,
importMapper: (import) => FlutterImport(
import,
MainInfo().projectName,
),
)
.join('\n'),
)
.join('');
return '''
import 'package:flutter/material.dart';
import 'package:dashbook/dashbook.dart';
$imports
void main() {
final dashbook = Dashbook();
$generatedCode
runApp(dashbook);
}
''';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/dashbook/entities/dashbook_story.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart';

/// Class that represents a group of [DashBookStories].
///
/// This class does not actually exist in Dashbook. However,
/// it makes it easier for us to group stories and generate them
/// in a single step.
class DashBookBook extends IsolationNode {
DashBookBook({
String name = 'Parabeac-Generated',
}) : super(name: name);

@override
String generate() {
var stories = getType<DashBookStory>();

var storiesGen = '';

if (stories != null && stories.isNotEmpty) {
storiesGen = stories.map((s) => s.generate()).join('\n');
}
return '''
${storiesGen.isNotEmpty ? ' $storiesGen\n' : ''}
''';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart';

class DashBookChapter extends IsolationNode {
String builderCode;
DashBookChapter(String name, this.builderCode) : super(name: name);

@override
String generate() {
return '''
.add('$name',
(ctx) => $builderCode)
''';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/dashbook/entities/dashbook_chapter.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart';

/// Node that represents a Widgetbook component.
class DashBookStory extends IsolationNode {
DashBookStory(String name) : super(name: name);

@override
String generate() {
var chapters = getType<DashBookChapter>();
var chaptersGen = '';
if (chapters != null && chapters.isNotEmpty) {
chaptersGen = chapters.map((chapter) => chapter.generate()).join('\n');
}
return '''
dashbook
.storiesOf('$name')
.decorator(CenterDecorator())
$chaptersGen
;
''';
}
}
17 changes: 16 additions & 1 deletion lib/generation/generators/visual-widgets/pb_bitmap_gen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import 'package:parabeac_core/interpret_and_optimize/entities/inherited_bitmap.d
import 'package:parabeac_core/interpret_and_optimize/helpers/override_helper.dart';
import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart';

import '../import_generator.dart';

class PBBitmapGenerator extends PBGenerator {
var _sizehelper;

Expand All @@ -21,11 +23,24 @@ class PBBitmapGenerator extends PBGenerator {
) {
var buffer = StringBuffer();
var imageOverride = OverrideHelper.getProperty(source.UUID, 'image');

var imageFormat = 'Image';

if ((source as InheritedBitmap).referenceImage.endsWith('.svg')) {
generatorContext.project.genProjectData
.addDependencies('flutter_svg', '^1.0.3');

generatorContext.managerData
.addImport(FlutterImport('flutter_svg.dart', 'flutter_svg'));

imageFormat = 'SvgPicture';
}

if (imageOverride != null) {
buffer.write(imageOverride.generateOverride());
}

buffer.write('Image.asset(');
buffer.write('$imageFormat.asset(');

var styleOverride = OverrideHelper.getProperty(source.UUID, 'layerStyle');
if (styleOverride != null) {
Expand Down
2 changes: 1 addition & 1 deletion lib/generation/generators/writers/pb_flutter_writer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ class MyApp extends StatelessWidget {
// Return names inside image reference storage
return ImageReferenceStorage()
.names
.map((imageName) => '${imageName}.png')
.map((imageName) => '${imageName}')
.toList();
} catch (e) {
return [];
Expand Down
2 changes: 1 addition & 1 deletion lib/interpret_and_optimize/entities/inherited_bitmap.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class InheritedBitmap extends PBVisualIntermediateNode
childrenStrategy = NoChildStrategy();
if (referenceImage != null && referenceImage.isNotEmpty) {
ImageReferenceStorage().addReference(
referenceImage.split('.').first.replaceAll('images/', ''),
referenceImage.replaceAll('images/', ''),
'${MainInfo().outputPath}assets/images');
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'package:parabeac_core/controllers/interpret.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_generator.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/dashbook/dashbook_generator.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_generator.dart';
import 'package:parabeac_core/generation/generators/util/pb_generation_project_data.dart';
import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/dashbook_service.dart';
import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/widgetbook_service.dart';

/// Class that bundles a ComponentIsolationGenerator and an AITHandler
Expand All @@ -18,6 +20,9 @@ class ComponentIsolationConfiguration {
case 'widgetbook':
return ComponentIsolationConfiguration._internal(
WidgetbookGenerator(projectData), WidgetBookService());
case 'dashbook':
return ComponentIsolationConfiguration._internal(
DashbookGenerator(projectData), DashbookService());
default:
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import 'package:parabeac_core/controllers/interpret.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/dashbook/entities/dashbook_book.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/dashbook/entities/dashbook_chapter.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/dashbook/entities/dashbook_story.dart';
import 'package:parabeac_core/generation/generators/attribute-helper/pb_size_helper.dart';
import 'package:parabeac_core/generation/generators/symbols/pb_instancesym_gen.dart';
import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart';
import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart';
import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart';
import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart';
import 'package:recase/recase.dart';

class DashbookService extends AITHandler {
/// Map that holds the name of the folder as its key, and the folder as its value.
static Map<String, DashBookStory> _dashBookStories;
static DashBookBook book = DashBookBook();
static final treeIds = <String>[];

DashbookService() {
_dashBookStories = {};
}

@override
Future<PBIntermediateTree> handleTree(
PBContext context, PBIntermediateTree tree) async {
/// Only process [PBSharedMasterNode]s.
if (tree.rootNode is PBSharedMasterNode) {
treeIds.add(tree.UUID);

var component = tree.rootNode as PBSharedMasterNode;
var rootName = component.componentSetName ?? tree.rootNode.name;

/// Create new Widget for this variation if it doesn't exist already
if (!_dashBookStories.containsKey(rootName)) {
_dashBookStories[rootName] = DashBookStory(rootName);
book.addChild(_dashBookStories[rootName]);
}

/// Create a fake instance in order to generate the Use Case.
// FIXME: Generating the code should happen somewhere in generate, not here.
var dummyInstance = PBSharedInstanceIntermediateNode(
null,
tree.rootNode.frame.copyWith(),
SYMBOL_ID: component.SYMBOL_ID,
name: rootName,
sharedNodeSetID: component.sharedNodeSetID,
);
var sizeHelper = PBSizeHelper();

var generatedCode = '''
SizedBox(
${sizeHelper.generate(dummyInstance, context.copyWith(sizingContext: SizingValueContext.PointValue))}
child: ${(dummyInstance.generator as PBSymbolInstanceGenerator).generate(
dummyInstance,
context.copyWith(),
)},
),
''';

/// Create a use case for the current component and add it to the folder.
var useCase = DashBookChapter(
(tree.rootNode as PBSharedMasterNode).name.pascalCase,
generatedCode,
);
_dashBookStories[rootName].addChild(useCase);
}
return tree;
}
}

0 comments on commit a0f1cd0

Please sign in to comment.