Skip to content

Commit bfbe0f6

Browse files
committed
Clipboard updates: Add image to clipboard and fix pasting and showing status when image is from clipboard
1 parent 8b30fd2 commit bfbe0f6

File tree

7 files changed

+66
-21
lines changed

7 files changed

+66
-21
lines changed

src/PicView.Avalonia.MacOS/App.axaml.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Avalonia;
44
using Avalonia.Controls;
55
using Avalonia.Controls.ApplicationLifetimes;
6+
using Avalonia.Media.Imaging;
67
using Avalonia.Threading;
78
using PicView.Avalonia.ColorManagement;
89
using PicView.Avalonia.Interfaces;
@@ -399,11 +400,16 @@ public bool CutFile(string path)
399400
return false;
400401
}
401402

402-
public Task CopyImageToClipboard()
403+
public Task CopyImageToClipboard(Bitmap bitmap)
403404
{
404405
return Task.CompletedTask;
405406
}
406407

408+
public Task<Bitmap?> GetImageFromClipboard()
409+
{
410+
return null;
411+
}
412+
407413
public Task<bool> ExtractWithLocalSoftwareAsync(string path, string tempDirectory)
408414
{
409415
// TODO: Implement ExtractWithLocalSoftwareAsync

src/PicView.Avalonia.Win32/App.axaml.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
using Avalonia.Controls;
44
using Avalonia.Controls.ApplicationLifetimes;
55
using Avalonia.Markup.Xaml;
6+
using Avalonia.Media.Imaging;
67
using Avalonia.Threading;
8+
using Clowd.Clipboard;
79
using PicView.Avalonia.ColorManagement;
810
using PicView.Avalonia.Interfaces;
911
using PicView.Avalonia.Navigation;
@@ -439,9 +441,14 @@ public bool CutFile(string path)
439441
return Win32Clipboard.CopyFileToClipboard(true, path);
440442
}
441443

442-
public Task CopyImageToClipboard()
444+
public async Task CopyImageToClipboard(Bitmap bitmap)
443445
{
444-
return Task.CompletedTask;
446+
await ClipboardAvalonia.SetImageAsync(bitmap).ConfigureAwait(false);
447+
}
448+
449+
public async Task<Bitmap?> GetImageFromClipboard()
450+
{
451+
return await ClipboardAvalonia.GetImageAsync().ConfigureAwait(false);
445452
}
446453

447454
public async Task<bool> ExtractWithLocalSoftwareAsync(string path, string tempDirectory)

src/PicView.Avalonia.Win32/PicView.Avalonia.Win32.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
<ItemGroup>
4444
<PackageReference Include="Avalonia.Desktop" Version="11.2.3" />
4545
<PackageReference Include="Avalonia.Themes.Simple" Version="11.2.3" />
46+
<PackageReference Include="Clowd.Clipboard.Avalonia" Version="1.1.4" />
4647
</ItemGroup>
4748

4849
<ItemGroup>

src/PicView.Avalonia/Clipboard/ClipboardHelper.cs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,31 @@ public static async Task CopyFileToClipboard(string? file, MainViewModel vm)
6666

6767
public static async Task CopyImageToClipboard(MainViewModel vm)
6868
{
69-
// TODO: Implement CopyImageToClipboard
69+
if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
70+
{
71+
return;
72+
}
73+
var clipboard = desktop.MainWindow.Clipboard;
74+
75+
if (vm.ImageSource is not Bitmap bitmap)
76+
{
77+
return;
78+
}
79+
await clipboard.ClearAsync();
80+
81+
// Handle for Windows
82+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
83+
{
84+
await Task.WhenAll(vm.PlatformService.CopyImageToClipboard(bitmap), CopyAnimation());
85+
return;
86+
}
87+
88+
using var ms = new MemoryStream();
89+
bitmap.Save(ms);
90+
91+
var dataObject = new DataObject();
92+
dataObject.Set("image/png", ms.ToArray());
93+
await Task.WhenAll(clipboard.SetDataObjectAsync(dataObject), CopyAnimation());
7094
}
7195

