Skip to content

Commit 5fc3561

Browse files
committed
Improve smoothness of elements creation for releasing pen
1 parent 3169b44 commit 5fc3561

File tree

5 files changed

+54
-13
lines changed

5 files changed

+54
-13
lines changed

app/lib/bloc/document_bloc.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,9 @@ class DocumentBloc extends ReplayBloc<DocumentEvent, DocumentState> {
223223
final assetService = current.assetService;
224224
final (data, elements) = await importAssetsAsync(
225225
current.data,
226-
event.elements.map((e) => e.copyWith(id: createUniqueId())).toList(),
226+
event.elements
227+
.map((e) => e.copyWith(id: e.id ?? createUniqueId()))
228+
.toList(),
227229
onInvalidate: assetService.invalidate,
228230
assets: event.assets,
229231
);
@@ -257,7 +259,7 @@ class DocumentBloc extends ReplayBloc<DocumentEvent, DocumentState> {
257259
final elements = event.elements.map(
258260
(key, value) => MapEntry(
259261
key,
260-
value.map((e) => e.copyWith(id: createUniqueId())).toList(),
262+
value.map((e) => e.copyWith(id: e.id ?? createUniqueId())).toList(),
261263
),
262264
);
263265
final replacedRenderers =

app/lib/cubits/current_index.dart

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
192192
if (selectState != SelectState.none) {
193193
state.handler.dispose(bloc);
194194
state.temporaryHandler?.dispose(bloc);
195+
_disposeTemporaryForegrounds();
195196
_disposeForegrounds();
196197
final foregrounds = handler.createForegrounds(
197198
this,
@@ -264,6 +265,15 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
264265
change.nextState.userName != change.currentState.userName) {
265266
_sendNetworkingState();
266267
}
268+
final newViewport = change.nextState.cameraViewport;
269+
final currentViewport = change.currentState.cameraViewport;
270+
if (change.currentState.cameraViewport != change.nextState.cameraViewport) {
271+
change.nextState.handler.onViewportUpdated(currentViewport, newViewport);
272+
change.nextState.temporaryHandler?.onViewportUpdated(
273+
currentViewport,
274+
newViewport,
275+
);
276+
}
267277
}
268278

269279
void _sendNetworkingState({
@@ -345,7 +355,6 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
345355
if (docState is! DocumentLoadSuccess) return;
346356
state.handler.dispose(bloc);
347357
final handler = Handler.fromTool(tool);
348-
state.handler.dispose(bloc);
349358
_disposeForegrounds();
350359
final foregrounds = handler.createForegrounds(
351360
this,
@@ -694,16 +703,25 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
694703
e.dispose(bloc);
695704
}
696705
_disposeForegrounds();
706+
_disposeTemporaryForegrounds();
707+
_disposeNetworkingForegrounds();
708+
_disposeToggleableForegrounds();
697709
emit(
698710
state.copyWith(
699711
index: null,
700712
handler: HandHandler(),
701713
cursor: MouseCursor.defer,
702-
foregrounds: [],
714+
foregrounds: const <Renderer>[],
703715
temporaryHandler: null,
704716
temporaryForegrounds: null,
705717
temporaryCursor: null,
706718
temporaryRendererStates: null,
719+
toolbar: null,
720+
temporaryToolbar: null,
721+
rendererStates: const <String, RendererState>{},
722+
toggleableHandlers: const <int, Handler<Tool>>{},
723+
toggleableForegrounds: const <int, List<Renderer>>{},
724+
networkingForegrounds: const <Renderer>[],
707725
cameraViewport: CameraViewport.unbaked(),
708726
),
709727
);
@@ -1603,7 +1621,6 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
16031621
bool Function()? shouldRefresh,
16041622
bool updateIndex = false,
16051623
}) async {
1606-
final cameraViewport = current.cameraViewport;
16071624
for (var renderer in {
16081625
...?backgrounds,
16091626
...?replacedElements,
@@ -1630,11 +1647,7 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
16301647
} else if (backgrounds != null) {
16311648
await this.unbake(blocState, backgrounds: backgrounds);
16321649
} else {
1633-
final elements = List<Renderer<PadElement>>.from(
1634-
cameraViewport.unbakedElements,
1635-
);
1636-
elements.addAll(addedElements);
1637-
await addUnbaked(blocState, elements);
1650+
await addUnbaked(blocState, addedElements);
16381651
}
16391652

16401653
setSaveState(saved: SaveState.unsaved);

app/lib/handlers/handler.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,11 @@ abstract class Handler<T> {
239239
EventContext eventContext,
240240
) {}
241241

242+
void onViewportUpdated(
243+
CameraViewport currentViewport,
244+
CameraViewport newViewport,
245+
) {}
246+
242247
void onLongPressDown(LongPressDownDetails details, EventContext context) {}
243248

244249
bool canChange(PointerDownEvent event, EventContext context) => true;

app/lib/handlers/pen.dart

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ class PenHandler extends Handler<PenTool> with ColoredHandler {
55
bool _hideCursorWhileDrawing = false;
66
// Map to store the PenElements.
77
final Map<int, PenElement> elements = {};
8+
final List<PenElement> _submittedElements = [];
89
// Map to store the starting positions of each element.
910
final Map<int, Offset> startPosition = {};
1011
// Map to store the last positions of each element.
@@ -29,7 +30,7 @@ class PenHandler extends Handler<PenTool> with ColoredHandler {
2930
DocumentPage page,
3031
DocumentInfo info, [
3132
Area? currentArea,
32-
]) => elements.values
33+
]) => [...elements.values, ..._submittedElements]
3334
.map((e) {
3435
if (e.points.length > 1) return PenRenderer(e);
3536
return null;
@@ -67,21 +68,34 @@ class PenHandler extends Handler<PenTool> with ColoredHandler {
6768

6869
// Flag to check if elements are being submitted.
6970
bool _currentlyBaking = false;
71+
DocumentBloc? _bloc;
7072

7173
// Submit elements for processing and rendering.
7274
Future<void> submitElements(DocumentBloc bloc, List<int> indexes) async {
75+
_bloc = bloc;
7376
final elements = indexes
7477
.map((e) => this.elements.remove(e))
7578
.nonNulls
7679
.toList();
7780
if (elements.isEmpty) return;
81+
_submittedElements.addAll(elements);
7882
lastPosition.removeWhere((key, value) => indexes.contains(key));
7983
bloc.add(ElementsCreated(elements));
84+
bloc.refresh();
85+
}
86+
87+
@override
88+
Future<void> onViewportUpdated(
89+
CameraViewport currentViewport,
90+
CameraViewport newViewport,
91+
) async {
92+
if (_submittedElements.isEmpty) return;
93+
_submittedElements.clear();
8094
if (_currentlyBaking) return;
8195
_currentlyBaking = true;
82-
await bloc.bake();
96+
await _bloc?.bake();
8397
_currentlyBaking = false;
84-
bloc.refresh();
98+
await _bloc?.refresh();
8599
}
86100

87101
// Add a point to the element.
@@ -401,4 +415,9 @@ class PenHandler extends Handler<PenTool> with ColoredHandler {
401415
MouseCursor get cursor => (_hideCursorWhileDrawing && elements.isNotEmpty)
402416
? SystemMouseCursors.none
403417
: SystemMouseCursors.precise;
418+
419+
@override
420+
Map<String, RendererState> get rendererStates => Map.fromEntries(
421+
_submittedElements.map((e) => MapEntry(e.id!, RendererState.hidden)),
422+
);
404423
}

metadata/en-US/changelogs/152.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
* Add delayed autosave ([#883](https://github.com/LinwoodDev/Butterfly/issues/883))
22
* Add save state as tooltip
33
* Improve memory usage and performance for importing large assets ([#917](https://github.com/LinwoodDev/Butterfly/issues/917))
4+
* Improve smoothness of elements creation for releasing pen
45
* Fix bfly files cannot be imported into existing documents
56
* Fix various memory leaks ([#925](https://github.com/LinwoodDev/Butterfly/issues/925))
67
* Fix header text color on certain themes
78
* Fix theme names not displaying correctly in personalization settings
89
* Fix metadata file version not updating if file version is null
910
* Fix cache settings not editable correctly
11+
* Fix elements are duplicated on creation
1012
* Add 16kb page size support for android
1113

1214
Read more here: https://linwood.dev/butterfly/2.4.1-rc.0

0 commit comments

Comments
 (0)