Mailcommon

daterulewidgethandler.cpp
1 /*
2  SPDX-FileCopyrightText: 2013-2023 Laurent Montel <[email protected]>
3 
4  SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "daterulewidgethandler.h"
8 
9 #include <KDateComboBox>
10 #include <KLocalizedString>
11 
12 #include <KLazyLocalizedString>
13 #include <QComboBox>
14 #include <QDate>
15 #include <QObject>
16 #include <QStackedWidget>
17 using namespace MailCommon;
18 
19 static const struct {
21  const KLazyLocalizedString displayName;
22 } DateFunctions[] = {{SearchRule::FuncEquals, kli18n("is equal to")},
23  {SearchRule::FuncNotEqual, kli18n("is not equal to")},
24  {SearchRule::FuncIsGreater, kli18n("is after")},
25  {SearchRule::FuncIsLessOrEqual, kli18n("is before or equal to")},
26  {SearchRule::FuncIsLess, kli18n("is before")},
27  {SearchRule::FuncIsGreaterOrEqual, kli18n("is after or equal to")}};
28 static const int DateFunctionCount = sizeof(DateFunctions) / sizeof(*DateFunctions);
29 
30 //---------------------------------------------------------------------------
31 
32 QWidget *DateRuleWidgetHandler::createFunctionWidget(int number, QStackedWidget *functionStack, const QObject *receiver, bool /*isBalooSearch*/) const
33 {
34  if (number != 0) {
35  return nullptr;
36  }
37 
38  auto funcCombo = new QComboBox(functionStack);
39  funcCombo->setMinimumWidth(50);
40  funcCombo->setObjectName(QLatin1StringView("dateRuleFuncCombo"));
41  for (int i = 0; i < DateFunctionCount; ++i) {
42  funcCombo->addItem(DateFunctions[i].displayName.toString());
43  }
44  funcCombo->adjustSize();
45  QObject::connect(funcCombo, SIGNAL(activated(int)), receiver, SLOT(slotFunctionChanged()));
46  return funcCombo;
47 }
48 
49 //---------------------------------------------------------------------------
50 
51 QWidget *DateRuleWidgetHandler::createValueWidget(int number, QStackedWidget *valueStack, const QObject *receiver) const
52 {
53  if (number != 0) {
54  return nullptr;
55  }
56 
57  auto dateCombo = new KDateComboBox(valueStack);
58  dateCombo->setObjectName(QLatin1StringView("KDateComboBox"));
60  QObject::connect(dateCombo, SIGNAL(dateChanged(QDate)), receiver, SLOT(slotValueChanged()));
61  return dateCombo;
62 }
63 
64 //---------------------------------------------------------------------------
65 
66 SearchRule::Function DateRuleWidgetHandler::currentFunction(const QStackedWidget *functionStack) const
67 {
68  const auto funcCombo = functionStack->findChild<QComboBox *>(QStringLiteral("dateRuleFuncCombo"));
69 
70  if (funcCombo && funcCombo->currentIndex() >= 0) {
71  return DateFunctions[funcCombo->currentIndex()].id;
72  }
73 
74  return SearchRule::FuncNone;
75 }
76 
77 //---------------------------------------------------------------------------
78 
79 SearchRule::Function DateRuleWidgetHandler::function(const QByteArray &field, const QStackedWidget *functionStack) const
80 {
81  if (!handlesField(field)) {
82  return SearchRule::FuncNone;
83  }
84 
85  return currentFunction(functionStack);
86 }
87 
88 //---------------------------------------------------------------------------
89 
90 QString DateRuleWidgetHandler::currentValue(const QStackedWidget *valueStack) const
91 {
92  const KDateComboBox *dateInput = valueStack->findChild<KDateComboBox *>(QStringLiteral("KDateComboBox"));
93 
94  if (dateInput) {
95  return dateInput->date().toString(Qt::ISODate);
96  }
97 
98  return {};
99 }
100 
101 //---------------------------------------------------------------------------
102 
103 QString DateRuleWidgetHandler::value(const QByteArray &field, const QStackedWidget *, const QStackedWidget *valueStack) const
104 {
105  if (!handlesField(field)) {
106  return {};
107  }
108 
109  return currentValue(valueStack);
110 }
111 
112 //---------------------------------------------------------------------------
113 
114 QString DateRuleWidgetHandler::prettyValue(const QByteArray &field, const QStackedWidget *, const QStackedWidget *valueStack) const
115 {
116  if (!handlesField(field)) {
117  return {};
118  }
119 
120  return currentValue(valueStack);
121 }
122 
123 //---------------------------------------------------------------------------
124 
125 bool DateRuleWidgetHandler::handlesField(const QByteArray &field) const
126 {
127  return field == "<date>";
128 }
129 
130 //---------------------------------------------------------------------------
131 
132 void DateRuleWidgetHandler::reset(QStackedWidget *functionStack, QStackedWidget *valueStack) const
133 {
134  // reset the function combo box
135  const auto funcCombo = functionStack->findChild<QComboBox *>(QStringLiteral("dateRuleFuncCombo"));
136 
137  if (funcCombo) {
138  funcCombo->blockSignals(true);
139  funcCombo->setCurrentIndex(0);
140  funcCombo->blockSignals(false);
141  }
142 
143  // reset the value widget
144  auto dateInput = valueStack->findChild<KDateComboBox *>(QStringLiteral("KDateComboBox"));
145 
146  if (dateInput) {
147  dateInput->blockSignals(true);
148  dateInput->setDate(QDate::currentDate());
149  dateInput->blockSignals(false);
150  }
151 }
152 
153 //---------------------------------------------------------------------------
154 
155 bool DateRuleWidgetHandler::setRule(QStackedWidget *functionStack, QStackedWidget *valueStack, const SearchRule::Ptr rule, bool /*isBalooSearch*/) const
156 {
157  if (!rule || !handlesField(rule->field())) {
158  reset(functionStack, valueStack);
159  return false;
160  }
161 
162  // set the function
163  const SearchRule::Function func = rule->function();
164  int funcIndex = 0;
165  for (; funcIndex < DateFunctionCount; ++funcIndex) {
166  if (func == DateFunctions[funcIndex].id) {
167  break;
168  }
169  }
170 
171  const auto funcCombo = functionStack->findChild<QComboBox *>(QStringLiteral("dateRuleFuncCombo"));
172 
173  if (funcCombo) {
174  funcCombo->blockSignals(true);
175  if (funcIndex < DateFunctionCount) {
176  funcCombo->setCurrentIndex(funcIndex);
177  } else {
178  funcCombo->setCurrentIndex(0);
179  }
180  funcCombo->blockSignals(false);
181  functionStack->setCurrentWidget(funcCombo);
182  }
183 
184  // set the value
185  const QString value = rule->contents();
186 
187  auto dateInput = valueStack->findChild<KDateComboBox *>(QStringLiteral("KDateComboBox"));
188 
189  if (dateInput) {
190  dateInput->blockSignals(true);
191  dateInput->setDate(QDate::fromString(value, Qt::ISODate));
192  dateInput->blockSignals(false);
193  valueStack->setCurrentWidget(dateInput);
194  }
195  return true;
196 }
197 
198 //---------------------------------------------------------------------------
199 
200 bool DateRuleWidgetHandler::update(const QByteArray &field, QStackedWidget *functionStack, QStackedWidget *valueStack) const
201 {
202  if (!handlesField(field)) {
203  return false;
204  }
205 
206  // raise the correct function widget
207  functionStack->setCurrentWidget(functionStack->findChild<QWidget *>(QStringLiteral("dateRuleFuncCombo")));
208 
209  // raise the correct value widget
210  auto dateInput = valueStack->findChild<KDateComboBox *>(QStringLiteral("KDateComboBox"));
211 
212  if (dateInput) {
213  valueStack->setCurrentWidget(dateInput);
214  }
215  return true;
216 }
void setCurrentWidget(QWidget *widget)
std::shared_ptr< SearchRule > Ptr
Defines a pointer to a search rule.
Definition: searchrule.h:29
void setDate(const QDate &date)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString toString() const
bool blockSignals(bool block)
QDate currentDate()
QDate date() const
Function
Describes operators for comparison of field and contents.
Definition: searchrule.h:40
T findChild(const QString &name, Qt::FindChildOptions options) const const
QDate fromString(const QString &string, Qt::DateFormat format)
KGuiItem reset()
QString toString(Qt::DateFormat format) const const
The filter dialog.
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Wed Dec 6 2023 04:03:01 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.