File indexing completed on 2025-02-16 04:55:56
0001 /* 0002 SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 #include "selectflagswidget.h" 0007 #include "autocreatescripts/autocreatescriptutil_p.h" 0008 0009 #include <KConfigGroup> 0010 #include <KLineEditEventHandler> 0011 #include <KLocalizedString> 0012 #include <KSharedConfig> 0013 #include <QLineEdit> 0014 0015 #include <KWindowConfig> 0016 #include <QDialogButtonBox> 0017 #include <QHBoxLayout> 0018 #include <QPointer> 0019 #include <QPushButton> 0020 #include <QToolButton> 0021 #include <QVBoxLayout> 0022 #include <QWindow> 0023 0024 using namespace KSieveUi; 0025 namespace 0026 { 0027 static const char mySelectFlagsListDialogGroupName[] = "SelectFlagsListDialog"; 0028 } 0029 SelectFlagsListDialog::SelectFlagsListDialog(QWidget *parent) 0030 : QDialog(parent) 0031 , mListWidget(new SelectFlagsListWidget(this)) 0032 { 0033 setWindowTitle(i18nc("@title:window", "Flags")); 0034 auto mainLayout = new QVBoxLayout(this); 0035 mainLayout->addWidget(mListWidget); 0036 0037 auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); 0038 QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); 0039 okButton->setDefault(true); 0040 okButton->setShortcut(Qt::CTRL | Qt::Key_Return); 0041 connect(buttonBox, &QDialogButtonBox::accepted, this, &SelectFlagsListDialog::accept); 0042 connect(buttonBox, &QDialogButtonBox::rejected, this, &SelectFlagsListDialog::reject); 0043 mainLayout->addWidget(buttonBox); 0044 okButton->setFocus(); 0045 readConfig(); 0046 } 0047 0048 SelectFlagsListDialog::~SelectFlagsListDialog() 0049 { 0050 writeConfig(); 0051 } 0052 0053 void SelectFlagsListDialog::readConfig() 0054 { 0055 create(); // ensure a window is created 0056 windowHandle()->resize(QSize(300, 200)); 0057 KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(mySelectFlagsListDialogGroupName)); 0058 KWindowConfig::restoreWindowSize(windowHandle(), group); 0059 resize(windowHandle()->size()); // workaround for QTBUG-40584 0060 } 0061 0062 void SelectFlagsListDialog::writeConfig() 0063 { 0064 KConfigGroup group(KSharedConfig::openStateConfig(), QLatin1StringView(mySelectFlagsListDialogGroupName)); 0065 KWindowConfig::saveWindowSize(windowHandle(), group); 0066 group.sync(); 0067 } 0068 0069 void SelectFlagsListDialog::setFlags(const QStringList &list) 0070 { 0071 mListWidget->setFlags(list); 0072 } 0073 0074 QStringList SelectFlagsListDialog::flags() const 0075 { 0076 return mListWidget->flags(); 0077 } 0078 0079 SelectFlagsListWidget::SelectFlagsListWidget(QWidget *parent) 0080 : QListWidget(parent) 0081 { 0082 init(); 0083 } 0084 0085 SelectFlagsListWidget::~SelectFlagsListWidget() = default; 0086 0087 void SelectFlagsListWidget::init() 0088 { 0089 auto item = new QListWidgetItem(i18n("Deleted"), this); 0090 item->setData(FlagsRealName, QStringLiteral("\\\\Deleted")); 0091 item->setCheckState(Qt::Unchecked); 0092 item = new QListWidgetItem(i18n("Answered"), this); 0093 item->setData(FlagsRealName, QStringLiteral("\\\\Answered")); 0094 item->setCheckState(Qt::Unchecked); 0095 item = new QListWidgetItem(i18n("Flagged"), this); 0096 item->setData(FlagsRealName, QStringLiteral("\\\\Flagged")); 0097 item->setCheckState(Qt::Unchecked); 0098 item = new QListWidgetItem(i18n("Seen"), this); 0099 item->setData(FlagsRealName, QStringLiteral("\\\\Seen")); 0100 item->setCheckState(Qt::Unchecked); 0101 // item = new QListWidgetItem(QStringLiteral("\\\\Recent"), this); 0102 // item->setCheckState(Qt::Unchecked); 0103 item = new QListWidgetItem(i18n("Draft"), this); 0104 item->setData(FlagsRealName, QStringLiteral("\\\\Draft")); 0105 item->setCheckState(Qt::Unchecked); 0106 } 0107 0108 void SelectFlagsListWidget::setFlags(const QStringList &list) 0109 { 0110 const int numberOfItem = count(); 0111 for (int i = 0; i < numberOfItem; ++i) { 0112 QListWidgetItem *it = item(i); 0113 if (list.contains(it->data(FlagsRealName).toString())) { 0114 it->setCheckState(Qt::Checked); 0115 } 0116 } 0117 } 0118 0119 QStringList SelectFlagsListWidget::flags() const 0120 { 0121 QStringList result; 0122 const int numberOfItem = count(); 0123 for (int i = 0; i < numberOfItem; ++i) { 0124 QListWidgetItem *it = item(i); 0125 if (it->checkState() == Qt::Checked) { 0126 result << it->data(FlagsRealName).toString(); 0127 } 0128 } 0129 return result; 0130 } 0131 0132 SelectFlagsWidget::SelectFlagsWidget(QWidget *parent) 0133 : QWidget(parent) 0134 { 0135 auto lay = new QHBoxLayout(this); 0136 lay->setContentsMargins({}); 0137 mEdit = new QLineEdit(this); 0138 KLineEditEventHandler::catchReturnKey(mEdit); 0139 mEdit->setReadOnly(true); 0140 mEdit->setPlaceholderText(i18n("Click on button for selecting flags...")); 0141 connect(mEdit, &QLineEdit::textChanged, this, &SelectFlagsWidget::valueChanged); 0142 lay->addWidget(mEdit); 0143 auto selectFlags = new QToolButton(this); 0144 selectFlags->setText(i18n("...")); 0145 selectFlags->setToolTip(i18n("Select Flags")); 0146 connect(selectFlags, &QPushButton::clicked, this, &SelectFlagsWidget::slotSelectFlags); 0147 lay->addWidget(selectFlags); 0148 } 0149 0150 SelectFlagsWidget::~SelectFlagsWidget() = default; 0151 0152 void SelectFlagsWidget::slotSelectFlags() 0153 { 0154 QPointer<SelectFlagsListDialog> dialog = new SelectFlagsListDialog(this); 0155 dialog->setFlags(AutoCreateScriptUtil::createListFromString(mEdit->text())); 0156 if (dialog->exec()) { 0157 const QStringList lstFlags = dialog->flags(); 0158 QString flags; 0159 if (!lstFlags.isEmpty()) { 0160 flags = AutoCreateScriptUtil::createList(lstFlags); 0161 } 0162 mEdit->setText(flags); 0163 } 0164 delete dialog; 0165 } 0166 0167 void SelectFlagsWidget::setFlags(const QStringList &flags) 0168 { 0169 mEdit->setText(AutoCreateScriptUtil::createList(flags, true, true)); 0170 } 0171 0172 QString SelectFlagsWidget::code() const 0173 { 0174 return mEdit->text(); 0175 } 0176 0177 #include "moc_selectflagswidget.cpp"