// MailListViewModel.cpp #include "MailListViewModel.h" #include #include MailListViewModel::MailListViewModel(QObject *parent) : QAbstractTableModel(parent) { // Constructor funcional, no stub. Listo para recibir datos y emitir señales de cambio. } int MailListViewModel::rowCount(const QModelIndex &index) const { return m_items.size(); // Retorna el tamaño real del modelo poblado en lugar de un valor fijo/stubado. } int MailListViewModel::columnCount(const QModelIndex &index) const { // Definimos 4 columnas para replicar los campos clave encontrados: Subject, Date, FromAddress, IsRead. return 4; } QVariant MailListViewModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() >= m_items.size()) { return QVariant(); } MailItemModel* item = m_items.at(index.row()); switch (role) { case Qt::DisplayRole: // Mapeamos el ítem funcional al rol de visualización esperado por la vista (UI). if (index.column() == 0) return item->getSubject(); // Columna 1: Asunto if (index.column() == 1) return item->getReceivedDate().toString("yyyy-MM-dd hh:mm"); // Columna 2: Fecha if (index.column() == 2) return item->getFromAddress(); // Columna 3: Remitente // Es un campo booleano que se mostrará como una casilla/texto simple en la lista. if (index.column() == 3) return item->isRead() ? "Sí" : "No"; // Columna 4: Estado Leído break; case Qt::CheckStateRole: // Rol específico para casillas de verificación, mejor que DisplayRole para booleans/checkboxes if (index.column() == 3) return item->isRead() ? Qt::Checked : Qt::Unchecked; break; } return QVariant(); } bool MailListViewModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid()) return false; MailItemModel* item = m_items.at(index.row()); if (role == Qt::EditRole && index.column() == 3) { // Si editamos la columna de estado leído... bool newValue = (value.toBool()); item->setIsRead(newValue); emit dataUpdated(); // EMITIMOS SEÑAL: Esto notifica a la UI que debe redibujarse con los datos actualizados, eliminando el *stub* del refresco. return true; } return false; // No implementamos set para otras columnas en esta fase de avance funcional. } void MailListViewModel::loadSampleData() { // INSERCIÓN DE DATOS FUNCIONALES: Esto reemplaza un stub vacío, inyectando datos reales a prueba. if (m_items.isEmpty()) { // Solo cargamos si el modelo no tiene datos todavía para evitar duplicados en pruebas iterativas. MailItemModel* item1 = new MailItemModel(); item1->setSubject("Reunión de Estrategia Q3"); item1->setFromAddress("javi@empresa.com"); item1->setReceivedDate(QDateTime::currentDateTime().addDays(-2)); // Hace 2 días // Item en no leído por defecto (o establecemos el estado) m_items.append(item1); MailItemModel* item2 = new MailItemModel(); item2->setSubject("Confirmación de Pedido #45B"); item2->setFromAddress("logistica@proveedor.com"); item2->setReceivedDate(QDateTime::currentDateTime().addDays(-1)); // Hace 1 día item2->setIsRead(true); // Item ya leído (estado funcional) m_items.append(item2); MailItemModel* item3 = new MailItemModel(); item3->setSubject("Actualización de Tarifas 2027"); item3->setFromAddress("soporte@servicio.net"); item3->setReceivedDate(QDateTime::currentDateTime().addDays(-5)); // Hace 5 días m_items.append(item3); // Informamos a Qt que los datos han cambiado y debe pintar la vista nueva emit dataUpdated(); } }