MailJD nbsp;·nbsp; Test Dashboard nbsp;·nbsp; Coverage
LCOV - code coverage report
Current view: top level - ui - QuickFilterBar.cpp (source / functions) Coverage Total Hit
Test: MailJD Coverage (Unit + E2E) Lines: 100.0 % 68 68
Test Date: 2026-06-21 21:10:19 Functions: 100.0 % 11 11
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 47.5 % 122 58

             Branch data     Line data    Source code
       1                 :             : #include "QuickFilterBar.h"
       2                 :             : 
       3                 :             : #include <QHBoxLayout>
       4                 :             : #include <QIcon>
       5                 :             : #include <QLineEdit>
       6                 :             : #include <QPushButton>
       7                 :             : #include <QTimer>
       8                 :             : #include <QEvent>
       9                 :             : 
      10         [ +  - ]:           5 : QuickFilterBar::QuickFilterBar(QWidget *parent) : QWidget(parent) {
      11         [ +  - ]:           5 :   setupUi();
      12                 :           5 : }
      13                 :             : 
      14                 :           5 : void QuickFilterBar::setupUi() {
      15   [ +  -  +  -  :           5 :   auto *layout = new QHBoxLayout(this);
             -  +  -  - ]
      16         [ +  - ]:           5 :   layout->setContentsMargins(4, 2, 4, 2);
      17         [ +  - ]:           5 :   layout->setSpacing(4);
      18                 :             : 
      19                 :             :   // Toggle buttons — all checkable, flat style
      20                 :          15 :   auto makeToggle = [this, layout](const QString &text,
      21                 :             :                                     const QString &tooltip) -> QPushButton * {
      22   [ +  -  -  +  :          15 :     auto *btn = new QPushButton(text, this);
                   -  - ]
      23                 :          15 :     btn->setCheckable(true);
      24                 :          15 :     btn->setToolTip(tooltip);
      25                 :          15 :     btn->setFixedHeight(24);
      26                 :             :     // Sprint 64: Handled by global ThemeManager (main.qss).
      27         [ +  - ]:          15 :     layout->addWidget(btn);
      28                 :          15 :     connect(btn, &QPushButton::toggled, this,
      29         [ +  - ]:          15 :             &QuickFilterBar::onFilterButtonToggled);
      30                 :          15 :     return btn;
      31                 :           5 :   };
      32                 :             : 
      33   [ +  -  +  - ]:           5 :   m_unreadBtn = makeToggle(tr("● Unread"),
      34         [ +  - ]:          10 :                             tr("Show unread messages only"));
      35                 :           5 :   m_starredBtn =
      36   [ +  -  +  - ]:           5 :       makeToggle(tr("★ Starred"),
      37         [ +  - ]:          10 :                   tr("Show starred messages only"));
      38   [ +  -  +  - ]:           5 :   m_attachBtn = makeToggle(tr("Attachments"),
      39         [ +  - ]:          10 :                             tr("Show messages with attachments only"));
      40   [ +  -  +  - ]:          10 :   m_attachBtn->setIcon(QIcon::fromTheme(
      41                 :          10 :       QStringLiteral("mail-attachment"),
      42         [ +  - ]:          10 :       QIcon::fromTheme(QStringLiteral("attachment"))));
      43                 :             : 
      44         [ +  - ]:           5 :   layout->addSpacing(8);
      45                 :             : 
      46                 :             :   // Text search field
      47   [ +  -  +  -  :           5 :   m_searchEdit = new QLineEdit(this);
             -  +  -  - ]
      48   [ +  -  +  - ]:           5 :   m_searchEdit->setPlaceholderText(tr("Filter…"));
      49         [ +  - ]:           5 :   m_searchEdit->setClearButtonEnabled(true);
      50         [ +  - ]:           5 :   m_searchEdit->setFixedHeight(24);
      51                 :             :   // Sprint 64: Handled by global ThemeManager (main.qss).
      52         [ +  - ]:           5 :   layout->addWidget(m_searchEdit, 1); // stretch
      53                 :             : 
      54                 :             :   // Debounce timer for text input (200ms)
      55   [ +  -  +  -  :           5 :   m_debounceTimer = new QTimer(this);
             -  +  -  - ]
      56         [ +  - ]:           5 :   m_debounceTimer->setSingleShot(true);
      57         [ +  - ]:           5 :   m_debounceTimer->setInterval(200);
      58                 :           5 :   connect(m_debounceTimer, &QTimer::timeout, this,
      59         [ +  - ]:           5 :           &QuickFilterBar::filterChanged);
      60                 :           5 :   connect(m_searchEdit, &QLineEdit::textChanged, this,
      61         [ +  - ]:           5 :           &QuickFilterBar::onTextChanged);
      62                 :             : 
      63         [ +  - ]:           5 :   setFixedHeight(32);
      64                 :           5 : }
      65                 :             : 
      66                 :           3 : bool QuickFilterBar::showUnreadOnly() const {
      67                 :           3 :   return m_unreadBtn->isChecked();
      68                 :             : }
      69                 :             : 
      70                 :           2 : bool QuickFilterBar::showStarredOnly() const {
      71                 :           2 :   return m_starredBtn->isChecked();
      72                 :             : }
      73                 :             : 
      74                 :           2 : bool QuickFilterBar::showWithAttachments() const {
      75                 :           2 :   return m_attachBtn->isChecked();
      76                 :             : }
      77                 :             : 
      78                 :           3 : QString QuickFilterBar::filterText() const {
      79   [ +  -  +  - ]:           3 :   return m_searchEdit->text().trimmed();
      80                 :             : }
      81                 :             : 
      82                 :           3 : void QuickFilterBar::onFilterButtonToggled() { emit filterChanged(); }
      83                 :             : 
      84                 :           3 : void QuickFilterBar::onTextChanged() {
      85                 :             :   // Restart debounce timer on each keystroke
      86                 :           3 :   m_debounceTimer->start();
      87                 :           3 : }
      88                 :             : 
      89                 :             : // T-304: Runtime language switching
      90                 :           3 : void QuickFilterBar::changeEvent(QEvent *event) {
      91         [ +  + ]:           3 :   if (event->type() == QEvent::LanguageChange)
      92                 :           1 :     retranslateUi();
      93                 :           3 :   QWidget::changeEvent(event);
      94                 :           3 : }
      95                 :             : 
      96                 :           1 : void QuickFilterBar::retranslateUi() {
      97   [ +  -  +  - ]:           1 :   m_unreadBtn->setText(tr("\u25cf Unread"));
      98   [ +  -  +  - ]:           1 :   m_unreadBtn->setToolTip(tr("Show unread messages only"));
      99   [ +  -  +  - ]:           1 :   m_starredBtn->setText(tr("\u2605 Starred"));
     100   [ +  -  +  - ]:           1 :   m_starredBtn->setToolTip(tr("Show starred messages only"));
     101   [ +  -  +  - ]:           1 :   m_attachBtn->setText(tr("Attachments"));
     102   [ +  -  +  - ]:           1 :   m_attachBtn->setToolTip(tr("Show messages with attachments only"));
     103   [ +  -  +  - ]:           1 :   m_searchEdit->setPlaceholderText(tr("Filter\u2026"));
     104                 :           1 : }
        

Generated by: LCOV version 2.0-1