From 24b9e8ab71952c06b2086b531e4e66ea30660034 Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Thu, 16 Jul 2026 00:35:38 +0200 Subject: [PATCH] Replace ConnectDialog with ConnectDialogWindow and move UI to XAML --- src/Decho/ViewModels/MainWindowViewModel.cs | 230 +------------------ src/Decho/Views/ConnectDialogWindow.axaml | 46 ++++ src/Decho/Views/ConnectDialogWindow.axaml.cs | 170 ++++++++++++++ 3 files changed, 218 insertions(+), 228 deletions(-) create mode 100644 src/Decho/Views/ConnectDialogWindow.axaml create mode 100644 src/Decho/Views/ConnectDialogWindow.axaml.cs diff --git a/src/Decho/ViewModels/MainWindowViewModel.cs b/src/Decho/ViewModels/MainWindowViewModel.cs index 23cd2f5..c25fa43 100644 --- a/src/Decho/ViewModels/MainWindowViewModel.cs +++ b/src/Decho/ViewModels/MainWindowViewModel.cs @@ -634,9 +634,8 @@ public sealed class MainWindowViewModel : ViewModelBase ClientConfig config = ConfigManager.Load(); SavedServer? prefill = config.SavedServers.FirstOrDefault(s => string.Equals(s.Url, serverVm.ServerUrl, StringComparison.OrdinalIgnoreCase)); - ConnectDialog dialog = new ConnectDialog(config.SavedServers, prefill); - - ConnectDialogResult? result = await dialog.ShowAsync(_mainWindow); + ConnectDialogWindow dialog = new ConnectDialogWindow(config.SavedServers, prefill); + ConnectDialogResult? result = await dialog.ShowDialog(_mainWindow); if (result is null) { return; @@ -754,228 +753,3 @@ public sealed class MainWindowViewModel : ViewModelBase } } -public sealed class ConnectDialogResult -{ - public string ServerUrl { get; set; } = string.Empty; - public string Username { get; set; } = string.Empty; - public string Password { get; set; } = string.Empty; - public bool IsRegister { get; set; } - public bool RememberMe { get; set; } - public bool IsSavedSession { get; set; } - public string? SavedRefreshToken { get; set; } -} - -public sealed class ConnectDialog(List savedServers, SavedServer? prefill = null) -{ - private readonly List _savedServers = savedServers; - private readonly SavedServer? _prefill = prefill; - - public async Task ShowAsync(Window owner) - { - Window dialog = new Window - { - Title = "Connect to Server", - Width = 450, - Height = 380, - WindowStartupLocation = WindowStartupLocation.CenterOwner, - CanResize = false, - }; - - StackPanel stack = new StackPanel { Spacing = 8, Margin = new Avalonia.Thickness(15) }; - - TextBlock urlLabel = new TextBlock { Text = "Server URL:" }; - TextBox urlBox = new TextBox { Watermark = "http://localhost:5000", Text = "http://localhost:5000" }; - stack.Children.Add(urlLabel); - stack.Children.Add(urlBox); - - TextBlock userLabel = new TextBlock { Text = "Username:" }; - TextBox userBox = new TextBox { Watermark = "username" }; - stack.Children.Add(userLabel); - stack.Children.Add(userBox); - - TextBlock passLabel = new TextBlock { Text = "Password:" }; - TextBox passBox = new TextBox { Watermark = "password", PasswordChar = '*' }; - stack.Children.Add(passLabel); - stack.Children.Add(passBox); - - CheckBox rememberMe = new CheckBox { Content = "Remember me", IsChecked = true }; - stack.Children.Add(rememberMe); - - StackPanel buttonPanel = new StackPanel { Orientation = Avalonia.Layout.Orientation.Horizontal, HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center, Spacing = 10 }; - - Button loginBtn = new Button { Content = "Login", Width = 100 }; - Button registerBtn = new Button { Content = "Register", Width = 100 }; - Button cancelBtn = new Button { Content = "Cancel", Width = 100 }; - buttonPanel.Children.Add(loginBtn); - buttonPanel.Children.Add(registerBtn); - buttonPanel.Children.Add(cancelBtn); - stack.Children.Add(buttonPanel); - - ListBox? serversList = null; - if (_savedServers.Count > 0) - { - TextBlock sep = new TextBlock { Text = "--- Saved Servers ---", HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center }; - stack.Children.Add(sep); - - serversList = new ListBox - { - Height = 100, - ItemsSource = _savedServers.Select(s => $"{s.Name} ({s.Url}) - {s.Username ?? "?"}").ToList() - }; - stack.Children.Add(serversList); - - serversList.SelectionChanged += (_, _) => - { - int idx = serversList.SelectedIndex; - if (idx >= 0 && idx < _savedServers.Count) - { - SavedServer s = _savedServers[idx]; - urlBox.Text = s.Url; - userBox.Text = s.Username ?? ""; - rememberMe.IsChecked = s.RememberMe; - if (!string.IsNullOrEmpty(s.RefreshToken)) - { - passBox.Text = ""; - } - } - }; - } - - if (_prefill is not null) - { - urlBox.Text = _prefill.Url; - userBox.Text = _prefill.Username ?? ""; - int idx = _savedServers.FindIndex(s => - string.Equals(s.Url, _prefill.Url, StringComparison.OrdinalIgnoreCase)); - if (idx >= 0 && idx < _savedServers.Count && serversList is not null) - { - serversList.SelectedIndex = idx; - } - } - - dialog.Content = new ScrollViewer { Content = stack }; - - TaskCompletionSource tcs = new TaskCompletionSource(); - ConnectDialogResult? result = null; - - loginBtn.Click += async (_, _) => - { - string url = urlBox.Text?.Trim() ?? ""; - string user = userBox.Text?.Trim() ?? ""; - string pass = passBox.Text ?? ""; - - if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(user)) - { - await ShowMessageBox(owner, "Validation", "Server URL and username are required."); - return; - } - - // Check for saved session - SavedServer? saved = _savedServers.FirstOrDefault(s => - string.Equals(s.Url, url, StringComparison.OrdinalIgnoreCase) && - string.Equals(s.Username, user, StringComparison.OrdinalIgnoreCase) && - !string.IsNullOrEmpty(s.RefreshToken)); - - if (string.IsNullOrEmpty(pass) && saved is not null) - { - result = new ConnectDialogResult - { - ServerUrl = url, - Username = user, - IsSavedSession = true, - SavedRefreshToken = saved.RefreshToken, - RememberMe = saved.RememberMe, - }; - } - else - { - if (string.IsNullOrEmpty(pass)) - { - await ShowMessageBox(owner, "Validation", "Password is required."); - return; - } - - result = new ConnectDialogResult - { - ServerUrl = url, - Username = user, - Password = pass, - IsRegister = false, - RememberMe = rememberMe.IsChecked ?? false, - }; - } - - dialog.Close(); - _ = tcs.TrySetResult(result); - }; - - registerBtn.Click += (_, _) => - { - string url = urlBox.Text?.Trim() ?? ""; - string user = userBox.Text?.Trim() ?? ""; - string pass = passBox.Text ?? ""; - - if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(user) || string.IsNullOrEmpty(pass)) - { - _ = ShowMessageBox(owner, "Validation", "Server URL, username, and password are required."); - return; - } - - result = new ConnectDialogResult - { - ServerUrl = url, - Username = user, - Password = pass, - IsRegister = true, - RememberMe = rememberMe.IsChecked ?? false, - }; - - dialog.Close(); - _ = tcs.TrySetResult(result); - }; - - cancelBtn.Click += (_, _) => - { - dialog.Close(); - _ = tcs.TrySetResult(null); - }; - - dialog.Closed += (_, _) => tcs.TrySetResult(result); - - if (owner is not null) - { - await dialog.ShowDialog(owner); - } - else - { - dialog.Show(); - } - - return await tcs.Task; - } - - private static async Task ShowMessageBox(Window owner, string title, string message) - { - Window msgBox = new Window - { - Title = title, - Width = 350, - Height = 150, - WindowStartupLocation = WindowStartupLocation.CenterOwner, - CanResize = false, - }; - - StackPanel stack = new StackPanel { Spacing = 10, Margin = new Avalonia.Thickness(15) }; - stack.Children.Add(new TextBlock { Text = message, TextWrapping = Avalonia.Media.TextWrapping.Wrap }); - Button okBtn = new Button { Content = "OK", HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center }; - stack.Children.Add(okBtn); - msgBox.Content = stack; - - TaskCompletionSource tcs = new TaskCompletionSource(); - okBtn.Click += (_, _) => { msgBox.Close(); _ = tcs.TrySetResult(); }; - msgBox.Closed += (_, _) => tcs.TrySetResult(); - - await msgBox.ShowDialog(owner); - await tcs.Task; - } -} \ No newline at end of file diff --git a/src/Decho/Views/ConnectDialogWindow.axaml b/src/Decho/Views/ConnectDialogWindow.axaml new file mode 100644 index 0000000..3a111ec --- /dev/null +++ b/src/Decho/Views/ConnectDialogWindow.axaml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + +