using Check.Main.Camera; using Check.Main.Common; using Check.Main.Dispatch; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Serialization; using WeifenLuo.WinFormsUI.Docking; namespace Check.Main.UI { public partial class FrmConfig : DockContent { public FrmConfig() { InitializeComponent(); ProductManager.OnProductChanged += UpdateUIForNewProduct; // 初始化UI InitializeProductComboBox(); //LoadSettings(); // 窗体加载时,读取主配置文件 propertyGrid1.SelectedObject = ProductManager.CurrentConfig; //_mainSettings; // 将配置对象绑定到属性网格 propertyGrid1.PropertyValueChanged += (s, e) => { ProductManager.SaveCurrentProductConfig(); }; // 任何属性改变后自动保存 } // 【新增】初始化产品下拉列表 private void InitializeProductComboBox() { cmbProducts.DataSource = null; // 先清空数据源 cmbProducts.DataSource = ProductManager.ProductList; cmbProducts.SelectedItem = ProductManager.CurrentProductName; } // 【新增】当产品管理器中的产品切换后,此方法被调用以更新整个UI private void UpdateUIForNewProduct() { // 使用Invoke确保线程安全 if (this.InvokeRequired) { this.Invoke(new Action(UpdateUIForNewProduct)); return; } ThreadSafeLogger.Log($"UI正在更新以显示产品 '{ProductManager.CurrentProductName}' 的配置。"); // 更新下拉列表的显示(如果产品列表也变了) InitializeProductComboBox(); // 【关键】将PropertyGrid重新绑定到新产品的配置对象上 propertyGrid1.SelectedObject = ProductManager.CurrentConfig; propertyGrid1.Refresh(); // 强制刷新UI } private void toolBtnApply_Click(object sender, EventArgs e) { ThreadSafeLogger.Log("用户点击“应用”按钮..."); // 1. 确保在应用前,任何可能未触发 PropertyValueChanged 的更改都被保存。 ConfigurationManager.SaveChanges(); // 2. 获取主窗体引用 var mainForm = this.DockPanel.FindForm() as FrmMain; mainForm?.ClearStatusStrip(); // 清理UI状态 // 3. 从 ConfigurationManager 获取最新的相机配置列表 var cameraSettings = ConfigurationManager.GetCurrentConfig();//.CameraSettings; if (cameraSettings != null) { // 使用全局配置来初始化或重新初始化相机。 // CameraManager.Initialize 内部会首先调用 Shutdown,所以这是个完整的重启流程。 CameraManager.Initialize(cameraSettings, mainForm); } ThreadSafeLogger.Log("中央配置已成功应用到相机系统。"); //MessageBox.Show("主配置已应用!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void cmbProducts_SelectedIndexChanged(object sender, EventArgs e) { if (cmbProducts.SelectedItem is string selectedProduct && selectedProduct != ProductManager.CurrentProductName) { ProductManager.SwitchToProduct(selectedProduct); } } private void toolBtnAddProduct_Click(object sender, EventArgs e) { // 使用一个简单的输入框来获取新产品名称 string newName = ShowInputDialog("请输入新产品名称:"); if (!string.IsNullOrWhiteSpace(newName)) { if (ProductManager.AddNewProduct(newName)) { ThreadSafeLogger.Log($"成功添加新产品: {newName}"); } else { MessageBox.Show("产品名称无效或已存在!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } // 一个简单的输入对话框辅助方法 public static string ShowInputDialog(string text) { Form prompt = new Form() { Width = 300, Height = 150, FormBorderStyle = FormBorderStyle.FixedDialog, Text = text, StartPosition = FormStartPosition.CenterScreen }; Label textLabel = new Label() { Left = 50, Top = 20, Text = "产品名称:" }; TextBox textBox = new TextBox() { Left = 50, Top = 50, Width = 200 }; Button confirmation = new Button() { Text = "确定", Left = 150, Width = 100, Top = 80, DialogResult = DialogResult.OK }; confirmation.Click += (sender, e) => { prompt.Close(); }; prompt.Controls.Add(textBox); prompt.Controls.Add(confirmation); prompt.Controls.Add(textLabel); prompt.AcceptButton = confirmation; return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : ""; } private void toolBtnDeleteProduct_Click(object sender, EventArgs e) { // 1. 获取当前选中的产品 string productToDelete = ProductManager.CurrentProductName; if (string.IsNullOrWhiteSpace(productToDelete) || productToDelete == "DefaultProduct") { MessageBox.Show("不能删除默认产品或无效产品!", "操作无效", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } // 2. 弹出安全确认对话框 var confirmResult = MessageBox.Show($"您确定要永久删除产品 '{productToDelete}' 吗?\n\n此操作不可恢复,将删除其所有相关配置!", "确认删除", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (confirmResult == DialogResult.Yes) { // 3. 调用核心删除逻辑 if (ProductManager.DeleteProduct(productToDelete)) { ThreadSafeLogger.Log($"用户成功删除了产品 '{productToDelete}'。"); // 无需在这里手动更新UI,因为DeleteProduct方法内部会触发 OnProductChanged 事件, // 而我们的 UpdateUIForNewProduct 方法会自动响应这个事件并刷新整个界面。 } else { MessageBox.Show($"删除产品 '{productToDelete}' 失败,请查看日志获取详细信息。", "删除失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } }