feat: responsive compact mail view + folder unread badges

- CompactMailDelegate: card-based view for narrow panels (<420px)
  * Avatar with hash-based color, sender + date (relative format)
  * Subject line with attachment icon
  * Action buttons: flag, delete, category, more (context menu)
  * Unread highlight with light blue background + bold sender
- MailListView: automatic switch between tree/table (wide) and list/cards (narrow)
  * QStackedWidget with QTreeView + QListView sharing same proxy model
  * resizeEvent threshold at 420px
  * Signals forwarded to MainMainWindow for actions
- FolderTreeDelegate: custom paint for folder tree
  * Unread count badge (blue pill) right-aligned on folder nodes
  * Account nodes bold, folder nodes normal weight
  * Proper indentation per depth level
- MailItemDao::countUnreadByFolderId() for real-time unread counts
- MainMainWindow handlers for compact actions (flag, delete, category, more menu)
This commit is contained in:
2026-08-24 23:25:13 +02:00
parent 705fe32e66
commit 4c4fec7a0a
846 changed files with 498002 additions and 52534 deletions
@@ -42,28 +42,45 @@ template <> constexpr inline auto ReaderView::qt_create_metaobjectdata<qt_meta_t
"ReaderView",
"replyRequested",
"",
"const MailItem*",
"item",
"mailId",
"forwardRequested",
"deleteRequested",
"detachRequested"
"detachRequested",
"openAttachmentRequested",
"path",
"onReplyClicked",
"onForwardClicked",
"onDeleteClicked",
"onDetachClicked"
};
QtMocHelpers::UintData qt_methods {
// Signal 'replyRequested'
QtMocHelpers::SignalData<void(const MailItem *)>(1, 2, QMC::AccessPublic, QMetaType::Void, {{
{ 0x80000000 | 3, 4 },
QtMocHelpers::SignalData<void(int)>(1, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::Int, 3 },
}}),
// Signal 'forwardRequested'
QtMocHelpers::SignalData<void(const MailItem *)>(5, 2, QMC::AccessPublic, QMetaType::Void, {{
{ 0x80000000 | 3, 4 },
QtMocHelpers::SignalData<void(int)>(4, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::Int, 3 },
}}),
// Signal 'deleteRequested'
QtMocHelpers::SignalData<void(const MailItem *)>(6, 2, QMC::AccessPublic, QMetaType::Void, {{
{ 0x80000000 | 3, 4 },
QtMocHelpers::SignalData<void(int)>(5, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::Int, 3 },
}}),
// Signal 'detachRequested'
QtMocHelpers::SignalData<void()>(7, 2, QMC::AccessPublic, QMetaType::Void),
QtMocHelpers::SignalData<void()>(6, 2, QMC::AccessPublic, QMetaType::Void),
// Signal 'openAttachmentRequested'
QtMocHelpers::SignalData<void(const QString &)>(7, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::QString, 8 },
}}),
// Slot 'onReplyClicked'
QtMocHelpers::SlotData<void()>(9, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onForwardClicked'
QtMocHelpers::SlotData<void()>(10, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onDeleteClicked'
QtMocHelpers::SlotData<void()>(11, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onDetachClicked'
QtMocHelpers::SlotData<void()>(12, 2, QMC::AccessPrivate, QMetaType::Void),
};
QtMocHelpers::UintData qt_properties {
};
@@ -87,22 +104,29 @@ void ReaderView::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id,
auto *_t = static_cast<ReaderView *>(_o);
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: _t->replyRequested((*reinterpret_cast<std::add_pointer_t<const MailItem*>>(_a[1]))); break;
case 1: _t->forwardRequested((*reinterpret_cast<std::add_pointer_t<const MailItem*>>(_a[1]))); break;
case 2: _t->deleteRequested((*reinterpret_cast<std::add_pointer_t<const MailItem*>>(_a[1]))); break;
case 0: _t->replyRequested((*reinterpret_cast<std::add_pointer_t<int>>(_a[1]))); break;
case 1: _t->forwardRequested((*reinterpret_cast<std::add_pointer_t<int>>(_a[1]))); break;
case 2: _t->deleteRequested((*reinterpret_cast<std::add_pointer_t<int>>(_a[1]))); break;
case 3: _t->detachRequested(); break;
case 4: _t->openAttachmentRequested((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 5: _t->onReplyClicked(); break;
case 6: _t->onForwardClicked(); break;
case 7: _t->onDeleteClicked(); break;
case 8: _t->onDetachClicked(); break;
default: ;
}
}
if (_c == QMetaObject::IndexOfMethod) {
if (QtMocHelpers::indexOfMethod<void (ReaderView::*)(const MailItem * )>(_a, &ReaderView::replyRequested, 0))
if (QtMocHelpers::indexOfMethod<void (ReaderView::*)(int )>(_a, &ReaderView::replyRequested, 0))
return;
if (QtMocHelpers::indexOfMethod<void (ReaderView::*)(const MailItem * )>(_a, &ReaderView::forwardRequested, 1))
if (QtMocHelpers::indexOfMethod<void (ReaderView::*)(int )>(_a, &ReaderView::forwardRequested, 1))
return;
if (QtMocHelpers::indexOfMethod<void (ReaderView::*)(const MailItem * )>(_a, &ReaderView::deleteRequested, 2))
if (QtMocHelpers::indexOfMethod<void (ReaderView::*)(int )>(_a, &ReaderView::deleteRequested, 2))
return;
if (QtMocHelpers::indexOfMethod<void (ReaderView::*)()>(_a, &ReaderView::detachRequested, 3))
return;
if (QtMocHelpers::indexOfMethod<void (ReaderView::*)(const QString & )>(_a, &ReaderView::openAttachmentRequested, 4))
return;
}
}
@@ -125,32 +149,32 @@ int ReaderView::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
if (_id < 4)
if (_id < 9)
qt_static_metacall(this, _c, _id, _a);
_id -= 4;
_id -= 9;
}
if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
if (_id < 4)
if (_id < 9)
*reinterpret_cast<QMetaType *>(_a[0]) = QMetaType();
_id -= 4;
_id -= 9;
}
return _id;
}
// SIGNAL 0
void ReaderView::replyRequested(const MailItem * _t1)
void ReaderView::replyRequested(int _t1)
{
QMetaObject::activate<void>(this, &staticMetaObject, 0, nullptr, _t1);
}
// SIGNAL 1
void ReaderView::forwardRequested(const MailItem * _t1)
void ReaderView::forwardRequested(int _t1)
{
QMetaObject::activate<void>(this, &staticMetaObject, 1, nullptr, _t1);
}
// SIGNAL 2
void ReaderView::deleteRequested(const MailItem * _t1)
void ReaderView::deleteRequested(int _t1)
{
QMetaObject::activate<void>(this, &staticMetaObject, 2, nullptr, _t1);
}
@@ -160,4 +184,10 @@ void ReaderView::detachRequested()
{
QMetaObject::activate(this, &staticMetaObject, 3, nullptr);
}
// SIGNAL 4
void ReaderView::openAttachmentRequested(const QString & _t1)
{
QMetaObject::activate<void>(this, &staticMetaObject, 4, nullptr, _t1);
}
QT_WARNING_POP