// lib/editor/engine/stroke_store.dart // // Mutable, revision-tracked store for committed EditorStrokes. // // Every mutation bumps [revision] (monotonic int). Consumers use the revision // as an O(1) repaint gate: if revision has not changed since the last paint, // nothing needs to be redrawn (StaticInkPainter.shouldRepaint). import 'stroke_model.dart'; /// Holds the ordered list of committed [EditorStroke]s for one ink host (e.g. /// a page or annotation layer). Every mutating operation bumps [revision]. /// /// This class is intentionally NOT a ChangeNotifier / Listenable — callers /// poll the revision number from within CustomPainter.shouldRepaint, so no /// subscription machinery is needed here. class StrokeStore { final List _strokes = []; int _revision = 0; /// Monotonically increasing counter. Bumped on every mutation. int get revision => _revision; /// Unmodifiable ordered list of committed strokes. List get committed => List.unmodifiable(_strokes); /// Appends [stroke] and bumps the revision. void add(EditorStroke stroke) { _strokes.add(stroke); _revision++; } /// Removes the stroke with the given [id] (no-op if not found) and bumps /// the revision only when a stroke was actually removed. void removeById(String id) { final before = _strokes.length; _strokes.removeWhere((s) => s.id == id); if (_strokes.length != before) { _revision++; } } /// Replaces the entire stroke list and bumps the revision. void replaceAll(List strokes) { _strokes ..clear() ..addAll(strokes); _revision++; } /// Clears all strokes and bumps the revision. void clear() { _strokes.clear(); _revision++; } }