7#include "tagrulewidgethandler.h"
8#include "mailcommon_debug.h"
12#include <KLocalizedString>
16#include <Akonadi/TagAttribute>
17#include <Akonadi/TagFetchJob>
18#include <Akonadi/TagFetchScope>
20#include <KLazyLocalizedString>
23#include <QStackedWidget>
26class FillTagComboJob :
public KJob
30 explicit FillTagComboJob(QComboBox *combo,
QObject *
parent =
nullptr);
31 void start()
override;
35 void onTagsFetched(
KJob *);
38 QComboBox *mComboBox =
nullptr;
48void FillTagComboJob::onDestroyed()
52 qCDebug(MAILCOMMON_LOG) <<
"Combobox destroyed";
56void FillTagComboJob::start()
58 auto fetchJob =
new Akonadi::TagFetchJob(
this);
59 fetchJob->fetchScope().fetchAttribute<Akonadi::TagAttribute>();
63void FillTagComboJob::onTagsFetched(
KJob *job)
71 qCDebug(MAILCOMMON_LOG) <<
"combobox already destroyed";
75 auto fetchJob =
static_cast<Akonadi::TagFetchJob *
>(job);
76 const auto lst = fetchJob->tags();
77 for (
const Akonadi::Tag &tag : lst) {
78 QString iconName = QStringLiteral(
"mail-tagged");
79 const auto attr = tag.attribute<Akonadi::TagAttribute>();
81 if (!attr->iconName().isEmpty()) {
82 iconName = attr->iconName();
93} TagFunctions[] = {{SearchRule::FuncContains, kli18n(
"contains")},
94 {SearchRule::FuncContainsNot, kli18n(
"does not contain")},
95 {SearchRule::FuncEquals, kli18n(
"equals")},
96 {SearchRule::FuncNotEqual, kli18n(
"does not equal")},
97 {SearchRule::FuncRegExp, kli18n(
"matches regular expr.")},
98 {SearchRule::FuncNotRegExp, kli18n(
"does not match reg. expr.")}};
99static const int TagFunctionCount =
sizeof(TagFunctions) /
sizeof(*TagFunctions);
103QWidget *TagRuleWidgetHandler::createFunctionWidget(
int number,
QStackedWidget *functionStack,
const QObject *receiver,
bool isBalooSearch)
const
109 const auto funcCombo =
new QComboBox(functionStack);
110 funcCombo->setMinimumWidth(50);
111 funcCombo->setObjectName(QLatin1StringView(
"tagRuleFuncCombo"));
112 for (
int i = 0; i < TagFunctionCount; ++i) {
114 if (TagFunctions[i].
id == SearchRule::FuncContains || TagFunctions[i].
id == SearchRule::FuncContainsNot) {
115 funcCombo->addItem(TagFunctions[i].displayName.
toString());
118 funcCombo->addItem(TagFunctions[i].displayName.
toString());
121 funcCombo->adjustSize();
122 QObject::connect(funcCombo, SIGNAL(activated(
int)), receiver, SLOT(slotFunctionChanged()));
128QWidget *TagRuleWidgetHandler::createValueWidget(
int number, QStackedWidget *valueStack,
const QObject *receiver)
const
131 auto lineEdit =
new KLineEdit(valueStack);
132 lineEdit->setClearButtonEnabled(
true);
133 lineEdit->setTrapReturnKey(
true);
134 lineEdit->setObjectName(QLatin1StringView(
"tagRuleRegExpLineEdit"));
135 QObject::connect(lineEdit, SIGNAL(textChanged(QString)), receiver, SLOT(slotValueChanged()));
136 QObject::connect(lineEdit, SIGNAL(returnPressed()), receiver, SLOT(slotReturnPressed()));
141 const auto valueCombo =
new QComboBox(valueStack);
142 valueCombo->setMinimumWidth(50);
143 valueCombo->setObjectName(QLatin1StringView(
"tagRuleValueCombo"));
144 valueCombo->setEditable(
true);
145 valueCombo->addItem(QString());
147 auto job =
new FillTagComboJob(valueCombo);
150 valueCombo->adjustSize();
151 QObject::connect(valueCombo, SIGNAL(activated(
int)), receiver, SLOT(slotValueChanged()));
160SearchRule::Function TagRuleWidgetHandler::function(
const QByteArray &field,
const QStackedWidget *functionStack)
const
162 if (!handlesField(field)) {
163 return SearchRule::FuncNone;
166 const auto funcCombo = functionStack->
findChild<QComboBox *>(QStringLiteral(
"tagRuleFuncCombo"));
168 if (funcCombo && funcCombo->currentIndex() >= 0) {
169 return TagFunctions[funcCombo->currentIndex()].id;
171 return SearchRule::FuncNone;
176QString TagRuleWidgetHandler::value(
const QByteArray &field,
const QStackedWidget *functionStack,
const QStackedWidget *valueStack)
const
178 if (!handlesField(field)) {
183 if (func == SearchRule::FuncRegExp || func == SearchRule::FuncNotRegExp) {
185 const KLineEdit *lineEdit = valueStack->
findChild<KLineEdit *>(QStringLiteral(
"tagRuleRegExpLineEdit"));
188 return lineEdit->
text();
195 const auto tagCombo = valueStack->
findChild<QComboBox *>(QStringLiteral(
"tagRuleValueCombo"));
198 return tagCombo->itemData(tagCombo->currentIndex()).toString();
206QString TagRuleWidgetHandler::prettyValue(
const QByteArray &field,
const QStackedWidget *funcStack,
const QStackedWidget *valueStack)
const
208 return value(field, funcStack, valueStack);
213bool TagRuleWidgetHandler::handlesField(
const QByteArray &field)
const
215 return field ==
"<tag>";
220void TagRuleWidgetHandler::reset(QStackedWidget *functionStack, QStackedWidget *valueStack)
const
223 const auto funcCombo = functionStack->
findChild<QComboBox *>(QStringLiteral(
"tagRuleFuncCombo"));
226 funcCombo->blockSignals(
true);
227 funcCombo->setCurrentIndex(0);
228 funcCombo->blockSignals(
false);
232 auto lineEdit = valueStack->
findChild<KLineEdit *>(QStringLiteral(
"tagRuleRegExpLineEdit"));
243 const auto tagCombo = valueStack->
findChild<QComboBox *>(QStringLiteral(
"tagRuleValueCombo"));
245 tagCombo->blockSignals(
true);
246 tagCombo->setCurrentIndex(0);
247 tagCombo->blockSignals(
false);
253bool TagRuleWidgetHandler::setRule(QStackedWidget *functionStack, QStackedWidget *valueStack,
const SearchRule::Ptr rule,
bool isBalooSearch)
const
255 if (!rule || !handlesField(rule->field())) {
256 reset(functionStack, valueStack);
264 if (func != SearchRule::FuncContains && func != SearchRule::FuncContainsNot) {
265 reset(functionStack, valueStack);
271 for (; funcIndex < TagFunctionCount; ++funcIndex) {
272 if (func == TagFunctions[funcIndex].
id) {
277 const auto funcCombo = functionStack->
findChild<QComboBox *>(QStringLiteral(
"tagRuleFuncCombo"));
280 funcCombo->blockSignals(
true);
281 if (funcIndex < TagFunctionCount) {
282 funcCombo->setCurrentIndex(funcIndex);
284 funcCombo->setCurrentIndex(0);
286 funcCombo->blockSignals(
false);
291 if (func == SearchRule::FuncRegExp || func == SearchRule::FuncNotRegExp) {
293 auto lineEdit = valueStack->
findChild<KLineEdit *>(QStringLiteral(
"tagRuleRegExpLineEdit"));
297 lineEdit->
setText(rule->contents());
305 const auto tagCombo = valueStack->
findChild<QComboBox *>(QStringLiteral(
"tagRuleValueCombo"));
308 tagCombo->blockSignals(
true);
311 for (
int i = 1; i < tagCombo->count(); i++) {
312 if (rule->contents() == tagCombo->itemData(i).toString()) {
313 tagCombo->setCurrentIndex(i);
319 tagCombo->setCurrentIndex(0);
321 QLineEdit *lineEdit = tagCombo->lineEdit();
323 lineEdit->
setText(rule->contents());
326 tagCombo->blockSignals(
false);
335bool TagRuleWidgetHandler::update(
const QByteArray &field, QStackedWidget *functionStack, QStackedWidget *valueStack)
const
337 if (!handlesField(field)) {
346 if (func == SearchRule::FuncRegExp || func == SearchRule::FuncNotRegExp) {
355#include "tagrulewidgethandler.moc"
virtual QString errorString() const
void setError(int errorCode)
virtual Q_SCRIPTABLE void start()=0
KJob(QObject *parent=nullptr)
virtual void setText(const QString &)
std::shared_ptr< SearchRule > Ptr
Defines a pointer to a search rule.
Function
Describes operators for comparison of field and contents.
QIcon fromTheme(const QString &name)
QString name() const const
bool blockSignals(bool block)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void destroyed(QObject *obj)
T findChild(const QString &name, Qt::FindChildOptions options) const const
QObject * parent() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)