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/nmParameterField.h

193 lines
7.0 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.

#pragma once
#include "nmSubWxs_global.h"
#include <QColor>
#include <QList>
#include <QObject>
#include <QString>
#include <QVariant>
class iParameter;
class iUnitGroup;
class QComboBox;
class QGridLayout;
class QLabel;
class QLineEdit;
/** @brief 通用参数字段的编辑器类型。 */
enum nmParameterEditorType
{
NM_PARAMETER_EDITOR_NUMBER = 0, ///< 浮点数输入框。
NM_PARAMETER_EDITOR_INTEGER, ///< 整数输入框。
NM_PARAMETER_EDITOR_ENUM, ///< 稳定code枚举下拉框。
NM_PARAMETER_EDITOR_TEXT ///< 文本输入框。
};
/** @brief 通用枚举下拉框选项。 */
struct NM_SUB_WXS_EXPORT nmParameterEnumOption
{
QString m_sCode; ///< 不随语言变化的业务代码。
QString m_sText; ///< 当前语言下的显示文本。
};
/**
* @brief 通用参数字段描述。
* @note 稳定参数ID用于业务读写基础参数ID用于读取XML单位、精度和范围。
*/
struct NM_SUB_WXS_EXPORT nmParameterFieldInfo
{
/** @brief 创建默认启用单位的数值字段描述。 */
nmParameterFieldInfo();
QString m_sParameterId; ///< 业务层稳定参数ID。
QString m_sBaseParameterId; ///< 参数XML中的基础参数ID。
QString m_sLabel; ///< 文本或枚举字段的显示名称。
nmParameterEditorType m_eEditorType; ///< 字段编辑器类型。
bool m_bUnitEnabled; ///< 是否创建单位下拉框。
QList<nmParameterEnumOption> m_listOptions; ///< 枚举字段的稳定选项。
};
/**
* @brief 参数字段所需的最小单位服务接口。
* @note 窗口负责适配iDlgBase字段不依赖具体业务窗口或全局对象。
*/
class NM_SUB_WXS_EXPORT nmIParameterUnitService
{
public:
/** @brief 析构单位服务接口。 */
virtual ~nmIParameterUnitService() {}
/** @brief 按NM参数定义绑定数值编辑器和单位下拉框。 */
virtual bool bindUnitField(QLineEdit* pLineEdit,
QComboBox* pUnitComboBox,
const QString& sBaseParameterId) = 0;
/** @brief 将基准单位数值写入字段。 */
virtual void setUnitBaseValue(QLineEdit* pLineEdit,
double dBaseValue) = 0;
/** @brief 读取字段的基准单位数值。 */
virtual double unitBaseValue(QLineEdit* pLineEdit) const = 0;
/** @brief 校验单位字段输入。 */
virtual bool isUnitInputValid(QLineEdit* pLineEdit) = 0;
/** @brief 返回字段当前显示单位。 */
virtual QString currentUnit(QLineEdit* pLineEdit) const = 0;
/** @brief 返回字段单位组,不转移所有权。 */
virtual iUnitGroup* unitGroup(QLineEdit* pLineEdit) const = 0;
};
/**
* @brief 不依赖具体业务数据源的参数行。
* @note 字段只负责控件、单位和输入校验,业务值由所属面板统一读写。
*/
class NM_SUB_WXS_EXPORT nmParameterField : public QObject
{
public:
/** @brief 创建字段控件描述控件在initialize()时按需生成。 */
nmParameterField(const nmParameterFieldInfo& oFieldInfo,
nmIParameterUnitService* pUnitService,
QObject* pParent = nullptr);
/** @brief 释放字段对象实际控件由所属Qt父控件管理。 */
virtual ~nmParameterField();
/** @brief 将字段控件加入指定分组网格。 */
bool initialize(QGridLayout* pLayout,
int nRow,
int nColumnOffset,
QString& sError);
/** @brief 返回业务层稳定参数ID。 */
QString parameterId() const;
/** @brief 返回XML参数定义使用的基础参数ID。 */
QString baseParameterId() const;
/** @brief 返回字段是否为枚举。 */
bool isEnum() const;
/** @brief 返回字段是否为文本。 */
bool isText() const;
/** @brief 设置输入文字是否右对齐。 */
void setValueRightAligned(bool bRightAligned);
/** @brief 返回数值编辑列的统一最小宽度。 */
static int editorMinimumWidth();
/** @brief 返回单位列的统一最小宽度。 */
static int unitMinimumWidth();
/** @brief 返回输入框和下拉框的统一紧凑高度。 */
static int editorHeight();
/** @brief 设置基准单位值或文本值并刷新显示。 */
void setBaseValue(const QVariant& oValue);
/** @brief 获取基准单位值或文本值。 */
QVariant baseValue(bool& bValid);
/** @brief 设置枚举稳定code。 */
void setEnumCode(const QString& sCode);
/** @brief 返回枚举稳定code。 */
QString enumCode() const;
/** @brief 设置业务关联校验错误,空文字表示清除。 */
void setExternalValidationError(const QString& sError);
/** @brief 校验当前输入并刷新提示。 */
bool validate();
/** @brief 同时显示或隐藏字段的全部控件。 */
void setFieldVisible(bool bVisible);
/** @brief 返回字段是否参与编辑和校验。 */
bool isFieldVisible() const;
/** @brief 返回文本或数值输入框。 */
QLineEdit* valueEditor() const;
/** @brief 返回枚举下拉框。 */
QComboBox* enumEditor() const;
private:
/** @brief 创建数值输入框并按XML参数定义绑定单位和范围。 */
bool createNumericEditor(QGridLayout* pLayout,
int nRow,
int nColumnOffset,
QString& sError);
/** @brief 创建不参与单位换算的文本输入框。 */
void createTextEditor(QGridLayout* pLayout,
int nRow,
int nColumnOffset);
/** @brief 创建使用稳定业务code保存值的枚举下拉框。 */
void createEnumEditor(QGridLayout* pLayout,
int nRow,
int nColumnOffset);
/** @brief 按XML精度规则格式化无单位绑定的基准数值。 */
QString formatBaseValue(double dValue) const;
/** @brief 根据校验状态统一刷新文字颜色和参数提示。 */
void updateValidationAppearance(bool bValid);
nmParameterFieldInfo m_oFieldInfo; ///< 稳定字段描述。
nmIParameterUnitService* m_pUnitService; ///< 注入的单位服务,不拥有所有权。
iParameter* m_pParameter; ///< 共享XML参数定义不拥有所有权。
QLabel* m_pLabel; ///< 参数名称标签。
QLineEdit* m_pLineEdit; ///< 文本或数值输入框。
QComboBox* m_pValueComboBox; ///< 枚举值下拉框。
QComboBox* m_pUnitComboBox; ///< 单位下拉框。
QLabel* m_pUnitLabel; ///< 无单位字段的空白对齐占位。
QColor m_clrNormalText; ///< 输入框默认文字颜色。
QString m_sExternalValidationError; ///< 业务关联校验错误。
bool m_bVisible; ///< 字段是否参与编辑。
};