#ifndef TREEVIEWMANAGER_H

#define TREEVIEWMANAGER_H



#include <QWidget>

#include <QTreeView>

#include <QJsonObject>

#include <QStandardItemModel>

#include <QMap>

#include <QCheckBox>

#include <QJsonDocument>

#include <QJsonArray>

#include <QFile>

#include <QVBoxLayout>

#include <QLabel>

#include <QLineEdit>

#include <QComboBox>

#include <QRadioButton>

#include <QButtonGroup>

#include <QDebug>

#include <QPushButton>

#include <QStyleFactory>

#include <QTimer>

#include <QPainter>

#include <QEvent>

#include <QStringList>

#include <QSettings>

#include <QSet>

#include <QVariant>

#include <QMenu>

#include <QAction>

#include <QMessageBox>

#include <QTimeEdit>

#include <QHBoxLayout>

#include <QCursor>

#include <QScrollArea>

#include <QToolButton>

#include <QFileInfo>





class OriginalWnd; // ǰ������





class TreeViewManager : public QWidget

{

    Q_OBJECT



public:

    /**

     * @brief ���캯��

     * @param parent ������

     * @param downView ����Ŀ¼������ͼ

     * @param widget2 �����������ȷ��������λ��

     */

    explicit TreeViewManager(OriginalWnd* originalWnd, QWidget *widget2, QWidget *parent = nullptr);

    virtual ~TreeViewManager();



    void applyCustomStyles();  //Ŀ¼����ʽ



    void clearThirdLevelMenu();    //��������������Ŀ¼�˵�����



    void switchConfig(const QString &configKey);    //�л������ļ�



    void loadJsonFromFile(const QString &filePath);  //���� JSON ����



    void updateNavigationBar(const QModelIndex &index);  //���µ��������ݣ����ݵ����Ŀ¼�̬��ʾ



    void preloadAllConfigs(const QStringList &configPaths);   // ���ض�������ļ����ڴ�



    QModelIndex findLastVisibleChild(const QModelIndex &parentIndex);  // �ָ��� �ҵ����һ���ɼ�����



    void loadButtonConfigForThirdLevel(const QJsonObject &thirdLevelObj); //���ز���ʾ����Ŀ¼�İ�ť������Ϣ



    void drawSiblingLine(const QModelIndex &childIndex, QPainter &painter);  //������



    void paintAllBranches(const QModelIndex &parentIndex, QPainter &painter);   //����ֱ��



    void drawParentChildLine(const QModelIndex &childIndex, QPainter &painter);  //L�͹ս��ߣ����������߶εij���



    void loadJsonDoc(const QJsonDocument &doc, const QString &configFilePath); // ֱ�Ӵ��� QJsonDocument ���м���



private:

    QWidget *widget2;        // �����������ȷ��������λ��



    QTreeView *treeViewDown;    // ����Ŀ¼��



    OriginalWnd *m_originalWnd;   // ����ָ�� OriginalWnd ��ָ��



    QWidget *navigationWidget;    // ��̬����������



    QPushButton *buttonOpenFile;     // ����һ���˵�

    QPushButton *buttonUp;       // ������������

    QPushButton *buttonDown;     // ������������

    QPushButton *buttonLeft;     // ������һ��Ŀ¼

    QPushButton *buttonRight;     // ������һ��Ŀ¼



    QList<QWidget*> m_fieldWidgets; // �洢�����˵��еĿɵ����ؼ�

    int m_currentFieldIndex = -1;   // ��ǰ����ؼ�������



    QStandardItemModel *downModel;   // ��״�ṹģ��



    QVBoxLayout *navigationLayout;   // ����������



    bool m_blockItemChanged;   // ��ֹ�ݹ鴥���ź�



    void updateChildItems(QStandardItem *parentItem, Qt::CheckState state);    // ������������ĸ�ѡ��״̬



    void updateParentItems(QStandardItem *parentItem);   // �������и���ĸ�ѡ��״̬



    QSet<QString> checkedPaths;     // ��¼��ѡ�еĸ�ѡ��·��



