Sostituisce WinForms, WebView2 e ui.html con una GUI Avalonia (XAML, ViewModel, tema chiaro/scuro) e un renderer markdown che trasforma l'albero di Markdig in controlli. Un solo progetto net10.0 per Windows e Linux, con publish single-file compresso. L'avvio di claude è in un solo punto (Core/Claude.cs) condiviso da CLI e GUI. Il nome dell'app viene dall'AssemblyName; ChatStore migra la cartella dati LlmRun alla nuova. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
49 lines
1.7 KiB
C#
49 lines
1.7 KiB
C#
using Avalonia;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Input;
|
|
using Avalonia.Input.Platform;
|
|
using Avalonia.Interactivity;
|
|
using Avalonia.Threading;
|
|
using AgentWikiUi.Core;
|
|
|
|
namespace AgentWikiUi.Gui;
|
|
|
|
partial class MainWindow : Window
|
|
{
|
|
public MainWindow()
|
|
{
|
|
InitializeComponent();
|
|
var vm = new MainViewModel();
|
|
DataContext = vm;
|
|
|
|
// proporzioni 16:10 orizzontali: 75% della larghezza utile (max 1440), altezza max 90%
|
|
var screen = Screens.Primary;
|
|
if (screen is not null)
|
|
{
|
|
var area = screen.WorkingArea;
|
|
double w = Math.Min(1440, area.Width / screen.Scaling * 3 / 4);
|
|
var h = Math.Min(w * 10 / 16, area.Height / screen.Scaling * 9 / 10);
|
|
Width = h * 16 / 10; Height = h;
|
|
}
|
|
else { Width = 1280; Height = 800; }
|
|
WindowStartupLocation = WindowStartupLocation.CenterScreen;
|
|
|
|
vm.CopyText = async text => { if (Clipboard is { } cb) await cb.SetTextAsync(text); };
|
|
vm.ConfirmDelete = () => ConfirmDialog.Ask(this, "Eliminare questa chat?");
|
|
vm.FocusInput += () => Dispatcher.UIThread.Post(() => InputBox.Focus());
|
|
vm.Messages.CollectionChanged += (_, _) => Dispatcher.UIThread.Post(() => Scroll.ScrollToEnd(), DispatcherPriority.Background);
|
|
|
|
// Invio invia, Maiusc+Invio va a capo (tunnel: prima che il TextBox inserisca l'a capo)
|
|
InputBox.AddHandler(KeyDownEvent, (_, e) =>
|
|
{
|
|
if (e.Key == Key.Enter && !e.KeyModifiers.HasFlag(KeyModifiers.Shift))
|
|
{
|
|
e.Handled = true;
|
|
if (vm.SendCommand.CanExecute(null)) vm.SendCommand.Execute(null);
|
|
}
|
|
}, RoutingStrategies.Tunnel);
|
|
|
|
Opened += (_, _) => InputBox.Focus();
|
|
}
|
|
}
|