#pragma once #include #include #include #include #include #include #include "core/mailitem.h" class EmailTreeModel : public QAbstractItemModel { Q_OBJECT public: enum Columns { ColSubject = 0, ColSender = 1, ColDate = 2, ColCount = 3 }; enum Roles { MailIdRole = Qt::UserRole + 1, IsGroupRole = Qt::UserRole + 2, GroupNameRole = Qt::UserRole + 3, GroupIndexRole = Qt::UserRole + 4, MailIndexRole = Qt::UserRole + 5, IsThreadRole = Qt::UserRole + 6, ThreadIdRole = Qt::UserRole + 7, IsThreadExpandedRole = Qt::UserRole + 8 }; explicit EmailTreeModel(QObject *parent = nullptr); ~EmailTreeModel() override; // Basic model interface QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; QModelIndex parent(const QModelIndex &child) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; Qt::ItemFlags flags(const QModelIndex &index) const override; // Email data management void setEmails(const QVector &emails); void clear(); // Grouping enum GroupMode { NoGrouping = 0, GroupByDate = 1, GroupByThread = 2, GroupBySender = 3 }; void setGroupMode(GroupMode mode); GroupMode groupMode() const { return m_groupMode; } // Thread expansion void setThreadExpanded(const QString& threadId, bool expanded); bool isThreadExpanded(const QString& threadId) const; private: struct TreeItem { enum Type { Group, Mail, Thread } type; QString groupName; // for Group type QString threadId; // for Thread type int groupIndex = -1; // for Group type int mailIndex = -1; // for Mail type (index in m_emails) QVector children; TreeItem* parent = nullptr; int row = -1; bool expanded = true; // for Thread type TreeItem(Type t, TreeItem* p = nullptr) : type(t), parent(p) {} ~TreeItem() { qDeleteAll(children); } }; GroupMode m_groupMode = NoGrouping; QVector m_emails; TreeItem* m_rootItem = nullptr; QSet m_expandedThreads; void setupModelData(); void buildGroups(); void buildThreads(); void buildSenderGroups(); QString groupNameForDate(const QDateTime &date) const; int groupIndexForDate(const QDateTime &date) const; void deleteTree(TreeItem* item); void buildThreadTree(); QString extractThreadId(const MailItem& mail) const; };