File indexing completed on 2024-05-12 16:01:55

0001 /* This file is part of the KDE project
0002    SPDX-FileCopyrightText: 2005-2006 Peter Simonsson <psn@linux.se>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "KisTemplatesPane.h"
0008 
0009 #include "KisTemplateGroup.h"
0010 #include "KisTemplate.h"
0011 
0012 #include <QFileInfo>
0013 #include <QStandardItemModel>
0014 #include <QUrl>
0015 
0016 #include <kguiitem.h>
0017 #include <kconfiggroup.h>
0018 #include <ksharedconfig.h>
0019 
0020 class KisTemplatesPanePrivate
0021 {
0022 public:
0023     KisTemplatesPanePrivate()
0024         : m_selected(false) {
0025     }
0026 
0027     bool m_selected;
0028     QString m_alwaysUseTemplate;
0029 };
0030 
0031 
0032 KisTemplatesPane::KisTemplatesPane(QWidget* parent, const QString& header,
0033                                    KisTemplateGroup *group, KisTemplate* defaultTemplate)
0034     : KisDetailsPane(parent,header)
0035     , d(new KisTemplatesPanePrivate)
0036 {
0037     setFocusProxy(m_documentList);
0038 
0039     KGuiItem openGItem(i18n("Use This Template"));
0040     KGuiItem::assign(m_openButton, openGItem);
0041     KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
0042     QString fullTemplateName = cfgGrp.readPathEntry("FullTemplateName", QString());
0043 
0044 
0045     d->m_alwaysUseTemplate = cfgGrp.readPathEntry("AlwaysUseTemplate", QString());
0046     m_alwaysUseCheckBox->setVisible(false);
0047     connect(m_alwaysUseCheckBox, SIGNAL(clicked()), this, SLOT(alwaysUseClicked()));
0048 
0049     QStandardItem* selectItem = 0;
0050     QStandardItem* rootItem = model()->invisibleRootItem();
0051     QStandardItem* defaultItem = 0;
0052 
0053     QFileInfo templateFileInfo(fullTemplateName);
0054 
0055     Q_FOREACH (KisTemplate* t, group->templates()) {
0056         if (t->isHidden())
0057             continue;
0058 
0059         QPixmap preview = t->loadPicture();
0060         QImage icon = preview.toImage();
0061         icon = icon.scaled(IconExtent, IconExtent, Qt::KeepAspectRatio, Qt::SmoothTransformation);
0062         icon = icon.convertToFormat(QImage::Format_ARGB32);
0063         icon = icon.copy((icon.width() - IconExtent) / 2, (icon.height() - IconExtent) / 2, IconExtent, IconExtent);
0064         QStandardItem* item = new QStandardItem(QPixmap::fromImage(icon), t->name());
0065         item->setEditable(false);
0066         item->setData(t->description(), Qt::UserRole);
0067         item->setData(t->file(), Qt::UserRole + 1);
0068         item->setData(preview, Qt::UserRole + 2);
0069         rootItem->appendRow(item);
0070 
0071         if (templateFileInfo.exists()) {
0072             if (!selectItem && (t->file() == fullTemplateName)) {
0073                 selectItem = item;
0074             }
0075         }
0076         else {
0077             if (!selectItem && QFileInfo(t->file()).fileName() == templateFileInfo.fileName()) {
0078                 selectItem = item;
0079             }
0080         }
0081 
0082         if (defaultTemplate && (t->file() == defaultTemplate->file())) {
0083             defaultItem = item;
0084         }
0085     }
0086 
0087     QModelIndex selectedIndex;
0088 
0089     if (selectItem) {
0090         selectedIndex = model()->indexFromItem(selectItem);
0091         d->m_selected = true;
0092     } else if (defaultItem) {
0093         selectedIndex = model()->indexFromItem(defaultItem);
0094     } else {
0095         selectedIndex = model()->indexFromItem(model()->item(0));
0096     }
0097 
0098     m_documentList->selectionModel()->select(selectedIndex, QItemSelectionModel::Select);
0099     m_documentList->selectionModel()->setCurrentIndex(selectedIndex, QItemSelectionModel::Select);
0100 }
0101 
0102 KisTemplatesPane::~KisTemplatesPane()
0103 {
0104     delete d;
0105 }
0106 
0107 void KisTemplatesPane::selectionChanged(const QModelIndex& index)
0108 {
0109     if (index.isValid()) {
0110         QStandardItem* item = model()->itemFromIndex(index);
0111         m_openButton->setEnabled(true);
0112         m_alwaysUseCheckBox->setEnabled(true);
0113 
0114         m_detailsLabel->setHtml(item->data(Qt::UserRole).toString());
0115         m_alwaysUseCheckBox->setChecked(item->data(Qt::UserRole + 1).toString() == d->m_alwaysUseTemplate);
0116     } else {
0117         m_openButton->setEnabled(false);
0118         m_alwaysUseCheckBox->setEnabled(false);
0119         m_alwaysUseCheckBox->setChecked(false);
0120         m_detailsLabel->clear();
0121     }
0122 }
0123 
0124 void KisTemplatesPane::openFile()
0125 {
0126     KisDetailsPane::openFile();
0127 }
0128 
0129 void KisTemplatesPane::openFile(const QModelIndex& index)
0130 {
0131     if (index.isValid()) {
0132         QStandardItem* item = model()->itemFromIndex(index);
0133         KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
0134         cfgGrp.writePathEntry("FullTemplateName", item->data(Qt::UserRole + 1).toString());
0135         cfgGrp.writeEntry("LastReturnType", "Template");
0136         cfgGrp.writeEntry("AlwaysUseTemplate", d->m_alwaysUseTemplate);
0137         emit openUrl(QUrl::fromLocalFile(item->data(Qt::UserRole + 1).toString()));
0138     }
0139 }
0140 
0141 bool KisTemplatesPane::isSelected()
0142 {
0143     return d->m_selected;
0144 }
0145 
0146 void KisTemplatesPane::alwaysUseClicked()
0147 {
0148     QStandardItem* item = model()->itemFromIndex(m_documentList->selectionModel()->currentIndex());
0149 
0150     if (!m_alwaysUseCheckBox->isChecked()) {
0151         d->m_alwaysUseTemplate.clear();
0152     } else {
0153         d->m_alwaysUseTemplate = item->data(Qt::UserRole + 1).toString();
0154     }
0155 
0156     KConfigGroup cfgGrp( KSharedConfig::openConfig(), "TemplateChooserDialog");
0157     cfgGrp.writeEntry("AlwaysUseTemplate", d->m_alwaysUseTemplate);
0158     cfgGrp.sync();
0159     emit alwaysUseChanged(this, d->m_alwaysUseTemplate);
0160 }
0161 
0162 void KisTemplatesPane::changeAlwaysUseTemplate(KisTemplatesPane* sender, const QString& alwaysUse)
0163 {
0164     if (this == sender)
0165         return;
0166 
0167     QStandardItem* item = model()->itemFromIndex(m_documentList->selectionModel()->currentIndex());
0168 
0169     // If the old always use template is selected uncheck the checkbox
0170     if (item && (item->data(Qt::UserRole + 1).toString() == d->m_alwaysUseTemplate)) {
0171         m_alwaysUseCheckBox->setChecked(false);
0172     }
0173 
0174     d->m_alwaysUseTemplate = alwaysUse;
0175 }
0176