sort now works

pull/695/head
YFdyh000 2020-04-18 17:31:18 +08:00
parent 414ac3225a
commit 05efff10da
4 changed files with 93 additions and 42 deletions

View File

@ -1,31 +1,50 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms;
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;
private bool descK;
public ListViewSort()
public int Column = 0;
public int Sorting = 0;
public int Compare(object x, object y) // IComparer Member
{
col = 0;
}
public ListViewSort(int column, object Desc)
{
descK = (bool)Desc;
col = column; //当前列,0,1,2...,参数由ListView控件的ColumnClick事件传递
}
public int Compare(object x, object y)
{
int tempInt = String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
if (descK) return -tempInt;
else return tempInt;
if (!(x is ListViewItem) || !(y is ListViewItem))
return (0);
ListViewItem l1 = (ListViewItem)x;
ListViewItem l2 = (ListViewItem)y;
int doIntSort = Sorting;
if (doIntSort > 0) // Tag will be number
{
ulong.TryParse(l1.SubItems[Column].Tag?.ToString(), out ulong fl1);
ulong.TryParse(l2.SubItems[Column].Tag?.ToString(), out ulong fl2);
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);
}
}
}
}
}

View File

@ -155,17 +155,18 @@
//
// lvServers
//
this.lvServers.AllowColumnReorder = true;
this.lvServers.ContextMenuStrip = this.cmsLv;
resources.ApplyResources(this.lvServers, "lvServers");
this.lvServers.FullRowSelect = true;
this.lvServers.GridLines = true;
this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.lvServers.HideSelection = false;
this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))});
this.lvServers.Name = "lvServers";
this.lvServers.UseCompatibleStateImageBehavior = false;
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.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick);
this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown);

View File

@ -168,6 +168,8 @@ namespace v2rayN.Forms
/// </summary>
private void InitServersView()
{
lvServers.ListViewItemSorter = new Sorter();
lvServers.BeginUpdate();
lvServers.Items.Clear();
@ -181,15 +183,18 @@ namespace v2rayN.Forms
lvServers.Columns.Add(EServerColName.subRemarks.ToString(), UIRes.I18N("LvSubscription"), 50);
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)
lvServers.HeaderStyle = ColumnHeaderStyle.Clickable;
this.lvServers.AllowColumnReorder = true;
{
lvServers.Columns.Add(EServerColName.todayDown.ToString(), UIRes.I18N("LvTodayDownloadDataAmount"), 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.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();
}
@ -220,11 +225,11 @@ namespace v2rayN.Forms
{
var n = new ListViewItem.ListViewSubItem() { Text = text };
n.Name = name; // new don't accept it.
n.Tag = tag;
n.Tag = tag; // cell's data store.
i.SubItems.Add(n);
}
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.remarks.ToString(), item.remarks);
_addSubItem(lvItem, EServerColName.address.ToString(), item.address);
@ -244,10 +249,10 @@ namespace v2rayN.Forms
todayUp = Utils.HumanFy(sItem.todayUp);
todayDown = Utils.HumanFy(sItem.todayDown);
}
_addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown, sItem.todayDown);
_addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp, sItem.todayUp);
_addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown, sItem.totalDown);
_addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp, sItem.totalUp);
_addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown, sItem?.todayDown);
_addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp, sItem?.todayUp);
_addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown, sItem?.totalDown);
_addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp, sItem?.totalUp);
}
if (config.interlaceColoring && k % 2 == 1) // 隔行着色
@ -1633,15 +1638,31 @@ namespace v2rayN.Forms
private void lvServers_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (lvServers.Columns[e.Column].Tag == null)
lvServers.Columns[e.Column].Tag = true;
bool flag = (bool)lvServers.Columns[e.Column].Tag;
if (flag)
lvServers.Columns[e.Column].Tag = false;
else
lvServers.Columns[e.Column].Tag = true;
lvServers.ListViewItemSorter = new ListViewSort(e.Column, lvServers.Columns[e.Column].Tag);
lvServers.Sort();//对列表进行自定义排序
Sorter s = (Sorter)lvServers.ListViewItemSorter;
s.Column = e.Column;
int doIntSort;
if (lvServers.Columns[e.Column].Tag?.ToString() == Global.sortMode.Numeric.ToString()) // 数字正序
{
lvServers.Columns[e.Column].Tag = Global.sortMode.NumericB.ToString();
doIntSort = 1;
}
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();
}
}
}

View File

@ -156,6 +156,16 @@ namespace v2rayN
/// </summary>
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
{
quick = 1000,