#ifndef NMWXGEOMETRYLAYERDLG_H #define NMWXGEOMETRYLAYERDLG_H #include "iDlgBase.h" #include "nmSubWxs_global.h" #include "nmLayerGeometry.h" #include #include class QLineEdit; class QComboBox; class QTableWidget; class QTableWidgetItem; class QPushButton; class QEvent; class iUnitGroup; class nmLayerGeometryDataSource; class nmLayerCellDelegate; class nmWxLayerGeometryPreview; // 分层几何编辑窗口:只管理工作副本、框架单位换算和表格交互。 // 数据源由入口持有,必须比窗口活得更久;取消直接丢弃副本,确定才尝试一次性提交。 class NM_SUB_WXS_EXPORT nmWxGeometryLayerDlg : public iDlgBase { Q_OBJECT public: // 构造仅创建界面和取得单位服务;调用方须先 initialize() 成功,再 exec()。 explicit nmWxGeometryLayerDlg(nmLayerGeometryDataSource* source, QWidget* parent = 0); // 在 exec 前读取已保存层;失败不展示不完整的数据。 bool initialize(); public slots: // 收齐活动编辑器内容后校验副本,仅数据源提交成功才关闭窗口;回车同样走此入口。 virtual void accept(); protected: // 双击右侧色带时定位对应层并进入选色;空白和间隙不触发其他层的颜色修改。 virtual bool eventFilter(QObject* pWatched, QEvent* pEvent); private slots: // 接收层名/厚度编辑;非法厚度保留为待修正文本,不替换副本中的合法值。 void onItemChanged(QTableWidgetItem* item); // 先按旧单位解析未完成的输入,再切换整张表的显示单位;失败恢复原选项。 void onUnitChanged(int index); // 输入过程中只更新可用状态和派生显示,避免把尚未输完的顶深写入副本。 void onTopEdited(); // 结束编辑时尝试应用首层顶深,合法后重新计算边界和预览。 void onTopFinished(); // 当前层变化只更新按钮和预览高亮,不改变层的物理顺序。 void onSelectionChanged(); // 添加在末尾追加;插入在当前行之前创建新层,均复用 insertAt()。 void onAdd(); void onInsert(); // 删除当前层;允许删除该行的非法输入,但不得丢弃其他行的待修正内容。 void onDelete(); // 显式放弃当前层编辑,从所属分析重建连续层;仍需确定后才保存到工程。 void onReset(); private: // 统一布局、主题和信号连接,几何运算与持久化通过各自接口完成。 void initUI(); // 全量刷新会清空非法文本;调用前须完成有效编辑,或已经明确执行重置/删除。 void refreshTable(int selectedRow); // 只更新顶底深度、统计及预览,保留用户正在修正的层名/厚度文本。 void refreshDerived(); // 集中设置操作可用性;输入合法性与数据源拒绝提交的状态分别处理。 void updateActions(); // 先按原显示单位提交活动编辑器,再执行单位切换/结构修改/保存。 bool finishEditing(); // 首层文本确实改变且几何计算成功时才更新副本,不回写未编辑的舍入显示值。 bool applyTop(); // 在临时副本上预判顶深输入是否有效,不改变当前工作副本。 bool topIsValid() const; // 按 m_sDisplayUnit 解析文本并交给框架换算为米;返回 true 后输出值才可使用。 bool toMeters(const QString& text, double& value) const; // 预检所有深度、厚度和总厚度,避免切换单位后出现溢出或正厚度下溢为零。 bool canDisplayUnit(const QString& unit) const; // 普通显示采用框架精度;编辑起始文本采用 17 位有效数字,避免截断原值。 QString displayValue(double meters, bool fullPrecision = false) const; // 查找当前名称列表中未占用的 LayerN,不重新编号已经存在的层。 QString nextLayerName() const; // 结构编辑共用入口:收齐输入、选择参考厚度、插入副本、恢复表格当前行。 void insertAt(int row); // 色带双击触发的选色入口;调用前须完成编辑校验,取消选色不修改副本。 void chooseLayerColor(int nRow); nmLayerGeometryDataSource* m_pDataSource; // 非拥有型接口,不能在窗口中删除。 nmLayerGeometry m_oGeometry; // 底层米制副本,绝不从格式化文本重建未修改的值。 QPointer m_pLengthUnitGroup; // 单位服务由底层框架管理。 QString m_sDisplayUnit; // 已生效的显示单位;切换成功前保留旧值解析输入。 QString m_sFirstTopDisplayText; // 上次已应用的顶深文本;作为未编辑判据,防止舍入显示值反写。 QSet m_setInvalidThicknessRows; // 厚度输入无效的零起始行号;原文本留在表格中,集合非空时禁止保存。 bool m_bRefreshing; // 程序刷新期间忽略编辑/选择回调,避免递归写回。 bool m_bInitialized; // 成功载入副本后才允许用户操作。 bool m_bCommitBlocked; // 上次提交被数据源拒绝,重新编辑/重置后才允许重试。 // 以下控件均由 Qt 父子关系释放;委托由表格持有,无需手动 delete。 QLineEdit* m_pFirstTopEdit; // 首层顶深输入框,文本按 m_sDisplayUnit 解释,副本始终存米。 QComboBox* m_pLengthUnitComboBox; // 框架提供的统一长度单位列表。 QTableWidget* m_pLayerTable; // 层名称、厚度、只读顶深和只读底深。 nmLayerCellDelegate* m_pLayerDelegate; // 保留编辑精度,并支持主动结束活动单元格编辑。 nmWxLayerGeometryPreview* m_pLayerPreview; // 只接收快照的剖面显示控件。 QLineEdit* m_pLayerCountEdit; // 只读层数,可选中复制。 QLineEdit* m_pTotalThicknessEdit; // 只读累计层厚度,不含历史间隙;按统一显示单位换算,框内仅显示数值。 // 层结构操作、显式重置以及最终提交入口;颜色通过右侧色带双击修改,取消由标准按钮框处理。 QPushButton* m_pAddButton; // 在列表末尾追加一层,初始厚度取当前参考层。 QPushButton* m_pInsertButton; // 在当前行之前插入一层,需要存在当前层。 QPushButton* m_pDeleteButton; // 删除当前层;仅剩一层时禁用,避免产生空几何。 QPushButton* m_pResetButton; // 用所属分析的完整层列表重置副本,确定前不写入工程。 QPushButton* m_pOkButton; // 提交入口;输入无效或上次提交被拒绝时禁用。 }; #endif // NMWXGEOMETRYLAYERDLG_H