RedPanda-CPP/RedPandaIDE/widgets/newprojectdialog.cpp

317 lines
9.4 KiB
C++
Raw Normal View History

2021-12-26 23:18:28 +08:00
/*
* 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/>.
*/
2021-09-16 12:03:10 +08:00
#include "newprojectdialog.h"
#include "ui_newprojectdialog.h"
#include "settings.h"
#include "systemconsts.h"
#include "../iconsmanager.h"
2021-09-16 12:03:10 +08:00
#include <QDir>
#include <QFile>
2021-09-16 23:51:05 +08:00
#include <QFileDialog>
#include <QPainter>
2021-09-16 23:51:05 +08:00
#include <QPushButton>
2021-09-16 12:03:10 +08:00
NewProjectDialog::NewProjectDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::NewProjectDialog)
{
setWindowFlag(Qt::WindowContextHelpButtonHint,false);
2021-09-16 12:03:10 +08:00
ui->setupUi(this);
2022-12-19 09:35:48 +08:00
#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)
ui->lstTemplates->setItemAlignment(Qt::AlignCenter);
#endif
2021-09-16 12:03:10 +08:00
mTemplatesTabBar = new QTabBar(this);
mTemplatesTabBar->setExpanding(false);
2021-09-16 12:03:10 +08:00
ui->verticalLayout->insertWidget(0,mTemplatesTabBar);
2021-09-16 23:51:05 +08:00
readTemplateDirs();
2021-09-16 23:51:05 +08:00
int i=0;
QString projectName;
QString location;
location = excludeTrailingPathDelimiter(pSettings->dirs().projectDir());
2021-09-16 23:51:05 +08:00
while (true) {
i++;
projectName = QString("Project%1").arg(i);
QString tempLocation = includeTrailingPathDelimiter(location)+projectName;
if (!QDir(tempLocation).exists())
2021-09-16 23:51:05 +08:00
break;
}
ui->txtProjectName->setText(projectName);
ui->txtLocation->setText(location);
resize(pSettings->ui().newProjectDialogWidth(),pSettings->ui().newProjectDialogHeight());
2021-09-16 23:51:05 +08:00
connect(mTemplatesTabBar,
&QTabBar::currentChanged,
this,
&NewProjectDialog::updateView
);
connect(ui->txtProjectName,
&QLineEdit::textChanged,
this,
&NewProjectDialog::updateProjectLocation);
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
onUpdateIcons();
connect(pIconsManager,&IconsManager::actionIconsUpdated,
this, &NewProjectDialog::onUpdateIcons);
2021-09-16 12:03:10 +08:00
}
NewProjectDialog::~NewProjectDialog()
{
delete ui;
}
2021-09-16 23:51:05 +08:00
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();
}
2021-09-16 23:51:05 +08:00
bool NewProjectDialog::isCProject()
{
return ui->rdCProject->isChecked();
}
bool NewProjectDialog::isCppProject()
{
return ui->rdCppProject->isChecked();
}
bool NewProjectDialog::makeDefaultLanguage()
2021-09-16 23:51:05 +08:00
{
return ui->chkMakeDefaultLanguage->isChecked();
2021-09-16 23:51:05 +08:00
}
2021-09-16 12:03:10 +08:00
void NewProjectDialog::addTemplate(const QString &filename)
{
if (!QFile(filename).exists())
return;
PProjectTemplate t = std::make_shared<ProjectTemplate>();
t->readTemplateFile(filename);
2023-08-17 19:24:49 +08:00
Settings::PCompilerSet pSet=pSettings->compilerSets().defaultSet();
if (pSet) {
2023-12-17 13:53:22 +08:00
#ifdef ENABLE_SDCC
2023-08-17 19:24:49 +08:00
if (pSet->compilerType()==CompilerType::SDCC) {
if (t->options().type==ProjectType::MicroController)
mTemplates.append(t);
2023-12-17 13:53:22 +08:00
} else
#endif
{
2023-08-17 19:24:49 +08:00
if (t->options().type!=ProjectType::MicroController)
mTemplates.append(t);
}
} else
mTemplates.append(t);
2021-09-16 12:03:10 +08:00
}
void NewProjectDialog::readTemplateDirs()
2021-09-16 12:03:10 +08:00
{
addTemplate(":/templates/empty.template");
readTemplateDir(pSettings->dirs().data(Settings::Dirs::DataType::Template));
readTemplateDir(pSettings->dirs().config(Settings::Dirs::DataType::Template));
rebuildTabs();
updateView();
}
void NewProjectDialog::readTemplateDir(const QString& folderPath)
{
2021-09-16 12:03:10 +08:00
QString templateExt(".");
templateExt += TEMPLATE_EXT;
QDir dir(folderPath);
if (!dir.exists())
return;
2021-09-16 12:03:10 +08:00
foreach (const QFileInfo& fileInfo,dir.entryInfoList()) {
if (fileInfo.isFile()
&& fileInfo.fileName().endsWith(templateExt)) {
addTemplate(fileInfo.absoluteFilePath());
} else if (fileInfo.isDir()) {
QDir subDir(fileInfo.absoluteFilePath());
if (subDir.exists(TEMPLATE_INFO_FILE)) {
addTemplate(cleanPath(subDir.absoluteFilePath(TEMPLATE_INFO_FILE)));
}
2021-09-16 12:03:10 +08:00
}
}
}
2021-09-16 23:51:05 +08:00
void NewProjectDialog::rebuildTabs()
2021-09-16 12:03:10 +08:00
{
while (mTemplatesTabBar->count()>0) {
mTemplatesTabBar->removeTab(0);
}
2021-09-16 23:51:05 +08:00
mCategories.clear();
2021-09-16 12:03:10 +08:00
foreach (const PProjectTemplate& t, mTemplates) {
QString category = t->category();
if (category.isEmpty())
category = tr("Default");
// Add a page for each unique category
2021-09-16 23:51:05 +08:00
int tabIndex = mCategories.value(category,-1);
2021-09-16 12:03:10 +08:00
if (tabIndex<0) {
tabIndex = mTemplatesTabBar->addTab(category);
2021-09-16 23:51:05 +08:00
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 = cleanPath(QFileInfo(t->fileName()).absoluteDir().absoluteFilePath(t->icon()));
QIcon icon=QIcon(iconFilename);
2021-09-16 23:51:05 +08:00
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->setSizeHint(QSize(font().pixelSize()*6,font().pixelSize()*2+64));
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignTop);
item->setData(Qt::ToolTipRole,t->name());
2021-09-16 23:51:05 +08:00
item->setData(Qt::UserRole,i);
ui->lstTemplates->addItem(item);
2021-09-16 12:03:10 +08:00
}
}
2021-09-16 23:51:05 +08:00
}
void NewProjectDialog::updateProjectLocation()
{
QString newLocation = ui->txtLocation->text();
2021-09-16 12:03:10 +08:00
2021-09-16 23:51:05 +08:00
QListWidgetItem * current = ui->lstTemplates->currentItem();
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
current && !ui->txtProjectName->text().isEmpty()
);
}
2021-09-16 12:03:10 +08:00
2021-09-16 23:51:05 +08:00
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().isCpp) {
ui->rdCProject->setEnabled(false);
2021-09-16 23:51:05 +08:00
ui->rdCppProject->setChecked(true);
} else {
ui->rdCProject->setEnabled(true);
ui->rdCProject->setChecked(true);
if (pSettings->editor().defaultFileCpp()) {
ui->rdCppProject->setChecked(true);
} else {
ui->rdCProject->setChecked(true);
}
2021-09-16 23:51:05 +08:00
}
if (t->iconInfo().isEmpty()) {
ui->panelIconInfo->setVisible(false);
} else {
ui->panelIconInfo->setVisible(true);
ui->lblIconInfo->setText(t->iconInfo());
}
2021-09-16 23:51:05 +08:00
} else {
ui->lblDescription->setText("");
ui->rdCProject->setChecked(false);
ui->rdCppProject->setChecked(false);
ui->chkMakeDefaultLanguage->setChecked(false);
ui->panelIconInfo->setVisible(false);
2021-09-16 23:51:05 +08:00
}
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
current && !ui->txtProjectName->text().isEmpty()
);
}
void NewProjectDialog::on_btnBrowse_clicked()
2021-09-16 23:51:05 +08:00
{
QString dirPath = ui->txtLocation->text();
if (!QDir(dirPath).exists()) {
dirPath = pSettings->dirs().projectDir();
}
QString dir = QFileDialog::getExistingDirectory(
this,
tr("Choose directory"),
2021-09-16 23:51:05 +08:00
dirPath
);
if (!dir.isEmpty()) {
ui->txtLocation->setText(dir);
QListWidgetItem * current = ui->lstTemplates->currentItem();
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
current && !ui->txtProjectName->text().isEmpty()
);
2021-09-16 12:03:10 +08:00
}
}
2021-09-16 23:51:05 +08:00
void NewProjectDialog::onUpdateIcons()
{
pIconsManager->setIcon(ui->btnBrowse, IconsManager::ACTION_FILE_OPEN_FOLDER);
}
void NewProjectDialog::on_btnOk_clicked()
{
accept();
}
void NewProjectDialog::on_btnCancel_clicked()
{
reject();
}