From a14d36ef77306486f37994e876d434935d3a468e Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 24 Apr 2022 16:23:30 +0800 Subject: [PATCH] add sort by title --- clashN/clashN/Forms/ProxiesForm.Designer.cs | 2 + clashN/clashN/Forms/ProxiesForm.cs | 120 +++++++++++++++++--- clashN/clashN/Forms/ProxiesForm.resx | 6 +- 3 files changed, 109 insertions(+), 19 deletions(-) diff --git a/clashN/clashN/Forms/ProxiesForm.Designer.cs b/clashN/clashN/Forms/ProxiesForm.Designer.cs index 4eb3f39..e61e5e9 100644 --- a/clashN/clashN/Forms/ProxiesForm.Designer.cs +++ b/clashN/clashN/Forms/ProxiesForm.Designer.cs @@ -72,6 +72,7 @@ this.lvProxies.Name = "lvProxies"; this.lvProxies.UseCompatibleStateImageBehavior = false; this.lvProxies.View = System.Windows.Forms.View.Details; + this.lvProxies.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvProxies_ColumnClick); this.lvProxies.SelectedIndexChanged += new System.EventHandler(this.lvProxies_SelectedIndexChanged); // // lvDetail @@ -86,6 +87,7 @@ this.lvDetail.Name = "lvDetail"; this.lvDetail.UseCompatibleStateImageBehavior = false; this.lvDetail.View = System.Windows.Forms.View.Details; + this.lvDetail.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvDetail_ColumnClick); this.lvDetail.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvDetail_KeyDown); // // tsMain diff --git a/clashN/clashN/Forms/ProxiesForm.cs b/clashN/clashN/Forms/ProxiesForm.cs index 43ec252..9bd1d7b 100644 --- a/clashN/clashN/Forms/ProxiesForm.cs +++ b/clashN/clashN/Forms/ProxiesForm.cs @@ -18,10 +18,14 @@ namespace clashN.Forms { public partial class ProxiesForm : BaseForm { - Dictionary proxies; - Dictionary providers; - ProxiesItem selectedProxy; + private Dictionary proxies; + private Dictionary providers; + private List lstDetail; + private int sortColumn = 0; + // ProxiesItem selectedProxy; + + #region Init public ProxiesForm() { InitializeComponent(); @@ -39,6 +43,10 @@ namespace clashN.Forms { lvProxies.Focus(); } + + #endregion + + #region listview private void InitProxiesView() { lvProxies.BeginUpdate(); @@ -51,6 +59,7 @@ namespace clashN.Forms lvProxies.MultiSelect = false; lvProxies.HeaderStyle = ColumnHeaderStyle.Clickable; + lvProxies.Columns.Add("", 30); lvProxies.Columns.Add(ResUI.LvAlias, 130); lvProxies.Columns.Add(ResUI.LvServiceType, 80); lvProxies.Columns.Add(ResUI.LvActivity, 130); @@ -78,6 +87,51 @@ namespace clashN.Forms lvDetail.EndUpdate(); } + private void lvProxies_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshDetail(GetLvSelectedIndex()); + } + + private void lvProxies_ColumnClick(object sender, ColumnClickEventArgs e) + { + if (e.Column < 0) + { + return; + } + + if (e.Column == 0) + { + foreach (ColumnHeader it in lvProxies.Columns) + { + it.Width = -2; + } + return; + } + } + + private void lvDetail_ColumnClick(object sender, ColumnClickEventArgs e) + { + if (e.Column < 0) + { + return; + } + + if (e.Column == 0) + { + foreach (ColumnHeader it in lvDetail.Columns) + { + it.Width = -2; + } + return; + } + + RefreshDetailSub(e.Column); + } + #endregion + + + #region proxy function + private void GetClashProxies(bool refreshUI) { MainFormHandler.Instance.GetClashProxies(config, (it, it2) => @@ -114,7 +168,8 @@ namespace clashN.Forms { continue; } - ListViewItem lvItem = new ListViewItem(kv.Key); + ListViewItem lvItem = new ListViewItem(""); + Utils.AddSubItem(lvItem, "Name", kv.Key); Utils.AddSubItem(lvItem, "Type", kv.Value.type); Utils.AddSubItem(lvItem, "Activity", kv.Value.now); @@ -132,7 +187,7 @@ namespace clashN.Forms } private void RefreshDetail(int index) { - selectedProxy = null; + //selectedProxy = null; lvDetail.BeginUpdate(); lvDetail.Items.Clear(); @@ -154,12 +209,9 @@ namespace clashN.Forms { return; } - selectedProxy = proxy; + //selectedProxy = proxy; - lvDetail.BeginUpdate(); - lvDetail.Items.Clear(); - - List lstDetail = new List(); + lstDetail = new List(); foreach (var item in proxy.all) { var isActive = item == proxy.now; @@ -183,7 +235,40 @@ namespace clashN.Forms }); } - foreach (var item in lstDetail.OrderBy(t => t.delay)) + RefreshDetailSub(-1); + } + + private void RefreshDetailSub(int column) + { + if (lstDetail == null) + { + return; + } + if (column < 0) + { + column = sortColumn; + } + else + { + sortColumn = column; + } + lvDetail.BeginUpdate(); + lvDetail.Items.Clear(); + + switch (column) + { + case 1: + lstDetail = lstDetail.OrderBy(x => x.name).ToList(); + break; + case 2: + lstDetail = lstDetail.OrderBy(x => x.type).ToList(); + break; + case 3: + lstDetail = lstDetail.OrderBy(x => x.delay).ToList(); + break; + } + + foreach (var item in lstDetail) { ListViewItem lvItem = new ListViewItem(item.now); Utils.AddSubItem(lvItem, "Name", item.name); @@ -224,10 +309,6 @@ namespace clashN.Forms return null; } - private void lvProxies_SelectedIndexChanged(object sender, EventArgs e) - { - RefreshDetail(GetLvSelectedIndex()); - } private void lvDetail_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) @@ -258,7 +339,8 @@ namespace clashN.Forms { return; } - if (selectedProxy.type != "Selector") + var selectedProxy = TryGetProxy(name); + if (selectedProxy == null || selectedProxy.type != "Selector") { UI.Show(ResUI.OperationFailed); return; @@ -273,6 +355,10 @@ namespace clashN.Forms RefreshDetail(GetLvSelectedIndex()); } + #endregion + + #region toolbar + private void tsbReload_Click(object sender, EventArgs e) { GetClashProxies(true); @@ -318,5 +404,7 @@ namespace clashN.Forms } } + #endregion + } } diff --git a/clashN/clashN/Forms/ProxiesForm.resx b/clashN/clashN/Forms/ProxiesForm.resx index 76e7759..afa6486 100644 --- a/clashN/clashN/Forms/ProxiesForm.resx +++ b/clashN/clashN/Forms/ProxiesForm.resx @@ -89,7 +89,7 @@ 0, 0 - 400, 446 + 399, 446 @@ -143,7 +143,7 @@ 0, 0 - 426, 446 + 427, 446 3 @@ -176,7 +176,7 @@ 830, 446 - 400 + 399 5