#include "FolderListModel.h" #include // --- FolderTreeItem --- FolderTreeItem::FolderTreeItem(Type type, QVariant data, FolderTreeItem *parent) : m_type(type), m_data(std::move(data)), m_parentItem(parent) { } FolderTreeItem::~FolderTreeItem() { qDeleteAll(m_childItems); } void FolderTreeItem::appendChild(FolderTreeItem *child) { m_childItems.append(child); } void FolderTreeItem::clearChildren() { qDeleteAll(m_childItems); m_childItems.clear(); } FolderTreeItem *FolderTreeItem::child(int row) { if (row < 0 || row >= m_childItems.size()) return nullptr; return m_childItems.at(row); } int FolderTreeItem::childCount() const { return m_childItems.size(); } int FolderTreeItem::row() const { if (m_parentItem) return m_parentItem->m_childItems.indexOf(const_cast(this)); return 0; } FolderTreeItem *FolderTreeItem::parentItem() { return m_parentItem; } // --- FolderListModel --- FolderListModel::FolderListModel(AccountService *accountService, QObject *parent) : QAbstractItemModel(parent), m_accountService(accountService), m_rootItem(new FolderTreeItem(FolderTreeItem::AccountNode, "Root")) { refresh(); } FolderListModel::~FolderListModel() { delete m_rootItem; } QModelIndex FolderListModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); FolderTreeItem *parentItem; if (!parent.isValid()) parentItem = m_rootItem; else parentItem = static_cast(parent.internalPointer()); FolderTreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); return QModelIndex(); } QModelIndex FolderListModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); FolderTreeItem *childItem = static_cast(index.internalPointer()); FolderTreeItem *parentItem = childItem->parentItem(); if (!parentItem || parentItem == m_rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } int FolderListModel::rowCount(const QModelIndex &parent) const { if (parent.column() > 0) return 0; FolderTreeItem *parentItem; if (!parent.isValid()) parentItem = m_rootItem; else parentItem = static_cast(parent.internalPointer()); return parentItem->childCount(); } int FolderListModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return 1; } QVariant FolderListModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); FolderTreeItem *item = static_cast(index.internalPointer()); if (role == Qt::DisplayRole || role == NameRole) { if (item->type() == FolderTreeItem::AccountNode) { Account acc = item->data().value(); return acc.displayName().isEmpty() ? acc.email() : acc.displayName(); } else { Folder folder = item->data().value(); return folder.name(); } } if (role == ItemTypeRole) return item->type(); if (role == AccountIdRole) { if (item->type() == FolderTreeItem::AccountNode) { Account acc = item->data().value(); return acc.id(); } } if (role == FolderIdRole) { if (item->type() == FolderTreeItem::FolderNode) { Folder folder = item->data().value(); return folder.id(); } } if (role == UnreadCountRole) { if (item->type() == FolderTreeItem::FolderNode) { Folder folder = item->data().value(); return folder.unreadCount(); } } return QVariant(); } Qt::ItemFlags FolderListModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::NoItemFlags; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } QHash FolderListModel::roleNames() const { QHash roles; roles[ItemTypeRole] = "itemType"; roles[AccountIdRole] = "accountId"; roles[FolderIdRole] = "folderId"; roles[NameRole] = "name"; roles[UnreadCountRole] = "unreadCount"; return roles; } void FolderListModel::refresh() { beginResetModel(); clearModel(); setupModelData(); endResetModel(); qDebug() << "FolderListModel refreshed"; } void FolderListModel::setupModelData() { QVector accounts = m_accountService->getAllAccounts(); // If no accounts exist yet, add one sample account with default folders if (accounts.isEmpty()) { Account sample(1, "javi@example.com", "Javi's Email", AccountType::IMAP); accounts.append(sample); } for (const Account &acc : accounts) { QVariant accVariant; accVariant.setValue(acc); FolderTreeItem *accountItem = new FolderTreeItem(FolderTreeItem::AccountNode, accVariant, m_rootItem); m_rootItem->appendChild(accountItem); // Get folders for this account QVector folders = FolderDao::findByAccountId(acc.id()); // If no folders exist yet, create default ones if (folders.isEmpty()) { QStringList defaultFolders = {"Inbox", "Sent", "Drafts", "Trash", "Spam"}; for (const QString &name : defaultFolders) { Folder f; f.setName(name); f.setAccountId(acc.id()); folders.append(f); } } for (const Folder &folder : folders) { QVariant folderVariant; folderVariant.setValue(folder); FolderTreeItem *folderItem = new FolderTreeItem(FolderTreeItem::FolderNode, folderVariant, accountItem); accountItem->appendChild(folderItem); } } } void FolderListModel::clearModel() { m_rootItem->clearChildren(); } #include "FolderListModel.moc"