File indexing completed on 2024-05-12 04:38:19

0001 /*
0002     SPDX-FileCopyrightText: 2012 Miha Čančula <miha@noughmad.eu>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "templatepage.h"
0008 #include "ui_templatepage.h"
0009 
0010 #include <QFileDialog>
0011 
0012 #include <interfaces/itemplateprovider.h>
0013 #include <language/codegen/templatesmodel.h>
0014 
0015 #include <KArchive>
0016 #include <KZip>
0017 #include <KTar>
0018 
0019 #include <util/scopeddialog.h>
0020 
0021 TemplatePage::TemplatePage (KDevelop::ITemplateProvider* provider, QWidget* parent) : QWidget (parent),
0022 m_provider(provider)
0023 {
0024     ui = new Ui::TemplatePage;
0025     ui->setupUi(this);
0026 
0027     if (!m_provider->knsConfigurationFile().isEmpty()) {
0028         auto* getNewButton = new KNSWidgets::Button(i18nc("@action:button", "Get More Templates"),
0029                                                     m_provider->knsConfigurationFile(), this);
0030         connect(getNewButton, &KNSWidgets::Button::dialogFinished, this, &TemplatePage::handleNewStuffDialogFinished);
0031         ui->buttonLayout->insertWidget(1, getNewButton);
0032     }
0033 
0034     ui->loadButton->setVisible(!m_provider->supportedMimeTypes().isEmpty());
0035     connect(ui->loadButton, &QPushButton::clicked,
0036             this, &TemplatePage::loadFromFile);
0037 
0038     ui->extractButton->setEnabled(false);
0039     connect(ui->extractButton, &QPushButton::clicked,
0040             this, &TemplatePage::extractTemplate);
0041 
0042     provider->reload();
0043 
0044     ui->treeView->setModel(provider->templatesModel());
0045     ui->treeView->expandAll();
0046     connect(ui->treeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &TemplatePage::currentIndexChanged);
0047 }
0048 
0049 TemplatePage::~TemplatePage()
0050 {
0051     delete ui;
0052 }
0053 
0054 void TemplatePage::loadFromFile()
0055 {
0056     KDevelop::ScopedDialog<QFileDialog> fileDialog(this);
0057     fileDialog->setMimeTypeFilters(m_provider->supportedMimeTypes());
0058     fileDialog->setFileMode(QFileDialog::ExistingFiles);
0059     if (!fileDialog->exec()) {
0060         return;
0061     }
0062 
0063     const auto& selectedFiles = fileDialog->selectedFiles();
0064     for (const auto& file : selectedFiles) {
0065         m_provider->loadTemplate(file);
0066     }
0067 
0068     m_provider->reload();
0069 }
0070 
0071 void TemplatePage::handleNewStuffDialogFinished(const QList<KNSCore::Entry>& changedEntries)
0072 {
0073     if (!changedEntries.isEmpty()) {
0074         m_provider->reload();
0075     }
0076 }
0077 
0078 void TemplatePage::currentIndexChanged(const QModelIndex& index)
0079 {
0080     QString archive = ui->treeView->model()->data(index, KDevelop::TemplatesModel::ArchiveFileRole).toString();
0081     ui->extractButton->setEnabled(QFileInfo::exists(archive));
0082 }
0083 
0084 void TemplatePage::extractTemplate()
0085 {
0086     QModelIndex index = ui->treeView->currentIndex();
0087     QString archiveName= ui->treeView->model()->data(index, KDevelop::TemplatesModel::ArchiveFileRole).toString();
0088 
0089     QFileInfo info(archiveName);
0090     if (!info.exists())
0091     {
0092         ui->extractButton->setEnabled(false);
0093         return;
0094     }
0095 
0096     QScopedPointer<KArchive> archive;
0097     if (info.suffix() == QLatin1String("zip"))
0098     {
0099         archive.reset(new KZip(archiveName));
0100     }
0101     else
0102     {
0103         archive.reset(new KTar(archiveName));
0104     }
0105 
0106     archive->open(QIODevice::ReadOnly);
0107 
0108     const QString destination = QFileDialog::getExistingDirectory() + QLatin1Char('/') + info.baseName();
0109     archive->directory()->copyTo(destination);
0110 }
0111 
0112 #include "moc_templatepage.cpp"