diff --git a/lib/models/project.dart b/lib/models/project.dart index a09832d..686f5eb 100644 --- a/lib/models/project.dart +++ b/lib/models/project.dart @@ -23,6 +23,8 @@ class ComponentEntry with _$ComponentEntry { required List outputs, @JsonKey(includeIfNull: false) List? truthTable, + @JsonKey(includeIfNull: false) + String? logicExpression, }) = _ComponentEntry; factory ComponentEntry.fromJson(Map json) => _$ComponentEntryFromJson(json); diff --git a/lib/models/project.freezed.dart b/lib/models/project.freezed.dart index 3637e1b..5457698 100644 --- a/lib/models/project.freezed.dart +++ b/lib/models/project.freezed.dart @@ -166,6 +166,8 @@ mixin _$ComponentEntry { List get outputs => throw _privateConstructorUsedError; @JsonKey(includeIfNull: false) List? get truthTable => throw _privateConstructorUsedError; + @JsonKey(includeIfNull: false) + String? get logicExpression => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -184,7 +186,8 @@ abstract class $ComponentEntryCopyWith<$Res> { @JsonKey(includeIfNull: false) String? componentDescription, List inputs, List outputs, - @JsonKey(includeIfNull: false) List? truthTable}); + @JsonKey(includeIfNull: false) List? truthTable, + @JsonKey(includeIfNull: false) String? logicExpression}); } /// @nodoc @@ -204,6 +207,7 @@ class _$ComponentEntryCopyWithImpl<$Res> Object? inputs = freezed, Object? outputs = freezed, Object? truthTable = freezed, + Object? logicExpression = freezed, }) { return _then(_value.copyWith( componentId: componentId == freezed @@ -230,6 +234,10 @@ class _$ComponentEntryCopyWithImpl<$Res> ? _value.truthTable : truthTable // ignore: cast_nullable_to_non_nullable as List?, + logicExpression: logicExpression == freezed + ? _value.logicExpression + : logicExpression // ignore: cast_nullable_to_non_nullable + as String?, )); } } @@ -247,7 +255,8 @@ abstract class _$$_ComponentEntryCopyWith<$Res> @JsonKey(includeIfNull: false) String? componentDescription, List inputs, List outputs, - @JsonKey(includeIfNull: false) List? truthTable}); + @JsonKey(includeIfNull: false) List? truthTable, + @JsonKey(includeIfNull: false) String? logicExpression}); } /// @nodoc @@ -269,6 +278,7 @@ class __$$_ComponentEntryCopyWithImpl<$Res> Object? inputs = freezed, Object? outputs = freezed, Object? truthTable = freezed, + Object? logicExpression = freezed, }) { return _then(_$_ComponentEntry( componentId: componentId == freezed @@ -295,6 +305,10 @@ class __$$_ComponentEntryCopyWithImpl<$Res> ? _value._truthTable : truthTable // ignore: cast_nullable_to_non_nullable as List?, + logicExpression: logicExpression == freezed + ? _value.logicExpression + : logicExpression // ignore: cast_nullable_to_non_nullable + as String?, )); } } @@ -308,7 +322,8 @@ class _$_ComponentEntry implements _ComponentEntry { @JsonKey(includeIfNull: false) this.componentDescription, required final List inputs, required final List outputs, - @JsonKey(includeIfNull: false) final List? truthTable}) + @JsonKey(includeIfNull: false) final List? truthTable, + @JsonKey(includeIfNull: false) this.logicExpression}) : _inputs = inputs, _outputs = outputs, _truthTable = truthTable; @@ -347,9 +362,13 @@ class _$_ComponentEntry implements _ComponentEntry { return EqualUnmodifiableListView(value); } + @override + @JsonKey(includeIfNull: false) + final String? logicExpression; + @override String toString() { - return 'ComponentEntry(componentId: $componentId, componentName: $componentName, componentDescription: $componentDescription, inputs: $inputs, outputs: $outputs, truthTable: $truthTable)'; + return 'ComponentEntry(componentId: $componentId, componentName: $componentName, componentDescription: $componentDescription, inputs: $inputs, outputs: $outputs, truthTable: $truthTable, logicExpression: $logicExpression)'; } @override @@ -366,7 +385,9 @@ class _$_ComponentEntry implements _ComponentEntry { const DeepCollectionEquality().equals(other._inputs, _inputs) && const DeepCollectionEquality().equals(other._outputs, _outputs) && const DeepCollectionEquality() - .equals(other._truthTable, _truthTable)); + .equals(other._truthTable, _truthTable) && + const DeepCollectionEquality() + .equals(other.logicExpression, logicExpression)); } @JsonKey(ignore: true) @@ -378,7 +399,8 @@ class _$_ComponentEntry implements _ComponentEntry { const DeepCollectionEquality().hash(componentDescription), const DeepCollectionEquality().hash(_inputs), const DeepCollectionEquality().hash(_outputs), - const DeepCollectionEquality().hash(_truthTable)); + const DeepCollectionEquality().hash(_truthTable), + const DeepCollectionEquality().hash(logicExpression)); @JsonKey(ignore: true) @override @@ -398,7 +420,8 @@ abstract class _ComponentEntry implements ComponentEntry { @JsonKey(includeIfNull: false) final String? componentDescription, required final List inputs, required final List outputs, - @JsonKey(includeIfNull: false) final List? truthTable}) = + @JsonKey(includeIfNull: false) final List? truthTable, + @JsonKey(includeIfNull: false) final String? logicExpression}) = _$_ComponentEntry; factory _ComponentEntry.fromJson(Map json) = @@ -419,6 +442,9 @@ abstract class _ComponentEntry implements ComponentEntry { @JsonKey(includeIfNull: false) List? get truthTable => throw _privateConstructorUsedError; @override + @JsonKey(includeIfNull: false) + String? get logicExpression => throw _privateConstructorUsedError; + @override @JsonKey(ignore: true) _$$_ComponentEntryCopyWith<_$_ComponentEntry> get copyWith => throw _privateConstructorUsedError; diff --git a/lib/models/project.g.dart b/lib/models/project.g.dart index 5af7051..3c43770 100644 --- a/lib/models/project.g.dart +++ b/lib/models/project.g.dart @@ -30,6 +30,7 @@ _$_ComponentEntry _$$_ComponentEntryFromJson(Map json) => truthTable: (json['truthTable'] as List?) ?.map((e) => e as String) .toList(), + logicExpression: json['logicExpression'] as String?, ); Map _$$_ComponentEntryToJson(_$_ComponentEntry instance) { @@ -48,5 +49,6 @@ Map _$$_ComponentEntryToJson(_$_ComponentEntry instance) { val['inputs'] = instance.inputs; val['outputs'] = instance.outputs; writeNotNull('truthTable', instance.truthTable); + writeNotNull('logicExpression', instance.logicExpression); return val; } diff --git a/lib/pages/edit_component.dart b/lib/pages/edit_component.dart index 5fa4292..ca7e385 100644 --- a/lib/pages/edit_component.dart +++ b/lib/pages/edit_component.dart @@ -21,6 +21,7 @@ class EditComponentPage extends HookWidget { final projectState = useProvider(); ComponentEntry ce() => projectState.index.components.where((c) => c.componentId == component.componentId).first; final truthTable = useState(ce().truthTable?.toList()); + final logicExpression = useState(ce().logicExpression); final inputs = useState(ce().inputs.toList()); final outputs = useState(ce().outputs.toList()); final componentNameEditingController = useTextEditingController(text: ce().componentName); @@ -39,6 +40,11 @@ class EditComponentPage extends HookWidget { // Don't allow saving empty outputs return false; } + if (truthTable.value == null && logicExpression.value == null) { + // Don't allow saving components without functionality + return false; + } + if (componentNameEditingController.text != ce().componentName) { return true; } @@ -51,6 +57,9 @@ class EditComponentPage extends HookWidget { if (!const ListEquality().equals(truthTable.value, ce().truthTable)) { return true; } + if (logicExpression.value != ce().logicExpression) { + return true; + } return false; }, [