diff --git a/Netch/Forms/AboutForm.Designer.cs b/Netch/Forms/AboutForm.Designer.cs index f77ae5ce..eab22ab1 100644 --- a/Netch/Forms/AboutForm.Designer.cs +++ b/Netch/Forms/AboutForm.Designer.cs @@ -99,7 +99,6 @@ this.Name = "AboutForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "About"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.AboutForm_FormClosing); this.Load += new System.EventHandler(this.AboutForm_Load); this.SponsorGroupBox.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.SponsorPictureBox)).EndInit(); diff --git a/Netch/Forms/AboutForm.cs b/Netch/Forms/AboutForm.cs index e26c6e02..2a5c59b0 100644 --- a/Netch/Forms/AboutForm.cs +++ b/Netch/Forms/AboutForm.cs @@ -19,11 +19,6 @@ namespace Netch.Forms SponsorGroupBox.Text = i18N.Translate(SponsorGroupBox.Text); } - private void AboutForm_FormClosing(object sender, FormClosingEventArgs e) - { - Global.MainForm.Show(); - } - private void NetchPictureBox_Click(object sender, EventArgs e) { Process.Start("https://github.com/NetchX/Netch"); diff --git a/Netch/Forms/GlobalBypassIPForm.Designer.cs b/Netch/Forms/GlobalBypassIPForm.Designer.cs index 68044eee..cb20c230 100644 --- a/Netch/Forms/GlobalBypassIPForm.Designer.cs +++ b/Netch/Forms/GlobalBypassIPForm.Designer.cs @@ -125,7 +125,6 @@ this.Name = "GlobalBypassIPForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Global Bypass IPs"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.GlobalBypassIPForm_FormClosing); this.Load += new System.EventHandler(this.GlobalBypassIPForm_Load); this.IPGroupBox.ResumeLayout(false); this.IPGroupBox.PerformLayout(); diff --git a/Netch/Forms/GlobalBypassIPForm.cs b/Netch/Forms/GlobalBypassIPForm.cs index 2e83482d..2f66e972 100644 --- a/Netch/Forms/GlobalBypassIPForm.cs +++ b/Netch/Forms/GlobalBypassIPForm.cs @@ -28,11 +28,6 @@ namespace Netch.Forms PrefixComboBox.SelectedIndex = 0; } - private void GlobalBypassIPForm_FormClosing(object sender, FormClosingEventArgs e) - { - Global.SettingForm.Show(); - } - private void AddButton_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(IPTextBox.Text)) diff --git a/Netch/Forms/MainForm.Designer.cs b/Netch/Forms/MainForm.Designer.cs index 37611e5b..01f7523e 100644 --- a/Netch/Forms/MainForm.Designer.cs +++ b/Netch/Forms/MainForm.Designer.cs @@ -153,35 +153,35 @@ namespace Netch.Forms this.AddSocks5ServerToolStripMenuItem.Name = "AddSocks5ServerToolStripMenuItem"; this.AddSocks5ServerToolStripMenuItem.Size = new System.Drawing.Size(259, 22); this.AddSocks5ServerToolStripMenuItem.Text = "Add [Socks5] Server"; - this.AddSocks5ServerToolStripMenuItem.Click += new System.EventHandler(this.AddSocks5ServerToolStripMenuItem_Click); + this.AddSocks5ServerToolStripMenuItem.Click += new System.EventHandler(this.AddServerToolStripMenuItem_Click); // // AddShadowsocksServerToolStripMenuItem // this.AddShadowsocksServerToolStripMenuItem.Name = "AddShadowsocksServerToolStripMenuItem"; this.AddShadowsocksServerToolStripMenuItem.Size = new System.Drawing.Size(259, 22); this.AddShadowsocksServerToolStripMenuItem.Text = "Add [Shadowsocks] Server"; - this.AddShadowsocksServerToolStripMenuItem.Click += new System.EventHandler(this.AddShadowsocksServerToolStripMenuItem_Click); + this.AddShadowsocksServerToolStripMenuItem.Click += new System.EventHandler(this.AddServerToolStripMenuItem_Click); // // AddShadowsocksRServerToolStripMenuItem // this.AddShadowsocksRServerToolStripMenuItem.Name = "AddShadowsocksRServerToolStripMenuItem"; this.AddShadowsocksRServerToolStripMenuItem.Size = new System.Drawing.Size(259, 22); this.AddShadowsocksRServerToolStripMenuItem.Text = "Add [ShadowsocksR] Server"; - this.AddShadowsocksRServerToolStripMenuItem.Click += new System.EventHandler(this.AddShadowsocksRServerToolStripMenuItem_Click); + this.AddShadowsocksRServerToolStripMenuItem.Click += new System.EventHandler(this.AddServerToolStripMenuItem_Click); // // AddVMessServerToolStripMenuItem // this.AddVMessServerToolStripMenuItem.Name = "AddVMessServerToolStripMenuItem"; this.AddVMessServerToolStripMenuItem.Size = new System.Drawing.Size(259, 22); this.AddVMessServerToolStripMenuItem.Text = "Add [VMess] Server"; - this.AddVMessServerToolStripMenuItem.Click += new System.EventHandler(this.AddVMessServerToolStripMenuItem_Click); + this.AddVMessServerToolStripMenuItem.Click += new System.EventHandler(this.AddServerToolStripMenuItem_Click); // // AddTrojanServerToolStripMenuItem // this.AddTrojanServerToolStripMenuItem.Name = "AddTrojanServerToolStripMenuItem"; this.AddTrojanServerToolStripMenuItem.Size = new System.Drawing.Size(259, 22); this.AddTrojanServerToolStripMenuItem.Text = "Add [Trojan] Server"; - this.AddTrojanServerToolStripMenuItem.Click += new System.EventHandler(this.AddTrojanServerToolStripMenuItem_Click); + this.AddTrojanServerToolStripMenuItem.Click += new System.EventHandler(this.AddServerToolStripMenuItem_Click); // // ModeToolStripMenuItem // diff --git a/Netch/Forms/MainForm.MenuStrip.cs b/Netch/Forms/MainForm.MenuStrip.cs index 2b16f0f7..61bb54ae 100644 --- a/Netch/Forms/MainForm.MenuStrip.cs +++ b/Netch/Forms/MainForm.MenuStrip.cs @@ -47,34 +47,21 @@ namespace Netch.Forms } } - private void AddSocks5ServerToolStripMenuItem_Click(object sender, EventArgs e) + private void AddServerToolStripMenuItem_Click(object sender, EventArgs e) { - new Socks5().Show(); - Hide(); - } + Form form = ((ToolStripMenuItem) sender).Name switch + { + "AddSocks5ServerToolStripMenuItem" => new Socks5(), + "AddShadowsocksServerToolStripMenuItem" => new Shadowsocks(), + "AddShadowsocksRServerToolStripMenuItem" => new ShadowsocksR(), + "AddVMessServerToolStripMenuItem" => new VMess(), + "AddTrojanServerToolStripMenuItem" => new Trojan(), + _ => null + }; - private void AddShadowsocksServerToolStripMenuItem_Click(object sender, EventArgs e) - { - new Shadowsocks().Show(); - Hide(); - } - - private void AddShadowsocksRServerToolStripMenuItem_Click(object sender, EventArgs e) - { - new ShadowsocksR().Show(); - Hide(); - } - - private void AddVMessServerToolStripMenuItem_Click(object sender, EventArgs e) - { - new VMess().Show(); - Hide(); - } - - private void AddTrojanServerToolStripMenuItem_Click(object sender, EventArgs e) - { - new Trojan().Show(); Hide(); + form?.ShowDialog(); + Show(); } #endregion @@ -83,8 +70,9 @@ namespace Netch.Forms private void CreateProcessModeToolStripButton_Click(object sender, EventArgs e) { - new Process().Show(); Hide(); + new Process().ShowDialog(); + Show(); } private async void ReloadModesToolStripMenuItem_Click(object sender, EventArgs e) @@ -115,8 +103,10 @@ namespace Netch.Forms private void ManageSubscribeLinksToolStripMenuItem_Click(object sender, EventArgs e) { - new SubscribeForm().Show(); Hide(); + new SubscribeForm().ShowDialog(); + InitServer(); + Show(); } private async void UpdateServersFromSubscribeLinksToolStripMenuItem_Click(object sender, EventArgs e) @@ -388,8 +378,9 @@ namespace Netch.Forms private void AboutToolStripButton_Click(object sender, EventArgs e) { - new AboutForm().Show(); Hide(); + new AboutForm().ShowDialog(); + Show(); } #endregion diff --git a/Netch/Forms/MainForm.Server_Mode.cs b/Netch/Forms/MainForm.Server_Mode.cs index eecae8bb..08dbb661 100644 --- a/Netch/Forms/MainForm.Server_Mode.cs +++ b/Netch/Forms/MainForm.Server_Mode.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; using System.IO; +using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using Netch.Utils; @@ -52,92 +53,15 @@ namespace Netch.Forms #region Mode - private void InitMode() + public void InitMode() { ModeComboBox.Items.Clear(); - Global.ModeFiles.Clear(); - if (Directory.Exists("mode")) - { - foreach (var name in Directory.GetFiles("mode", "*.txt")) - { - var ok = true; - var mode = new Models.Mode(); + Modes.Load(); - using (var sr = new StringReader(File.ReadAllText(name))) - { - var i = 0; - string text; + ModeComboBox.Items.AddRange(Global.Modes.ToArray()); - while ((text = sr.ReadLine()) != null) - { - if (i == 0) - { - var splited = text.Trim().Substring(1).Split(','); - - if (splited.Length == 0) - { - ok = false; - break; - } - - if (splited.Length >= 1) - { - mode.Remark = i18N.Translate(splited[0].Trim()); - } - - if (splited.Length >= 2) - { - if (int.TryParse(splited[1], out var result)) - { - mode.Type = result; - } - else - { - ok = false; - break; - } - } - - if (splited.Length >= 3) - { - if (int.TryParse(splited[2], out var result)) - { - mode.BypassChina = result == 1; - } - else - { - ok = false; - break; - } - } - } - else - { - if (!text.StartsWith("#") && !string.IsNullOrWhiteSpace(text)) - { - mode.Rule.Add(text.Trim()); - } - } - - i++; - } - } - - if (ok) - { - mode.FileName = Path.GetFileNameWithoutExtension(name); - Global.ModeFiles.Add(mode); - } - } - - var array = Global.ModeFiles.ToArray(); - Array.Sort(array, (a, b) => string.Compare(a.Remark, b.Remark, StringComparison.Ordinal)); - - ModeComboBox.Items.AddRange(array); - - SelectLastMode(); - } + SelectLastMode(); } private void SelectLastMode() @@ -160,20 +84,8 @@ namespace Netch.Forms public void AddMode(Models.Mode mode) { ModeComboBox.Items.Clear(); - Global.ModeFiles.Add(mode); - var array = Global.ModeFiles.ToArray(); - Array.Sort(array, (a, b) => string.Compare(a.Remark, b.Remark, StringComparison.Ordinal)); - ModeComboBox.Items.AddRange(array); - - SelectLastMode(); - } - - public void UpdateMode(Models.Mode NewMode, Models.Mode OldMode) - { - ModeComboBox.Items.Clear(); - Global.ModeFiles.Remove(OldMode); - Global.ModeFiles.Add(NewMode); - var array = Global.ModeFiles.ToArray(); + Global.Modes.Add(mode); + var array = Global.Modes.ToArray(); Array.Sort(array, (a, b) => string.Compare(a.Remark, b.Remark, StringComparison.Ordinal)); ModeComboBox.Items.AddRange(array); diff --git a/Netch/Forms/MainForm.cs b/Netch/Forms/MainForm.cs index f3f0e73b..a33c3909 100644 --- a/Netch/Forms/MainForm.cs +++ b/Netch/Forms/MainForm.cs @@ -162,8 +162,9 @@ namespace Netch.Forms private void SettingsButton_Click(object sender, EventArgs e) { - (Global.SettingForm = new SettingForm()).Show(); Hide(); + new SettingForm().ShowDialog(); + Show(); } @@ -285,28 +286,19 @@ namespace Netch.Forms // 当前ServerComboBox中至少有一项 if (ServerComboBox.SelectedIndex != -1) { - switch (Global.Settings.Server[ServerComboBox.SelectedIndex].Type) + Form server = Global.Settings.Server[ServerComboBox.SelectedIndex].Type switch { - case "Socks5": - new Socks5(ServerComboBox.SelectedIndex).Show(); - break; - case "SS": - new Shadowsocks(ServerComboBox.SelectedIndex).Show(); - break; - case "SSR": - new ShadowsocksR(ServerComboBox.SelectedIndex).Show(); - break; - case "VMess": - new VMess(ServerComboBox.SelectedIndex).Show(); - break; - case "Trojan": - new Trojan(ServerComboBox.SelectedIndex).Show(); - break; - default: - return; - } - + "Socks5" => new Socks5(ServerComboBox.SelectedIndex), + "SS" => new Shadowsocks(ServerComboBox.SelectedIndex), + "SSR" => new ShadowsocksR(ServerComboBox.SelectedIndex), + "VMess" => new VMess(ServerComboBox.SelectedIndex), + "Trojan" => new Trojan(ServerComboBox.SelectedIndex), + _ => null + }; Hide(); + server?.ShowDialog(); + InitServer(); + Show(); } else { @@ -349,6 +341,11 @@ namespace Netch.Forms var process = new Process(selectedMode); process.Show(); Hide(); + process.FormClosed += (o, args) => + { + InitMode(); + Show(); + }; break; } default: @@ -370,8 +367,8 @@ namespace Netch.Forms selectedMode.DeleteFile("mode"); ModeComboBox.Items.Clear(); - Global.ModeFiles.Remove(selectedMode); - var array = Global.ModeFiles.ToArray(); + Global.Modes.Remove(selectedMode); + var array = Global.Modes.ToArray(); Array.Sort(array, (a, b) => string.Compare(a.Remark, b.Remark, StringComparison.Ordinal)); ModeComboBox.Items.AddRange(array); diff --git a/Netch/Forms/Mode/Process.Designer.cs b/Netch/Forms/Mode/Process.Designer.cs index 4f6fbc74..fece099b 100644 --- a/Netch/Forms/Mode/Process.Designer.cs +++ b/Netch/Forms/Mode/Process.Designer.cs @@ -198,7 +198,6 @@ namespace Netch.Forms.Mode this.Name = "Process"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Create Process Mode"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ModeForm_FormClosing); this.Load += new System.EventHandler(this.ModeForm_Load); this.ConfigurationGroupBox.ResumeLayout(false); this.ConfigurationGroupBox.PerformLayout(); @@ -212,7 +211,7 @@ namespace Netch.Forms.Mode private System.Windows.Forms.ContextMenuStrip contextMenuStrip; private System.Windows.Forms.ToolStripMenuItem DeleteToolStripMenuItem; - private System.Windows.Forms.GroupBox ConfigurationGroupBox; + public System.Windows.Forms.GroupBox ConfigurationGroupBox; private System.Windows.Forms.Label RemarkLabel; private System.Windows.Forms.GroupBox ProcessGroupBox; private System.Windows.Forms.ListBox RuleListBox; @@ -220,7 +219,7 @@ namespace Netch.Forms.Mode private System.Windows.Forms.TextBox ProcessNameTextBox; private System.Windows.Forms.Button AddButton; private System.Windows.Forms.Button ScanButton; - private System.Windows.Forms.Button ControlButton; + public System.Windows.Forms.Button ControlButton; private System.Windows.Forms.Label FilenameLabel; private System.Windows.Forms.TextBox FilenameTextBox; private System.Windows.Forms.CheckBox UseCustomFilenameBox; diff --git a/Netch/Forms/Mode/Process.cs b/Netch/Forms/Mode/Process.cs index fd223f96..afe06f23 100644 --- a/Netch/Forms/Mode/Process.cs +++ b/Netch/Forms/Mode/Process.cs @@ -11,10 +11,12 @@ namespace Netch.Forms.Mode public partial class Process : Form { //用于判断当前窗口是否为编辑模式 - private bool EditMode; + public readonly bool IsEditing; - //被编辑模式坐标 - private Models.Mode EditMode_Old; + //被编辑的模式 + public readonly Models.Mode EditingMode; + + public bool IsEdited { get; private set; } = false; /// /// 编辑模式 @@ -23,15 +25,14 @@ namespace Netch.Forms.Mode public Process(Models.Mode mode) { InitializeComponent(); - CheckForIllegalCrossThreadCalls = false; - EditMode_Old = mode; + EditingMode = mode; Text = "Edit Process Mode"; //循环填充已有规则 mode.Rule.ForEach(i => RuleListBox.Items.Add(i)); - EditMode = true; + IsEditing = true; RemarkTextBox.TextChanged -= RemarkTextBox_TextChanged; FilenameTextBox.Enabled = false; FilenameLabel.Enabled = false; @@ -44,11 +45,13 @@ namespace Netch.Forms.Mode public Process() { InitializeComponent(); - CheckForIllegalCrossThreadCalls = false; - EditMode = false; - EditMode_Old = null; + EditingMode = null; + + FilenameTextBox.Enabled = false; + FilenameLabel.Enabled = false; + IsEditing = false; } /// @@ -88,6 +91,7 @@ namespace Netch.Forms.Mode if (FileChildInfo.Name.EndsWith(".exe") && !RuleListBox.Items.Contains(FileChildInfo.Name)) { RuleListBox.Items.Add(FileChildInfo.Name); + IsEdited = true; } } } @@ -98,7 +102,7 @@ namespace Netch.Forms.Mode } } - private void ModeForm_Load(object sender, EventArgs e) + public void ModeForm_Load(object sender, EventArgs e) { Text = i18N.Translate(Text); ConfigurationGroupBox.Text = i18N.Translate(ConfigurationGroupBox.Text); @@ -109,14 +113,6 @@ namespace Netch.Forms.Mode ScanButton.Text = i18N.Translate(ScanButton.Text); ControlButton.Text = i18N.Translate(ControlButton.Text); DeleteToolStripMenuItem.Text = i18N.Translate(DeleteToolStripMenuItem.Text); - - FilenameTextBox.Enabled = false; - FilenameLabel.Enabled = false; - } - - private void ModeForm_FormClosing(object sender, FormClosingEventArgs e) - { - Global.MainForm.Show(); } /// @@ -137,6 +133,7 @@ namespace Netch.Forms.Mode { if (RuleListBox.SelectedIndex == -1) return; RuleListBox.Items.RemoveAt(RuleListBox.SelectedIndex); + IsEdited = true; } private async void AddButton_Click(object sender, EventArgs e) @@ -156,6 +153,7 @@ namespace Netch.Forms.Mode RuleListBox.Items.Add(process); } + IsEdited = true; RuleListBox.SelectedIndex = RuleListBox.Items.IndexOf(process); ProcessNameTextBox.Text = string.Empty; } @@ -176,26 +174,24 @@ namespace Netch.Forms.Mode } } - private void ControlButton_Click(object sender, EventArgs e) + public void ControlButton_Click(object sender, EventArgs e) { - if (EditMode) + if (IsEditing) { // 编辑模式 if (RuleListBox.Items.Count != 0) { - var mode = new Models.Mode - { - BypassChina = false, - FileName = FilenameTextBox.Text, - Type = 0, - Remark = RemarkTextBox.Text - }; + EditingMode.BypassChina = false; + EditingMode.FileName = FilenameTextBox.Text; + EditingMode.Type = 0; + EditingMode.Remark = RemarkTextBox.Text; + EditingMode.Rule.Clear(); var text = $"# {RemarkTextBox.Text}, 0\r\n"; foreach (var item in RuleListBox.Items) { var process = item as string; - mode.Rule.Add(process); + EditingMode.Rule.Add(process); text += process + "\r\n"; } @@ -210,7 +206,7 @@ namespace Netch.Forms.Mode MessageBoxX.Show(i18N.Translate("Mode updated successfully")); - Global.MainForm.UpdateMode(mode, EditMode_Old); + IsEdited = false; Close(); } else diff --git a/Netch/Forms/Server/Shadowsocks.Designer.cs b/Netch/Forms/Server/Shadowsocks.Designer.cs index 14e26089..6159e23a 100644 --- a/Netch/Forms/Server/Shadowsocks.Designer.cs +++ b/Netch/Forms/Server/Shadowsocks.Designer.cs @@ -218,7 +218,6 @@ this.Name = "Shadowsocks"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Shadowsocks"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Shadowsocks_FormClosing); this.Load += new System.EventHandler(this.Shadowsocks_Load); this.ConfigurationGroupBox.ResumeLayout(false); this.ConfigurationGroupBox.PerformLayout(); diff --git a/Netch/Forms/Server/Shadowsocks.cs b/Netch/Forms/Server/Shadowsocks.cs index 05d2f6a1..3758bd07 100644 --- a/Netch/Forms/Server/Shadowsocks.cs +++ b/Netch/Forms/Server/Shadowsocks.cs @@ -48,11 +48,6 @@ namespace Netch.Forms.Server PluginOptionsTextBox.Text = _server.PluginOption; } - private void Shadowsocks_FormClosing(object sender, FormClosingEventArgs e) - { - Global.MainForm.Show(); - } - private void ComboBox_DrawItem(object sender, DrawItemEventArgs e) { if (sender is ComboBox cbx) diff --git a/Netch/Forms/Server/ShadowsocksR.Designer.cs b/Netch/Forms/Server/ShadowsocksR.Designer.cs index 8cd01b80..d90ff9f2 100644 --- a/Netch/Forms/Server/ShadowsocksR.Designer.cs +++ b/Netch/Forms/Server/ShadowsocksR.Designer.cs @@ -266,7 +266,6 @@ this.Name = "ShadowsocksR"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "ShadowsocksR"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ShadowsocksR_FormClosing); this.Load += new System.EventHandler(this.ShadowsocksR_Load); this.ConfigurationGroupBox.ResumeLayout(false); this.ConfigurationGroupBox.PerformLayout(); diff --git a/Netch/Forms/Server/ShadowsocksR.cs b/Netch/Forms/Server/ShadowsocksR.cs index 56d11a06..504e625a 100644 --- a/Netch/Forms/Server/ShadowsocksR.cs +++ b/Netch/Forms/Server/ShadowsocksR.cs @@ -56,11 +56,6 @@ namespace Netch.Forms.Server OBFSOptionParamTextBox.Text = _server.OBFSParam; } - private void ShadowsocksR_FormClosing(object sender, FormClosingEventArgs e) - { - Global.MainForm.Show(); - } - private void ComboBox_DrawItem(object sender, DrawItemEventArgs e) { if (sender is ComboBox cbx) diff --git a/Netch/Forms/Server/Socks5.Designer.cs b/Netch/Forms/Server/Socks5.Designer.cs index 88e39622..c6f1006f 100644 --- a/Netch/Forms/Server/Socks5.Designer.cs +++ b/Netch/Forms/Server/Socks5.Designer.cs @@ -173,7 +173,6 @@ this.Name = "Socks5"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Socks5"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Shadowsocks_FormClosing); this.Load += new System.EventHandler(this.Shadowsocks_Load); this.ConfigurationGroupBox.ResumeLayout(false); this.ConfigurationGroupBox.PerformLayout(); diff --git a/Netch/Forms/Server/Socks5.cs b/Netch/Forms/Server/Socks5.cs index 4bd0ae4e..06c00c62 100644 --- a/Netch/Forms/Server/Socks5.cs +++ b/Netch/Forms/Server/Socks5.cs @@ -42,11 +42,6 @@ namespace Netch.Forms.Server PasswordTextBox.Text = _server.Password; } - private void Shadowsocks_FormClosing(object sender, FormClosingEventArgs e) - { - Global.MainForm.Show(); - } - private void ComboBox_DrawItem(object sender, DrawItemEventArgs e) { if (sender is ComboBox cbx) diff --git a/Netch/Forms/Server/Trojan.Designer.cs b/Netch/Forms/Server/Trojan.Designer.cs index 361759a2..317524c4 100644 --- a/Netch/Forms/Server/Trojan.Designer.cs +++ b/Netch/Forms/Server/Trojan.Designer.cs @@ -152,7 +152,6 @@ this.Name = "Trojan"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Trojan"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Trojan_FormClosing); this.Load += new System.EventHandler(this.Trojan_Load); this.ConfigurationGroupBox.ResumeLayout(false); this.ConfigurationGroupBox.PerformLayout(); diff --git a/Netch/Forms/Server/Trojan.cs b/Netch/Forms/Server/Trojan.cs index b5c0c4a8..5e30b14e 100644 --- a/Netch/Forms/Server/Trojan.cs +++ b/Netch/Forms/Server/Trojan.cs @@ -37,11 +37,6 @@ namespace Netch.Forms.Server PasswordTextBox.Text = _server.Password; } - private void Trojan_FormClosing(object sender, FormClosingEventArgs e) - { - Global.MainForm.Show(); - } - private void ComboBox_DrawItem(object sender, DrawItemEventArgs e) { if (sender is ComboBox cbx) diff --git a/Netch/Forms/Server/Vmess.Designer.cs b/Netch/Forms/Server/Vmess.Designer.cs index 5c355b46..5bcb0ec0 100644 --- a/Netch/Forms/Server/Vmess.Designer.cs +++ b/Netch/Forms/Server/Vmess.Designer.cs @@ -385,7 +385,6 @@ this.Name = "VMess"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "VMess"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.VMess_FormClosing); this.Load += new System.EventHandler(this.VMess_Load); this.ConfigurationGroupBox.ResumeLayout(false); this.ConfigurationGroupBox.PerformLayout(); diff --git a/Netch/Forms/Server/Vmess.cs b/Netch/Forms/Server/Vmess.cs index 1cfffe19..46786820 100644 --- a/Netch/Forms/Server/Vmess.cs +++ b/Netch/Forms/Server/Vmess.cs @@ -87,11 +87,6 @@ namespace Netch.Forms.Server UseMuxCheckBox.Checked = server.UseMux; } - private void VMess_FormClosing(object sender, FormClosingEventArgs e) - { - Global.MainForm.Show(); - } - private void ControlButton_Click(object sender, EventArgs e) { if (!int.TryParse(PortTextBox.Text, out var port)) diff --git a/Netch/Forms/SettingForm.Designer.cs b/Netch/Forms/SettingForm.Designer.cs index 1832734c..459efbd7 100644 --- a/Netch/Forms/SettingForm.Designer.cs +++ b/Netch/Forms/SettingForm.Designer.cs @@ -535,7 +535,6 @@ this.Name = "SettingForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Settings"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SettingForm_FormClosing); this.Load += new System.EventHandler(this.SettingForm_Load); this.PortGroupBox.ResumeLayout(false); this.PortGroupBox.PerformLayout(); diff --git a/Netch/Forms/SettingForm.cs b/Netch/Forms/SettingForm.cs index b6c9e5b0..975cc918 100644 --- a/Netch/Forms/SettingForm.cs +++ b/Netch/Forms/SettingForm.cs @@ -172,15 +172,11 @@ namespace Netch.Forms InitValue(); } - private void SettingForm_FormClosing(object sender, FormClosingEventArgs e) - { - Global.MainForm.Show(); - } - private void GlobalBypassIPsButton_Click(object sender, EventArgs e) { - new GlobalBypassIPForm().Show(); Hide(); + new GlobalBypassIPForm().ShowDialog(); + Show(); } private void ControlButton_Click(object sender, EventArgs e) diff --git a/Netch/Forms/SubscribeForm.cs b/Netch/Forms/SubscribeForm.cs index 7c48b0b1..d65cc112 100644 --- a/Netch/Forms/SubscribeForm.cs +++ b/Netch/Forms/SubscribeForm.cs @@ -63,9 +63,6 @@ namespace Netch.Forms { Configuration.Save(); Global.Settings.UseProxyToUpdateSubscription = UseSelectedServerCheckBox.Checked; - - Global.MainForm.InitServer(); - Global.MainForm.Show(); } private void CopyLinkToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/Netch/Global.cs b/Netch/Global.cs index 92dafa35..4a67443a 100644 --- a/Netch/Global.cs +++ b/Netch/Global.cs @@ -21,11 +21,6 @@ namespace Netch /// public static Forms.MainForm MainForm; - /// - /// 设置窗体 - /// - public static Forms.SettingForm SettingForm; - /// /// SS/SSR 加密方式 /// @@ -206,8 +201,8 @@ namespace Netch public static Models.Setting Settings = new Models.Setting(); /// - /// 用于存储模式文件内容 + /// 用于存储模式 /// - public static List ModeFiles = new List(); + public static readonly List Modes = new List(); } } diff --git a/Netch/Models/Mode.cs b/Netch/Models/Mode.cs index fb64f996..4c83b14f 100644 --- a/Netch/Models/Mode.cs +++ b/Netch/Models/Mode.cs @@ -11,6 +11,11 @@ namespace Netch.Models /// public string Remark; + /// + /// 文件相对路径 + /// + public string RelativePath; + /// /// 无后缀文件名 /// diff --git a/Netch/Netch.csproj b/Netch/Netch.csproj index e6946e0e..72178afe 100644 --- a/Netch/Netch.csproj +++ b/Netch/Netch.csproj @@ -107,6 +107,6 @@ - + diff --git a/Netch/Utils/Modes.cs b/Netch/Utils/Modes.cs new file mode 100644 index 00000000..65ae19f7 --- /dev/null +++ b/Netch/Utils/Modes.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Netch.Models; + +namespace Netch.Utils +{ + public static class Modes + { + private static readonly string ModeDirectory = Path.Combine(Global.NetchDir, "mode\\"); + + public static void Load() + { + Global.Modes.Clear(); + if (!Directory.Exists("mode")) return; + + var stack = new Stack(); + stack.Push("mode"); + while (stack.Count > 0) + { + var dirInfo = new DirectoryInfo(stack.Pop()); + try + { + foreach (var childDirInfo in dirInfo.GetDirectories()) + stack.Push(childDirInfo.FullName); + + foreach (var childFileInfo in dirInfo.GetFiles().Where(info => info.Name.EndsWith(".txt"))) + LoadModeFile(childFileInfo.FullName); + } + catch + { + // ignored + } + } + + Global.Modes.Sort((a, b) => string.Compare(a.Remark, b.Remark, StringComparison.Ordinal)); + } + + private static void LoadModeFile(string path) + { + var mode = new Mode + { + FileName = Path.GetFileNameWithoutExtension(path), + RelativePath = path.Substring(ModeDirectory.Length) + }; + + var content = File.ReadAllLines(path); + if (content.Length == 0) return; + + for (var i = 0; i < content.Length; i++) + { + var text = content[i]; + + if (i == 0) + { + var splited = text.Substring(text.IndexOf('#') + 1).Split(',').Select(s => s.Trim()).ToArray(); + try + { + string tmp; + if ((tmp = splited.ElementAtOrDefault(0)) != null) + mode.Remark = i18N.Translate(tmp); + + if ((tmp = splited.ElementAtOrDefault(1)) != null) + mode.Type = int.Parse(tmp); + + if ((tmp = splited.ElementAtOrDefault(2)) != null) + mode.BypassChina = int.Parse(tmp) == 1; + } + catch + { + return; + } + } + else + { + if (!text.StartsWith("#") && !string.IsNullOrWhiteSpace(text)) + mode.Rule.Add(text.Trim()); + } + } + + Global.Modes.Add(mode); + } + } +} \ No newline at end of file