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
1 change: 1 addition & 0 deletions src/SharpFM/MainWindow.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
<KeyBinding Gesture="Ctrl+N" Command="{Binding NewScriptCommand}" />
<KeyBinding Gesture="Ctrl+Shift+N" Command="{Binding NewTableCommand}" />
<KeyBinding Gesture="Ctrl+Shift+C" Command="{Binding CopySelectedToClip}" />
<KeyBinding Gesture="Ctrl+V" Command="{Binding PasteFileMakerClipData}" />
</Window.KeyBindings>

<DockPanel>
Expand Down
9 changes: 8 additions & 1 deletion src/SharpFM/ViewModels/MainWindowViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ public async Task PasteFileMakerClipData()
{
var formats = await _clipboard.GetFormatsAsync();
int count = 0;
ClipViewModel? lastAdded = null;

foreach (var format in formats.Where(f => f.StartsWith("Mac-", StringComparison.CurrentCultureIgnoreCase)).Distinct())
{
Expand All @@ -244,10 +245,16 @@ public async Task PasteFileMakerClipData()
// don't add duplicates
if (FileMakerClips.Any(k => k.Clip.XmlData == clip.XmlData)) continue;

FileMakerClips.Add(new ClipViewModel(clip));
lastAdded = new ClipViewModel(clip);
FileMakerClips.Add(lastAdded);
count++;
}

if (lastAdded is not null)
{
SelectedClip = lastAdded;
}

ShowStatus(count > 0 ? $"Pasted {count} clip(s) from FileMaker" : "No FileMaker clips found on clipboard");
}
catch (Exception e)
Expand Down
27 changes: 26 additions & 1 deletion tests/SharpFM.Tests/ViewModels/MainWindowViewModelTests.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Controls;
using Microsoft.Extensions.Logging;
Expand All @@ -21,7 +23,7 @@ public class MockClipboardService : IClipboardService

public Task SetTextAsync(string text) { LastText = text; return Task.CompletedTask; }
public Task SetDataAsync(string format, byte[] data) { LastFormat = format; LastData = data; return Task.CompletedTask; }
public Task<string[]> GetFormatsAsync() => Task.FromResult(Array.Empty<string>());
public Task<string[]> GetFormatsAsync() => Task.FromResult(ClipboardData.Keys.ToArray());
public Task<object?> GetDataAsync(string format) =>
Task.FromResult(ClipboardData.TryGetValue(format, out var v) ? v : null);
}
Expand Down Expand Up @@ -113,6 +115,29 @@ public async Task PasteFileMakerClipData_NoFormats_ShowsStatus()
Assert.Contains("No FileMaker clips found", vm.StatusMessage);
}

[Fact]
public async Task PasteFileMakerClipData_SelectsLastPastedClip()
{
var clipboard = new MockClipboardService();
clipboard.ClipboardData["Mac-XMSC"] = BuildClipBytes("<fmxmlsnippet><Script name=\"FirstPasted\"></Script></fmxmlsnippet>");
clipboard.ClipboardData["Mac-XMSS"] = BuildClipBytes("<fmxmlsnippet><Step name=\"SecondPasted\"></Step></fmxmlsnippet>");
var vm = CreateVm(clipboard);
var initialCount = vm.FileMakerClips.Count;

await vm.PasteFileMakerClipData();

Assert.NotNull(vm.SelectedClip);
Assert.Equal(initialCount + 2, vm.FileMakerClips.Count);
Assert.Same(vm.FileMakerClips[^1], vm.SelectedClip);
Assert.Contains("Pasted 2 clip(s)", vm.StatusMessage);
}

private static byte[] BuildClipBytes(string xml)
{
var payload = Encoding.UTF8.GetBytes(xml);
return BitConverter.GetBytes(payload.Length).Concat(payload).ToArray();
}

[Fact]
public void StatusMessage_NotifiesPropertyChanged()
{
Expand Down
Loading