7 #include "sieveconditionwidgetlister.h" 8 #include "autocreatescriptdialog.h" 9 #include "autocreatescriptutil_p.h" 10 #include "commonwidgets/sievehelpbutton.h" 11 #include "libksieve_debug.h" 12 #include "sieveconditions/sievecondition.h" 13 #include "sieveconditions/sieveconditionlist.h" 14 #include "sieveeditorgraphicalmodewidget.h" 16 #include <KLocalizedString> 20 #include <QPushButton> 23 #include "sievescriptdescriptiondialog.h" 24 #include <QGridLayout> 30 static const int MINIMUMCONDITION = 1;
31 static const int MAXIMUMCONDITION = 8;
33 SieveConditionWidget::SieveConditionWidget(SieveEditorGraphicalModeWidget *sieveGraphicalModeWidget,
QWidget *parent)
35 , mSieveGraphicalModeWidget(sieveGraphicalModeWidget)
40 SieveConditionWidget::~SieveConditionWidget()
42 qDeleteAll(mConditionList);
43 mConditionList.clear();
46 void SieveConditionWidget::setFilterCondition(
QWidget *widget)
48 if (mLayout->itemAtPosition(1, 3)) {
49 delete mLayout->itemAtPosition(1, 3)->widget();
53 mLayout->addWidget(widget, 1, 3);
55 mLayout->addWidget(
new QLabel(
i18n(
"Please select an condition."),
this), 1, 3);
59 void SieveConditionWidget::generatedScript(
QString &script,
QStringList &required,
bool inForEveryPartLoop)
61 Q_UNUSED(inForEveryPartLoop)
62 const
int index = mComboBox->currentIndex();
63 if (index != mComboBox->count() - 1) {
64 KSieveUi::SieveCondition *widgetCondition = mConditionList.at(mComboBox->currentIndex());
65 QWidget *currentWidget = mLayout->itemAtPosition(1, 3)->widget();
66 const QStringList lstRequires = widgetCondition->needRequires(currentWidget);
67 for (
const QString &r : lstRequires) {
72 script += mConditionList.
at(mComboBox->currentIndex())->code(currentWidget) +
QLatin1Char(
'\n');
76 void SieveConditionWidget::initWidget()
79 mLayout->setContentsMargins({});
83 mComboBox->setEditable(
false);
89 for (index = 0, it = list.
constBegin(); it !=
end; ++it, ++index) {
90 if ((*it)->needCheckIfServerHasCapability()) {
91 if (mSieveGraphicalModeWidget->sieveCapabilities().contains((*it)->serverNeedsCapability())) {
93 mConditionList.append(*it);
94 connect(*it, &SieveCondition::valueChanged,
this, &SieveConditionWidget::valueChanged);
96 mComboBox->addItem((*it)->label(), (*it)->name());
102 mConditionList.append(*it);
103 connect(*it, &SieveCondition::valueChanged,
this, &SieveConditionWidget::valueChanged);
105 mComboBox->addItem((*it)->label(), (*it)->name());
109 mHelpButton =
new SieveHelpButton(
this);
110 mLayout->addWidget(mHelpButton, 1, 0);
111 connect(mHelpButton, &SieveHelpButton::clicked,
this, &SieveConditionWidget::slotHelp);
114 mCommentButton->setToolTip(
i18n(
"Add comment"));
115 mLayout->addWidget(mCommentButton, 1, 1);
116 mCommentButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"view-pim-notes")));
120 mLayout->addWidget(mComboBox, 1, 2);
123 mComboBox->setMaxCount(mComboBox->count());
126 mComboBox->adjustSize();
136 mLayout->addWidget(mAdd, 1, 4);
137 mLayout->addWidget(mRemove, 1, 5);
140 setFocusProxy(mComboBox);
148 void SieveConditionWidget::slotAddComment()
150 const int index = mComboBox->currentIndex();
151 if (index < mConditionList.count()) {
152 KSieveUi::SieveCondition *condition = mConditionList.
at(index);
153 const QString comment = condition->comment();
155 dlg->setDescription(comment);
157 condition->setComment(dlg->description());
164 void SieveConditionWidget::slotHelp()
166 const int index = mComboBox->currentIndex();
167 if (index < mConditionList.count()) {
168 KSieveUi::SieveCondition *condition = mConditionList.at(index);
170 const QUrl href = condition->href();
171 const QString fullWhatsThis = AutoCreateScriptUtil::createFullWhatsThis(help, href.
toString());
176 void SieveConditionWidget::slotConditionChanged(
int index)
178 if (index < mConditionList.count()) {
179 KSieveUi::SieveCondition *condition = mConditionList.at(index);
180 mHelpButton->setEnabled(!condition->help().isEmpty());
181 setFilterCondition(condition->createParamWidget(
this));
182 mCommentButton->setEnabled(
true);
184 setFilterCondition(
nullptr);
185 mHelpButton->setEnabled(
false);
186 mCommentButton->setEnabled(
false);
191 void SieveConditionWidget::slotAddWidget()
197 void SieveConditionWidget::slotRemoveWidget()
199 Q_EMIT removeWidget(
this);
203 void SieveConditionWidget::clear()
205 mComboBox->setCurrentIndex(mComboBox->count() - 1);
206 setFilterCondition(
nullptr);
207 mHelpButton->setEnabled(
false);
208 mCommentButton->setEnabled(
false);
211 void SieveConditionWidget::updateAddRemoveButton(
bool addButtonEnabled,
bool removeButtonEnabled)
213 mAdd->setEnabled(addButtonEnabled);
214 mRemove->setEnabled(removeButtonEnabled);
219 const int index = mComboBox->findData(conditionName);
221 mComboBox->setCurrentIndex(index);
222 slotConditionChanged(index);
223 KSieveUi::SieveCondition *condition = mConditionList.at(index);
224 condition->setParamWidgetValue(element,
this, notCondition, error);
226 error +=
i18n(
"Script contains unsupported feature \"%1\"", conditionName) +
QLatin1Char(
'\n');
227 qCDebug(LIBKSIEVE_LOG) <<
"Condition " << conditionName <<
" not supported";
232 SieveConditionWidgetLister::SieveConditionWidgetLister(SieveEditorGraphicalModeWidget *sieveGraphicalModeWidget,
QWidget *
parent)
233 :
KPIM::KWidgetLister(false, MINIMUMCONDITION, MAXIMUMCONDITION, parent)
234 , mSieveGraphicalModeWidget(sieveGraphicalModeWidget)
237 updateAddRemoveButton();
240 SieveConditionWidgetLister::~SieveConditionWidgetLister()
244 void SieveConditionWidgetLister::slotAddWidget(
QWidget *w)
246 addWidgetAfterThisWidget(w);
247 updateAddRemoveButton();
250 void SieveConditionWidgetLister::slotRemoveWidget(
QWidget *w)
253 updateAddRemoveButton();
256 void SieveConditionWidgetLister::updateAddRemoveButton()
259 const int numberOfWidget(widgetList.
count());
260 bool addButtonEnabled =
false;
261 bool removeButtonEnabled =
false;
262 if (numberOfWidget <= widgetsMinimum()) {
263 addButtonEnabled =
true;
264 removeButtonEnabled =
false;
265 }
else if (numberOfWidget >= widgetsMaximum()) {
266 addButtonEnabled =
false;
267 removeButtonEnabled =
true;
269 addButtonEnabled =
true;
270 removeButtonEnabled =
true;
274 for (; wIt != wEnd; ++wIt) {
276 w->updateAddRemoveButton(addButtonEnabled, removeButtonEnabled);
280 void SieveConditionWidgetLister::reconnectWidget(SieveConditionWidget *w)
287 void SieveConditionWidgetLister::clearWidget(
QWidget *aWidget)
290 auto widget =
static_cast<SieveConditionWidget *
>(aWidget);
298 auto w =
new SieveConditionWidget(mSieveGraphicalModeWidget, parent);
303 void SieveConditionWidgetLister::generatedScript(
QString &script,
int &numberOfCondition,
QStringList &requireModules,
bool inForEveryPartLoop)
308 bool wasFirst =
true;
309 for (; wIt != wEnd; ++wIt) {
312 w->generatedScript(condition, requireModules, inForEveryPartLoop);
315 if (inForEveryPartLoop) {
316 script += AutoCreateScriptUtil::indentation();
327 int SieveConditionWidgetLister::conditionNumber()
const 329 return widgets().
count();
339 auto w =
qobject_cast<SieveConditionWidget *>(widgets().constLast());
340 w->setCondition(conditionName, element, notCondition, error);
347 void SieveConditionWidgetLister::loadScript(
QXmlStreamReader &element,
bool uniqTest,
bool notCondition,
QString &error)
350 loadTest(element, notCondition, error);
352 bool firstCondition =
true;
364 if (firstCondition) {
365 firstCondition =
false;
367 addWidgetAfterThisWidget(widgets().constLast());
369 auto w =
qobject_cast<SieveConditionWidget *>(widgets().constLast());
376 w->setCondition(conditionName, element, notCondition, error);
379 notCondition =
false;
380 w->setCondition(conditionName, element, notCondition, error);
387 qDebug() <<
"Need to implement comment here ";
392 qCDebug(LIBKSIEVE_LOG) <<
" SieveConditionWidgetLister::loadScript unknown condition tag: " << testTagName;
void showText(const QPoint &pos, const QString &text, QWidget *w)
bool readNextStartElement()
QString toString() const const
const T & at(int i) const const
bool contains(const QString &str, Qt::CaseSensitivity cs) const const
QStringRef value(const QString &namespaceUri, const QString &name) const const
QString toString(QUrl::FormattingOptions options) const const
void skipCurrentElement()
int count(const T &value) const const
void append(const T &value)
const QList< QKeySequence > & help()
bool isEmpty() const const
void activated(int index)
bool hasAttribute(const QString &qualifiedName) const const
QString i18n(const char *text, const TYPE &arg...)
const QList< QKeySequence > & end()
const QChar at(int position) const const
QXmlStreamAttributes attributes() const const
QIcon fromTheme(const QString &name)
QList::const_iterator constEnd() const const
QList::const_iterator constBegin() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
T qobject_cast(QObject *object)
QObject * parent() const const
QStringRef name() const const
KIOFILEWIDGETS_EXPORT QStringList list(const QString &fileClass)