mirror of https://github.com/2dust/v2rayN
sort now works
parent
414ac3225a
commit
05efff10da
|
@ -1,31 +1,50 @@
|
||||||
using System;
|
using System.Windows.Forms;
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace v2rayN.Base
|
namespace v2rayN.Base
|
||||||
{
|
{
|
||||||
public class ListViewSort : IComparer
|
|
||||||
|
// ref: https://stackoverflow.com/questions/1214289/how-do-i-sort-integers-in-a-listview
|
||||||
|
class Sorter : System.Collections.IComparer
|
||||||
{
|
{
|
||||||
private int col;
|
public int Column = 0;
|
||||||
private bool descK;
|
public int Sorting = 0;
|
||||||
public ListViewSort()
|
public int Compare(object x, object y) // IComparer Member
|
||||||
{
|
{
|
||||||
col = 0;
|
if (!(x is ListViewItem) || !(y is ListViewItem))
|
||||||
}
|
return (0);
|
||||||
public ListViewSort(int column, object Desc)
|
|
||||||
{
|
ListViewItem l1 = (ListViewItem)x;
|
||||||
descK = (bool)Desc;
|
ListViewItem l2 = (ListViewItem)y;
|
||||||
col = column; //当前列,0,1,2...,参数由ListView控件的ColumnClick事件传递
|
|
||||||
}
|
int doIntSort = Sorting;
|
||||||
public int Compare(object x, object y)
|
if (doIntSort > 0) // Tag will be number
|
||||||
{
|
{
|
||||||
int tempInt = String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
|
ulong.TryParse(l1.SubItems[Column].Tag?.ToString(), out ulong fl1);
|
||||||
if (descK) return -tempInt;
|
ulong.TryParse(l2.SubItems[Column].Tag?.ToString(), out ulong fl2);
|
||||||
else return tempInt;
|
|
||||||
|
if (doIntSort == 1)
|
||||||
|
{
|
||||||
|
return fl1.CompareTo(fl2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return fl2.CompareTo(fl1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string str1 = l1.SubItems[Column].Text;
|
||||||
|
string str2 = l2.SubItems[Column].Text;
|
||||||
|
|
||||||
|
if (doIntSort == -1)
|
||||||
|
{
|
||||||
|
return str1.CompareTo(str2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return str2.CompareTo(str1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,17 +155,18 @@
|
||||||
//
|
//
|
||||||
// lvServers
|
// lvServers
|
||||||
//
|
//
|
||||||
|
this.lvServers.AllowColumnReorder = true;
|
||||||
this.lvServers.ContextMenuStrip = this.cmsLv;
|
this.lvServers.ContextMenuStrip = this.cmsLv;
|
||||||
resources.ApplyResources(this.lvServers, "lvServers");
|
resources.ApplyResources(this.lvServers, "lvServers");
|
||||||
this.lvServers.FullRowSelect = true;
|
this.lvServers.FullRowSelect = true;
|
||||||
this.lvServers.GridLines = true;
|
this.lvServers.GridLines = true;
|
||||||
this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
|
||||||
this.lvServers.HideSelection = false;
|
this.lvServers.HideSelection = false;
|
||||||
this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
|
this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
|
||||||
((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))});
|
((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))});
|
||||||
this.lvServers.Name = "lvServers";
|
this.lvServers.Name = "lvServers";
|
||||||
this.lvServers.UseCompatibleStateImageBehavior = false;
|
this.lvServers.UseCompatibleStateImageBehavior = false;
|
||||||
this.lvServers.View = System.Windows.Forms.View.Details;
|
this.lvServers.View = System.Windows.Forms.View.Details;
|
||||||
|
this.lvServers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvServers_ColumnClick);
|
||||||
this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged);
|
this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged);
|
||||||
this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick);
|
this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick);
|
||||||
this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown);
|
this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown);
|
||||||
|
|
|
@ -168,6 +168,8 @@ namespace v2rayN.Forms
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitServersView()
|
private void InitServersView()
|
||||||
{
|
{
|
||||||
|
lvServers.ListViewItemSorter = new Sorter();
|
||||||
|
|
||||||
lvServers.BeginUpdate();
|
lvServers.BeginUpdate();
|
||||||
lvServers.Items.Clear();
|
lvServers.Items.Clear();
|
||||||
|
|
||||||
|
@ -181,15 +183,18 @@ namespace v2rayN.Forms
|
||||||
lvServers.Columns.Add(EServerColName.subRemarks.ToString(), UIRes.I18N("LvSubscription"), 50);
|
lvServers.Columns.Add(EServerColName.subRemarks.ToString(), UIRes.I18N("LvSubscription"), 50);
|
||||||
lvServers.Columns.Add(EServerColName.testResult.ToString(), UIRes.I18N("LvTestResults"), 70);
|
lvServers.Columns.Add(EServerColName.testResult.ToString(), UIRes.I18N("LvTestResults"), 70);
|
||||||
|
|
||||||
|
lvServers.Columns[EServerColName.port.ToString()].Tag = Global.sortMode.Numeric.ToString();
|
||||||
if (statistics != null && statistics.Enable)
|
if (statistics != null && statistics.Enable)
|
||||||
lvServers.HeaderStyle = ColumnHeaderStyle.Clickable;
|
|
||||||
this.lvServers.AllowColumnReorder = true;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
lvServers.Columns.Add(EServerColName.todayDown.ToString(), UIRes.I18N("LvTodayDownloadDataAmount"), 70);
|
lvServers.Columns.Add(EServerColName.todayDown.ToString(), UIRes.I18N("LvTodayDownloadDataAmount"), 70);
|
||||||
lvServers.Columns.Add(EServerColName.todayUp.ToString(), UIRes.I18N("LvTodayUploadDataAmount"), 70);
|
lvServers.Columns.Add(EServerColName.todayUp.ToString(), UIRes.I18N("LvTodayUploadDataAmount"), 70);
|
||||||
lvServers.Columns.Add(EServerColName.totalDown.ToString(), UIRes.I18N("LvTotalDownloadDataAmount"), 70);
|
lvServers.Columns.Add(EServerColName.totalDown.ToString(), UIRes.I18N("LvTotalDownloadDataAmount"), 70);
|
||||||
lvServers.Columns.Add(EServerColName.totalUp.ToString(), UIRes.I18N("LvTotalUploadDataAmount"), 70);
|
lvServers.Columns.Add(EServerColName.totalUp.ToString(), UIRes.I18N("LvTotalUploadDataAmount"), 70);
|
||||||
|
|
||||||
|
lvServers.Columns[EServerColName.todayDown.ToString()].Tag = Global.sortMode.Numeric.ToString();
|
||||||
|
lvServers.Columns[EServerColName.todayUp.ToString()].Tag = Global.sortMode.Numeric.ToString();
|
||||||
|
lvServers.Columns[EServerColName.totalDown.ToString()].Tag = Global.sortMode.Numeric.ToString();
|
||||||
|
lvServers.Columns[EServerColName.totalUp.ToString()].Tag = Global.sortMode.Numeric.ToString();
|
||||||
}
|
}
|
||||||
lvServers.EndUpdate();
|
lvServers.EndUpdate();
|
||||||
}
|
}
|
||||||
|
@ -220,11 +225,11 @@ namespace v2rayN.Forms
|
||||||
{
|
{
|
||||||
var n = new ListViewItem.ListViewSubItem() { Text = text };
|
var n = new ListViewItem.ListViewSubItem() { Text = text };
|
||||||
n.Name = name; // new don't accept it.
|
n.Name = name; // new don't accept it.
|
||||||
n.Tag = tag;
|
n.Tag = tag; // cell's data store.
|
||||||
i.SubItems.Add(n);
|
i.SubItems.Add(n);
|
||||||
}
|
}
|
||||||
ListViewItem lvItem = new ListViewItem(def);
|
ListViewItem lvItem = new ListViewItem(def);
|
||||||
lvItem.Tag = k; // the Tag of items is config's index.
|
lvItem.Tag = k; // the Tag of line is config's index.
|
||||||
_addSubItem(lvItem, EServerColName.type.ToString(), ((EConfigType)item.configType).ToString());
|
_addSubItem(lvItem, EServerColName.type.ToString(), ((EConfigType)item.configType).ToString());
|
||||||
_addSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks);
|
_addSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks);
|
||||||
_addSubItem(lvItem, EServerColName.address.ToString(), item.address);
|
_addSubItem(lvItem, EServerColName.address.ToString(), item.address);
|
||||||
|
@ -244,10 +249,10 @@ namespace v2rayN.Forms
|
||||||
todayUp = Utils.HumanFy(sItem.todayUp);
|
todayUp = Utils.HumanFy(sItem.todayUp);
|
||||||
todayDown = Utils.HumanFy(sItem.todayDown);
|
todayDown = Utils.HumanFy(sItem.todayDown);
|
||||||
}
|
}
|
||||||
_addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown, sItem.todayDown);
|
_addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown, sItem?.todayDown);
|
||||||
_addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp, sItem.todayUp);
|
_addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp, sItem?.todayUp);
|
||||||
_addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown, sItem.totalDown);
|
_addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown, sItem?.totalDown);
|
||||||
_addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp, sItem.totalUp);
|
_addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp, sItem?.totalUp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.interlaceColoring && k % 2 == 1) // 隔行着色
|
if (config.interlaceColoring && k % 2 == 1) // 隔行着色
|
||||||
|
@ -1633,15 +1638,31 @@ namespace v2rayN.Forms
|
||||||
|
|
||||||
private void lvServers_ColumnClick(object sender, ColumnClickEventArgs e)
|
private void lvServers_ColumnClick(object sender, ColumnClickEventArgs e)
|
||||||
{
|
{
|
||||||
if (lvServers.Columns[e.Column].Tag == null)
|
Sorter s = (Sorter)lvServers.ListViewItemSorter;
|
||||||
lvServers.Columns[e.Column].Tag = true;
|
s.Column = e.Column;
|
||||||
bool flag = (bool)lvServers.Columns[e.Column].Tag;
|
|
||||||
if (flag)
|
int doIntSort;
|
||||||
lvServers.Columns[e.Column].Tag = false;
|
if (lvServers.Columns[e.Column].Tag?.ToString() == Global.sortMode.Numeric.ToString()) // 数字正序
|
||||||
else
|
{
|
||||||
lvServers.Columns[e.Column].Tag = true;
|
lvServers.Columns[e.Column].Tag = Global.sortMode.NumericB.ToString();
|
||||||
lvServers.ListViewItemSorter = new ListViewSort(e.Column, lvServers.Columns[e.Column].Tag);
|
doIntSort = 1;
|
||||||
lvServers.Sort();//对列表进行自定义排序
|
}
|
||||||
|
else if (lvServers.Columns[e.Column].Tag?.ToString() == Global.sortMode.NumericB.ToString()) // 数字倒序
|
||||||
|
{
|
||||||
|
lvServers.Columns[e.Column].Tag = Global.sortMode.Numeric.ToString();
|
||||||
|
doIntSort = 2;
|
||||||
|
}
|
||||||
|
else // 非数字
|
||||||
|
{
|
||||||
|
bool bGo = bool.TryParse(lvServers.Columns[e.Column].Tag?.ToString(), out bool bOk);
|
||||||
|
// 首个转换将失败,如果Tag是null或其他。
|
||||||
|
bool flag = bOk ? bGo : false;
|
||||||
|
lvServers.Columns[e.Column].Tag = !flag; // 首次则赋值true。
|
||||||
|
doIntSort = flag ? -1 : -2; // -1正序 -2倒序
|
||||||
|
}
|
||||||
|
s.Sorting = doIntSort;
|
||||||
|
|
||||||
|
lvServers.Sort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,6 +156,16 @@ namespace v2rayN
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string CustomIconName = "v2rayN.ico";
|
public const string CustomIconName = "v2rayN.ico";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表格列的排序方式
|
||||||
|
/// </summary>
|
||||||
|
public enum sortMode
|
||||||
|
{
|
||||||
|
Numeric,
|
||||||
|
NumericB,
|
||||||
|
// More, like natural numbers, string length, visual length, etc.
|
||||||
|
}
|
||||||
|
|
||||||
public enum StatisticsFreshRate
|
public enum StatisticsFreshRate
|
||||||
{
|
{
|
||||||
quick = 1000,
|
quick = 1000,
|
||||||
|
|
Loading…
Reference in New Issue