mirror of https://github.com/2dust/v2rayN
header sort memory
parent
6f357828b7
commit
12af02435f
|
@ -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<string?> GetAsync(HttpClient client, string url, CancellationToken token = default)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(url)) return null;
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
using System.Windows.Controls;
|
||||
|
||||
namespace v2rayN.Base
|
||||
{
|
||||
internal class MyDGTextColumn : DataGridTextColumn
|
||||
{
|
||||
public string ExName { get; set; }
|
||||
|
||||
}
|
||||
}
|
|
@ -151,9 +151,9 @@ namespace v2rayN.Handler
|
|||
enableAutoAdjustMainLvColWidth = true
|
||||
};
|
||||
}
|
||||
if (config.uiItem.mainLvColWidth == null)
|
||||
if (config.uiItem.mainColumnItem == null)
|
||||
{
|
||||
config.uiItem.mainLvColWidth = new Dictionary<string, int>();
|
||||
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<string, int>();
|
||||
}
|
||||
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<string, int>();
|
||||
}
|
||||
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)
|
||||
|
|
|
@ -274,7 +274,7 @@ namespace v2rayN.Handler
|
|||
{
|
||||
msg = string.Empty;
|
||||
|
||||
ProfileItem profileItem = new();
|
||||
ProfileItem profileItem = new();
|
||||
|
||||
try
|
||||
{
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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<string, int> mainLvColWidth { get; set; }
|
||||
public List<ColumnItem> 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; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,8 +12,8 @@ namespace v2rayN.Mode
|
|||
network,
|
||||
streamSecurity,
|
||||
subRemarks,
|
||||
delay,
|
||||
speed,
|
||||
delayVal,
|
||||
speedVal,
|
||||
|
||||
todayDown,
|
||||
todayUp,
|
||||
|
|
|
@ -38,7 +38,7 @@ namespace v2rayN.ViewModels
|
|||
private static Config _config;
|
||||
private NoticeHandler? _noticeHandler;
|
||||
private readonly PaletteHelper _paletteHelper = new();
|
||||
private Dictionary<int, bool> _dicHeaderSort = new();
|
||||
private Dictionary<string, bool> _dicHeaderSort = new();
|
||||
private Action<string> _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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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}" />
|
||||
</WrapPanel>
|
||||
|
||||
|
@ -459,6 +459,7 @@
|
|||
CanUserSortColumns="False"
|
||||
EnableRowVirtualization="True"
|
||||
Focusable="True"
|
||||
FrozenColumnCount="1"
|
||||
GridLinesVisibility="All"
|
||||
HeadersVisibility="All"
|
||||
IsReadOnly="True"
|
||||
|
@ -601,41 +602,50 @@
|
|||
</DataGridTemplateColumn.CellTemplate>
|
||||
</DataGridTemplateColumn>
|
||||
|
||||
<materialDesign:DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
Width="80"
|
||||
Binding="{Binding configType}"
|
||||
ExName="configType"
|
||||
Header="{x:Static resx:ResUI.LvServiceType}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
Width="150"
|
||||
Binding="{Binding remarks}"
|
||||
ExName="remarks"
|
||||
Header="{x:Static resx:ResUI.LvAlias}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
Width="120"
|
||||
Binding="{Binding address}"
|
||||
ExName="address"
|
||||
Header="{x:Static resx:ResUI.LvAddress}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
Width="60"
|
||||
Binding="{Binding port}"
|
||||
ExName="port"
|
||||
Header="{x:Static resx:ResUI.LvPort}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
Width="100"
|
||||
Binding="{Binding security}"
|
||||
ExName="security"
|
||||
Header="{x:Static resx:ResUI.LvEncryptionMethod}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
Width="100"
|
||||
Binding="{Binding network}"
|
||||
ExName="network"
|
||||
Header="{x:Static resx:ResUI.LvTransportProtocol}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
Width="100"
|
||||
Binding="{Binding streamSecurity}"
|
||||
ExName="streamSecurity"
|
||||
Header="{x:Static resx:ResUI.LvTLS}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
Width="100"
|
||||
Binding="{Binding subRemarks}"
|
||||
ExName="subRemarks"
|
||||
Header="{x:Static resx:ResUI.LvSubscription}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
Width="100"
|
||||
Binding="{Binding delayVal}"
|
||||
ExName="delayVal"
|
||||
Header="{x:Static resx:ResUI.LvTestDelay}">
|
||||
<DataGridTextColumn.ElementStyle>
|
||||
<Style TargetType="{x:Type TextBlock}">
|
||||
|
@ -643,37 +653,42 @@
|
|||
<Setter Property="Foreground" Value="{Binding delay, Converter={StaticResource DelayColorConverter}}" />
|
||||
</Style>
|
||||
</DataGridTextColumn.ElementStyle>
|
||||
</DataGridTextColumn>
|
||||
<DataGridTextColumn
|
||||
</base:MyDGTextColumn>
|
||||
<base:MyDGTextColumn
|
||||
Width="100"
|
||||
Binding="{Binding speedVal}"
|
||||
ExName="speedVal"
|
||||
Header="{x:Static resx:ResUI.LvTestSpeed}">
|
||||
<DataGridTextColumn.ElementStyle>
|
||||
<Style TargetType="{x:Type TextBlock}">
|
||||
<Setter Property="HorizontalAlignment" Value="Right" />
|
||||
</Style>
|
||||
</DataGridTextColumn.ElementStyle>
|
||||
</DataGridTextColumn>
|
||||
</base:MyDGTextColumn>
|
||||
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
x:Name="colTodayUp"
|
||||
Width="100"
|
||||
Binding="{Binding todayUp}"
|
||||
ExName="todayUp"
|
||||
Header="{x:Static resx:ResUI.LvTodayUploadDataAmount}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
x:Name="colTodayDown"
|
||||
Width="100"
|
||||
Binding="{Binding todayDown}"
|
||||
ExName="todayDown"
|
||||
Header="{x:Static resx:ResUI.LvTodayDownloadDataAmount}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
x:Name="colTotalUp"
|
||||
Width="100"
|
||||
Binding="{Binding totalUp}"
|
||||
ExName="totalUp"
|
||||
Header="{x:Static resx:ResUI.LvTotalUploadDataAmount}" />
|
||||
<DataGridTextColumn
|
||||
<base:MyDGTextColumn
|
||||
x:Name="colTotalDown"
|
||||
Width="100"
|
||||
Binding="{Binding totalDown}"
|
||||
ExName="totalDown"
|
||||
Header="{x:Static resx:ResUI.LvTotalDownloadDataAmount}" />
|
||||
|
||||
</DataGrid.Columns>
|
||||
|
|
|
@ -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<ColumnItem> 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
|
|||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue