|
- /**
- * @file main_window.h
- * @brief 定义综合平台编程器主窗口及运行模式界面协调逻辑
- * @version 0.2.0
- * @author suyu
- * @date 2026-08-08
- */
-
- #pragma once
-
- #include "domain/hmi_model.h"
- #include "domain/runtime_state.h"
-
- #include <QMainWindow>
-
- #include <memory>
-
- QT_BEGIN_NAMESPACE
- class QActionGroup;
- class QAction;
- class QComboBox;
- class QLabel;
- class QLineEdit;
- class QPushButton;
- class QSpinBox;
- class QTimer;
- class QToolBar;
-
- namespace Ui {
- class MainWindow;
- }
- QT_END_NAMESPACE
-
- class RuntimeModeService;
- class ProjectService;
- class HmiEditorService;
- class HmiRuntimeService;
- class HmiEditorWidget;
-
- /**
- * @brief 组织主界面区域并将用户操作转交给服务层
- *
- * 主窗口不直接访问寄存器、工程文件或 PLC 通信实现
- */
- class MainWindow final : public QMainWindow
- {
- Q_OBJECT
-
- public:
- /**
- * @brief 创建主窗口并注入 UI 所需的应用服务
- * @param runtime_mode_service 运行模式服务,调用方必须保证其生命周期覆盖窗口
- * @param project_service 工程管理服务,调用方必须保证其生命周期覆盖窗口
- * @param hmi_editor_service HMI 编辑服务,调用方必须保证其生命周期覆盖窗口
- * @param hmi_runtime_service HMI 运行服务,调用方必须保证其生命周期覆盖窗口
- * @param parent Qt 父对象
- */
- explicit MainWindow(
- RuntimeModeService &runtime_mode_service,
- ProjectService &project_service,
- HmiEditorService &hmi_editor_service,
- HmiRuntimeService &hmi_runtime_service,
- QWidget *parent = nullptr);
-
- ~MainWindow() override;
-
- private:
- void configureActions();
- void configureAppearance();
- void configureHmiEditor();
- void configurePropertyEditor();
- void refreshProjectUi();
- void showControlProperties(const std::string &control_id);
- void addHmiControl(HmiControlType type);
- void deleteSelectedControl();
- void applySelectedControlProperties();
- void createNewProject();
- void saveProject();
- void saveProjectAs();
- void loadProject();
- void showProjectResult(const QString &action, const QString &message, bool succeeded);
-
- /**
- * @brief 请求服务层切换模式并同步界面状态
- * @param requested_mode 目标应用模式
- *
- * 失败时恢复与服务层当前状态一致的工具栏选项
- */
- void requestMode(ApplicationMode requested_mode);
-
- /**
- * @brief 根据服务层模式策略更新编辑权限和状态反馈
- * @param message 要显示在状态栏和输出区的模式结果消息
- */
- void updateModeUi(const QString &message);
-
- /**
- * @brief 将互斥模式动作同步到服务层当前状态
- */
- void restoreCurrentModeAction();
-
- std::unique_ptr<Ui::MainWindow> ui_;
- /**
- * @brief 非拥有的运行模式服务依赖,由应用入口保证生命周期
- */
- RuntimeModeService &runtime_mode_service_;
- /**
- * @brief 非拥有的工程和 HMI 服务依赖,由应用入口保证生命周期
- */
- ProjectService &project_service_;
- HmiEditorService &hmi_editor_service_;
- HmiRuntimeService &hmi_runtime_service_;
- QActionGroup *mode_action_group_ = nullptr;
- QAction *new_project_action_ = nullptr;
- QAction *save_project_action_ = nullptr;
- QAction *save_as_project_action_ = nullptr;
- QAction *load_project_action_ = nullptr;
- QAction *add_button_action_ = nullptr;
- QAction *add_indicator_action_ = nullptr;
- QAction *add_numeric_display_action_ = nullptr;
- QAction *add_numeric_input_action_ = nullptr;
- QAction *delete_control_action_ = nullptr;
- QToolBar *hmi_tool_bar_ = nullptr;
- HmiEditorWidget *hmi_editor_widget_ = nullptr;
- QTimer *runtime_refresh_timer_ = nullptr;
- QLabel *mode_status_label_ = nullptr;
- QLabel *register_status_label_ = nullptr;
- QLabel *executor_status_label_ = nullptr;
- QLineEdit *control_id_edit_ = nullptr;
- QLineEdit *control_text_edit_ = nullptr;
- QSpinBox *control_x_spin_box_ = nullptr;
- QSpinBox *control_y_spin_box_ = nullptr;
- QSpinBox *control_width_spin_box_ = nullptr;
- QSpinBox *control_height_spin_box_ = nullptr;
- QComboBox *binding_area_combo_box_ = nullptr;
- QSpinBox *binding_index_spin_box_ = nullptr;
- QPushButton *apply_properties_button_ = nullptr;
- std::string selected_control_id_;
- };
|