Files
ClaudeDo/src/ClaudeDo.Ui/Views/Islands/Detail/DescriptionStepsCard.axaml.cs
Mika Kuns d8ff8cc110 feat(attachments): drag-and-drop file attachments on the detail pane
Drop a file anywhere on the detail pane to attach it: pane-wide drop target
with a 'Drop to attach' hover overlay (Copy cursor, gated on an idle selected
task), an explicit lingering confirmation/error line, plus an Attachments list
with size, remove, and an Add file… picker in the DETAILS card. ComposedPreview
now shows the reference files too. en/de keys added.
2026-06-26 16:11:48 +02:00

67 lines
2.0 KiB
C#

using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Interactivity;
using Avalonia.Platform.Storage;
using ClaudeDo.Ui.ViewModels.Islands;
namespace ClaudeDo.Ui.Views.Islands.Detail;
public partial class DescriptionStepsCard : UserControl
{
public DescriptionStepsCard()
{
InitializeComponent();
}
private async void OnCopyClick(object? sender, RoutedEventArgs e)
{
if (DataContext is not DetailsIslandViewModel vm) return;
var clipboard = TopLevel.GetTopLevel(this)?.Clipboard;
if (clipboard is null) return;
await clipboard.SetTextAsync(vm.ComposedPreview);
}
private void OnSubtaskTitleTapped(object? sender, TappedEventArgs e)
{
if (sender is TextBlock { DataContext: SubtaskRowViewModel row })
row.IsEditing = true;
}
private void OnSubtaskEditLostFocus(object? sender, RoutedEventArgs e)
{
if (sender is TextBox { DataContext: SubtaskRowViewModel row }
&& DataContext is DetailsIslandViewModel vm
&& vm.CommitSubtaskEditCommand.CanExecute(row))
vm.CommitSubtaskEditCommand.Execute(row);
}
private async void OnAddFileClick(object? sender, RoutedEventArgs e)
{
if (DataContext is not DetailsIslandViewModel vm) return;
var topLevel = TopLevel.GetTopLevel(this);
if (topLevel is null) return;
var picked = await topLevel.StorageProvider.OpenFilePickerAsync(
new FilePickerOpenOptions { AllowMultiple = true });
if (picked.Count == 0) return;
var files = new List<(string FileName, System.IO.Stream Content)>();
foreach (var item in picked)
{
var stream = await item.OpenReadAsync();
files.Add((item.Name, stream));
}
try
{
await vm.AddFilesAsync(files);
}
finally
{
foreach (var (_, s) in files) await s.DisposeAsync();
}
}
}