7#include "templatelistwidget.h"
8#include "templateeditdialog.h"
11#include <KConfigGroup>
12#include <KLocalizedString>
14#include <KNSWidgets/Action>
15#include <KSharedConfig>
21#include <QListWidgetItem>
27class TemplateListWidgetPrivate
30 TemplateListWidgetPrivate(
const QString &configName, TemplateListWidget *qq)
36 ~TemplateListWidgetPrivate()
41 void createListWidgetItem(
const QString &name,
const QString &text,
bool isDefaultTemplate)
44 item->setData(TemplateListWidget::Text, text);
45 item->setData(TemplateListWidget::DefaultTemplate, isDefaultTemplate);
46 if (isDefaultTemplate) {
56 if (q->addNewTemplate(templateName, templateScript)) {
57 createListWidgetItem(templateName, templateScript,
false);
62 void slotInsertNewTemplate(
const QString &newTemplateScript)
65 QString templateScript = newTemplateScript;
66 if (q->modifyTemplate(templateName, templateScript,
false)) {
67 createListWidgetItem(templateName, templateScript,
false);
75 i18n(
"Do you want to delete selected template?"),
76 i18nc(
"@title:window",
"Delete template"),
79 if (answer == KMessageBox::ButtonCode::PrimaryAction) {
82 if (item->data(TemplateListWidget::DefaultTemplate).toBool() ==
false) {
94 const bool defaultTemplate = item->
data(TemplateListWidget::DefaultTemplate).
toBool();
98 if (q->modifyTemplate(templateName, templateScript, defaultTemplate)) {
99 if (!defaultTemplate) {
101 item->
setData(TemplateListWidget::Text, templateScript);
108 void slotInsertTemplate()
113 Q_EMIT q->insertTemplate(templateScript);
123 for (
int i = 0; i < q->
count(); ++i) {
130 newName = templateName.
arg(i);
135 createListWidgetItem(newName, templateScript,
false);
141 void slotImportTemplates()
146 loadTemplates(&conf);
150 void slotExportTemplates()
155 saveTemplates(&conf);
159 void slotContextMenu(
const QPoint &pos)
162 const bool listSelectedIsEmpty = lstSelectedItems.
isEmpty();
163 auto menu =
new QMenu(q);
165 if (!listSelectedIsEmpty) {
166 menu->addAction(
i18n(
"Insert template"), q, [
this]() {
167 slotInsertTemplate();
169 menu->addSeparator();
172 menu->addAction(
i18n(
"Add..."), q, [
this]() {
175 if (!listSelectedIsEmpty) {
176 const bool defaultTemplate = lstSelectedItems.
first()->data(TemplateListWidget::DefaultTemplate).toBool();
177 if (lstSelectedItems.
count() == 1) {
178 menu->addAction(defaultTemplate ?
i18n(
"Show...") :
i18n(
"Modify..."), q, [
this]() {
185 if (lstSelectedItems.
count() == 1 && !defaultTemplate) {
186 menu->addSeparator();
192 menu->addSeparator();
193 if (q->
count() > 0) {
194 menu->addAction(
i18n(
"Export..."), q, [
this]() {
195 slotExportTemplates();
198 menu->addAction(
i18n(
"Import..."), q, [
this]() {
199 slotImportTemplates();
203 if (!knewstuffConfigName.
isEmpty()) {
204 menu->addSeparator();
206 menu->addAction(fileGHNS);
217 for (
const PimCommon::defaultTemplate &tmp : templatesLst) {
218 createListWidgetItem(tmp.name, tmp.text,
true);
220 KConfigGroup group = config.data()->group(QStringLiteral(
"template"));
221 if (group.
hasKey(QStringLiteral(
"templateCount"))) {
222 loadTemplates(config.data());
227 void loadTemplates(
KConfig *configFile)
230 if (group.
hasKey(QStringLiteral(
"templateCount"))) {
231 const int numberTemplate = group.
readEntry(
"templateCount", 0);
232 for (
int i = 0; i < numberTemplate; ++i) {
233 KConfigGroup templateGroup = configFile->
group(QStringLiteral(
"templateDefine_%1").arg(i));
237 createListWidgetItem(name, text,
false);
244 void saveTemplates(
KConfig *configFile)
248 for (
const QString &group : lst) {
251 int numberOfTemplate = 0;
252 for (
int i = 0; i < q->
count(); ++i) {
254 if (templateItem->
data(TemplateListWidget::DefaultTemplate).
toBool() ==
false) {
255 KConfigGroup group = configFile->
group(QStringLiteral(
"templateDefine_%1").arg(numberOfTemplate));
257 group.
writeEntry(
"Text", templateItem->
data(TemplateListWidget::Text));
262 group.
writeEntry(
"templateCount", numberOfTemplate);
272 saveTemplates(config.data());
278 KSharedConfig::Ptr config;
279 TemplateListWidget *
const q;
282TemplateListWidget::TemplateListWidget(
const QString &configName,
QWidget *parent)
284 , d(new TemplateListWidgetPrivate(configName, this))
289 connect(
this, &TemplateListWidget::customContextMenuRequested,
this, [
this](
QPoint p) {
290 d->slotContextMenu(p);
292 connect(
this, &TemplateListWidget::doubleClicked,
this, [
this]() {
295 connect(
this, &TemplateListWidget::insertNewTemplate,
this, [
this](
const QString &tmp) {
296 d->slotInsertNewTemplate(tmp);
300TemplateListWidget::~TemplateListWidget() =
default;
302void TemplateListWidget::loadTemplates()
314 const QStringList lst{QStringLiteral(
"text/plain")};
325 mimeData->setText(item->
data(TemplateListWidget::Text).
toString());
329bool TemplateListWidget::addNewTemplate(
QString &templateName,
QString &templateScript)
334 templateName = dlg->templateName();
335 templateScript = dlg->script();
342bool TemplateListWidget::modifyTemplate(
QString &templateName,
QString &templateScript,
bool defaultTemplate)
345 dlg->setTemplateName(templateName);
346 dlg->setScript(templateScript);
349 if (!defaultTemplate) {
350 templateName = dlg->templateName();
351 templateScript = dlg->script();
359void TemplateListWidget::dropEvent(
QDropEvent *event)
361 if (
event->source() ==
this) {
365 if (
event->mimeData()->hasText()) {
367 Q_EMIT insertNewTemplate(
event->mimeData()->text());
373void TemplateListWidget::setKNewStuffConfigFile(
const QString &configName)
375 d->knewstuffConfigName = configName;
378void TemplateListWidget::addDefaultTemplate(
const QString &templateName,
const QString &templateScript)
380 d->createListWidgetItem(templateName, templateScript,
true);
384#include "moc_templatelistwidget.cpp"
static Q_INVOKABLE bool authorize(const QString &action)
void deleteGroup(const QString &group, WriteConfigFlags flags=Normal)
KConfigGroup group(const QString &group)
bool hasKey(const char *key) const
void writeEntry(const char *key, const char *value, WriteConfigFlags pFlags=Normal)
QString readEntry(const char *key, const char *aDefault=nullptr) const
QStringList groupList() const override
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
AKONADI_CALENDAR_EXPORT KCalendarCore::Event::Ptr event(const Akonadi::Item &item)
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
ButtonCode questionTwoActions(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const QString &dontAskAgainName=QString(), Options options=Notify)
QString name(StandardShortcut id)
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, Options options)
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, Options options)
QIcon fromTheme(const QString &name)
qsizetype count() const const
bool isEmpty() const const
void setText(const QString &text)
QString text() const const
QString & append(QChar ch)
QString arg(Args &&... args) const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
void reserve(qsizetype size)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
bool toBool() const const
QString toString() const const