RedPanda-CPP/RedPandaIDE/widgets/newprojectdialog.cpp

254 lines
7.3 KiB
C++

/*
* Copyright (C) 2020-2022 Roy Qu (royqh1979@gmail.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "newprojectdialog.h"
#include "ui_newprojectdialog.h"
#include "settings.h"
#include "systemconsts.h"
#include "../iconsmanager.h"
#include <QDir>
#include <QFile>
#include <QFileDialog>
#include <QPushButton>
NewProjectDialog::NewProjectDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::NewProjectDialog)
{
ui->setupUi(this);
mTemplatesTabBar = new QTabBar(this);
ui->verticalLayout->insertWidget(0,mTemplatesTabBar);
readTemplateDir();
int i=0;
QString projectName;
QString location;
location = excludeTrailingPathDelimiter(pSettings->dirs().projectDir());
while (true) {
i++;
projectName = tr("Project%1").arg(i);
QString tempLocation = includeTrailingPathDelimiter(location)+projectName;
if (!QDir(tempLocation).exists())
break;
}
ui->txtProjectName->setText(projectName);
ui->txtLocation->setText(location);
connect(mTemplatesTabBar,
&QTabBar::currentChanged,
this,
&NewProjectDialog::updateView
);
connect(ui->txtProjectName,
&QLineEdit::textChanged,
this,
&NewProjectDialog::updateProjectLocation);
}
NewProjectDialog::~NewProjectDialog()
{
delete ui;
}
PProjectTemplate NewProjectDialog::getTemplate()
{
QListWidgetItem * item = ui->lstTemplates->currentItem();
if (!item)
return PProjectTemplate();
int index = item->data(Qt::UserRole).toInt();
return mTemplates[index];
}
QString NewProjectDialog::getLocation()
{
return ui->txtLocation->text();
}
QString NewProjectDialog::getProjectName()
{
return ui->txtProjectName->text();
}
bool NewProjectDialog::useAsDefaultProjectDir()
{
return ui->chkAsDefaultLocation->isChecked();
}
bool NewProjectDialog::isCProject()
{
return ui->rdCProject->isChecked();
}
bool NewProjectDialog::isCppProject()
{
return ui->rdCppProject->isChecked();
}
bool NewProjectDialog::makeDefaultLanguage()
{
return ui->chkMakeDefaultLanguage->isChecked();
}
void NewProjectDialog::addTemplate(const QString &filename)
{
if (!QFile(filename).exists())
return;
PProjectTemplate t = std::make_shared<ProjectTemplate>();
t->readTemplateFile(filename);
mTemplates.append(t);
}
void NewProjectDialog::readTemplateDir()
{
QString templateExt(".");
templateExt += TEMPLATE_EXT;
QDir dir(pSettings->dirs().templateDir());
foreach (const QFileInfo& fileInfo,dir.entryInfoList()) {
if (fileInfo.isFile()
&& fileInfo.fileName().endsWith(templateExt)) {
addTemplate(fileInfo.absoluteFilePath());
}
}
rebuildTabs();
updateView();
}
void NewProjectDialog::rebuildTabs()
{
while (mTemplatesTabBar->count()>0) {
mTemplatesTabBar->removeTab(0);
}
mCategories.clear();
foreach (const PProjectTemplate& t, mTemplates) {
QString category = t->category();
if (category.isEmpty())
category = tr("Default");
// Add a page for each unique category
int tabIndex = mCategories.value(category,-1);
if (tabIndex<0) {
tabIndex = mTemplatesTabBar->addTab(category);
mCategories.insert(category,tabIndex);
}
}
mTemplatesTabBar->setCurrentIndex(0);
}
void NewProjectDialog::updateView()
{
int index = std::max(0,mTemplatesTabBar->currentIndex());
if (index>=mTemplatesTabBar->count())
return;
ui->lstTemplates->clear();
for (int i=0;i<mTemplates.count();i++) {
const PProjectTemplate& t = mTemplates[i];
QString category = t->category();
if (category.isEmpty())
category = tr("Default");
QString tabText = mTemplatesTabBar->tabText(index);
if (category == tabText) {
QListWidgetItem * item;
QString iconFilename = QDir(pSettings->dirs().templateDir()).absoluteFilePath(t->icon());
QIcon icon(iconFilename);
if (icon.isNull()) {
//todo : use an default icon
item = new QListWidgetItem(
QIcon(":/icons/images/associations/template.ico"),
t->name());
} else {
item = new QListWidgetItem(
icon,
t->name());
}
item->setData(Qt::ToolTipRole,t->name());
item->setData(Qt::UserRole,i);
ui->lstTemplates->addItem(item);
}
}
}
void NewProjectDialog::updateProjectLocation()
{
QString newLocation = ui->txtLocation->text();
QListWidgetItem * current = ui->lstTemplates->currentItem();
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
current && !ui->txtProjectName->text().isEmpty()
);
}
void NewProjectDialog::on_lstTemplates_itemDoubleClicked(QListWidgetItem *item)
{
if (item)
accept();
}
void NewProjectDialog::on_lstTemplates_currentItemChanged(QListWidgetItem *current, QListWidgetItem *)
{
if (current) {
int index = current->data(Qt::UserRole).toInt();
PProjectTemplate t = mTemplates[index];
ui->lblDescription->setText(t->description());
if (t->options().useGPP) {
ui->rdCProject->setEnabled(false);
ui->rdCppProject->setChecked(true);
} else {
ui->rdCProject->setEnabled(true);
if (pSettings->editor().defaultFileCpp()) {
ui->rdCppProject->setChecked(true);
} else {
ui->rdCProject->setChecked(true);
}
}
} else {
ui->lblDescription->setText("");
ui->rdCProject->setChecked(false);
ui->rdCppProject->setChecked(false);
ui->chkMakeDefaultLanguage->setChecked(false);
}
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
current && !ui->txtProjectName->text().isEmpty()
);
}
void NewProjectDialog::on_btnBrowse_clicked()
{
QString dirPath = ui->txtLocation->text();
if (!QDir(dirPath).exists()) {
dirPath = pSettings->dirs().projectDir();
}
QString dir = QFileDialog::getExistingDirectory(
this,
"Choose directory",
dirPath
);
if (!dir.isEmpty()) {
ui->txtLocation->setText(dir);
QListWidgetItem * current = ui->lstTemplates->currentItem();
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
current && !ui->txtProjectName->text().isEmpty()
);
}
}
void NewProjectDialog::updateIcons()
{
pIconsManager->setIcon(ui->btnBrowse, IconsManager::ACTION_FILE_OPEN_FOLDER);
}