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
@@ -33,170 +33,6 @@ QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
QT_WARNING_DISABLE_GCC("-Wuseless-cast")
namespace {
struct qt_meta_tag_ZN14RichTextEditorE_t {};
} // unnamed namespace
template <> constexpr inline auto RichTextEditor::qt_create_metaobjectdata<qt_meta_tag_ZN14RichTextEditorE_t>()
{
namespace QMC = QtMocConstants;
QtMocHelpers::StringRefStorage qt_stringData {
"RichTextEditor",
"signatureClicked",
"",
"signatureEditRequested",
"onBold",
"onItalic",
"onUnderline",
"onBulletList",
"onNumberedList",
"onIndent",
"onOutdent",
"onAlignLeft",
"onAlignCenter",
"onAlignRight",
"onAlignJustify",
"onFontChanged",
"QFont",
"font",
"onFontSizeChanged",
"size",
"onInsertImage",
"onInsertTable"
};
QtMocHelpers::UintData qt_methods {
// Signal 'signatureClicked'
QtMocHelpers::SignalData<void()>(1, 2, QMC::AccessPublic, QMetaType::Void),
// Signal 'signatureEditRequested'
QtMocHelpers::SignalData<void()>(3, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onBold'
QtMocHelpers::SlotData<void()>(4, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onItalic'
QtMocHelpers::SlotData<void()>(5, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onUnderline'
QtMocHelpers::SlotData<void()>(6, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onBulletList'
QtMocHelpers::SlotData<void()>(7, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onNumberedList'
QtMocHelpers::SlotData<void()>(8, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onIndent'
QtMocHelpers::SlotData<void()>(9, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onOutdent'
QtMocHelpers::SlotData<void()>(10, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onAlignLeft'
QtMocHelpers::SlotData<void()>(11, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onAlignCenter'
QtMocHelpers::SlotData<void()>(12, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onAlignRight'
QtMocHelpers::SlotData<void()>(13, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onAlignJustify'
QtMocHelpers::SlotData<void()>(14, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onFontChanged'
QtMocHelpers::SlotData<void(const QFont &)>(15, 2, QMC::AccessPublic, QMetaType::Void, {{
{ 0x80000000 | 16, 17 },
}}),
// Slot 'onFontSizeChanged'
QtMocHelpers::SlotData<void(int)>(18, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::Int, 19 },
}}),
// Slot 'onInsertImage'
QtMocHelpers::SlotData<void()>(20, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'onInsertTable'
QtMocHelpers::SlotData<void()>(21, 2, QMC::AccessPublic, QMetaType::Void),
};
QtMocHelpers::UintData qt_properties {
};
QtMocHelpers::UintData qt_enums {
};
return QtMocHelpers::metaObjectData<RichTextEditor, qt_meta_tag_ZN14RichTextEditorE_t>(QMC::MetaObjectFlag{}, qt_stringData,
qt_methods, qt_properties, qt_enums);
}
Q_CONSTINIT const QMetaObject RichTextEditor::staticMetaObject = { {
QMetaObject::SuperData::link<QTextEdit::staticMetaObject>(),
qt_staticMetaObjectStaticContent<qt_meta_tag_ZN14RichTextEditorE_t>.stringdata,
qt_staticMetaObjectStaticContent<qt_meta_tag_ZN14RichTextEditorE_t>.data,
qt_static_metacall,
nullptr,
qt_staticMetaObjectRelocatingContent<qt_meta_tag_ZN14RichTextEditorE_t>.metaTypes,
nullptr
} };
void RichTextEditor::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
auto *_t = static_cast<RichTextEditor *>(_o);
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: _t->signatureClicked(); break;
case 1: _t->signatureEditRequested(); break;
case 2: _t->onBold(); break;
case 3: _t->onItalic(); break;
case 4: _t->onUnderline(); break;
case 5: _t->onBulletList(); break;
case 6: _t->onNumberedList(); break;
case 7: _t->onIndent(); break;
case 8: _t->onOutdent(); break;
case 9: _t->onAlignLeft(); break;
case 10: _t->onAlignCenter(); break;
case 11: _t->onAlignRight(); break;
case 12: _t->onAlignJustify(); break;
case 13: _t->onFontChanged((*reinterpret_cast<std::add_pointer_t<QFont>>(_a[1]))); break;
case 14: _t->onFontSizeChanged((*reinterpret_cast<std::add_pointer_t<int>>(_a[1]))); break;
case 15: _t->onInsertImage(); break;
case 16: _t->onInsertTable(); break;
default: ;
}
}
if (_c == QMetaObject::IndexOfMethod) {
if (QtMocHelpers::indexOfMethod<void (RichTextEditor::*)()>(_a, &RichTextEditor::signatureClicked, 0))
return;
if (QtMocHelpers::indexOfMethod<void (RichTextEditor::*)()>(_a, &RichTextEditor::signatureEditRequested, 1))
return;
}
}
const QMetaObject *RichTextEditor::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}
void *RichTextEditor::qt_metacast(const char *_clname)
{
if (!_clname) return nullptr;
if (!strcmp(_clname, qt_staticMetaObjectStaticContent<qt_meta_tag_ZN14RichTextEditorE_t>.strings))
return static_cast<void*>(this);
return QTextEdit::qt_metacast(_clname);
}
int RichTextEditor::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QTextEdit::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
if (_id < 17)
qt_static_metacall(this, _c, _id, _a);
_id -= 17;
}
if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
if (_id < 17)
*reinterpret_cast<QMetaType *>(_a[0]) = QMetaType();
_id -= 17;
}
return _id;
}
// SIGNAL 0
void RichTextEditor::signatureClicked()
{
QMetaObject::activate(this, &staticMetaObject, 0, nullptr);
}
// SIGNAL 1
void RichTextEditor::signatureEditRequested()
{
QMetaObject::activate(this, &staticMetaObject, 1, nullptr);
}
namespace {
struct qt_meta_tag_ZN11ComposeViewE_t {};
} // unnamed namespace
@@ -218,13 +54,20 @@ template <> constexpr inline auto ComposeView::qt_create_metaobjectdata<qt_meta_
"body",
"scheduleTime",
"fromAddress",
"attachmentPaths",
"discardRequested",
"statusMessageRequested",
"message",
"initializeComposition",
"startNewEmail",
"initialRecipient",
"setTo",
"setSubject",
"setBody",
"applyTemplate",
"Template",
"tmpl",
"getBody",
"onCcToggle",
"onBccToggle",
"onSendClicked",
@@ -232,8 +75,12 @@ template <> constexpr inline auto ComposeView::qt_create_metaobjectdata<qt_meta_
"onDetachClicked",
"onAccountChanged",
"index",
"onSignatureComboChanged",
"onSignatureClicked",
"onSignatureEditRequested"
"onSignatureEditRequested",
"onAddAttachmentClicked",
"onRemoveAttachmentClicked",
"onTemplateClicked"
};
QtMocHelpers::UintData qt_methods {
@@ -244,48 +91,68 @@ template <> constexpr inline auto ComposeView::qt_create_metaobjectdata<qt_meta_
{ 0x80000000 | 4, 5 },
}}),
// Signal 'sendRequested'
QtMocHelpers::SignalData<void(const QString &, const QString &, const QString &, const QString &, const QString &, const QDateTime &, const QString &)>(6, 2, QMC::AccessPublic, QMetaType::Void, {{
QtMocHelpers::SignalData<void(const QString &, const QString &, const QString &, const QString &, const QString &, const QDateTime &, const QString &, const QStringList &)>(6, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::QString, 7 }, { QMetaType::QString, 8 }, { QMetaType::QString, 9 }, { QMetaType::QString, 10 },
{ QMetaType::QString, 11 }, { QMetaType::QDateTime, 12 }, { QMetaType::QString, 13 },
{ QMetaType::QString, 11 }, { QMetaType::QDateTime, 12 }, { QMetaType::QString, 13 }, { QMetaType::QStringList, 14 },
}}),
// Signal 'discardRequested'
QtMocHelpers::SignalData<void()>(14, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'initializeComposition'
QtMocHelpers::SlotData<void()>(15, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'startNewEmail'
QtMocHelpers::SlotData<void(const QString &)>(16, 2, QMC::AccessPublic, QMetaType::Void, {{
QtMocHelpers::SignalData<void()>(15, 2, QMC::AccessPublic, QMetaType::Void),
// Signal 'statusMessageRequested'
QtMocHelpers::SignalData<void(const QString &)>(16, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::QString, 17 },
}}),
// Slot 'initializeComposition'
QtMocHelpers::SlotData<void()>(18, 2, QMC::AccessPublic, QMetaType::Void),
// Slot 'startNewEmail'
QtMocHelpers::SlotData<void(const QString &)>(19, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::QString, 20 },
}}),
// Slot 'setTo'
QtMocHelpers::SlotData<void(const QString &)>(18, 2, QMC::AccessPublic, QMetaType::Void, {{
QtMocHelpers::SlotData<void(const QString &)>(21, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::QString, 7 },
}}),
// Slot 'setSubject'
QtMocHelpers::SlotData<void(const QString &)>(19, 2, QMC::AccessPublic, QMetaType::Void, {{
QtMocHelpers::SlotData<void(const QString &)>(22, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::QString, 10 },
}}),
// Slot 'setBody'
QtMocHelpers::SlotData<void(const QString &)>(20, 2, QMC::AccessPublic, QMetaType::Void, {{
QtMocHelpers::SlotData<void(const QString &)>(23, 2, QMC::AccessPublic, QMetaType::Void, {{
{ QMetaType::QString, 11 },
}}),
// Slot 'applyTemplate'
QtMocHelpers::SlotData<void(const Template &)>(24, 2, QMC::AccessPublic, QMetaType::Void, {{
{ 0x80000000 | 25, 26 },
}}),
// Slot 'getBody'
QtMocHelpers::SlotData<QString() const>(27, 2, QMC::AccessPublic, QMetaType::QString),
// Slot 'onCcToggle'
QtMocHelpers::SlotData<void()>(21, 2, QMC::AccessPrivate, QMetaType::Void),
QtMocHelpers::SlotData<void()>(28, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onBccToggle'
QtMocHelpers::SlotData<void()>(22, 2, QMC::AccessPrivate, QMetaType::Void),
QtMocHelpers::SlotData<void()>(29, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onSendClicked'
QtMocHelpers::SlotData<void()>(23, 2, QMC::AccessPrivate, QMetaType::Void),
QtMocHelpers::SlotData<void()>(30, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onScheduleClicked'
QtMocHelpers::SlotData<void()>(24, 2, QMC::AccessPrivate, QMetaType::Void),
QtMocHelpers::SlotData<void()>(31, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onDetachClicked'
QtMocHelpers::SlotData<void()>(25, 2, QMC::AccessPrivate, QMetaType::Void),
QtMocHelpers::SlotData<void()>(32, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onAccountChanged'
QtMocHelpers::SlotData<void(int)>(26, 2, QMC::AccessPrivate, QMetaType::Void, {{
{ QMetaType::Int, 27 },
QtMocHelpers::SlotData<void(int)>(33, 2, QMC::AccessPrivate, QMetaType::Void, {{
{ QMetaType::Int, 34 },
}}),
// Slot 'onSignatureComboChanged'
QtMocHelpers::SlotData<void(int)>(35, 2, QMC::AccessPrivate, QMetaType::Void, {{
{ QMetaType::Int, 34 },
}}),
// Slot 'onSignatureClicked'
QtMocHelpers::SlotData<void()>(28, 2, QMC::AccessPrivate, QMetaType::Void),
QtMocHelpers::SlotData<void()>(36, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onSignatureEditRequested'
QtMocHelpers::SlotData<void()>(29, 2, QMC::AccessPrivate, QMetaType::Void),
QtMocHelpers::SlotData<void()>(37, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onAddAttachmentClicked'
QtMocHelpers::SlotData<void()>(38, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onRemoveAttachmentClicked'
QtMocHelpers::SlotData<void()>(39, 2, QMC::AccessPrivate, QMetaType::Void),
// Slot 'onTemplateClicked'
QtMocHelpers::SlotData<void()>(40, 2, QMC::AccessPrivate, QMetaType::Void),
};
QtMocHelpers::UintData qt_properties {
};
@@ -311,21 +178,29 @@ void ComposeView::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id,
switch (_id) {
case 0: _t->compositionFinished(); break;
case 1: _t->detachRequested((*reinterpret_cast<std::add_pointer_t<QWidget*>>(_a[1]))); break;
case 2: _t->sendRequested((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[2])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[3])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[4])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[5])),(*reinterpret_cast<std::add_pointer_t<QDateTime>>(_a[6])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[7]))); break;
case 2: _t->sendRequested((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[2])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[3])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[4])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[5])),(*reinterpret_cast<std::add_pointer_t<QDateTime>>(_a[6])),(*reinterpret_cast<std::add_pointer_t<QString>>(_a[7])),(*reinterpret_cast<std::add_pointer_t<QStringList>>(_a[8]))); break;
case 3: _t->discardRequested(); break;
case 4: _t->initializeComposition(); break;
case 5: _t->startNewEmail((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 6: _t->setTo((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 7: _t->setSubject((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 8: _t->setBody((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 9: _t->onCcToggle(); break;
case 10: _t->onBccToggle(); break;
case 11: _t->onSendClicked(); break;
case 12: _t->onScheduleClicked(); break;
case 13: _t->onDetachClicked(); break;
case 14: _t->onAccountChanged((*reinterpret_cast<std::add_pointer_t<int>>(_a[1]))); break;
case 15: _t->onSignatureClicked(); break;
case 16: _t->onSignatureEditRequested(); break;
case 4: _t->statusMessageRequested((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 5: _t->initializeComposition(); break;
case 6: _t->startNewEmail((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 7: _t->setTo((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 8: _t->setSubject((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 9: _t->setBody((*reinterpret_cast<std::add_pointer_t<QString>>(_a[1]))); break;
case 10: _t->applyTemplate((*reinterpret_cast<std::add_pointer_t<Template>>(_a[1]))); break;
case 11: { QString _r = _t->getBody();
if (_a[0]) *reinterpret_cast<QString*>(_a[0]) = std::move(_r); } break;
case 12: _t->onCcToggle(); break;
case 13: _t->onBccToggle(); break;
case 14: _t->onSendClicked(); break;
case 15: _t->onScheduleClicked(); break;
case 16: _t->onDetachClicked(); break;
case 17: _t->onAccountChanged((*reinterpret_cast<std::add_pointer_t<int>>(_a[1]))); break;
case 18: _t->onSignatureComboChanged((*reinterpret_cast<std::add_pointer_t<int>>(_a[1]))); break;
case 19: _t->onSignatureClicked(); break;
case 20: _t->onSignatureEditRequested(); break;
case 21: _t->onAddAttachmentClicked(); break;
case 22: _t->onRemoveAttachmentClicked(); break;
case 23: _t->onTemplateClicked(); break;
default: ;
}
}
@@ -346,10 +221,12 @@ void ComposeView::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id,
return;
if (QtMocHelpers::indexOfMethod<void (ComposeView::*)(QWidget * )>(_a, &ComposeView::detachRequested, 1))
return;
if (QtMocHelpers::indexOfMethod<void (ComposeView::*)(const QString & , const QString & , const QString & , const QString & , const QString & , const QDateTime & , const QString & )>(_a, &ComposeView::sendRequested, 2))
if (QtMocHelpers::indexOfMethod<void (ComposeView::*)(const QString & , const QString & , const QString & , const QString & , const QString & , const QDateTime & , const QString & , const QStringList & )>(_a, &ComposeView::sendRequested, 2))
return;
if (QtMocHelpers::indexOfMethod<void (ComposeView::*)()>(_a, &ComposeView::discardRequested, 3))
return;
if (QtMocHelpers::indexOfMethod<void (ComposeView::*)(const QString & )>(_a, &ComposeView::statusMessageRequested, 4))
return;
}
}
@@ -372,14 +249,14 @@ int ComposeView::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
if (_id < 17)
if (_id < 24)
qt_static_metacall(this, _c, _id, _a);
_id -= 17;
_id -= 24;
}
if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
if (_id < 17)
if (_id < 24)
qt_static_metacall(this, _c, _id, _a);
_id -= 17;
_id -= 24;
}
return _id;
}
@@ -397,9 +274,9 @@ void ComposeView::detachRequested(QWidget * _t1)
}
// SIGNAL 2
void ComposeView::sendRequested(const QString & _t1, const QString & _t2, const QString & _t3, const QString & _t4, const QString & _t5, const QDateTime & _t6, const QString & _t7)
void ComposeView::sendRequested(const QString & _t1, const QString & _t2, const QString & _t3, const QString & _t4, const QString & _t5, const QDateTime & _t6, const QString & _t7, const QStringList & _t8)
{
QMetaObject::activate<void>(this, &staticMetaObject, 2, nullptr, _t1, _t2, _t3, _t4, _t5, _t6, _t7);
QMetaObject::activate<void>(this, &staticMetaObject, 2, nullptr, _t1, _t2, _t3, _t4, _t5, _t6, _t7, _t8);
}
// SIGNAL 3
@@ -407,4 +284,10 @@ void ComposeView::discardRequested()
{
QMetaObject::activate(this, &staticMetaObject, 3, nullptr);
}
// SIGNAL 4
void ComposeView::statusMessageRequested(const QString & _t1)
{
QMetaObject::activate<void>(this, &staticMetaObject, 4, nullptr, _t1);
}
QT_WARNING_POP