Complete Phase 4: Basic UI with QML - MailListPage with folder/email navigation, models connected to DAOs, placeholder pages for Calendar/Contacts/Settings
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
#include "EmailListModel.h"
|
||||
#include <QDebug>
|
||||
#include <QDateTime>
|
||||
|
||||
EmailListModel::EmailListModel(QObject *parent)
|
||||
: QAbstractListModel(parent),
|
||||
m_mailItemDao(MailItemDao::instance())
|
||||
{
|
||||
refresh();
|
||||
}
|
||||
|
||||
int EmailListModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
if (parent.isValid())
|
||||
return 0;
|
||||
return m_emails.size();
|
||||
}
|
||||
|
||||
QVariant EmailListModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid() || index.row() >= m_emails.size())
|
||||
return QVariant();
|
||||
|
||||
const MailItem& item = m_emails.at(index.row());
|
||||
|
||||
switch (role) {
|
||||
case IdRole:
|
||||
return item.id();
|
||||
case SubjectRole:
|
||||
return item.subject();
|
||||
case SenderRole:
|
||||
return item.sender();
|
||||
case RecipientRole:
|
||||
return item.recipient();
|
||||
case DateRole:
|
||||
return item.date();
|
||||
case ReadRole:
|
||||
return item.isRead();
|
||||
case FlaggedRole:
|
||||
return item.isFlagged();
|
||||
case AttachmentsRole:
|
||||
return QVariant::fromValue(item.attachments());
|
||||
case FileIdRole:
|
||||
return item.fileId();
|
||||
case SizeRole:
|
||||
return item.size();
|
||||
case MessageIdRole:
|
||||
return item.messageId();
|
||||
case SenderInitialRole: {
|
||||
QString sender = item.sender();
|
||||
if (sender.isEmpty())
|
||||
return QString();
|
||||
// Get first character, or first non-space character?
|
||||
// Simple: first character of the sender string
|
||||
return QString(sender.at(0)).toUpper();
|
||||
}
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> EmailListModel::roleNames() const
|
||||
{
|
||||
QHash<int, QByteArray> roles;
|
||||
roles[IdRole] = "id";
|
||||
roles[SubjectRole] = "subject";
|
||||
roles[SenderRole] = "sender";
|
||||
roles[RecipientRole] = "recipient";
|
||||
roles[DateRole] = "date";
|
||||
roles[ReadRole] = "read";
|
||||
roles[FlaggedRole] = "flagged";
|
||||
roles[AttachmentsRole] = "attachments";
|
||||
roles[FileIdRole] = "fileId";
|
||||
roles[SizeRole] = "size";
|
||||
roles[MessageIdRole] = "messageId";
|
||||
roles[SenderInitialRole] = "senderInitial";
|
||||
return roles;
|
||||
}
|
||||
|
||||
void EmailListModel::setFolderId(int folderId)
|
||||
{
|
||||
if (m_folderId == folderId)
|
||||
return;
|
||||
m_folderId = folderId;
|
||||
refresh();
|
||||
}
|
||||
|
||||
void EmailListModel::refresh()
|
||||
{
|
||||
beginResetModel();
|
||||
if (m_folderId == -1) {
|
||||
m_emails = m_mailItemDao.findAll();
|
||||
} else {
|
||||
m_emails = m_mailItemDao.findByFolderId(m_folderId);
|
||||
}
|
||||
endResetModel();
|
||||
qDebug() << "EmailListModel refreshed with" << m_emails.size() << "emails for folderId" << m_folderId;
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
#ifndef EMAILLISTMODEL_H
|
||||
#define EMAILLISTMODEL_H
|
||||
|
||||
#include <QAbstractListModel>
|
||||
#include <QHash>
|
||||
#include <QByteArray>
|
||||
#include "../db/dao/mailitemdao.h"
|
||||
|
||||
class EmailListModel : public QAbstractListModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit EmailListModel(QObject *parent = nullptr);
|
||||
~EmailListModel() override = default;
|
||||
|
||||
enum EmailRoles {
|
||||
IdRole = Qt::UserRole + 1,
|
||||
SubjectRole,
|
||||
SenderRole,
|
||||
RecipientRole,
|
||||
DateRole,
|
||||
ReadRole,
|
||||
FlaggedRole,
|
||||
AttachmentsRole,
|
||||
FileIdRole,
|
||||
SizeRole,
|
||||
MessageIdRole,
|
||||
SenderInitialRole // computed from sender
|
||||
};
|
||||
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
QHash<int, QByteArray> roleNames() const override;
|
||||
|
||||
// Set the folderId to filter emails; -1 means all folders
|
||||
void setFolderId(int folderId);
|
||||
// Refresh the model from the database based on current folderId
|
||||
void refresh();
|
||||
|
||||
private:
|
||||
QVector<MailItem> m_emails;
|
||||
int m_folderId{-1}; // -1 means all folders
|
||||
MailItemDao& m_mailItemDao;
|
||||
};
|
||||
|
||||
#endif // EMAILLISTMODEL_H
|
||||
Reference in New Issue
Block a user