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"