/** * @file property_panel_controller.h * @brief 定义 HMI 和梯形图属性面板控制器 * @version 1.0.0 * @author suyu * @date 2026-08-22 */ #pragma once #include "domain/control_logic_model.h" #include "domain/hmi_model.h" #include #include #include class HmiEditorService; class HmiEditorWidget; class LogicEditorService; class LogicEditorWidget; class ProjectService; class QWidget; namespace Ui { class MainWindow; } /** * 组织 HMI/梯形图选择状态、属性面板和编辑器信号 * * 属性提交统一经过编辑服务,以便校验、原子回滚和撤销/重做 */ class PropertyPanelController final { public: /** 报告属性操作结果,参数依次为操作名、消息和是否成功 */ using ResultReporter = std::function; /** 向状态栏报告一条带超时的消息 */ using StatusReporter = std::function; /** 创建属性面板控制器并注入编辑服务和选择状态 */ PropertyPanelController( QWidget &parent, Ui::MainWindow &ui, ProjectService &project_service, HmiEditorService &hmi_editor_service, LogicEditorService &logic_editor_service, const HmiDefaultSettings &hmi_defaults, std::function current_page_id, std::function current_logic_id, std::string &selected_control_id, std::string &selected_logic_node_id, std::function refresh_project_ui, ResultReporter result_reporter, StatusReporter status_reporter); /** 连接属性面板按钮、输入框和服务信号 */ void configure(); /** 绑定 HMI 与梯形图编辑器,接收它们的选择变化 */ void bindEditorWidgets( HmiEditorWidget &hmi_editor_widget, LogicEditorWidget &logic_editor_widget); /** 显示指定 HMI 控件的属性 */ void showControlProperties(const std::string &control_id); /** 显示指定 HMI 页面尺寸属性 */ void showPageProperties(const std::string &page_id); /** 显示指定梯形图节点的属性 */ void showLogicNodeProperties(const std::string &node_id); /** 在当前页面添加指定类型的 HMI 控件 */ void addHmiControl(HmiControlType type); /** 删除当前选中的 HMI 控件 */ void deleteSelectedControl(); /** 提交当前 HMI 控件属性 */ void applySelectedControlProperties(); /** 提交当前 HMI 页面属性 */ void applySelectedPageProperties(); /** 提交当前梯形图节点属性 */ void applySelectedLogicNodeProperties(); private: /** 显示 HMI 编辑服务返回的错误 */ void handleHmiEditorError(const QString &message) const; /** 显示梯形图编辑服务返回的错误 */ void handleLogicEditorError(const QString &message) const; /** 打开颜色选择器并写回属性输入框 */ void chooseTextColor(); /** 统一报告属性操作失败 */ void reportFailure( const QString &action, const std::string &message) const; /** 主窗口父对象,不由控制器拥有 */ QWidget &parent_; /** 主窗口的 Designer 界面对象 */ Ui::MainWindow &ui_; /** 工程服务,不由控制器拥有 */ ProjectService &project_service_; /** HMI 编辑服务,不由控制器拥有 */ HmiEditorService &hmi_editor_service_; /** 梯形图编辑服务,不由控制器拥有 */ LogicEditorService &logic_editor_service_; /** 新建页面的启动期只读默认尺寸 */ const HmiDefaultSettings &hmi_defaults_; /** 获取当前 HMI 页面标识的回调 */ std::function current_page_id_; /** 获取当前控制逻辑标识的回调 */ std::function current_logic_id_; /** 主窗口保存的当前控件标识 */ std::string &selected_control_id_; /** 主窗口保存的当前逻辑节点标识 */ std::string &selected_logic_node_id_; /** 请求主窗口刷新工程界面的回调 */ std::function refresh_project_ui_; /** 属性操作结果回调 */ ResultReporter result_reporter_; /** 状态栏消息回调 */ StatusReporter status_reporter_; /** 绑定后的 HMI 编辑器 */ HmiEditorWidget *hmi_editor_widget_ = nullptr; /** 绑定后的梯形图编辑器 */ LogicEditorWidget *logic_editor_widget_ = nullptr; };