You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmSubWxs/nmWxGeometryLayerDlg.h

114 lines
6.7 KiB
C

#ifndef NMWXGEOMETRYLAYERDLG_H
#define NMWXGEOMETRYLAYERDLG_H
#include "iDlgBase.h"
#include "nmSubWxs_global.h"
#include "nmLayerGeometry.h"
#include <QPointer>
#include <QSet>
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<iUnitGroup> m_pLengthUnitGroup; // 单位服务由底层框架管理。
QString m_sDisplayUnit; // 已生效的显示单位;切换成功前保留旧值解析输入。
QString m_sFirstTopDisplayText; // 上次已应用的顶深文本;作为未编辑判据,防止舍入显示值反写。
QSet<int> 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