File indexing completed on 2024-04-28 05:11:38

0001 /*
0002     SPDX-FileCopyrightText: 2005 Till Adam <adam@kde.org>
0003     SPDX-FileCopyrightText: 2009 Allen Winter <winter@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "templatemanagementdialog.h"
0009 
0010 #include <KLocalizedString>
0011 #include <KMessageBox>
0012 #include <KStandardGuiItem>
0013 #include <QInputDialog>
0014 
0015 #include <QDesktopServices>
0016 #include <QDialogButtonBox>
0017 #include <QPushButton>
0018 #include <QTimer>
0019 #include <QUrlQuery>
0020 #include <QVBoxLayout>
0021 
0022 using namespace IncidenceEditorNG;
0023 
0024 TemplateManagementDialog::TemplateManagementDialog(QWidget *parent, const QStringList &templates, const QString &incidenceType)
0025     : QDialog(parent)
0026     , m_templates(templates)
0027     , m_type(incidenceType)
0028 {
0029     QString m_type_translated = i18n(qPrintable(m_type));
0030     setWindowTitle(i18nc("@title:window", "Manage %1 Templates", m_type_translated));
0031     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help, this);
0032     auto mainLayout = new QVBoxLayout(this);
0033     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
0034     okButton->setDefault(true);
0035     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0036     connect(buttonBox, &QDialogButtonBox::rejected, this, &TemplateManagementDialog::reject);
0037     setObjectName(QLatin1StringView("template_management_dialog"));
0038     connect(buttonBox->button(QDialogButtonBox::Help), &QPushButton::clicked, this, &TemplateManagementDialog::slotHelp);
0039     auto widget = new QWidget(this);
0040     mainLayout->addWidget(widget);
0041     mainLayout->addWidget(buttonBox);
0042 
0043     widget->setObjectName(QLatin1StringView("template_management_dialog_base"));
0044     m_base.setupUi(widget);
0045 
0046     m_base.m_listBox->addItems(m_templates);
0047     m_base.m_listBox->setSelectionMode(QAbstractItemView::SingleSelection);
0048 
0049     connect(m_base.m_buttonAdd, &QPushButton::clicked, this, &TemplateManagementDialog::slotAddTemplate);
0050     connect(m_base.m_buttonRemove, &QPushButton::clicked, this, &TemplateManagementDialog::slotRemoveTemplate);
0051     connect(m_base.m_buttonApply, &QPushButton::clicked, this, &TemplateManagementDialog::slotApplyTemplate);
0052 
0053     connect(m_base.m_listBox, &QListWidget::itemSelectionChanged, this, &TemplateManagementDialog::slotItemSelected);
0054     connect(m_base.m_listBox, &QListWidget::itemDoubleClicked, this, &TemplateManagementDialog::slotApplyTemplate);
0055     connect(okButton, &QPushButton::clicked, this, &TemplateManagementDialog::slotOk);
0056 
0057     m_base.m_buttonRemove->setEnabled(false);
0058     m_base.m_buttonApply->setEnabled(false);
0059 }
0060 
0061 void TemplateManagementDialog::slotHelp()
0062 {
0063     QUrl url = QUrl(QStringLiteral("help:/")).resolved(QUrl(QStringLiteral("korganizer/entering-data.html")));
0064     QUrlQuery query(url);
0065     query.addQueryItem(QStringLiteral("anchor"), QStringLiteral("entering-data-events-template-buttons"));
0066     url.setQuery(query);
0067     // launch khelpcenter, or a browser for URIs not handled by khelpcenter
0068     QDesktopServices::openUrl(url);
0069 }
0070 
0071 void TemplateManagementDialog::slotItemSelected()
0072 {
0073     m_base.m_buttonRemove->setEnabled(true);
0074     m_base.m_buttonApply->setEnabled(true);
0075 }
0076 
0077 void TemplateManagementDialog::slotAddTemplate()
0078 {
0079     bool ok;
0080     bool duplicate = false;
0081     QString m_type_translated = i18n(qPrintable(m_type));
0082     const QString newTemplate = QInputDialog::getText(this,
0083                                                       i18n("Template Name"),
0084                                                       i18n("Please enter a name for the new template:"),
0085                                                       QLineEdit::Normal,
0086                                                       i18n("New %1 Template", m_type_translated),
0087                                                       &ok);
0088     if (newTemplate.isEmpty() || !ok) {
0089         return;
0090     }
0091 
0092     if (m_templates.contains(newTemplate)) {
0093         int rc = KMessageBox::warningContinueCancel(this,
0094                                                     i18n("A template with that name already exists, do you want to overwrite it?"),
0095                                                     i18nc("@title:window", "Duplicate Template Name"),
0096                                                     KStandardGuiItem::overwrite());
0097         if (rc == KMessageBox::Cancel) {
0098             QTimer::singleShot(0, this, &TemplateManagementDialog::slotAddTemplate);
0099             return;
0100         }
0101         duplicate = true;
0102     }
0103 
0104     if (!duplicate) {
0105         int count = m_base.m_listBox->count();
0106         m_templates.append(newTemplate);
0107         m_base.m_listBox->addItem(newTemplate);
0108         QListWidgetItem *item = m_base.m_listBox->item(count);
0109         item->setSelected(true);
0110     }
0111     m_newTemplate = newTemplate;
0112     m_changed = true;
0113 
0114     // From this point on we need to keep the original event around until the
0115     // user has closed the dialog, applying a template would make little sense
0116     // buttonBox->button(QDialogButtonBox::Apply)->setEnabled( false );
0117     // neither does adding it again
0118     m_base.m_buttonAdd->setEnabled(false);
0119 }
0120 
0121 void TemplateManagementDialog::slotRemoveTemplate()
0122 {
0123     QListWidgetItem *const item = m_base.m_listBox->selectedItems().first();
0124     if (!item) {
0125         return; // can't happen (TM)
0126     }
0127 
0128     int rc = KMessageBox::warningContinueCancel(this,
0129                                                 i18n("Are you sure that you want to remove the template <b>%1</b>?", item->text()),
0130                                                 i18nc("@title:window", "Remove Template"),
0131                                                 KStandardGuiItem::remove());
0132 
0133     if (rc == KMessageBox::Cancel) {
0134         return;
0135     }
0136 
0137     int current = m_base.m_listBox->row(item);
0138 
0139     m_templates.removeAll(item->text());
0140     m_base.m_listBox->takeItem(current);
0141     QListWidgetItem *newItem = m_base.m_listBox->item(qMax(current - 1, 0));
0142     if (newItem) {
0143         newItem->setSelected(true);
0144     }
0145 
0146     updateButtons();
0147 
0148     m_changed = true;
0149 }
0150 
0151 void TemplateManagementDialog::updateButtons()
0152 {
0153     m_base.m_buttonAdd->setEnabled(true);
0154     const bool isNotEmpty = m_base.m_listBox->count() != 0;
0155     m_base.m_buttonRemove->setEnabled(isNotEmpty);
0156     m_base.m_buttonApply->setEnabled(isNotEmpty);
0157 }
0158 
0159 void TemplateManagementDialog::slotApplyTemplate()
0160 {
0161     // Once the user has applied the current template to the event,
0162     // it makes no sense to add it again
0163     m_base.m_buttonAdd->setEnabled(false);
0164     QListWidgetItem *item = m_base.m_listBox->currentItem();
0165     if (item) {
0166         const QString &cur = item->text();
0167         if (!cur.isEmpty() && cur != m_newTemplate) {
0168             Q_EMIT loadTemplate(cur);
0169             slotOk();
0170         }
0171     }
0172 }
0173 
0174 void TemplateManagementDialog::slotOk()
0175 {
0176     // failure is not an option *cough*
0177     if (!m_newTemplate.isEmpty()) {
0178         Q_EMIT saveTemplate(m_newTemplate);
0179     }
0180     if (m_changed) {
0181         Q_EMIT templatesChanged(m_templates);
0182     }
0183     accept();
0184 }
0185 
0186 #include "moc_templatemanagementdialog.cpp"