#ifndef NMWXVOLUMESLICESETTINGSDLG_H #define NMWXVOLUMESLICESETTINGSDLG_H #include "iDlgBase.h" #include "nmSubWxs_global.h" #include "nmVolumeData.h" #include "nmVolumeSliceSettings.h" class QCheckBox; class QHideEvent; class QLabel; class QLineEdit; class QPushButton; /** @brief 复用通用参数对话框基类的非模态切片窗口;草稿与已应用参数分离。 */ class NM_SUB_WXS_EXPORT nmWxVolumeSliceSettingsDlg : public iDlgBase { Q_OBJECT public: /** @brief 创建原点、法向及显示选项控件,不自动显示窗口;着色属性由底栏控制。 */ explicit nmWxVolumeSliceSettingsDlg(QWidget* pParent = nullptr); /** @brief 更换当前模型及已应用参数,清除前一模型的草稿和错误。 */ void setData(const QSharedPointer& pData, const nmVolumeSliceSettings& oApplied); /** @brief 提交成功后同步归一化参数,同时更新重置目标。 */ void setAppliedSettings(const nmVolumeSliceSettings& oSettings); /** @brief 同步底栏已应用的着色属性,保留原点和法向的未应用草稿。 */ void setAppliedProperty(const QString& sPropertyId); /** @brief 从当前输入读取并校验草稿,失败不改变输出。 */ bool getDraft(nmVolumeSliceSettings& oSettings, QString* pError = nullptr) const; /** @brief 从拖动事件更新原点和法向,不改变底栏已应用的属性,不回发预览信号。 */ void setPlanePreview(const nmVolumeSliceSettings& oSettings); /** @brief 在窗口内显示计算或绑定错误,不弹出阻塞对话框。 */ void setError(const QString& sError); signals: /** @brief 请求应用当前有效草稿,由所属结果窗口负责事务提交。 */ void applyRequested(); /** @brief 有效草稿变化,仅用于同步辅助平面,不能触发截面计算。 */ void previewChanged(); /** @brief 显示选项立即生效,与原点、法向草稿的应用周期分离。 */ void displayOptionsChanged(bool bShowPlane, bool bShowSource); /** @brief 窗口隐藏后通知宿主关闭交互手柄;截面继续显示。 */ void dialogHidden(); protected: /** @brief 任何隐藏路径均丢弃未应用草稿,避免重开后显示过期参数。 */ virtual void hideEvent(QHideEvent* pEvent); private slots: /** @brief 校验当前输入并更新应用按钮;有效输入更新平面预览。 */ void onDraftChanged(); /** @brief 将平面法向设置为 XY/XZ/YZ 对应轴,保持原点。 */ void onAxisRequested(); /** @brief 将草稿原点移到模型中心,保持法向与属性。 */ void onCenterRequested(); /** @brief 恢复最后已应用参数并同步辅助平面。 */ void onResetRequested(); /** @brief 校验有效后请求宿主提交当前草稿。 */ void onApplyRequested(); /** @brief 更新已应用状态中的显示偏好,不提交原点和法向草稿。 */ void onDisplayOptionsChanged(); private: /** @brief 按现有参数窗口样式创建分组、对齐的编辑控件及固定顺序的底部按钮。 */ void createUi(); /** @brief 阻止信号递归地把值对象写入所有控件,然后更新校验提示。 */ void writeSettings(const nmVolumeSliceSettings& oSettings); /** @brief 保存单个字段的完整精度并回填简洁文字,清除该字段修改标记。 */ void writePlaneValue(int nField, double dValue); /** @brief 未编辑字段返回原值;已编辑字段按完整输入精度读取。 */ bool readPlaneValue(int nField, double& dValue) const; /** @brief 更新按钮及校验消息,不发送预览或应用信号。 */ void updateValidation(); QSharedPointer m_pData; ///< 当前只读模型,用于有效性检查及中心位置。 nmVolumeSliceSettings m_oApplied; ///< 最后成功提交的参数,含立即生效的显示偏好。 double m_dPlaneValues[6]; ///< 原点、法向各三项最近一次程序回填的完整精度值。 QString m_sPlaneDisplayTexts[6]; ///< 对应回填文字,配合输入框修改标记判断是否需要解析。 QLineEdit* m_pOriginEdits[3]; ///< 原点 X/Y/Z 文本输入,支持科学计数法。 QLineEdit* m_pNormalEdits[3]; ///< 法向 X/Y/Z 文本输入,应用时归一化。 QCheckBox* m_pShowPlaneCheck; ///< 参数窗口打开时显示辅助平面的开关。 QCheckBox* m_pShowSourceCheck; ///< 灰色半透明原模型的即时显示开关。 QLabel* m_pErrorLabel; ///< 非模态输入或计算错误提示。 QPushButton* m_pApplyButton; ///< 草稿合法且模型存在时才启用。 bool m_bUpdating; ///< 程序同步控件时屏蔽业务信号,防止反馈循环。 }; #endif // NMWXVOLUMESLICESETTINGSDLG_H