7#include "sieveglobalvariablewidget.h"
8#include "autocreatescriptutil_p.h"
9#include "commonwidgets/sievehelpbutton.h"
10#include "editor/sieveeditorutil.h"
11#include "sievescriptblockwidget.h"
12#include "widgets/lineeditvalidator.h"
14#include <KLineEditEventHandler>
15#include <KLocalizedString>
20#include "libksieveui_debug.h"
26#include <QXmlStreamReader>
28using namespace KSieveUi;
29static const int MINIMUMGLOBALVARIABLEACTION = 1;
30static const int MAXIMUMGLOBALVARIABLEACTION = 15;
32SieveGlobalVariableActionWidget::SieveGlobalVariableActionWidget(
QWidget *parent)
38SieveGlobalVariableActionWidget::~SieveGlobalVariableActionWidget() =
default;
40void SieveGlobalVariableActionWidget::generatedScript(
QString &script)
42 const QString variableName = mVariableName->text();
43 if (variableName.trimmed().isEmpty()) {
46 script += QLatin1StringView(
"global ");
47 script += QStringLiteral(
"\"%1\";\n").
arg(variableName);
48 if (mSetValueTo->isChecked() && !mVariableValue->text().isEmpty()) {
49 script += QStringLiteral(
"set \"%1\" \"%2\";\n").
arg(variableName, mVariableValue->text());
53void SieveGlobalVariableActionWidget::initWidget()
55 mLayout =
new QGridLayout(
this);
56 mLayout->setContentsMargins({});
58 auto lab =
new QLabel(
i18nc(
"@label:textbox",
"Variable name:"),
this);
59 mLayout->addWidget(lab, 1, 0);
61 mVariableName =
new LineEditValidator(
this);
63 mLayout->addWidget(mVariableName, 1, 1);
65 mSetValueTo =
new QCheckBox(
i18nc(
"@option:check",
"Set value to:"),
this);
67 mLayout->addWidget(mSetValueTo, 1, 2);
68 mSetValueTo->setChecked(
false);
70 mVariableValue =
new QLineEdit(
this);
73 mVariableValue->setEnabled(
false);
74 mLayout->addWidget(mVariableValue, 1, 3);
78 mAdd =
new QPushButton(
this);
82 mRemove =
new QPushButton(
this);
85 mLayout->addWidget(mAdd, 1, 4);
86 mLayout->addWidget(mRemove, 1, 5);
92void SieveGlobalVariableActionWidget::clear()
94 mVariableName->clear();
95 mSetValueTo->setChecked(
false);
96 mVariableValue->setEnabled(
false);
97 mVariableValue->clear();
100bool SieveGlobalVariableActionWidget::isInitialized()
const
102 return !mVariableName->text().isEmpty();
105QString SieveGlobalVariableActionWidget::variableName()
const
107 const QString varName = mVariableName->text();
114void SieveGlobalVariableActionWidget::setVariableValue(
const QString &name)
116 mSetValueTo->setChecked(
true);
117 mVariableValue->setText(name);
118 mVariableValue->setEnabled(
true);
121void SieveGlobalVariableActionWidget::loadScript(QXmlStreamReader &element, QString &error)
124 const QStringView tagName = element.
name();
125 if (tagName == QLatin1StringView(
"str")) {
128 const QString result = tagName.
toString();
129 error +=
i18n(
"Unknown tag \"%1\" during loading of variables.", result) + QLatin1Char(
'\n');
130 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveGlobalVariableActionWidget::loadScript unknown tagName " << tagName;
135void SieveGlobalVariableActionWidget::slotAddWidget()
141void SieveGlobalVariableActionWidget::slotRemoveWidget()
143 Q_EMIT removeWidget(
this);
147void SieveGlobalVariableActionWidget::updateAddRemoveButton(
bool addButtonEnabled,
bool removeButtonEnabled)
149 mAdd->setEnabled(addButtonEnabled);
150 mRemove->setEnabled(removeButtonEnabled);
153SieveGlobalVariableWidget::SieveGlobalVariableWidget(QWidget *parent)
154 : SieveWidgetPageAbstract(parent)
157 mHelpButton =
new SieveHelpButton(
this);
158 lay->addWidget(mHelpButton);
161 mGlobalVariableLister =
new SieveGlobalVariableLister(
this);
162 connect(mGlobalVariableLister, &SieveGlobalVariableLister::valueChanged,
this, &SieveGlobalVariableWidget::valueChanged);
165 scrollArea->setAutoFillBackground(
false);
166 scrollArea->setWidget(mGlobalVariableLister);
167 scrollArea->setWidgetResizable(
true);
169 lay->addWidget(scrollArea);
171 setPageType(KSieveUi::SieveScriptBlockWidget::GlobalVariable);
174SieveGlobalVariableWidget::~SieveGlobalVariableWidget() =
default;
176void SieveGlobalVariableWidget::slotHelp()
179 "A variable has global scope in all scripts that have declared it with the \"global\" command. If a script uses that variable name without declaring "
180 "it global, the name specifies a separate, non-global variable within that script.");
181 const QUrl href = KSieveUi::SieveEditorUtil::helpUrl(KSieveUi::SieveEditorUtil::GlobalVariable);
182 const QString fullWhatsThis = AutoCreateScriptUtil::createFullWhatsThis(help, href.
toString());
186void SieveGlobalVariableWidget::generatedScript(QString &script, QStringList &requireModules,
bool inForEveryPartLoop)
188 Q_UNUSED(inForEveryPartLoop)
191 mGlobalVariableLister->generatedScript(result, lst);
194 requireModules << lst;
198void SieveGlobalVariableWidget::loadScript(QXmlStreamReader &element, QString &error)
200 mGlobalVariableLister->loadScript(element, error);
203SieveGlobalVariableActionWidget::VariableElement SieveGlobalVariableWidget::loadSetVariable(QXmlStreamReader &element, QString &error)
205 return mGlobalVariableLister->loadSetVariable(element, error);
208SieveGlobalVariableLister::SieveGlobalVariableLister(QWidget *parent)
209 : KPIM::KWidgetLister(false, MINIMUMGLOBALVARIABLEACTION, MAXIMUMGLOBALVARIABLEACTION, parent)
212 updateAddRemoveButton();
215SieveGlobalVariableLister::~SieveGlobalVariableLister() =
default;
217void SieveGlobalVariableLister::slotAddWidget(
QWidget *w)
220 updateAddRemoveButton();
223void SieveGlobalVariableLister::slotRemoveWidget(QWidget *w)
226 updateAddRemoveButton();
229void SieveGlobalVariableLister::updateAddRemoveButton()
231 QList<QWidget *> widgetList =
widgets();
232 const int numberOfWidget(widgetList.
count());
233 bool addButtonEnabled =
false;
234 bool removeButtonEnabled =
false;
236 addButtonEnabled =
true;
237 removeButtonEnabled =
false;
239 addButtonEnabled =
false;
240 removeButtonEnabled =
true;
242 addButtonEnabled =
true;
243 removeButtonEnabled =
true;
247 for (; wIt != wEnd; ++wIt) {
249 w->updateAddRemoveButton(addButtonEnabled, removeButtonEnabled);
253void SieveGlobalVariableLister::generatedScript(QString &script, QStringList &requireModules)
255 requireModules << QStringLiteral(
"include");
256 const QList<QWidget *> widgetList =
widgets();
259 for (; wIt != wEnd; ++wIt) {
261 w->generatedScript(script);
265void SieveGlobalVariableLister::reconnectWidget(SieveGlobalVariableActionWidget *w)
268 connect(w, &SieveGlobalVariableActionWidget::removeWidget,
this, &SieveGlobalVariableLister::slotRemoveWidget,
Qt::UniqueConnection);
272void SieveGlobalVariableLister::clearWidget(QWidget *aWidget)
275 auto widget =
static_cast<SieveGlobalVariableActionWidget *
>(aWidget);
277 updateAddRemoveButton();
282QWidget *SieveGlobalVariableLister::createWidget(QWidget *parent)
284 auto w =
new SieveGlobalVariableActionWidget(
parent);
289void SieveGlobalVariableLister::loadScript(QXmlStreamReader &element, QString &error)
291 SieveGlobalVariableActionWidget *w =
static_cast<SieveGlobalVariableActionWidget *
>(
widgets().constLast());
292 if (w->isInitialized()) {
294 w =
static_cast<SieveGlobalVariableActionWidget *
>(
widgets().constLast());
296 w->loadScript(element, error);
299SieveGlobalVariableActionWidget::VariableElement SieveGlobalVariableLister::loadSetVariable(QXmlStreamReader &element, QString & )
301 SieveGlobalVariableActionWidget::VariableElement var;
302 QString variableName;
303 QString variableValue;
306 const QStringView tagName = element.
name();
307 if (tagName == QLatin1StringView(
"str")) {
310 }
else if (index == 1) {
313 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveGlobalVariableLister::loadSetVariable too many argument:" << index;
317 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveGlobalVariableLister::loadSetVariable unknown tagName " << tagName;
321 const QList<QWidget *> lstWidget =
widgets();
322 bool globalVariableFound =
false;
323 for (
QWidget *widget : lstWidget) {
324 auto w =
static_cast<SieveGlobalVariableActionWidget *
>(widget);
325 if (w->variableName() == variableName) {
326 w->setVariableValue(variableValue);
327 globalVariableFound =
true;
330 if (!globalVariableFound) {
331 var.variableName = variableName;
332 var.variableValue = variableValue;
337#include "moc_sieveglobalvariablewidget.cpp"
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
void catchReturnKey(QObject *lineEdit)
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
const QList< QKeySequence > & help()
QIcon fromTheme(const QString &name)
void textChanged(const QString &text)
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)
QString arg(Args &&... args) const const
bool isEmpty() const const
QString trimmed() const const
QString toString() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QString toString(FormattingOptions options) const const
void showText(const QPoint &pos, const QString &text, QWidget *w)
QStringView name() const const
QString readElementText(ReadElementTextBehaviour behaviour)
bool readNextStartElement()