Skip to content

Commit 6d6a895

Browse files
committed
refactor: Improve the export feature to capture actively selected strokes only if there is one
1 parent 2727897 commit 6d6a895

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,10 @@ public class RequestCanvasDataMessage : RequestMessage<CanvasDataPayload>
1717
public record LoadCanvasDataMessage(List<Stroke> Strokes, string? BackgroundColorHex);
1818

1919
// Message from Document View Model to MainViewModel asking to clear the canvas
20-
public record ClearCanvasMessage();
20+
public record ClearCanvasMessage;
21+
22+
public record SelectedStrokesPayload(List<DrawStroke> Strokes);
23+
24+
public class RequestSelectedStrokes : RequestMessage<SelectedStrokesPayload>
25+
{
26+
}

Scribble/ViewModels/CanvasExportViewModel.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,32 @@ private void ChangeImageScale(string value)
4646
UpdateCanvasPreview();
4747
}
4848

49+
/// <summary>
50+
/// Updates the preview image based on the current canvas state
51+
/// If there is an active selection, it will be used as the preview else the entire canvas will be used
52+
/// </summary>
4953
public void UpdateCanvasPreview()
5054
{
55+
List<DrawStroke> previewedStrokes = [];
56+
var strokesPayload = WeakReferenceMessenger.Default.Send<RequestSelectedStrokes>().Response;
5157
var canvasData = WeakReferenceMessenger.Default.Send<RequestCanvasDataMessage>().Response;
52-
List<DrawStroke> drawStrokes = [];
53-
foreach (var canvasStroke in canvasData.Strokes)
58+
59+
if (strokesPayload.Strokes.Count > 0)
5460
{
55-
if (canvasStroke is DrawStroke drawStroke)
61+
previewedStrokes = strokesPayload.Strokes;
62+
}
63+
else
64+
{
65+
foreach (var canvasStroke in canvasData.Strokes)
5666
{
57-
drawStrokes.Add(drawStroke);
67+
if (canvasStroke is DrawStroke drawStroke)
68+
{
69+
previewedStrokes.Add(drawStroke);
70+
}
5871
}
5972
}
6073

61-
var pngData = GetImageData(drawStrokes,
74+
var pngData = GetImageData(previewedStrokes,
6275
includeBackground: IncludeBackground,
6376
backgroundColor: Utilities.ToSkColor(canvasData.BackgroundColor),
6477
ImageScale, SKEncodedImageFormat.Png);

Scribble/ViewModels/MainViewModel.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,32 @@ public MainViewModel(MultiUserDrawingViewModel multiplayer, DocumentViewModel do
8888
// Clear data when the DocumentViewModel triggers a reset
8989
WeakReferenceMessenger.Default.Register<MainViewModel, ClearCanvasMessage>(this,
9090
(mainViewModel, m) => { mainViewModel.ApplyEvent(new LoadCanvasEvent(Guid.NewGuid(), [])); });
91+
92+
// Send the actively selected strokes to the recipient
93+
WeakReferenceMessenger.Default.Register<MainViewModel, RequestSelectedStrokes>(this,
94+
(mainViewModel, message) =>
95+
{
96+
var hasActiveSelection = mainViewModel.SelectionTargets.Count > 0;
97+
if (hasActiveSelection)
98+
{
99+
var id = mainViewModel.SelectionTargets.Keys.First();
100+
var selectedStrokesIds = mainViewModel.SelectionTargets[id];
101+
List<DrawStroke> selectedStrokes = [];
102+
foreach (var stroke in mainViewModel.CanvasStrokes)
103+
{
104+
if (stroke is DrawStroke drawStroke && selectedStrokesIds.Contains(drawStroke.Id))
105+
{
106+
selectedStrokes.Add(drawStroke);
107+
}
108+
}
109+
110+
message.Reply(new SelectedStrokesPayload(selectedStrokes));
111+
}
112+
else
113+
{
114+
message.Reply(new SelectedStrokesPayload([]));
115+
}
116+
});
91117
}
92118

93119
// Event handler for when another client in the room draws something

0 commit comments

Comments
 (0)