Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion patterns/memento/memento_editor/editor/editor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
64 changes: 33 additions & 31 deletions patterns/memento/memento_editor/memento_pattern/originator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
}
Expand All @@ -82,7 +90,7 @@ mixin Originator implements Shapes {
byteData.getFloat32(byteOffset + 12),
);
shapes.add(shape);
byteOffset += 16;
byteOffset += _shapeByteSize;
}

return shapes;
Expand All @@ -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(),
);
}
}