Mailcommon

numericrulewidgethandler.cpp
1/*
2 SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "numericrulewidgethandler.h"
8#include "search/searchpattern.h"
9
10#include <KLazyLocalizedString>
11#include <KLocalization>
12#include <KLocalizedString>
13#include <QComboBox>
14#include <QSpinBox>
15#include <QStackedWidget>
16using namespace MailCommon;
17
18static const struct {
20 const KLazyLocalizedString displayName;
21} NumericFunctions[] = {{SearchRule::FuncEquals, kli18n("is equal to")},
22 {SearchRule::FuncNotEqual, kli18n("is not equal to")},
23 {SearchRule::FuncIsGreater, kli18n("is greater than")},
24 {SearchRule::FuncIsLessOrEqual, kli18n("is less than or equal to")},
25 {SearchRule::FuncIsLess, kli18n("is less than")},
26 {SearchRule::FuncIsGreaterOrEqual, kli18n("is greater than or equal to")}};
27static const int NumericFunctionCount = sizeof(NumericFunctions) / sizeof(*NumericFunctions);
28
29//---------------------------------------------------------------------------
30
31QWidget *NumericRuleWidgetHandler::createFunctionWidget(int number, QStackedWidget *functionStack, const QObject *receiver, bool /*isBalooSearch*/) const
32{
33 if (number != 0) {
34 return nullptr;
35 }
36
37 auto funcCombo = new QComboBox(functionStack);
38 funcCombo->setMinimumWidth(50);
39 funcCombo->setObjectName(QLatin1StringView("numericRuleFuncCombo"));
40 for (int i = 0; i < NumericFunctionCount; ++i) {
41 funcCombo->addItem(NumericFunctions[i].displayName.toString());
42 }
43 funcCombo->adjustSize();
44 QObject::connect(funcCombo, SIGNAL(activated(int)), receiver, SLOT(slotFunctionChanged()));
45 return funcCombo;
46}
47
48//---------------------------------------------------------------------------
49
50QWidget *NumericRuleWidgetHandler::createValueWidget(int number, QStackedWidget *valueStack, const QObject *receiver) const
51{
52 if (number != 0) {
53 return nullptr;
54 }
55
56 auto numInput = new QSpinBox(valueStack);
57 numInput->setObjectName(QLatin1StringView("QSpinBox"));
58 QObject::connect(numInput, SIGNAL(valueChanged(int)), receiver, SLOT(slotValueChanged()));
59 return numInput;
60}
61
62//---------------------------------------------------------------------------
63
64SearchRule::Function NumericRuleWidgetHandler::currentFunction(const QStackedWidget *functionStack) const
65{
66 const auto funcCombo = functionStack->findChild<QComboBox *>(QStringLiteral("numericRuleFuncCombo"));
67
68 if (funcCombo && funcCombo->currentIndex() >= 0) {
69 return NumericFunctions[funcCombo->currentIndex()].id;
70 }
71
72 return SearchRule::FuncNone;
73}
74
75//---------------------------------------------------------------------------
76
77SearchRule::Function NumericRuleWidgetHandler::function(const QByteArray &field, const QStackedWidget *functionStack) const
78{
79 if (!handlesField(field)) {
80 return SearchRule::FuncNone;
81 }
82
83 return currentFunction(functionStack);
84}
85
86//---------------------------------------------------------------------------
87
88QString NumericRuleWidgetHandler::currentValue(const QStackedWidget *valueStack) const
89{
90 const QSpinBox *numInput = valueStack->findChild<QSpinBox *>(QStringLiteral("QSpinBox"));
91
92 if (numInput) {
93 return QString::number(numInput->value());
94 }
95
96 return {};
97}
98
99//---------------------------------------------------------------------------
100
101QString NumericRuleWidgetHandler::value(const QByteArray &field, const QStackedWidget *, const QStackedWidget *valueStack) const
102{
103 if (!handlesField(field)) {
104 return {};
105 }
106
107 return currentValue(valueStack);
108}
109
110//---------------------------------------------------------------------------
111
112QString NumericRuleWidgetHandler::prettyValue(const QByteArray &field, const QStackedWidget *, const QStackedWidget *valueStack) const
113{
114 if (!handlesField(field)) {
115 return {};
116 }
117
118 return currentValue(valueStack);
119}
120
121//---------------------------------------------------------------------------
122
123bool NumericRuleWidgetHandler::handlesField(const QByteArray &field) const
124{
125 return field == "<age in days>";
126}
127
128//---------------------------------------------------------------------------
129
130void NumericRuleWidgetHandler::reset(QStackedWidget *functionStack, QStackedWidget *valueStack) const
131{
132 // reset the function combo box
133 const auto funcCombo = functionStack->findChild<QComboBox *>(QStringLiteral("numericRuleFuncCombo"));
134
135 if (funcCombo) {
136 funcCombo->blockSignals(true);
137 funcCombo->setCurrentIndex(0);
138 funcCombo->blockSignals(false);
139 }
140
141 // reset the value widget
142 auto numInput = valueStack->findChild<QSpinBox *>(QStringLiteral("QSpinBox"));
143
144 if (numInput) {
145 numInput->blockSignals(true);
146 numInput->setValue(0);
147 numInput->blockSignals(false);
148 }
149}
150
151//---------------------------------------------------------------------------
152
153void initNumInput(QSpinBox *numInput, const QByteArray &field)
154{
155 if (field == "<age in days>") {
156 numInput->setMinimum(-10000);
157#if KI18N_VERSION > QT_VERSION_CHECK(6, 5, 0)
158 KLocalization::setupSpinBoxFormatString(numInput, ki18ncp("Unit suffix where units are days.", "%v day", "%v days"));
159#endif
160 }
161}
162
163//---------------------------------------------------------------------------
164
165bool NumericRuleWidgetHandler::setRule(QStackedWidget *functionStack, QStackedWidget *valueStack, const SearchRule::Ptr rule, bool /*isBalooSearch*/) const
166{
167 if (!rule || !handlesField(rule->field())) {
168 reset(functionStack, valueStack);
169 return false;
170 }
171
172 // set the function
173 const SearchRule::Function func = rule->function();
174 int funcIndex = 0;
175 for (; funcIndex < NumericFunctionCount; ++funcIndex) {
176 if (func == NumericFunctions[funcIndex].id) {
177 break;
178 }
179 }
180
181 const auto funcCombo = functionStack->findChild<QComboBox *>(QStringLiteral("numericRuleFuncCombo"));
182
183 if (funcCombo) {
184 funcCombo->blockSignals(true);
185 if (funcIndex < NumericFunctionCount) {
186 funcCombo->setCurrentIndex(funcIndex);
187 } else {
188 funcCombo->setCurrentIndex(0);
189 }
190 funcCombo->blockSignals(false);
191 functionStack->setCurrentWidget(funcCombo);
192 }
193
194 // set the value
195 bool ok;
196 int value = rule->contents().toInt(&ok);
197 if (!ok) {
198 value = 0;
199 }
200
201 auto numInput = valueStack->findChild<QSpinBox *>(QStringLiteral("QSpinBox"));
202
203 if (numInput) {
204 initNumInput(numInput, rule->field());
205 numInput->blockSignals(true);
206 numInput->setValue(value);
207 numInput->blockSignals(false);
208 valueStack->setCurrentWidget(numInput);
209 }
210 return true;
211}
212
213//---------------------------------------------------------------------------
214
215bool NumericRuleWidgetHandler::update(const QByteArray &field, QStackedWidget *functionStack, QStackedWidget *valueStack) const
216{
217 if (!handlesField(field)) {
218 return false;
219 }
220
221 // raise the correct function widget
222 functionStack->setCurrentWidget(functionStack->findChild<QWidget *>(QStringLiteral("numericRuleFuncCombo")));
223
224 // raise the correct value widget
225 auto numInput = valueStack->findChild<QSpinBox *>(QStringLiteral("QSpinBox"));
226
227 if (numInput) {
228 initNumInput(numInput, field);
229 valueStack->setCurrentWidget(numInput);
230 }
231 return true;
232}
QString toString() const
std::shared_ptr< SearchRule > Ptr
Defines a pointer to a search rule.
Definition searchrule.h:29
Function
Describes operators for comparison of field and contents.
Definition searchrule.h:40
KLocalizedString KI18N_EXPORT ki18ncp(const char *context, const char *singular, const char *plural)
void setupSpinBoxFormatString(T *spinBox, const KLocalizedString &formatString)
The filter dialog.
bool blockSignals(bool block)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
T findChild(const QString &name, Qt::FindChildOptions options) const const
void setMinimum(int min)
void setCurrentWidget(QWidget *widget)
QString number(double n, char format, int precision)
int toInt(bool *ok, int base) const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Fri Oct 11 2024 12:18:39 by doxygen 1.12.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.