    QString currentConfigFilePath;  // ��ǰ�����ļ�·��



    QMap<QString, QJsonDocument> m_configCache;     // ���ڻ������������ļ� JSON



    void clearAllSeparators();          // ���ز�ɾ�����зָ���



    QString currentConfigKey(const QString &configFilePath);        // ʹ���ļ�����ΪΨһ��ʶ��



    QStandardItem* findFirstThirdLevelItemDFS(QStandardItem *parentItem);   // ���ҷ�����Ŀ¼���������ӷָ���



    void setCheckedPaths(const QStringList &checkedPaths);    // ����·�����ø�ѡ��״̬



    QStringList collectCheckedPaths();    // �ռ����б�ѡ�еĸ�ѡ��·��



    void saveCheckedPaths();   //���渴ѡ��״̬



    void loadCheckedPaths();   //���ظ�ѡ��״̬



    QJsonDocument m_jsonDoc;     // �洢�Ѽ��ص� JSON �ĵ�



    QSet<QString> visitedPaths;     // ���ڴ洢ѡ��·��



    QSet<QString> expandedPaths;     // ���ڴ洢ѡ��չ��·��



    bool restoring;     // ��ʶ��ǰ�Ƿ��ڡ��ָ���״̬



    QFrame* createUnifiedSeparator(QWidget *parent, int height = 1);    //����������ʽ



    void updateSeparatorLine();    // Ŀ¼���ĺ���



    QMap<QStandardItem*, QFrame*> firstLevelSeparators;   // ������¼��һ��Ŀ¼



    void saveVisitedPaths();    //���浱ǰѡ����չ��·���� QSettings



    void loadVisitedPaths();     //�� QSettings �м�����һ�ε�ѡ����չ��·��



    void addVisitedPath(const QStringList &path);    //��ij��ѡ��·�����ӵ� visitedPaths



    void removeVisitedPath(const QStringList &path);   //��ij��ѡ��·���� visitedPaths ���Ƴ�



    void addExpandedPath(const QStringList &path);    //��ij��չ��·�����ӵ� expandedPaths



    void removeExpandedPath(const QStringList &path);    //��ij��չ��·���� expandedPaths ���Ƴ�



    QStringList buildItemPath(QStandardItem *item);    //�������� QStandardItem ��·������ "һ��/����/����"



    QModelIndex findItemByPath(const QStringList &path);     //����·�����Ҷ�Ӧ�� QModelIndex



    //QModelIndex getNextIndex(const QModelIndex &currentIndex);   //��ȡ��ǰ��������һ����Ч����



    //QModelIndex getLastChildIndex(const QModelIndex &parentIndex); //��ȡ���һ���ӽڵ������



    void setupButton();  // ��������ʼ����ť



    void buildTree(const QJsonObject &jsonObj, QStandardItem *parent); //����Ŀ¼��



    void displayThirdLevelFields(const QJsonObject &fields); //��ʾ����Ŀ¼���ֶ�����



    //���ݷֶ�·���������²�ƥ��

    QModelIndex findItemByPathRecursive(QStandardItem *parentItem,const QStringList &path,int depth);



    //�����ڵ������������������չ��·��

    void storeExpandedItems(QStandardItem *parentItem,const QStringList &currentPath,QStringList &expandedPaths);



    // �ռ����б�ѡ�еĸ�ѡ��·��

    QStringList collectCheckedPathsRecursive(QStandardItem *item = nullptr, QStringList path = QStringList());





protected:



    bool eventFilter(QObject *watched, QEvent *event) override;   //����  Paint �¼�



private slots:



    void onItemChanged(QStandardItem *item);   //������ѡ��״̬�ı仯



    void onButtonOpenFileClicked();    // �ۺ���������һ���˵�



    void onButtonUpClicked();    // �ۺ�����������������



    void onButtonDownClicked();     // �ۺ�����������������



    void onButtonLeftClicked();      // �ۺ�����������һ��Ŀ¼



    void onButtonRightClicked();     // �ۺ�����������һ��Ŀ¼



};



#endif // TREEVIEWMANAGER_H