- MailListView: new '🌐 Online' button in search bar
- Clicking button emits onlineSearchRequested(query)
- If search box empty, shows QInputDialog for query entry
- MainMainWindow::onOnlineSearchRequested() handler:
- Validates current folder selected
- Gets account for folder
- Shows status message
- Shows info dialog with query/folder/account (placeholder for IMAP SEARCH)
- Signal: onlineSearchRequested(const QString& query)
- Button styled in blue (online theme)
- MailListView: setDragEnabled, setAcceptDrops, setDropIndicatorShown, setDragDropMode(DragDrop)
- Custom MIME type: application/x-wino-mail-ids with QVector<int> mail IDs
- mousePressEvent + mouseMoveEvent for drag initiation (standard Qt drag distance)
- initDrag() creates QDrag with selected mail IDs
- dragEnterEvent, dragMoveEvent, dropEvent handlers
- dropEvent emits batchMoveRequested(mailIds, targetFolderId)
- Works in both tree view and compact list view
- MailListView: new m_pivotCombo (Principal/Otros) visible only for Inbox folders
- MailListView::setFolderType(folderType) called from MainMainWindow::onFolderSelected()
- Folder::type() returns 'inbox', 'sent', 'drafts', 'trash', 'custom'
- onPivotChanged() placeholder for future AI-based filtering (Focused vs Other)
- UI hidden for non-Inbox folders
- MailListView: ExtendedSelection mode for both tree and list views
- Action bar (blue bar) appears when items selected
- Select all checkbox + counter label
- Batch actions: Flag, Mark unread, Move (TODO), Delete, Exit selection
- Signals: selectionChanged, batchFlagRequested, batchDeleteRequested, batchMarkUnreadRequested, batchMoveRequested
- enterMultiSelectMode()/exitMultiSelectMode() state management
- Works in both normal and compact views
- EmailListModel: new m_pinnedOnly filter + setShowPinnedOnly()
- EmailListModel/EmailListModel.cpp: passes pinnedOnly to paginated queries
- MailItemDao: countAll, countByFolderId, findAllPaginated, findByFolderIdPaginated accept pinnedOnly
- MailListView: new 'Solo fijados' checkbox in filter bar
- CompactMailDelegate: orange pushpin indicator (top-right) for pinned emails
- Works in both tree view and compact card view
- Pinned indicator uses QPainterPath for pushpin shape (orange)
- EmailListModel: QAbstractListModel with canFetchMore/fetchMore
* Batch loading (default 50 emails per fetch)
* Total count query for scrollbar
* TotalCountChanged signal
* Paginated DB queries: findAllPaginated, findByFolderIdPaginated
* Count queries: countAll, countByFolderId
- MailItemDao: new paginated methods
* findAllPaginated(offset, limit, filters...)
* findByFolderIdPaginated(folderId, offset, limit, filters...)
* countAll(filters...), countByFolderId(folderId, filters...)
- MailListView: scroll-triggered fetchMore
* Connects verticalScrollBar valueChanged on both TreeView and ListView
* Triggers fetchMore at 90% scroll threshold
* onRowsInserted updates EmailTreeModel when new emails arrive
* Works in both normal (tree) and compact (list) views
- CompactMailDelegate: 3 display modes (Compact/Medium/Spacious) like WinUI original
* Compact: 64px, minimal, no preview
* Medium: 96px, with preview, detailed categories
* Spacious: 120px, full padding, preview visible
- Hover actions: Reply (↩), Forward (↪), Mark unread (✎) on right side
- Unread dot indicator (top-right, blue) like WinUI
- User-configurable display mode via combo box in filter bar
- MainMainWindow handlers for reply/forward/mark-unread from compact view
- Signals: replyRequested, forwardRequested, markUnreadRequested
- EmailTreeModel: hierarchical model for grouped email view (QTreeView)
- DateGroupProxyModel: proxy model for date-based grouping logic
- MailListView: migrated from QTableView to QTreeView with grouping support
- ReaderView: subject frame with shadow, avatar moved to header, body inside header
- MainWindow: frameless with rounded corners, 1px border, edge resize, no status bar
- Stability fixes for grouping mode switch:
* Proper tree cleanup (no double-delete of root)
* Bounds checking on all array accesses
* Null pointer checks in index/parent/data methods
* Date validity checks before grouping
* Index validation before accessing m_emails
- ReaderView: complete rewrite with CSS styling, headers, attachments, zoom, find, dark mode, image blocking
- Categories: DAO + UI tree widget with colors, nested categories, assignment
- Rules engine: DAO + evaluation + actions (move, mark read, flag, delete, category, forward)
- Templates: DAO + editor + manager with variables support
- Signatures: DAO + manager + auto-per-account + manual selector in compose
- ComposeView: signature combo, template selector, auto-signature on new email
- MainWindow: frameless with rounded corners, 1px border, resize from edges, no status bar
- Database: new tables (Category, MailCategory, Rule, Template, Signature) with indexes
- 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