diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs index e40d948e..5b07ec87 100644 --- a/v2rayN/v2rayN/Base/HttpClientHelper.cs +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -1,6 +1,5 @@ using System.IO; using System.Net.Http; -using System.Net.Http.Headers; using System.Net.Mime; using System.Text; @@ -26,7 +25,7 @@ namespace v2rayN.Base if (string.IsNullOrEmpty(url)) return null; return await httpClient.GetStringAsync(url); } - + public async Task GetAsync(HttpClient client, string url, CancellationToken token = default) { if (string.IsNullOrWhiteSpace(url)) return null; diff --git a/v2rayN/v2rayN/Base/MyDGTextColumn.cs b/v2rayN/v2rayN/Base/MyDGTextColumn.cs new file mode 100644 index 00000000..b58e3668 --- /dev/null +++ b/v2rayN/v2rayN/Base/MyDGTextColumn.cs @@ -0,0 +1,10 @@ +using System.Windows.Controls; + +namespace v2rayN.Base +{ + internal class MyDGTextColumn : DataGridTextColumn + { + public string ExName { get; set; } + + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index f1ec1c74..6eecaa3b 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -151,9 +151,9 @@ namespace v2rayN.Handler enableAutoAdjustMainLvColWidth = true }; } - if (config.uiItem.mainLvColWidth == null) + if (config.uiItem.mainColumnItem == null) { - config.uiItem.mainLvColWidth = new Dictionary(); + config.uiItem.mainColumnItem = new(); } if (Utils.IsNullOrEmpty(config.uiItem.currentLanguage)) { @@ -694,7 +694,7 @@ namespace v2rayN.Handler } - public static int SortServers(ref Config config, string subId, EServerColName name, bool asc) + public static int SortServers(ref Config config, string subId, string colName, bool asc) { var lstModel = LazyConfig.Instance.ProfileItems(subId, ""); if (lstModel.Count <= 0) @@ -720,6 +720,8 @@ namespace v2rayN.Handler sort = t33 == null ? 0 : t33.sort }).ToList(); + + Enum.TryParse(colName, true, out EServerColName name); var propertyName = string.Empty; switch (name) { @@ -730,10 +732,14 @@ namespace v2rayN.Handler case EServerColName.security: case EServerColName.network: case EServerColName.streamSecurity: - case EServerColName.delay: - case EServerColName.speed: propertyName = name.ToString(); break; + case EServerColName.delayVal: + propertyName = "delay"; + break; + case EServerColName.speedVal: + propertyName = "speed"; + break; case EServerColName.subRemarks: propertyName = "subid"; break; @@ -755,7 +761,7 @@ namespace v2rayN.Handler { ProfileExHandler.Instance.SetSort(lstProfile[i].indexId, (i + 1) * 10); } - if (name == EServerColName.delay) + if (name == EServerColName.delayVal) { var maxSort = lstProfile.Max(t => t.sort) + 10; foreach (var item in lstProfile) @@ -766,7 +772,7 @@ namespace v2rayN.Handler } } } - if (name == EServerColName.speed) + if (name == EServerColName.speedVal) { var maxSort = lstProfile.Max(t => t.sort) + 10; foreach (var item in lstProfile) @@ -1310,44 +1316,6 @@ namespace v2rayN.Handler } #endregion - #region UI - - public static int AddformMainLvColWidth(ref Config config, string name, int width) - { - if (config.uiItem.mainLvColWidth == null) - { - config.uiItem.mainLvColWidth = new Dictionary(); - } - if (config.uiItem.mainLvColWidth.ContainsKey(name)) - { - config.uiItem.mainLvColWidth[name] = width; - } - else - { - config.uiItem.mainLvColWidth.Add(name, width); - } - - ToJsonFile(config); - return 0; - } - public static int GetformMainLvColWidth(ref Config config, string name, int width) - { - if (config.uiItem.mainLvColWidth == null) - { - config.uiItem.mainLvColWidth = new Dictionary(); - } - if (config.uiItem.mainLvColWidth.ContainsKey(name)) - { - return config.uiItem.mainLvColWidth[name]; - } - else - { - return width; - } - } - - #endregion - #region Routing public static int SaveRoutingItem(ref Config config, RoutingItem item) diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index cee723b6..661c533e 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -274,7 +274,7 @@ namespace v2rayN.Handler { msg = string.Empty; - ProfileItem profileItem = new(); + ProfileItem profileItem = new(); try { diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index cc2b3fdd..1608689e 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -58,7 +58,7 @@ namespace v2rayN.Handler ProfileExHandler.Instance.SetTestDelay(it.indexId, "0"); break; case ESpeedActionType.Speedtest: - UpdateFunc(it.indexId, "", ResUI.Speedtesting); + UpdateFunc(it.indexId, "", ResUI.Speedtesting); ProfileExHandler.Instance.SetTestSpeed(it.indexId, "0"); break; case ESpeedActionType.Mixedtest: diff --git a/v2rayN/v2rayN/Mode/ConfigItems.cs b/v2rayN/v2rayN/Mode/ConfigItems.cs index 86b5eaa9..3f9e9eac 100644 --- a/v2rayN/v2rayN/Mode/ConfigItems.cs +++ b/v2rayN/v2rayN/Mode/ConfigItems.cs @@ -123,7 +123,8 @@ namespace v2rayN.Mode public bool doubleClick2Activate { get; set; } public bool autoHideStartup { get; set; } = true; public string mainMsgFilter { get; set; } - public Dictionary mainLvColWidth { get; set; } + public List mainColumnItem { get; set; } + } [Serializable] @@ -195,4 +196,12 @@ namespace v2rayN.Mode public string routingIndexId { get; set; } public bool enableRoutingAdvanced { get; set; } } + + [Serializable] + public class ColumnItem + { + public string Name { get; set; } + public int Width { get; set; } + public int Index { get; set; } + } } diff --git a/v2rayN/v2rayN/Mode/EServerColName.cs b/v2rayN/v2rayN/Mode/EServerColName.cs index 7a14feaf..682e413a 100644 --- a/v2rayN/v2rayN/Mode/EServerColName.cs +++ b/v2rayN/v2rayN/Mode/EServerColName.cs @@ -12,8 +12,8 @@ namespace v2rayN.Mode network, streamSecurity, subRemarks, - delay, - speed, + delayVal, + speedVal, todayDown, todayUp, diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index 1d9dc7cc..5e60eddc 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -38,7 +38,7 @@ namespace v2rayN.ViewModels private static Config _config; private NoticeHandler? _noticeHandler; private readonly PaletteHelper _paletteHelper = new(); - private Dictionary _dicHeaderSort = new(); + private Dictionary _dicHeaderSort = new(); private Action _updateView; #endregion @@ -366,7 +366,7 @@ namespace v2rayN.ViewModels }, canEditRemove); SortServerResultCmd = ReactiveCommand.Create(() => { - SortServer((int)EServerColName.delay); + SortServer(EServerColName.delayVal.ToString()); }); //servers export Export2ClientConfigCmd = ReactiveCommand.Create(() => @@ -1034,23 +1034,23 @@ namespace v2rayN.ViewModels await DialogHost.Show(dialog, "RootDialog"); } - public void SortServer(int colIndex) + public void SortServer(string colName) { - if (colIndex < 0) + if (Utils.IsNullOrEmpty(colName)) { return; } - if (!_dicHeaderSort.ContainsKey(colIndex)) + if (!_dicHeaderSort.ContainsKey(colName)) { - _dicHeaderSort.Add(colIndex, true); + _dicHeaderSort.Add(colName, true); } - _dicHeaderSort.TryGetValue(colIndex, out bool asc); - if (ConfigHandler.SortServers(ref _config, _subId, (EServerColName)colIndex, asc) != 0) + _dicHeaderSort.TryGetValue(colName, out bool asc); + if (ConfigHandler.SortServers(ref _config, _subId, colName, asc) != 0) { return; } - _dicHeaderSort[colIndex] = !asc; + _dicHeaderSort[colName] = !asc; RefreshServers(); } diff --git a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs index 3d004d14..87db80d4 100644 --- a/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/OptionSettingViewModel.cs @@ -84,7 +84,7 @@ namespace v2rayN.ViewModels [Reactive] public bool TunBypassMode2 { get; set; } [Reactive] public string TunDirectIP { get; set; } [Reactive] public string TunDirectProcess { get; set; } - [Reactive] public string TunDirectDNS { get; set; } + [Reactive] public string TunDirectDNS { get; set; } [Reactive] public string TunProxyIP { get; set; } [Reactive] public string TunProxyProcess { get; set; } [Reactive] public string TunProxyDNS { get; set; } diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml b/v2rayN/v2rayN/Views/MainWindow.xaml index 6af8d92f..80aa90c2 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml +++ b/v2rayN/v2rayN/Views/MainWindow.xaml @@ -357,9 +357,9 @@ x:Name="txtServerFilter" Width="200" Margin="4,0" + VerticalContentAlignment="Center" materialDesign:HintAssist.Hint="{x:Static resx:ResUI.MsgServerTitle}" materialDesign:TextFieldAssist.HasClearButton="True" - VerticalContentAlignment="Center" Style="{StaticResource DefTextBox}" /> @@ -459,6 +459,7 @@ CanUserSortColumns="False" EnableRowVirtualization="True" Focusable="True" + FrozenColumnCount="1" GridLinesVisibility="All" HeadersVisibility="All" IsReadOnly="True" @@ -601,41 +602,50 @@ - - - - - - - - - - - + - + - - - - diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayN/v2rayN/Views/MainWindow.xaml.cs index deb67f17..1a528d8d 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/MainWindow.xaml.cs @@ -9,6 +9,7 @@ using System.Windows.Controls.Primitives; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; +using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; using v2rayN.Resx; @@ -265,14 +266,7 @@ namespace v2rayN.Views return; } - //find index - var index = lstProfiles.Columns.IndexOf(colHeader.Column); - if (index < 0) - { - index = colHeader.TabIndex; - } - - if (index == 0) + if (colHeader.Column.GetType().Name != typeof(MyDGTextColumn).Name) { foreach (var it in lstProfiles.Columns) { @@ -282,7 +276,8 @@ namespace v2rayN.Views return; } - ViewModel?.SortServer(index); + var colName = ((MyDGTextColumn)colHeader.Column).ExName; + ViewModel?.SortServer(colName); } private void menuSelectAll_Click(object sender, RoutedEventArgs e) @@ -403,7 +398,7 @@ namespace v2rayN.Views } #endregion - #region UI + #region UI private void RestoreUI() { @@ -429,11 +424,21 @@ namespace v2rayN.Views gridMain.RowDefinitions[2].Height = new GridLength(_config.uiItem.mainGirdHeight2, GridUnitType.Star); } - for (int k = 0; k < lstProfiles.Columns.Count; k++) + var lvColumnItem = _config.uiItem.mainColumnItem.OrderBy(t => t.Index).ToList(); + for (int i = 0; i < lvColumnItem.Count; i++) { - var width = ConfigHandler.GetformMainLvColWidth(ref _config, ((EServerColName)k).ToString(), Convert.ToInt32(lstProfiles.Columns[k].Width.Value)); - lstProfiles.Columns[k].Width = width; + var item = lvColumnItem[i]; + for (int k = 1; k < lstProfiles.Columns.Count; k++) + { + var item2 = (MyDGTextColumn)lstProfiles.Columns[k]; + if (item2.ExName == item.Name) + { + item2.Width = item.Width; + item2.DisplayIndex = i + 1; + } + } } + if (!_config.guiItem.enableStatistics) { colTodayUp.Visibility = Visibility.Hidden; @@ -447,10 +452,19 @@ namespace v2rayN.Views _config.uiItem.mainWidth = this.Width; _config.uiItem.mainHeight = this.Height; - for (int k = 0; k < lstProfiles.Columns.Count; k++) + List lvColumnItem = new(); + for (int k = 1; k < lstProfiles.Columns.Count; k++) { - ConfigHandler.AddformMainLvColWidth(ref _config, ((EServerColName)k).ToString(), Convert.ToInt32(lstProfiles.Columns[k].ActualWidth)); + var item2 = (MyDGTextColumn)lstProfiles.Columns[k]; + lvColumnItem.Add(new() + { + Name = item2.ExName, + Width = Convert.ToInt32(item2.ActualWidth), + Index = item2.DisplayIndex + }); } + _config.uiItem.mainColumnItem = lvColumnItem; + _config.uiItem.mainGirdHeight1 = Math.Ceiling(gridMain.RowDefinitions[0].ActualHeight + 0.1); _config.uiItem.mainGirdHeight2 = Math.Ceiling(gridMain.RowDefinitions[2].ActualHeight + 0.1); } @@ -573,4 +587,4 @@ namespace v2rayN.Views } -} +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Views/MsgView.xaml.cs b/v2rayN/v2rayN/Views/MsgView.xaml.cs index 8e999939..8ed7b10d 100644 --- a/v2rayN/v2rayN/Views/MsgView.xaml.cs +++ b/v2rayN/v2rayN/Views/MsgView.xaml.cs @@ -46,7 +46,7 @@ namespace v2rayN.Views { return; } - + var MsgFilter = cmbMsgFilter.Text.TrimEx(); if (MsgFilter != lastMsgFilter) lastMsgFilterNotAvailable = false; if (!string.IsNullOrEmpty(MsgFilter) && !lastMsgFilterNotAvailable) @@ -64,7 +64,7 @@ namespace v2rayN.Views } } lastMsgFilter = MsgFilter; - + ShowMsg(msg); }