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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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