7#include "sieveconditionwidgetlister.h"
8#include "autocreatescriptutil_p.h"
9#include "commonwidgets/sievehelpbutton.h"
10#include "libksieveui_debug.h"
11#include "sieveconditions/sievecondition.h"
12#include "sieveconditions/sieveconditionlist.h"
13#include "sieveeditorgraphicalmodewidget.h"
15#include <KLocalizedString>
22#include "sievescriptdescriptiondialog.h"
27using namespace KSieveUi;
29static const int MINIMUMCONDITION = 1;
30static const int MAXIMUMCONDITION = 8;
32SieveConditionWidget::SieveConditionWidget(SieveEditorGraphicalModeWidget *sieveGraphicalModeWidget,
QWidget *parent)
34 , mSieveGraphicalModeWidget(sieveGraphicalModeWidget)
39SieveConditionWidget::~SieveConditionWidget()
41 qDeleteAll(mConditionList);
42 mConditionList.clear();
45void SieveConditionWidget::setFilterCondition(QWidget *widget)
47 if (mLayout->itemAtPosition(1, 3)) {
48 delete mLayout->itemAtPosition(1, 3)->widget();
52 mLayout->addWidget(widget, 1, 3);
54 mLayout->addWidget(
new QLabel(
i18nc(
"@label:textbox",
"Please select an condition."),
this), 1, 3);
58void SieveConditionWidget::generatedScript(QString &script, QStringList &required,
bool inForEveryPartLoop)
60 Q_UNUSED(inForEveryPartLoop)
61 const int index = mComboBox->currentIndex();
62 if (index != mComboBox->count() - 1) {
63 KSieveUi::SieveCondition *widgetCondition = mConditionList.at(mComboBox->currentIndex());
64 QWidget *currentWidget = mLayout->itemAtPosition(1, 3)->widget();
65 const QStringList lstRequires = widgetCondition->needRequires(currentWidget);
66 for (
const QString &r : lstRequires) {
71 script += mConditionList.
at(mComboBox->currentIndex())->code(currentWidget) + QLatin1Char(
'\n');
75void SieveConditionWidget::initWidget()
77 mLayout =
new QGridLayout(
this);
78 mLayout->setContentsMargins({});
80 mComboBox =
new QComboBox;
81 mComboBox->setMinimumWidth(50);
82 mComboBox->setEditable(
false);
84 const QList<KSieveUi::SieveCondition *>
list = KSieveUi::SieveConditionList::conditionList(mSieveGraphicalModeWidget);
85 for (
const auto &action : list) {
86 if (action->needCheckIfServerHasCapability()) {
87 if (mSieveGraphicalModeWidget->sieveCapabilities().contains(action->serverNeedsCapability())) {
89 mConditionList.append(action);
90 connect(action, &SieveCondition::valueChanged,
this, &SieveConditionWidget::valueChanged);
92 mComboBox->addItem(action->label(), action->name());
98 mConditionList.append(action);
99 connect(action, &SieveCondition::valueChanged,
this, &SieveConditionWidget::valueChanged);
101 mComboBox->addItem(action->label(), action->name());
105 mHelpButton =
new SieveHelpButton(
this);
106 mLayout->addWidget(mHelpButton, 1, 0);
109 mCommentButton =
new QToolButton(
this);
110 mCommentButton->setToolTip(
i18nc(
"@info:tooltip",
"Add comment"));
111 mLayout->addWidget(mCommentButton, 1, 1);
112 mCommentButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"view-pim-notes")));
115 mComboBox->addItem(QLatin1StringView(
""));
116 mLayout->addWidget(mComboBox, 1, 2);
119 mComboBox->setMaxCount(mComboBox->count());
122 mComboBox->adjustSize();
124 mAdd =
new QPushButton(
this);
128 mRemove =
new QPushButton(
this);
132 mLayout->addWidget(mAdd, 1, 4);
133 mLayout->addWidget(mRemove, 1, 5);
144void SieveConditionWidget::slotAddComment()
146 const int index = mComboBox->currentIndex();
147 if (index < mConditionList.count()) {
148 KSieveUi::SieveCondition *condition = mConditionList.at(index);
149 const QString comment = condition->comment();
150 QPointer<SieveScriptDescriptionDialog> dlg =
new SieveScriptDescriptionDialog(
this);
151 dlg->setDescription(comment);
153 condition->setComment(dlg->description());
160void SieveConditionWidget::slotHelp()
162 const int index = mComboBox->currentIndex();
163 if (index < mConditionList.count()) {
164 KSieveUi::SieveCondition *condition = mConditionList.at(index);
165 const QString
help = condition->help();
166 const QUrl href = condition->href();
167 const QString fullWhatsThis = AutoCreateScriptUtil::createFullWhatsThis(help, href.
toString());
172void SieveConditionWidget::slotConditionChanged(
int index)
174 if (index < mConditionList.count()) {
175 KSieveUi::SieveCondition *condition = mConditionList.at(index);
176 mHelpButton->setEnabled(!condition->help().
isEmpty());
177 setFilterCondition(condition->createParamWidget(
this));
178 mCommentButton->setEnabled(
true);
180 setFilterCondition(
nullptr);
181 mHelpButton->setEnabled(
false);
182 mCommentButton->setEnabled(
false);
187void SieveConditionWidget::slotAddWidget()
193void SieveConditionWidget::slotRemoveWidget()
195 Q_EMIT removeWidget(
this);
199void SieveConditionWidget::clear()
201 mComboBox->setCurrentIndex(mComboBox->count() - 1);
202 setFilterCondition(
nullptr);
203 mHelpButton->setEnabled(
false);
204 mCommentButton->setEnabled(
false);
207void SieveConditionWidget::updateAddRemoveButton(
bool addButtonEnabled,
bool removeButtonEnabled)
209 mAdd->setEnabled(addButtonEnabled);
210 mRemove->setEnabled(removeButtonEnabled);
213void SieveConditionWidget::setCondition(
const QString &conditionName, QXmlStreamReader &element,
bool notCondition, QString &error)
215 const int index = mComboBox->findData(conditionName);
217 mComboBox->setCurrentIndex(index);
218 slotConditionChanged(index);
219 KSieveUi::SieveCondition *condition = mConditionList.at(index);
220 condition->setParamWidgetValue(element,
this, notCondition, error);
222 error +=
i18n(
"Script contains unsupported feature \"%1\"", conditionName) + QLatin1Char(
'\n');
223 qCDebug(LIBKSIEVEUI_LOG) <<
"Condition " << conditionName <<
" not supported";
228SieveConditionWidgetLister::SieveConditionWidgetLister(SieveEditorGraphicalModeWidget *sieveGraphicalModeWidget, QWidget *parent)
229 : KPIM::KWidgetLister(false, MINIMUMCONDITION, MAXIMUMCONDITION, parent)
230 , mSieveGraphicalModeWidget(sieveGraphicalModeWidget)
233 updateAddRemoveButton();
236SieveConditionWidgetLister::~SieveConditionWidgetLister() =
default;
238void SieveConditionWidgetLister::slotAddWidget(
QWidget *w)
241 updateAddRemoveButton();
244void SieveConditionWidgetLister::slotRemoveWidget(QWidget *w)
247 updateAddRemoveButton();
250void SieveConditionWidgetLister::updateAddRemoveButton()
252 QList<QWidget *> widgetList =
widgets();
253 const int numberOfWidget(widgetList.
count());
254 bool addButtonEnabled =
false;
255 bool removeButtonEnabled =
false;
257 addButtonEnabled =
true;
258 removeButtonEnabled =
false;
260 addButtonEnabled =
false;
261 removeButtonEnabled =
true;
263 addButtonEnabled =
true;
264 removeButtonEnabled =
true;
268 for (; wIt != wEnd; ++wIt) {
270 w->updateAddRemoveButton(addButtonEnabled, removeButtonEnabled);
274void SieveConditionWidgetLister::reconnectWidget(SieveConditionWidget *w)
281void SieveConditionWidgetLister::clearWidget(QWidget *aWidget)
284 auto widget =
static_cast<SieveConditionWidget *
>(aWidget);
286 updateAddRemoveButton();
291QWidget *SieveConditionWidgetLister::createWidget(QWidget *parent)
293 auto w =
new SieveConditionWidget(mSieveGraphicalModeWidget,
parent);
298void SieveConditionWidgetLister::generatedScript(QString &script,
int &numberOfCondition, QStringList &requireModules,
bool inForEveryPartLoop)
300 const QList<QWidget *> widgetList =
widgets();
303 bool wasFirst =
true;
304 for (; wIt != wEnd; ++wIt) {
307 w->generatedScript(condition, requireModules, inForEveryPartLoop);
310 if (inForEveryPartLoop) {
311 script += AutoCreateScriptUtil::indentation();
313 script += QLatin1StringView(
", ");
322int SieveConditionWidgetLister::conditionNumber()
const
327void SieveConditionWidgetLister::loadTest(QXmlStreamReader &element,
bool notCondition, QString &error)
335 w->setCondition(conditionName, element, notCondition, error);
342void SieveConditionWidgetLister::loadScript(QXmlStreamReader &element,
bool uniqTest,
bool notCondition, QString &error)
345 loadTest(element, notCondition, error);
347 bool firstCondition =
true;
352 const QStringView tagName = element.
name();
353 if (tagName == QLatin1StringView(
"testlist")) {
355 const QStringView testTagName = element.
name();
356 if (testTagName == QLatin1StringView(
"test")) {
359 if (firstCondition) {
360 firstCondition =
false;
365 if (conditionName == QLatin1StringView(
"not")) {
371 w->setCondition(conditionName, element, notCondition, error);
374 notCondition =
false;
375 w->setCondition(conditionName, element, notCondition, error);
378 }
else if (testTagName == QLatin1StringView(
"crlf")) {
381 }
else if (testTagName == QLatin1StringView(
"comment")) {
382 qDebug() <<
"Need to implement comment here ";
387 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveConditionWidgetLister::loadScript unknown condition tag: " << testTagName;
395#include "moc_sieveconditionwidgetlister.cpp"
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
KIOCORE_EXPORT QStringList list(const QString &fileClass)
void activated(int index)
QIcon fromTheme(const QString &name)
void append(QList< T > &&value)
const_iterator constBegin() const const
const_iterator constEnd() const const
qsizetype count() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QObject * parent() const const
T qobject_cast(QObject *object)
const QChar at(qsizetype position) const const
bool isEmpty() const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QString toString() const const
QString toString(FormattingOptions options) const const
void showText(const QPoint &pos, const QString &text, QWidget *w)
bool hasAttribute(QAnyStringView namespaceUri, QAnyStringView name) const const
QStringView value(QAnyStringView namespaceUri, QAnyStringView name) const const
QXmlStreamAttributes attributes() const const
QStringView name() const const
bool readNextStartElement()
void skipCurrentElement()