image thumbnails

This commit is contained in:
grimsace
2026-06-08 10:50:01 -05:00
parent 22c2ef78fd
commit 86e54906b4
2 changed files with 70 additions and 25 deletions
+2 -2
View File
@@ -17,8 +17,8 @@
<vm:MainWindowViewModel/> <vm:MainWindowViewModel/>
</Design.DataContext> </Design.DataContext>
<ScrollViewer> <ScrollViewer DragDrop.AllowDrop="True">
<StackPanel Margin="20" Spacing="10"> <StackPanel Margin="20" Spacing="10" DragDrop.AllowDrop="True">
<Label Content="Provider:"/> <Label Content="Provider:"/>
<Grid ColumnDefinitions="*,Auto"> <Grid ColumnDefinitions="*,Auto">
<ComboBox Grid.Column="0" HorizontalAlignment="Stretch" <ComboBox Grid.Column="0" HorizontalAlignment="Stretch"
+64 -19
View File
@@ -1,12 +1,14 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.IO;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Input.Platform; using Avalonia.Input.Platform;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Platform.Storage; using Avalonia.Platform.Storage;
using Avalonia.Media.Imaging;
using Finder2eFoundryConverterCS.ViewModels; using Finder2eFoundryConverterCS.ViewModels;
namespace Finder2eFoundryConverterCS.Views namespace Finder2eFoundryConverterCS.Views
@@ -17,7 +19,20 @@ namespace Finder2eFoundryConverterCS.Views
{ {
InitializeComponent(); InitializeComponent();
AddHandler(DragDrop.DropEvent, Drop); AddHandler(DragDrop.DropEvent, Drop);
KeyDown += OnKeyDown; AddHandler(DragDrop.DragOverEvent, DragOver);
AddHandler(KeyDownEvent, OnKeyDown, RoutingStrategies.Bubble, true);
}
private void DragOver(object? sender, DragEventArgs e)
{
if (e.DataTransfer.TryGetFiles() != null || e.DataTransfer.TryGetBitmap() != null)
{
e.DragEffects = DragDropEffects.Copy;
}
else
{
e.DragEffects = DragDropEffects.None;
}
} }
private async void OnKeyDown(object? sender, KeyEventArgs e) private async void OnKeyDown(object? sender, KeyEventArgs e)
@@ -34,10 +49,24 @@ namespace Finder2eFoundryConverterCS.Views
var text = await topLevel.Clipboard.TryGetTextAsync(); var text = await topLevel.Clipboard.TryGetTextAsync();
if (!string.IsNullOrWhiteSpace(text)) if (!string.IsNullOrWhiteSpace(text))
{ {
var path = text.Replace("file://", "").Trim(); // Handle multiple lines (multiple files)
if (System.IO.File.Exists(path)) var lines = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{ {
var ext = System.IO.Path.GetExtension(path).ToLower(); var path = line.Trim();
if (path.StartsWith("file://"))
{
try
{
var uri = new Uri(path);
path = uri.LocalPath;
}
catch { path = path.Replace("file://", ""); }
}
if (File.Exists(path))
{
var ext = Path.GetExtension(path).ToLower();
if (new[] { ".png", ".jpg", ".jpeg", ".webp" }.Contains(ext)) if (new[] { ".png", ".jpg", ".jpeg", ".webp" }.Contains(ext))
{ {
vm.AddImagePathCommand.Execute(path); vm.AddImagePathCommand.Execute(path);
@@ -45,19 +74,29 @@ namespace Finder2eFoundryConverterCS.Views
} }
} }
} }
}
// Try to get bitmap directly // Try to get bitmap directly
var bitmap = await topLevel.Clipboard.TryGetBitmapAsync(); var bitmap = await topLevel.Clipboard.TryGetBitmapAsync();
if (bitmap != null) if (bitmap != null)
{ {
// Save bitmap to temp file try
var tempDir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Finder2eFoundryConverter"); {
if (!System.IO.Directory.Exists(tempDir)) System.IO.Directory.CreateDirectory(tempDir); var tempDir = Path.Combine(Path.GetTempPath(), "Finder2eFoundryConverter");
if (!Directory.Exists(tempDir)) Directory.CreateDirectory(tempDir);
var tempPath = System.IO.Path.Combine(tempDir, $"pasted_image_{DateTime.Now.Ticks}.png"); var tempPath = Path.Combine(tempDir, $"pasted_image_{DateTime.Now.Ticks}.png");
bitmap.Save(tempPath); using (var stream = File.Create(tempPath))
{
bitmap.Save(stream);
}
vm.AddImagePathCommand.Execute(tempPath); vm.AddImagePathCommand.Execute(tempPath);
} }
catch (Exception ex)
{
vm.StatusMessage = $"Error saving pasted image: {ex.Message}";
}
}
} }
} }
@@ -93,19 +132,19 @@ namespace Finder2eFoundryConverterCS.Views
} }
private async void Drop(object? sender, DragEventArgs e) private async void Drop(object? sender, DragEventArgs e)
{
var files = e.DataTransfer.TryGetFiles();
if (files != null)
{ {
var vm = DataContext as MainWindowViewModel; var vm = DataContext as MainWindowViewModel;
if (vm == null) return; if (vm == null) return;
var files = e.DataTransfer.TryGetFiles();
if (files != null)
{
foreach (var file in files) foreach (var file in files)
{ {
var path = file.Path.LocalPath; var path = file.Path.LocalPath;
if (path == null) continue; if (path == null) continue;
var ext = System.IO.Path.GetExtension(path).ToLower(); var ext = Path.GetExtension(path).ToLower();
if (new[] { ".png", ".jpg", ".jpeg", ".webp" }.Contains(ext)) if (new[] { ".png", ".jpg", ".jpeg", ".webp" }.Contains(ext))
{ {
vm.AddImagePathCommand.Execute(path); vm.AddImagePathCommand.Execute(path);
@@ -117,16 +156,22 @@ namespace Finder2eFoundryConverterCS.Views
var bitmap = e.DataTransfer.TryGetBitmap(); var bitmap = e.DataTransfer.TryGetBitmap();
if (bitmap != null) if (bitmap != null)
{ {
var vm = DataContext as MainWindowViewModel; try
if (vm != null)
{ {
var tempDir = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Finder2eFoundryConverter"); var tempDir = Path.Combine(Path.GetTempPath(), "Finder2eFoundryConverter");
if (!System.IO.Directory.Exists(tempDir)) System.IO.Directory.CreateDirectory(tempDir); if (!Directory.Exists(tempDir)) Directory.CreateDirectory(tempDir);
var tempPath = System.IO.Path.Combine(tempDir, $"dropped_image_{DateTime.Now.Ticks}.png"); var tempPath = Path.Combine(tempDir, $"dropped_image_{DateTime.Now.Ticks}.png");
bitmap.Save(tempPath); using (var stream = File.Create(tempPath))
{
bitmap.Save(stream);
}
vm.AddImagePathCommand.Execute(tempPath); vm.AddImagePathCommand.Execute(tempPath);
} }
catch (Exception ex)
{
vm.StatusMessage = $"Error saving dropped image: {ex.Message}";
}
} }
} }