Each window can remember its size

This commit is contained in:
2dust
2025-07-01 19:39:27 +08:00
parent cb28c31519
commit 7a9ee6e9e2
31 changed files with 212 additions and 81 deletions

View File

@@ -0,0 +1,52 @@
using Avalonia;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
namespace v2rayN.Desktop.Base;
public class WindowBase<TViewModel> : ReactiveWindow<TViewModel> where TViewModel : class
{
public WindowBase()
{
Loaded += OnLoaded;
}
private void ReactiveWindowBase_Closed(object? sender, EventArgs e)
{
throw new NotImplementedException();
}
protected virtual void OnLoaded(object? sender, RoutedEventArgs e)
{
try
{
var sizeItem = ConfigHandler.GetWindowSizeItem(AppHandler.Instance.Config, GetType().Name);
if (sizeItem == null)
{
return;
}
Width = sizeItem.Width;
Height = sizeItem.Height;
var workingArea = (Screens.ScreenFromWindow(this) ?? Screens.Primary).WorkingArea;
var scaling = VisualRoot is not null ? VisualRoot.RenderScaling : 1.0;
var x = workingArea.X + ((workingArea.Width - (Width * scaling)) / 2);
var y = workingArea.Y + ((workingArea.Height - (Height * scaling)) / 2);
Position = new PixelPoint((int)x, (int)y);
}
catch { }
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
try
{
ConfigHandler.SaveWindowSizeItem(AppHandler.Instance.Config, GetType().Name, Width, Height);
}
catch { }
}
}

View File

@@ -1,12 +1,12 @@
using System.Reactive.Disposables;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using ReactiveUI;
using v2rayN.Desktop.Base;
using v2rayN.Desktop.Common;
namespace v2rayN.Desktop.Views;
public partial class AddServer2Window : ReactiveWindow<AddServer2ViewModel>
public partial class AddServer2Window : WindowBase<AddServer2ViewModel>
{
public AddServer2Window()
{

View File

@@ -1,12 +1,12 @@
using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using ReactiveUI;
using v2rayN.Desktop.Base;
namespace v2rayN.Desktop.Views;
public partial class AddServerWindow : ReactiveWindow<AddServerViewModel>
public partial class AddServerWindow : WindowBase<AddServerViewModel>
{
public AddServerWindow()
{

View File

@@ -1,11 +1,11 @@
using System.Reactive.Disposables;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using ReactiveUI;
using v2rayN.Desktop.Base;
namespace v2rayN.Desktop.Views;
public partial class DNSSettingWindow : ReactiveWindow<DNSSettingViewModel>
public partial class DNSSettingWindow : WindowBase<DNSSettingViewModel>
{
private static Config _config;

View File

@@ -3,13 +3,13 @@ using System.Text;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using ReactiveUI;
using v2rayN.Desktop.Base;
using v2rayN.Desktop.Handler;
namespace v2rayN.Desktop.Views;
public partial class GlobalHotkeySettingWindow : ReactiveWindow<GlobalHotkeySettingViewModel>
public partial class GlobalHotkeySettingWindow : WindowBase<GlobalHotkeySettingViewModel>
{
private readonly List<object> _textBoxKeyEventItem = new();

View File

@@ -5,18 +5,18 @@ using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Controls.Notifications;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using Avalonia.Threading;
using DialogHostAvalonia;
using MsBox.Avalonia.Enums;
using ReactiveUI;
using Splat;
using v2rayN.Desktop.Base;
using v2rayN.Desktop.Common;
using v2rayN.Desktop.Handler;
namespace v2rayN.Desktop.Views;
public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
public partial class MainWindow : WindowBase<MainWindowViewModel>
{
private static Config _config;
private WindowNotificationManager? _manager;
@@ -154,7 +154,6 @@ public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
}
menuAddServerViaScan.IsVisible = false;
RestoreUI();
AddHelpMenuItem();
MessageBus.Current.Listen<string>(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI);
}
@@ -436,14 +435,14 @@ public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
_config.UiItem.ShowInTaskbar = bl;
}
protected override void OnLoaded(object? sender, RoutedEventArgs e)
{
base.OnLoaded(sender, e);
RestoreUI();
}
private void RestoreUI()
{
if (_config.UiItem.MainWidth > 0 && _config.UiItem.MainHeight > 0)
{
Width = _config.UiItem.MainWidth;
Height = _config.UiItem.MainHeight;
}
if (_config.UiItem.MainGirdHeight1 > 0 && _config.UiItem.MainGirdHeight2 > 0)
{
if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal)
@@ -461,8 +460,7 @@ public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
private void StorageUI(string? n = null)
{
_config.UiItem.MainWidth = this.Width;
_config.UiItem.MainHeight = this.Height;
ConfigHandler.SaveWindowSizeItem(_config, GetType().Name, Width, Height);
if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal)
{

View File

@@ -1,11 +1,11 @@
using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.ReactiveUI;
using ReactiveUI;
using v2rayN.Desktop.Base;
namespace v2rayN.Desktop.Views;
public partial class OptionSettingWindow : ReactiveWindow<OptionSettingViewModel>
public partial class OptionSettingWindow : WindowBase<OptionSettingViewModel>
{
private static Config _config;

View File

@@ -1,12 +1,12 @@
using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using ReactiveUI;
using v2rayN.Desktop.Base;
namespace v2rayN.Desktop.Views;
public partial class RoutingRuleDetailsWindow : ReactiveWindow<RoutingRuleDetailsViewModel>
public partial class RoutingRuleDetailsWindow : WindowBase<RoutingRuleDetailsViewModel>
{
public RoutingRuleDetailsWindow()
{

View File

@@ -2,14 +2,14 @@ using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using MsBox.Avalonia.Enums;
using ReactiveUI;
using v2rayN.Desktop.Base;
using v2rayN.Desktop.Common;
namespace v2rayN.Desktop.Views;
public partial class RoutingRuleSettingWindow : ReactiveWindow<RoutingRuleSettingViewModel>
public partial class RoutingRuleSettingWindow : WindowBase<RoutingRuleSettingViewModel>
{
public RoutingRuleSettingWindow()
{

View File

@@ -2,14 +2,14 @@ using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using MsBox.Avalonia.Enums;
using ReactiveUI;
using v2rayN.Desktop.Base;
using v2rayN.Desktop.Common;
namespace v2rayN.Desktop.Views;
public partial class RoutingSettingWindow : ReactiveWindow<RoutingSettingViewModel>
public partial class RoutingSettingWindow : WindowBase<RoutingSettingViewModel>
{
private bool _manualClose = false;

View File

@@ -1,12 +1,12 @@
using System.Reactive.Disposables;
using Avalonia;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using ReactiveUI;
using v2rayN.Desktop.Base;
namespace v2rayN.Desktop.Views;
public partial class SubEditWindow : ReactiveWindow<SubEditViewModel>
public partial class SubEditWindow : WindowBase<SubEditViewModel>
{
public SubEditWindow()
{

View File

@@ -1,16 +1,16 @@
using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.ReactiveUI;
using DialogHostAvalonia;
using DynamicData;
using MsBox.Avalonia.Enums;
using ReactiveUI;
using v2rayN.Desktop.Base;
using v2rayN.Desktop.Common;
namespace v2rayN.Desktop.Views;
public partial class SubSettingWindow : ReactiveWindow<SubSettingViewModel>
public partial class SubSettingWindow : WindowBase<SubSettingViewModel>
{
private bool _manualClose = false;