7296
public static async Task CopyBase64ToClipboard(string path, MainViewModel vm)
@@ -129,13 +153,6 @@ public static async Task Paste(MainViewModel vm)
129153
return;
130154
}
131155
var clipboard = desktop.MainWindow.Clipboard;
132-
var text = await clipboard.GetTextAsync();
133-
if (text is not null)
134-
{
135-
await NavigationHelper.LoadPicFromStringAsync(text, vm).ConfigureAwait(false);
136-
return;
137-
}
138-
139156
var files = await clipboard.GetDataAsync(DataFormats.Files);
140157
if (files is not null)
141158
{
@@ -229,6 +246,20 @@ public static async Task Paste(MainViewModel vm)
229246
UpdateImage.SetSingleImage(bitmap, imageType, name, vm);
230247
return;
231248
}
249+
250+
var text = await clipboard.GetTextAsync();
251+
if (!string.IsNullOrWhiteSpace(text))
252+
{
253+
await NavigationHelper.LoadPicFromStringAsync(text, vm).ConfigureAwait(false);
254+
return;
255+
}
256+
// Handle for Windows
257+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
258+
{
259+
bitmap = await vm.PlatformService.GetImageFromClipboard();
260+
UpdateImage.SetSingleImage(bitmap, imageType, name, vm);
261+
return;
262+
}
232263
return;
233264

234265
async Task<Bitmap?> GetBitmapFromBytes(string format)

src/PicView.Avalonia/Interfaces/IPlatformSpecificService.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace PicView.Avalonia.Interfaces;
1+
using Avalonia.Media.Imaging;
2+
3+
namespace PicView.Avalonia.Interfaces;
24

35
public interface IPlatformSpecificService
46
{
@@ -43,7 +45,9 @@ public interface IPlatformSpecificService
4345

4446
bool CutFile(string path);
4547

46-
Task CopyImageToClipboard();
48+
Task CopyImageToClipboard(Bitmap bitmap);
49+
50+
Task<Bitmap?> GetImageFromClipboard();
4751

4852
Task<bool> ExtractWithLocalSoftwareAsync(string path, string tempDirectory);
4953

src/PicView.Avalonia/Navigation/UpdateImage.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,9 @@ public static void SetSingleImage(object source, ImageType imageType, string nam
177177
}
178178

179179
var singeImageWindowTitles = ImageTitleFormatter.GenerateTitleForSingleImage(width, height, name, 1);
180-
vm.WindowTitle = singeImageWindowTitles.BaseTitle;
181-
vm.Title = singeImageWindowTitles.TitleWithAppName;
182-
vm.TitleTooltip = singeImageWindowTitles.TitleWithAppName;
180+
vm.WindowTitle = singeImageWindowTitles.TitleWithAppName;
181+
vm.Title = singeImageWindowTitles.BaseTitle;
182+
vm.TitleTooltip = singeImageWindowTitles.BaseTitle;
183183
vm.GalleryMargin = new Thickness(0, 0, 0, 0);
184184

185185
vm.PlatformService.StopTaskbarProgress();

src/PicView.Avalonia/Views/MainView.axaml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -856,11 +856,7 @@
856856
</MenuItem.Icon>
857857

858858
<!-- Copy image -->
859-
<MenuItem
860-
Command="{CompiledBinding CopyImageCommand}"
861-
Header="{CompiledBinding CopyImage,
862-
Mode=OneWay}"
863-
IsEnabled="False">
859+
<MenuItem Command="{CompiledBinding CopyImageCommand}" Header="{CompiledBinding CopyImage, Mode=OneWay}">
864860
<MenuItem.Icon>
865861
<Path
866862
Data="M384 336H192c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16l140.1 0L400 115.9V320c0 8.8-7.2 16-16 16zM192 384H384c35.3 0 64-28.7 64-64V115.9c0-12.7-5.1-24.9-14.1-33.9L366.1 14.1c-9-9-21.2-14.1-33.9-14.1H192c-35.3 0-64 28.7-64 64V320c0 35.3 28.7 64 64 64zM64 128c-35.3 0-64 28.7-64 64V448c0 35.3 28.7 64 64 64H256c35.3 0 64-28.7 64-64V416H272v32c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V192c0-8.8 7.2-16 16-16H96V128H64z"

0 commit comments

Comments
 (0)