#pragma once #include "iDlgBase.h" #include "nmParameterField.h" #include "nmPlotDialogContextProvider.h" #include "nmSubWxs_global.h" class nmDataWellBase; class nmWellEditorController; class nmWellEditorSession; class nmWellParameterPanel; class nmWxWellboreTrajectoryDisplay; class QCheckBox; class QComboBox; class QDialogButtonBox; class QKeyEvent; class QLabel; class QLineEdit; class QSplitter; class QToolButton; /** * @brief 数值试井井参数编辑器。 * @note 所有输入只修改会话副本,确认后由调用者接管最终副本。 */ class NM_SUB_WXS_EXPORT nmWxWellEditor : public iDlgBase, public nmIParameterUnitService { Q_OBJECT public: /** @brief 使用只读上下文创建编辑器,原始井不会被窗口直接修改。 */ explicit nmWxWellEditor(const nmWellEditContext& oContext, QWidget* pParent = nullptr); /** @brief 按引用依赖顺序释放控制器、界面和编辑会话。 */ virtual ~nmWxWellEditor(); /** @brief 初始化工作会话、参数面板和轨迹控制器。 */ bool initialize(QString& sError); /** @brief 转移确认后的井副本所有权。 */ nmDataWellBase* takeModifiedWell(); /** @brief 将通用参数字段接入iDlgBase已有单位绑定器。 */ virtual bool bindUnitField(QLineEdit* pLineEdit, QComboBox* pUnitComboBox, const QString& sBaseParameterId); /** @brief 通过窗口单位绑定器显示基准单位值。 */ virtual void setUnitBaseValue(QLineEdit* pLineEdit, double dBaseValue); /** @brief 通过窗口单位绑定器读取基准单位值。 */ virtual double unitBaseValue(QLineEdit* pLineEdit) const; /** @brief 使用XML参数范围校验当前单位输入。 */ virtual bool isUnitInputValid(QLineEdit* pLineEdit); /** @brief 返回字段当前显示单位。 */ virtual QString currentUnit(QLineEdit* pLineEdit) const; /** @brief 返回字段绑定的单位组,不转移所有权。 */ virtual iUnitGroup* unitGroup(QLineEdit* pLineEdit) const; public slots: /** @brief 校验完整工作副本并关闭窗口。 */ virtual void accept(); /** @brief 丢弃工作会话并关闭窗口。 */ virtual void reject(); protected: /** @brief 屏蔽回车直接提交,避免参数编辑时误关闭窗口。 */ virtual void keyPressEvent(QKeyEvent* pEvent); private slots: /** @brief 保存当前井型输入并切换到独立井型缓存。 */ void slotWellTypeChanged(int nIndex); /** @brief 将井名实时同步到所有井型工作副本。 */ void slotWellNameEdited(const QString& sWellName); /** @brief 同步时间变表皮开关并更新详情入口状态。 */ void slotTimeDependentToggled(bool bChecked); /** @brief 以当前工作副本打开旧时间变表皮编辑窗口。 */ void slotEditTimeDependentSkin(); /** @brief 根据参数面板有效状态刷新确定按钮。 */ void slotPanelValidityChanged(bool bValid); /** @brief 保存参数面板错误并刷新底部状态提示。 */ void slotPanelValidationMessageChanged(const QString& sMessage); private: /** @brief 创建左侧参数区、右侧轨迹区和底部命令区。 */ void createUi(); /** @brief 创建时间变表皮入口、校验提示和确认按钮区。 */ QWidget* createFooter(); /** @brief 从当前工作副本回填时间变表皮控件。 */ void reloadTimeDependentSkinControls(nmDataWellBase* pWell); /** @brief 为当前井型工作副本重新创建轨迹交互控制器。 */ void createController(); /** @brief 连接轨迹视图请求与控制器业务槽。 */ void setupControllerConnections(); /** @brief 规范化并校验井名,返回去除首尾空格后的名称。 */ bool validateWellName(QString& sTrimmedName, QString& sError) const; /** @brief 按Windows文件名规则校验井名。 */ bool isLegalFileName(const QString& sWellName) const; /** @brief 汇总井名和参数校验结果,刷新确定按钮及错误提示。 */ void updateAcceptState(); nmWellEditorSession* m_pSession; ///< 对话框独占编辑会话。 nmWellParameterPanel* m_pParameterPanel; ///< 左侧单列参数分组。 nmWxWellboreTrajectoryDisplay* m_pTrajectoryDisplay; ///< 右侧轨迹视图。 nmWellEditorController* m_pWellEditorController; ///< 轨迹交互控制器。 QLineEdit* m_pWellNameLineEdit; ///< 井名输入框。 QComboBox* m_pWellTypeComboBox; ///< 井型选择器。 QCheckBox* m_pTimeDependentCheckBox; ///< 时间变表皮开关。 QToolButton* m_pTimeDependentButton; ///< 时间变表皮详情入口。 QDialogButtonBox* m_pButtonBox; ///< 确定和取消按钮区。 QLabel* m_pStatusLabel; ///< 当前校验错误。 QSplitter* m_pMainSplitter; ///< 参数与轨迹分割器。 QString m_sPanelValidationMessage; ///< 参数面板错误。 bool m_bInitialized; ///< 编辑器是否初始化完成。 bool m_bChangingWellType; ///< 程序同步井型标记。 };