From 96ef70592eda0877dd5f6f1eb52c2194712ec4f7 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 28 Jul 2022 20:16:01 +0800 Subject: [PATCH] Improved proxies --- clashN/clashN/Base/ListViewFlickerFree.cs | 16 ++++++++++++ clashN/clashN/Forms/MainForm.cs | 9 ++++--- clashN/clashN/Forms/ProxiesControl.cs | 31 +++++++++++++---------- clashN/clashN/Handler/MainFormHandler.cs | 31 ++++++++++++++++++----- 4 files changed, 63 insertions(+), 24 deletions(-) diff --git a/clashN/clashN/Base/ListViewFlickerFree.cs b/clashN/clashN/Base/ListViewFlickerFree.cs index 7b9bd5e..49d432b 100644 --- a/clashN/clashN/Base/ListViewFlickerFree.cs +++ b/clashN/clashN/Base/ListViewFlickerFree.cs @@ -93,5 +93,21 @@ namespace clashN.Base this.DoDragDrop(e.Item, DragDropEffects.Move); this.InsertionMark.Index = -1; } + + public void SetScrollPosition(int pos) + { + pos = Math.Min(Items.Count - 1, pos); + + if (pos < 0 || pos >= Items.Count) + return; + + EnsureVisible(pos); + + for (int i = 0; i < 10; i++) + { + if (TopItem != null && TopItem.Index != pos) + TopItem = Items[pos]; + } + } } } \ No newline at end of file diff --git a/clashN/clashN/Forms/MainForm.cs b/clashN/clashN/Forms/MainForm.cs index 5cb5971..7649b57 100644 --- a/clashN/clashN/Forms/MainForm.cs +++ b/clashN/clashN/Forms/MainForm.cs @@ -100,7 +100,7 @@ namespace clashN.Forms _ = LoadCore(); - proxiesControl.Init(config); + proxiesControl.Init(config, UpdateTaskHandler); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) @@ -332,7 +332,7 @@ namespace clashN.Forms if (index >= 0 && index < lvProfiles.Items.Count && lvProfiles.Items.Count > 0) { lvProfiles.Items[index].Selected = true; - lvProfiles.EnsureVisible(index); // workaround + lvProfiles.SetScrollPosition(index); // workaround } } @@ -456,6 +456,7 @@ namespace clashN.Forms SwitchUI(true); proxiesControl.ProxiesReload(); + proxiesControl.ProxiesDelayTest(); } @@ -847,7 +848,7 @@ namespace clashN.Forms if (index >= 0 && index < lvProfiles.Items.Count && lvProfiles.Items.Count > 0) { lvProfiles.Items[index].Selected = true; - lvProfiles.EnsureVisible(index); // workaround + lvProfiles.SetScrollPosition(index); // workaround } SetVisibleCore(true); @@ -1225,11 +1226,13 @@ namespace clashN.Forms { tsbCurrentProxies.Enabled = true; tsbProfile.Enabled = false; + proxiesControl.Focus(); } else { tsbCurrentProxies.Enabled = false; tsbProfile.Enabled = true; + lvProfiles.Focus(); } tsbReload.Enabled = true; diff --git a/clashN/clashN/Forms/ProxiesControl.cs b/clashN/clashN/Forms/ProxiesControl.cs index 917ed1d..cbd277d 100644 --- a/clashN/clashN/Forms/ProxiesControl.cs +++ b/clashN/clashN/Forms/ProxiesControl.cs @@ -17,7 +17,8 @@ namespace clashN.Forms { public partial class ProxiesControl : UserControl { - private Config config; + private Config _config; + Action _updateFunc; private Dictionary proxies; private Dictionary providers; private List lstProxies; @@ -37,9 +38,10 @@ namespace clashN.Forms } - public void Init(Config _config) + public void Init(Config config, Action update) { - config = _config; + _config = config; + _updateFunc = update; InitProxiesView(); InitDetailView(); @@ -137,8 +139,9 @@ namespace clashN.Forms private void GetClashProxies(bool refreshUI) { - MainFormHandler.Instance.GetClashProxies(config, (it, it2) => + MainFormHandler.Instance.GetClashProxies(_config, (it, it2) => { + _updateFunc(false, "Refresh proxies"); proxies = it?.proxies; providers = it2?.providers; @@ -224,7 +227,8 @@ namespace clashN.Forms if (index >= 0 && index < lvProxies.Items.Count && lvProxies.Items.Count > 0) { lvProxies.Items[index].Selected = true; - lvProxies.EnsureVisible(index); + lvProxies.SetScrollPosition(index); + } })); @@ -393,11 +397,11 @@ namespace clashN.Forms var selectedProxy = TryGetProxy(name); if (selectedProxy == null || selectedProxy.type != "Selector") { - UI.Show(ResUI.OperationFailed); + _updateFunc(false, ResUI.OperationFailed); return; } - var url = $"{Global.httpProtocol}{Global.Loopback}:{config.APIPort}/proxies/{name}"; + var url = $"{Global.httpProtocol}{Global.Loopback}:{_config.APIPort}/proxies/{name}"; Dictionary headers = new Dictionary(); headers.Add("name", nameNode); _ = HttpClientHelper.GetInstance().PutAsync(url, headers); @@ -405,6 +409,8 @@ namespace clashN.Forms selectedProxy.now = nameNode; RefreshDetail(GetLvSelectedIndex()); + _updateFunc(false, ResUI.OperationSuccess); + GetClashProxies(true); } @@ -433,17 +439,14 @@ namespace clashN.Forms public void ProxiesReload() { GetClashProxies(true); + lvProxies.Focus(); } public void ProxiesDelayTest() { - if (proxies == null) - { - return; - } - MainFormHandler.Instance.ClashProxiesDelayTest(it => { + _updateFunc(false, "Clash Proxies Delay Test"); GetClashProxies(true); }); } @@ -503,9 +506,9 @@ namespace clashN.Forms { var dtNow = DateTime.Now; - if (config.autoDelayTestInterval > 0) + if (_config.autoDelayTestInterval > 0) { - if ((dtNow - autoDelayTestTime).Minutes % config.autoDelayTestInterval == 0) + if ((dtNow - autoDelayTestTime).Minutes % _config.autoDelayTestInterval == 0) { ProxiesDelayTest(); autoDelayTestTime = dtNow; diff --git a/clashN/clashN/Handler/MainFormHandler.cs b/clashN/clashN/Handler/MainFormHandler.cs index a7ef1e4..78a0438 100644 --- a/clashN/clashN/Handler/MainFormHandler.cs +++ b/clashN/clashN/Handler/MainFormHandler.cs @@ -203,21 +203,38 @@ namespace clashN.Handler private async Task GetClashProxiesAsync(Config config, Action update) { - var url = $"{Global.httpProtocol}{Global.Loopback}:{config.APIPort}/proxies"; - var result = await HttpClientHelper.GetInstance().GetAsync(url); - var clashProxies = Utils.FromJson(result); + for (var i = 0; i < 5; i++) + { + var url = $"{Global.httpProtocol}{Global.Loopback}:{config.APIPort}/proxies"; + var result = await HttpClientHelper.GetInstance().GetAsync(url); + var clashProxies = Utils.FromJson(result); - var url2 = $"{Global.httpProtocol}{Global.Loopback}:{config.APIPort}/providers/proxies"; - var result2 = await HttpClientHelper.GetInstance().GetAsync(url2); - var clashProviders = Utils.FromJson(result2); + var url2 = $"{Global.httpProtocol}{Global.Loopback}:{config.APIPort}/providers/proxies"; + var result2 = await HttpClientHelper.GetInstance().GetAsync(url2); + var clashProviders = Utils.FromJson(result2); - update(clashProxies, clashProviders); + if (clashProxies != null || clashProviders != null) + { + update(clashProxies, clashProviders); + return; + } + Thread.Sleep(5000); + } + update(null, null); } public void ClashProxiesDelayTest(Action update) { Task.Run(() => { + for (int i = 0; i < 5; i++) + { + if (LazyConfig.Instance.GetProxies() == null) + { + Thread.Sleep(5000); + continue; + } + } var proxies = LazyConfig.Instance.GetProxies(); if (proxies == null) {