From ad1a1f8015ce55079fd93b769ffb78c8e05e65d0 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:31:07 +0800 Subject: [PATCH] Main window layout orientation setting --- v2rayN/v2rayN/Enums/EGirdOrientation.cs | 9 +++ v2rayN/v2rayN/Global.cs | 1 + v2rayN/v2rayN/Models/ConfigItems.cs | 1 + v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 +++ v2rayN/v2rayN/Resx/ResUI.resx | 3 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 + .../ViewModels/OptionSettingViewModel.cs | 3 + v2rayN/v2rayN/Views/MainWindow.xaml | 66 +++++++++++------ v2rayN/v2rayN/Views/MainWindow.xaml.cs | 74 ++++++++++++++++--- v2rayN/v2rayN/Views/OptionSettingWindow.xaml | 16 ++++ .../v2rayN/Views/OptionSettingWindow.xaml.cs | 8 +- 11 files changed, 158 insertions(+), 35 deletions(-) create mode 100644 v2rayN/v2rayN/Enums/EGirdOrientation.cs diff --git a/v2rayN/v2rayN/Enums/EGirdOrientation.cs b/v2rayN/v2rayN/Enums/EGirdOrientation.cs new file mode 100644 index 0000000000..e7f9749f4a --- /dev/null +++ b/v2rayN/v2rayN/Enums/EGirdOrientation.cs @@ -0,0 +1,9 @@ +namespace v2rayN.Enums +{ + public enum EGirdOrientation + { + Horizontal, + Vertical, + Tab, + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 1bbd9fefd4..d39001e0d9 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -116,6 +116,7 @@ internal class Global public static readonly List SpeedPingTestUrls = new() { @"https://www.google.com/generate_204", + @"https://www.gstatic.com/generate_204", @"https://www.apple.com/library/test/success.html", @"http://www.msftconnecttest.com/connecttest.txt", }; diff --git a/v2rayN/v2rayN/Models/ConfigItems.cs b/v2rayN/v2rayN/Models/ConfigItems.cs index 6bef1ce5d3..2ec36a45a2 100644 --- a/v2rayN/v2rayN/Models/ConfigItems.cs +++ b/v2rayN/v2rayN/Models/ConfigItems.cs @@ -119,6 +119,7 @@ public class UIItem public double mainHeight { get; set; } public double mainGirdHeight1 { get; set; } public double mainGirdHeight2 { get; set; } + public EGirdOrientation mainGirdOrientation { get; set; } public bool colorModeDark { get; set; } public bool followSystemTheme { get; set; } public string? colorPrimaryName { get; set; } diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 927edffc35..ee5ab7da41 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -2878,6 +2878,15 @@ public static string TbSettingsLogLevel { } } + /// + /// 查找类似 Main layout orientation(Require restart) 的本地化字符串。 + /// + public static string TbSettingsMainGirdOrientation { + get { + return ResourceManager.GetString("TbSettingsMainGirdOrientation", resourceCulture); + } + } + /// /// 查找类似 sing-box Mux Protocol 的本地化字符串。 /// diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index e96c109b1b..3808267ed7 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -1249,4 +1249,7 @@ Multi-server set to active + + Main layout orientation(Require restart) + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 5cbc26c743..e0f6e20b97 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -1246,4 +1246,7 @@ 多服务器设为活动(多选) + + 主界面布局方向(需重启) + \ No newline at end of file diff --git a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs index 77a4851d89..0b0321d8ff 100644 --- a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs @@ -74,6 +74,7 @@ public class OptionSettingViewModel : ReactiveObject [Reactive] public string SpeedPingTestUrl { get; set; } [Reactive] public bool EnableHWA { get; set; } [Reactive] public string SubConvertUrl { get; set; } + [Reactive] public int MainGirdOrientation { get; set; } #endregion UI @@ -171,6 +172,7 @@ public OptionSettingViewModel(Window view) SpeedPingTestUrl = _config.speedTestItem.speedPingTestUrl; EnableHWA = _config.guiItem.enableHWA; SubConvertUrl = _config.constItem.subConvertUrl; + MainGirdOrientation = (int)_config.uiItem.mainGirdOrientation; #endregion UI @@ -333,6 +335,7 @@ private void SaveSetting() _config.speedTestItem.speedPingTestUrl = SpeedPingTestUrl; _config.guiItem.enableHWA = EnableHWA; _config.constItem.subConvertUrl = SubConvertUrl; + _config.uiItem.mainGirdOrientation = (EGirdOrientation)MainGirdOrientation; //systemProxy _config.systemProxyExceptions = systemProxyExceptions; diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml b/v2rayN/v2rayN/Views/MainWindow.xaml index 76827bf139..abaee0ec37 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml +++ b/v2rayN/v2rayN/Views/MainWindow.xaml @@ -466,28 +466,50 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vm.SelectedSwatch, v => v.cmbSwatches.SelectedItem).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.Text).DisposeWith(disposables); - this.OneWayBind(ViewModel, vm => vm.ShowClashUI, v => v.tabClashProxies.Visibility).DisposeWith(disposables); - this.OneWayBind(ViewModel, vm => vm.ShowClashUI, v => v.tabClashConnections.Visibility).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.TabMainSelectedIndex, v => v.tabMain.SelectedIndex).DisposeWith(disposables); + + if (_config.uiItem.mainGirdOrientation == EGirdOrientation.Horizontal) + { + gridMain.Visibility = Visibility.Visible; + this.OneWayBind(ViewModel, vm => vm.ShowClashUI, v => v.tabClashProxies.Visibility).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.ShowClashUI, v => v.tabClashConnections.Visibility).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.TabMainSelectedIndex, v => v.tabMain.SelectedIndex).DisposeWith(disposables); + } + else if (_config.uiItem.mainGirdOrientation == EGirdOrientation.Vertical) + { + gridMain1.Visibility = Visibility.Visible; + this.OneWayBind(ViewModel, vm => vm.ShowClashUI, v => v.tabClashProxies1.Visibility).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.ShowClashUI, v => v.tabClashConnections1.Visibility).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.TabMainSelectedIndex, v => v.tabMain1.SelectedIndex).DisposeWith(disposables); + } + else + { + gridMain2.Visibility = Visibility.Visible; + this.OneWayBind(ViewModel, vm => vm.ShowClashUI, v => v.tabClashProxies2.Visibility).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.ShowClashUI, v => v.tabClashConnections2.Visibility).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.TabMainSelectedIndex, v => v.tabMain2.SelectedIndex).DisposeWith(disposables); + } }); var IsAdministrator = Utils.IsAdministrator(); @@ -152,10 +171,27 @@ public MainWindow() MainFormHandler.Instance.RegisterSystemColorSet(_config, this, (bool bl) => { ViewModel?.ModifyTheme(bl); }); - tabProfiles.Content ??= new ProfilesView(); - tabMsgView.Content ??= new MsgView(); - tabClashProxies.Content ??= new ClashProxiesView(); - tabClashConnections.Content ??= new ClashConnectionsView(); + if (_config.uiItem.mainGirdOrientation == EGirdOrientation.Horizontal) + { + tabProfiles.Content ??= new ProfilesView(); + tabMsgView.Content ??= new MsgView(); + tabClashProxies.Content ??= new ClashProxiesView(); + tabClashConnections.Content ??= new ClashConnectionsView(); + } + else if (_config.uiItem.mainGirdOrientation == EGirdOrientation.Vertical) + { + tabProfiles1.Content ??= new ProfilesView(); + tabMsgView1.Content ??= new MsgView(); + tabClashProxies1.Content ??= new ClashProxiesView(); + tabClashConnections1.Content ??= new ClashConnectionsView(); + } + else + { + tabProfiles2.Content ??= new ProfilesView(); + tabMsgView2.Content ??= new MsgView(); + tabClashProxies2.Content ??= new ClashProxiesView(); + tabClashConnections2.Content ??= new ClashConnectionsView(); + } RestoreUI(); AddHelpMenuItem(); @@ -248,8 +284,16 @@ private void RestoreUI() if (Height > maxHeight) Height = maxHeight; if (_config.uiItem.mainGirdHeight1 > 0 && _config.uiItem.mainGirdHeight2 > 0) { - gridMain.ColumnDefinitions[0].Width = new GridLength(_config.uiItem.mainGirdHeight1, GridUnitType.Star); - gridMain.ColumnDefinitions[2].Width = new GridLength(_config.uiItem.mainGirdHeight2, GridUnitType.Star); + if (_config.uiItem.mainGirdOrientation == EGirdOrientation.Horizontal) + { + gridMain.ColumnDefinitions[0].Width = new GridLength(_config.uiItem.mainGirdHeight1, GridUnitType.Star); + gridMain.ColumnDefinitions[2].Width = new GridLength(_config.uiItem.mainGirdHeight2, GridUnitType.Star); + } + else if (_config.uiItem.mainGirdOrientation == EGirdOrientation.Vertical) + { + gridMain1.RowDefinitions[0].Height = new GridLength(_config.uiItem.mainGirdHeight1, GridUnitType.Star); + gridMain1.RowDefinitions[2].Height = new GridLength(_config.uiItem.mainGirdHeight2, GridUnitType.Star); + } } } @@ -258,8 +302,16 @@ private void StorageUI() _config.uiItem.mainWidth = Utils.ToInt(this.Width); _config.uiItem.mainHeight = Utils.ToInt(this.Height); - _config.uiItem.mainGirdHeight1 = Math.Ceiling(gridMain.ColumnDefinitions[0].ActualWidth + 0.1); - _config.uiItem.mainGirdHeight2 = Math.Ceiling(gridMain.ColumnDefinitions[2].ActualWidth + 0.1); + if (_config.uiItem.mainGirdOrientation == EGirdOrientation.Horizontal) + { + _config.uiItem.mainGirdHeight1 = Math.Ceiling(gridMain.ColumnDefinitions[0].ActualWidth + 0.1); + _config.uiItem.mainGirdHeight2 = Math.Ceiling(gridMain.ColumnDefinitions[2].ActualWidth + 0.1); + } + else if (_config.uiItem.mainGirdOrientation == EGirdOrientation.Vertical) + { + _config.uiItem.mainGirdHeight1 = Math.Ceiling(gridMain1.RowDefinitions[0].ActualHeight + 0.1); + _config.uiItem.mainGirdHeight2 = Math.Ceiling(gridMain1.RowDefinitions[2].ActualHeight + 0.1); + } } private void AddHelpMenuItem() diff --git a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml index 1c10ca0d0b..05ab9cda19 100644 --- a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml +++ b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml @@ -528,6 +528,7 @@ + @@ -830,6 +831,21 @@ materialDesign:HintAssist.Hint="Convert Url" IsEditable="True" Style="{StaticResource DefComboBox}" /> + + + diff --git a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs index 933c76cc55..3ad6f095bc 100644 --- a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml.cs @@ -4,6 +4,7 @@ using System.Reactive.Disposables; using System.Windows; using System.Windows.Media; +using v2rayN.Enums; using v2rayN.Handler; using v2rayN.Models; using v2rayN.ViewModels; @@ -18,8 +19,6 @@ public OptionSettingWindow() { InitializeComponent(); - - this.Owner = Application.Current.MainWindow; _config = LazyConfig.Instance.GetConfig(); var lstFonts = GetFonts(Utils.GetFontsPath()); @@ -90,6 +89,10 @@ public OptionSettingWindow() { cmbSubConvertUrl.Items.Add(it); }); + foreach (EGirdOrientation it in Enum.GetValues(typeof(EGirdOrientation))) + { + cmbMainGirdOrientation.Items.Add(it.ToString()); + } lstFonts.ForEach(it => { cmbcurrentFontFamily.Items.Add(it); }); cmbcurrentFontFamily.Items.Add(string.Empty); @@ -145,6 +148,7 @@ public OptionSettingWindow() this.Bind(ViewModel, vm => vm.SpeedPingTestUrl, v => v.cmbSpeedPingTestUrl.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableHWA, v => v.togEnableHWA.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SubConvertUrl, v => v.cmbSubConvertUrl.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.MainGirdOrientation, v => v.cmbMainGirdOrientation.SelectedIndex).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.systemProxyAdvancedProtocol, v => v.cmbsystemProxyAdvancedProtocol.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.systemProxyExceptions, v => v.txtsystemProxyExceptions.Text).DisposeWith(disposables);