diff --git a/patterns/memento/memento_editor/editor/editor.dart b/patterns/memento/memento_editor/editor/editor.dart index 8ab97ac..6455cb7 100644 --- a/patterns/memento/memento_editor/editor/editor.dart +++ b/patterns/memento/memento_editor/editor/editor.dart @@ -5,7 +5,8 @@ import '../memento_pattern/originator.dart'; import '../shapes/shapes.dart'; import 'manipulator.dart'; -class Editor extends ClassicApp with Manipulator, Shapes, Originator { +class Editor extends ClassicApp + with Manipulator, Shapes, BackupOriginator, RecoveryOriginator { @override void onPaint(Canvas canvas, Size canvasSize) { _paintBackground(canvas, canvasSize); diff --git a/patterns/memento/memento_editor/memento_pattern/originator.dart b/patterns/memento/memento_editor/memento_pattern/originator.dart index f46a1ae..36ed585 100644 --- a/patterns/memento/memento_editor/memento_pattern/originator.dart +++ b/patterns/memento/memento_editor/memento_pattern/originator.dart @@ -6,37 +6,22 @@ import '../shapes/shapes.dart'; import '../shapes/shape.dart'; import 'snapshot.dart'; -mixin Originator implements Shapes { - Snapshot backup() { - final data = _allocateBuffer(); - _writeShapes(data); - _writeSelectedIndex(data); - return _toSnapshot(data); - } +const _shapeByteSize = 16; +const _selectedIndexByteSize = 4; - void restore(Snapshot snapshot) { - final byteData = _fromSnapshotToByteData(snapshot); - final newShapes = _readShapes(byteData); - final selectedIndex = _readSelectedIndex(byteData); - shapes.clear(); - shapes.addAll(newShapes); - selectByIndex(selectedIndex); +mixin BackupOriginator implements Shapes { + Snapshot backup() { + final buffer = _allocateBuffer(); + _writeShapes(buffer); + _writeSelectedIndex(buffer); + return _toSnapshot(buffer); } - static const _shapeByteSize = 16; - static const _selectedIndexByteSize = 4; - ByteData _allocateBuffer() { final byteSize = shapes.length * _shapeByteSize + _selectedIndexByteSize; return ByteData(byteSize); } - ByteData _fromSnapshotToByteData(Snapshot snapshot) { - final unBase = Base64Decoder().convert(snapshot); - final byteData = ByteData.sublistView(unBase); - return byteData; - } - void _writeSelectedIndex(ByteData data) { late final int selectedIndex; @@ -59,12 +44,35 @@ mixin Originator implements Shapes { ..setFloat32(byteOffset + 4, shape.y) ..setInt32(byteOffset + 8, shape.color.value) ..setFloat32(byteOffset + 12, shape.size); - byteOffset += 16; + byteOffset += _shapeByteSize; } return byteOffset; } + Snapshot _toSnapshot(ByteData data) { + return Base64Encoder().convert( + data.buffer.asUint8List(), + ); + } +} + +mixin RecoveryOriginator implements Shapes { + void restore(Snapshot snapshot) { + final byteData = _fromSnapshotToByteData(snapshot); + final newShapes = _readShapes(byteData); + final selectedIndex = _readSelectedIndex(byteData); + shapes.clear(); + shapes.addAll(newShapes); + selectByIndex(selectedIndex); + } + + ByteData _fromSnapshotToByteData(Snapshot snapshot) { + final unBase = Base64Decoder().convert(snapshot); + final byteData = ByteData.sublistView(unBase); + return byteData; + } + int _getNumberOfShapes(ByteData byteData) { return (byteData.lengthInBytes - _selectedIndexByteSize) ~/ _shapeByteSize; } @@ -82,7 +90,7 @@ mixin Originator implements Shapes { byteData.getFloat32(byteOffset + 12), ); shapes.add(shape); - byteOffset += 16; + byteOffset += _shapeByteSize; } return shapes; @@ -91,10 +99,4 @@ mixin Originator implements Shapes { int _readSelectedIndex(ByteData byteData) { return byteData.getInt32(byteData.lengthInBytes - _selectedIndexByteSize); } - - Snapshot _toSnapshot(ByteData data) { - return Base64Encoder().convert( - data.buffer.asUint8List(), - ); - } }