fix: EmailListModel as QAbstractTableModel for proper MailListView display
- Changed EmailListModel from QAbstractListModel to QAbstractTableModel - Added columnCount() returning 3 columns (Subject, Sender, Date) - Added headerData() for column headers (Asunto, De, Fecha) - Modified data() to handle Qt::DisplayRole per column index - Updated MailListView::setModel() to use column indices instead of role-based column hiding - Added proper column resize modes (Stretch for Subject/Sender, ResizeToContents for Date) - Default sort by Date column descending
This commit is contained in:
+9
-25
@@ -72,33 +72,17 @@ void MailListView::setupUI() {
|
|||||||
void MailListView::setModel(EmailListModel *model) {
|
void MailListView::setModel(EmailListModel *model) {
|
||||||
m_proxyModel->setSourceModel(model);
|
m_proxyModel->setSourceModel(model);
|
||||||
|
|
||||||
m_tableView->setColumnHidden(EmailListModel::IdRole - Qt::UserRole - 1, true);
|
// Hide columns we don't want to show (by index now, not by role)
|
||||||
m_tableView->setColumnHidden(EmailListModel::RecipientRole - Qt::UserRole - 1, true);
|
// Columns: 0=Subject, 1=Sender, 2=Date
|
||||||
m_tableView->setColumnHidden(EmailListModel::ReadRole - Qt::UserRole - 1, true);
|
// All visible for now - we can hide via header data
|
||||||
m_tableView->setColumnHidden(EmailListModel::FlaggedRole - Qt::UserRole - 1, true);
|
|
||||||
m_tableView->setColumnHidden(EmailListModel::AttachmentsRole - Qt::UserRole - 1, true);
|
|
||||||
m_tableView->setColumnHidden(EmailListModel::FileIdRole - Qt::UserRole - 1, true);
|
|
||||||
m_tableView->setColumnHidden(EmailListModel::SizeRole - Qt::UserRole - 1, true);
|
|
||||||
m_tableView->setColumnHidden(EmailListModel::MessageIdRole - Qt::UserRole - 1, true);
|
|
||||||
m_tableView->setColumnHidden(EmailListModel::SenderInitialRole - Qt::UserRole - 1, true);
|
|
||||||
|
|
||||||
m_tableView->horizontalHeader()->setSectionResizeMode(EmailListModel::SenderRole - Qt::UserRole - 1, QHeaderView::Stretch);
|
// Default sort by date descending (column 2)
|
||||||
m_tableView->horizontalHeader()->setSectionResizeMode(EmailListModel::SubjectRole - Qt::UserRole - 1, QHeaderView::Stretch);
|
m_tableView->sortByColumn(EmailListModel::ColDate, Qt::DescendingOrder);
|
||||||
|
|
||||||
// Default sort by date descending
|
// Set column resize modes
|
||||||
m_tableView->sortByColumn(EmailListModel::DateRole - Qt::UserRole - 1, Qt::DescendingOrder);
|
m_tableView->horizontalHeader()->setSectionResizeMode(EmailListModel::ColSubject, QHeaderView::Stretch);
|
||||||
|
m_tableView->horizontalHeader()->setSectionResizeMode(EmailListModel::ColSender, QHeaderView::Stretch);
|
||||||
// Set column titles manually
|
m_tableView->horizontalHeader()->setSectionResizeMode(EmailListModel::ColDate, QHeaderView::ResizeToContents);
|
||||||
QHeaderView *header = m_tableView->horizontalHeader();
|
|
||||||
for (int i = 0; i < m_proxyModel->columnCount(); ++i) {
|
|
||||||
int role = Qt::UserRole + 1 + i;
|
|
||||||
switch (role) {
|
|
||||||
case EmailListModel::SenderRole: header->setSectionHidden(i, false); break;
|
|
||||||
case EmailListModel::SubjectRole: header->setSectionHidden(i, false); break;
|
|
||||||
case EmailListModel::DateRole: header->setSectionHidden(i, false); break;
|
|
||||||
default: header->setSectionHidden(i, true); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MailListView::onRowSelected(const QModelIndex &index) {
|
void MailListView::onRowSelected(const QModelIndex &index) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
|
||||||
EmailListModel::EmailListModel(QObject *parent)
|
EmailListModel::EmailListModel(QObject *parent)
|
||||||
: QAbstractListModel(parent)
|
: QAbstractTableModel(parent)
|
||||||
{
|
{
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
@@ -15,6 +15,12 @@ int EmailListModel::rowCount(const QModelIndex &parent) const
|
|||||||
return m_emails.size();
|
return m_emails.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int EmailListModel::columnCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent);
|
||||||
|
return ColCount;
|
||||||
|
}
|
||||||
|
|
||||||
QVariant EmailListModel::data(const QModelIndex &index, int role) const
|
QVariant EmailListModel::data(const QModelIndex &index, int role) const
|
||||||
{
|
{
|
||||||
if (!index.isValid() || index.row() >= m_emails.size())
|
if (!index.isValid() || index.row() >= m_emails.size())
|
||||||
@@ -23,6 +29,17 @@ QVariant EmailListModel::data(const QModelIndex &index, int role) const
|
|||||||
const MailItem& item = m_emails.at(index.row());
|
const MailItem& item = m_emails.at(index.row());
|
||||||
|
|
||||||
switch (role) {
|
switch (role) {
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
case Qt::EditRole:
|
||||||
|
switch (index.column()) {
|
||||||
|
case ColSubject:
|
||||||
|
return item.subject();
|
||||||
|
case ColSender:
|
||||||
|
return item.sender();
|
||||||
|
case ColDate:
|
||||||
|
return item.date();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case IdRole:
|
case IdRole:
|
||||||
return item.id();
|
return item.id();
|
||||||
case SubjectRole:
|
case SubjectRole:
|
||||||
@@ -49,13 +66,29 @@ QVariant EmailListModel::data(const QModelIndex &index, int role) const
|
|||||||
QString sender = item.sender();
|
QString sender = item.sender();
|
||||||
if (sender.isEmpty())
|
if (sender.isEmpty())
|
||||||
return QString();
|
return QString();
|
||||||
// Get first character, or first non-space character?
|
|
||||||
// Simple: first character of the sender string
|
|
||||||
return QString(sender.at(0)).toUpper();
|
return QString(sender.at(0)).toUpper();
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant EmailListModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
|
{
|
||||||
|
if (orientation != Qt::Horizontal || role != Qt::DisplayRole)
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
switch (section) {
|
||||||
|
case ColSubject:
|
||||||
|
return tr("Asunto");
|
||||||
|
case ColSender:
|
||||||
|
return tr("De");
|
||||||
|
case ColDate:
|
||||||
|
return tr("Fecha");
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QHash<int, QByteArray> EmailListModel::roleNames() const
|
QHash<int, QByteArray> EmailListModel::roleNames() const
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
#ifndef EMAILLISTMODEL_H
|
#ifndef EMAILLISTMODEL_H
|
||||||
#define EMAILLISTMODEL_H
|
#define EMAILLISTMODEL_H
|
||||||
|
|
||||||
#include <QAbstractListModel>
|
#include <QAbstractTableModel>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include "../db/dao/mailitemdao.h"
|
#include "../db/dao/mailitemdao.h"
|
||||||
|
|
||||||
class EmailListModel : public QAbstractListModel
|
class EmailListModel : public QAbstractTableModel
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
@@ -28,8 +28,18 @@ public:
|
|||||||
SenderInitialRole // computed from sender
|
SenderInitialRole // computed from sender
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Column indices (match role order for simplicity)
|
||||||
|
enum Columns {
|
||||||
|
ColSubject = 0,
|
||||||
|
ColSender = 1,
|
||||||
|
ColDate = 2,
|
||||||
|
ColCount = 3 // number of visible columns
|
||||||
|
};
|
||||||
|
|
||||||
int rowCount(const QModelIndex &parent = QModelIndex()) 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 data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||||
|
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||||
QHash<int, QByteArray> roleNames() const override;
|
QHash<int, QByteArray> roleNames() const override;
|
||||||
|
|
||||||
// Set the folderId to filter emails; -1 means all folders
|
// Set the folderId to filter emails; -1 means all folders
|
||||||
@@ -40,7 +50,5 @@ public:
|
|||||||
private:
|
private:
|
||||||
QVector<MailItem> m_emails;
|
QVector<MailItem> m_emails;
|
||||||
int m_folderId{-1}; // -1 means all folders
|
int m_folderId{-1}; // -1 means all folders
|
||||||
// REMOVED: MailItemDao& m_mailItemDao; // Methods are static, no instance needed
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // EMAILLISTMODEL_H
|
#endif // EMAILLISTMODEL_H
|
||||||
Reference in New Issue
Block a user