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

Feature/pb 304 support fo global effects #711

Open
wants to merge 15 commits into
base: dev
Choose a base branch
from
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import 'dart:io';

import 'package:parabeac_core/controllers/main_info.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart';
import 'package:yaml_modify/yaml_modify.dart';

class AppendToYamlPostGenTask implements PostGenTask {
// List of assets to be append to the yaml
static List<String> assets = [];

// TODO: WIP for when we add dependencies on the future
Map dependeciens = {};

@override
void execute() {
var yamlAbsPath = MainInfo().genProjectPath + '/pubspec.yaml';
var yamlStr = File(yamlAbsPath).readAsStringSync();
var modifiableyaml = getModifiableNode(loadYaml(yamlStr)) as Map;

if (modifiableyaml.containsKey('flutter') && assets.isNotEmpty) {
/// Add only elements that are not already in the yaml
if (modifiableyaml['flutter'].containsKey('assets') &&
modifiableyaml['flutter']['assets'] != null) {
var existingAssets = (modifiableyaml['flutter']['assets'] as List);
assets.forEach((asset) {
if (!existingAssets.any((e) => e.endsWith('/$asset'))) {
existingAssets
.add('packages/${MainInfo().projectName}/assets/images/$asset');
}
});
}

/// Add all elements to the yaml
else {
modifiableyaml['flutter']['assets'] = assets
.map((e) => 'packages/${MainInfo().projectName}/assets/images/$e')
.toList();
}
}

/// Write the new yaml file
File(yamlAbsPath).writeAsStringSync(toYamlString(modifiableyaml));
}

static void addAsset(String name) {
assets.add(name);
}
}
Original file line number Diff line number Diff line change
@@ -1,45 +1,99 @@
import 'package:get_it/get_it.dart';
import 'package:parabeac_core/analytics/amplitude_analytics_service.dart';
import 'package:parabeac_core/controllers/main_info.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/append_to_yaml_post_gen_task.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart';
import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/commands/add_constant_command.dart';
import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/file_ownership_policy.dart';
import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/path_services/path_service.dart';
import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart';
import 'package:parabeac_core/interpret_and_optimize/helpers/pb_image_reference_storage.dart';
import 'package:parabeac_core/interpret_and_optimize/state_management/auxilary_data_helpers/intermediate_fill.dart';
import 'package:pbdl/pbdl.dart';
import 'package:recase/recase.dart';
import 'package:uuid/uuid.dart';

