#ifndef CUSTOMLINEEDIT_H
#define CUSTOMLINEEDIT_H

#include <QLineEdit>
#include <QScopedPointer>
#include <QObject>

#include "settings/OtherSettings/dialog/DialogEditValue.h"

/**
 * @class CustomLineEdit
 * @brief CustomLineEdit 是一个继承自 QLineEdit 的自定义编辑框类，用于在应用程序中提供更高级的输入功能。
 * 
 * CustomLineEdit 类扩展了 QLineEdit 的功能，通过设置不同的表单类型和编辑类型，可以定制化输入框的行为。
 * 它还提供了一个事件处理函数，用于处理自定义的事件。
 * 
 * @note 使用该类时，需要确保在 Qt 应用程序中正确初始化。
 * 
 * @author Your Name
 * @version 1.0
 * 
 * @param parent 指向父 QWidget 的指针，用于设置该 QLineEdit 的父对象。默认为 nullptr。
 * 
 * @example
 * CustomLineEdit *lineEdit = new CustomLineEdit(parentWidget);
 * lineEdit->setFormType(FormType::SomeType);
 * lineEdit->setEditType(EditType::SomeType);
 * 
 * @warning 请注意，该类使用 QScopedPointer 管理内部资源，因此不需要手动释放内存。
 */
class CustomLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数，创建一个新的 CustomLineEdit 对象。
     * 
     * @param parent 指向父 QWidget 的指针，用于设置该 QLineEdit 的父对象。默认为 nullptr。
     */
    explicit CustomLineEdit(QWidget *parent = nullptr);

    /**
     * @brief 析构函数，销毁 CustomLineEdit 对象。
     */
    ~CustomLineEdit();

    /**
     * @brief 设置表单类型。
     * 
     * @param newFormType 新的表单类型，用于定制化输入框的行为。
     */
    void setFormType(int newFormType);

    /**
     * @brief 设置编辑类型。
     * 
     * @param newEditType 新的编辑类型，用于定制化输入框的行为。
     */
    void setEditType(int newEditType);

    enum DisplayBase {
        Base_Decimal = 10,
        Base_Hex = 16,
        Base_Binary = 2
    };

    void setDisplayBase(DisplayBase base);
    DisplayBase displayBase() const;

protected:
    /**
     * @brief 事件处理函数，用于处理自定义的事件。
     * 
     * @param event 指向 QEvent 的指针，表示发生的事件。
     * 
     * @return 如果事件被处理，则返回 true；否则返回 false。
     */
    bool event(QEvent* event) override;

    void updateDisplayText();

private:
    /**
     * @brief 使用 QScopedPointer 管理的 DialogEditValue 对象指针。
     */
    QScopedPointer<DialogEditValue> m_input_dialog;

    /**
     * @brief 当前表单类型。
     */
    int formType;

    /**
     * @brief 当前编辑类型。
     */
    int editType;

    DisplayBase m_displayBase = Base_Decimal;
};

#endif // CUSTOMLINEEDIT_H
