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 : }
|