class ColorsPostGenTask extends PostGenTask {
GenerationConfiguration generationConfiguration;

List<PBDLGlobalColor> colors;
List<PBDLGlobalStyle> fills;

ColorsPostGenTask(
this.generationConfiguration,
this.colors,
this.fills,
);
@override
void execute() {
var constColors = <ConstantHolder>[];
var mainInfo = MainInfo();
var constGradients = <ConstantHolder>[];
var constImages = <ConstantHolder>[];
// var mainInfo = MainInfo();

/// Format colors to be added to constants file
colors.forEach((color) {
constColors.add(ConstantHolder(
'Color',
color.name.camelCase,
'Color(${color.color.toHex()})',
description: color.description,
));
fills.forEach((fill) {
// To add Constant Colors
if (fill is PBDLGlobalColor) {
constColors.add(ConstantHolder(
'Color',
fill.name.camelCase,
'Color(${fill.color.toHex()})',
description: fill.description,
));
}
// To add Constant Images
else if (fill is PBDLGlobalImage) {
var imageFill = PBFill.fromJson(fill.image.toJson());
constImages.add(ConstantHolder(
'Image',
fill.name.camelCase,
imageFill.initializerGenerator(),
description: fill.description,
isconst: false,
));
// Append image path to yaml so it can get expose to be used
if (imageFill.imageRef != null && imageFill.imageRef.isNotEmpty) {
AppendToYamlPostGenTask.addAsset(
imageFill.imageRef.replaceAll('images/', ''));
}
}
// To add Constant Gradients
else if (fill is PBDLGlobalGradient) {
var gradientFill = PBFill.fromJson(fill.gradient.toJson());
constGradients.add(ConstantHolder(
_interpretType(gradientFill.type),
fill.name.camelCase,
gradientFill.initializerGenerator(),
description: fill.description,
));
}
});

/// Write colors to constants file in `colors.g.dart`
/// Write list to constants file in `[$type].g.dart`
createCommand(constColors, 'colors');
createCommand(constGradients, 'gradients');
createCommand(constImages, 'images');
}

String _interpretType(String type) {
switch (type) {
case 'GRADIENT_LINEAR':
return 'LinearGradient';
case 'GRADIENT_RADIAL':
return 'RadialGradient';
case 'GRADIENT_ANGULAR':
return 'SweepGradient';
default:
return 'Gradient';
}
}

void createCommand(List<ConstantHolder> list, String type) {
var mainInfo = MainInfo();
generationConfiguration.fileStructureStrategy.commandCreated(
WriteConstantsCommand(
Uuid().v4(),
constColors,
filename: '${mainInfo.projectName.snakeCase}_colors',
list,
filename: '${mainInfo.projectName.snakeCase}_$type',
ownershipPolicy: FileOwnership.PBC,
imports: 'import \'package:flutter/material.dart\';',
relativePath: GetIt.I.get<PathService>().themingRelativePath,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import 'package:get_it/get_it.dart';
import 'package:parabeac_core/controllers/main_info.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart';
import 'package:parabeac_core/generation/generators/attribute-helper/pb_color_gen_helper.dart';
import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/commands/add_constant_command.dart';
import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/file_ownership_policy.dart';
import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/path_services/path_service.dart';
import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart';
import 'package:parabeac_core/interpret_and_optimize/helpers/pb_color.dart';
import 'package:pbdl/pbdl.dart';
import 'package:recase/recase.dart';
import 'package:uuid/uuid.dart';
import 'package:path/path.dart' as path;

class EffectsPostGenTask extends PostGenTask {
GenerationConfiguration generationConfiguration;
List<PBDLGlobalEffect> effects;

EffectsPostGenTask(
this.generationConfiguration,
this.effects,
);

@override
void execute() {
var constLayerBlurs = <ConstantHolder>[];
var constBackgroundBlurs = <ConstantHolder>[];
var constDropShadows = <ConstantHolder>[];
var constInnerShadows = <ConstantHolder>[];

/// Go through each effect
effects.forEach((effect) {
switch (effect.effect.type) {
case 'LAYER_BLUR':
constLayerBlurs.add(ConstantHolder(
'ImageFiltered',
effect.name.camelCase + '(Widget child)',
_getLayerBlur(effect.effect),
description: effect.description,
isconst: false,
isFunction: true,
));
break;
case 'BACKGROUND_BLUR':
constBackgroundBlurs.add(ConstantHolder(
'ClipRect',
effect.name.camelCase + '(Widget child)',
_getBackgroundBlur(effect.effect),
description: effect.description,
isconst: false,
isFunction: true,
));
break;
case 'DROP_SHADOW':
constDropShadows.add(ConstantHolder(
'BoxShadow',
effect.name.camelCase.toLowerCase(),
_getDropShadow(effect.effect),
description: effect.description,
));
break;

case 'INNER_SHADOW':

/// TODO: Empty for now
break;
default:
}
});

/// Write list to constants file in `[$type].g.dart`
createCommand(constLayerBlurs, 'layer_blur',
imports: ['import \'dart:ui\';']);
createCommand(constBackgroundBlurs, 'background_blur',
imports: ['import \'dart:ui\';']);
createCommand(constDropShadows, 'drop_shadow');
}

void createCommand(List<ConstantHolder> list, String type,
{List<String> imports}) {
var mainInfo = MainInfo();
generationConfiguration.fileStructureStrategy.commandCreated(
WriteConstantsCommand(
Uuid().v4(),
list,
filename: '${mainInfo.projectName.snakeCase}_$type',
ownershipPolicy: FileOwnership.PBC,
imports: 'import \'package:flutter/material.dart\';\n' +
((imports != null) ? imports.join() : '\n'),
relativePath: path.join(
GetIt.I.get<PathService>().themingRelativePath, 'effects'),
),
);
}

String _getLayerBlur(var effect) {
return '''
ImageFiltered(
imageFilter: ImageFilter.blur(
sigmaX: ${effect.radius},
sigmaY: ${effect.radius},
),
child: child,
)
''';
}

String _getBackgroundBlur(var effect) {
return '''
ClipRect(
child: BackdropFilter(
filter: ImageFilter.blur(
sigmaX: ${effect.radius},
sigmaY: ${effect.radius},
),
child: child,
)
)
''';
}

String _getDropShadow(var effect) {
var color = PBColor.fromJson(effect.color.toJson());
return '''
BoxShadow(
offset: Offset(${effect.offset['x']}, ${effect.offset['y']}),
${PBColorGenHelper().getHexColor(color)}
spreadRadius: 0.0,
blurRadius: ${effect.radius},
)
''';
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'package:get_it/get_it.dart';
import 'package:parabeac_core/analytics/amplitude_analytics_service.dart';
import 'package:parabeac_core/generation/flutter_project_builder/flutter_project_builder.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/append_to_yaml_post_gen_task.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/global_styling/colors_post_gen_task.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/global_styling/global_effects_post_gen_task.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/global_styling/text_styles_post_gen_task.dart';
import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/global_styling/theming_post_gen_task.dart';
import 'package:pbdl/pbdl.dart';
Expand Down Expand Up @@ -68,6 +70,19 @@ class GlobalStylingAggregator {
globalColors,
),
);
builder.postGenTasks.add(
AppendToYamlPostGenTask(),
);
}

/// Check whether there are global effects
if (globalStyles.effects != null && globalStyles.effects.isNotEmpty) {
builder.postGenTasks.add(
EffectsPostGenTask(
builder.generationConfiguration,
globalStyles.effects,
),
);
}

/// Check whether there are theme or global textstyles
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class WriteConstantsCommand extends FileStructureCommand {
var description =
constant.description.isNotEmpty ? '/// ${constant.description}' : '';
var constStr =
'static ${constant.isconst ? 'const' : ''} ${constant.type} ${constant.name} = ${constant.value};';
'static ${constant.isconst ? 'const ' : ''}${constant.type} ${constant.name} =${constant.isFunction ? '>' : ''} ${constant.value};';

constBuffer.writeln('$description\n$constStr');
});
Expand Down Expand Up @@ -90,11 +90,15 @@ class ConstantHolder {
/// Whether [this] should have "const" written in it.
bool isconst; //TODO: Temporary bool in order to write theming file.

/// Whether [this] is declaring a funciton or a variable
bool isFunction;

ConstantHolder(
this.type,
this.name,
this.value, {
this.isconst = true,
this.description = '',
this.isFunction = false,
});
}
Loading