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"