From f8be0d62c728101c62dfcc43d66bda1fb92d89a3 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Thu, 16 Sep 2021 23:51:05 +0800 Subject: [PATCH] work save: new project --- RedPandaIDE/editor.cpp | 21 +- RedPandaIDE/editor.h | 3 +- RedPandaIDE/icons.qrc | 13 ++ RedPandaIDE/images/associations/IDE2.ico | Bin 0 -> 42222 bytes RedPandaIDE/images/associations/c.ico | Bin 0 -> 42222 bytes RedPandaIDE/images/associations/cpp.ico | Bin 0 -> 42222 bytes RedPandaIDE/images/associations/dev.ico | Bin 0 -> 42222 bytes .../images/associations/devpackage.ico | Bin 0 -> 6894 bytes RedPandaIDE/images/associations/devpak.ico | Bin 0 -> 6894 bytes RedPandaIDE/images/associations/h.ico | Bin 0 -> 42222 bytes RedPandaIDE/images/associations/hpp.ico | Bin 0 -> 42222 bytes RedPandaIDE/images/associations/ide.ico | Bin 0 -> 42222 bytes RedPandaIDE/images/associations/o.ico | Bin 0 -> 3262 bytes RedPandaIDE/images/associations/obj.ico | Bin 0 -> 42222 bytes RedPandaIDE/images/associations/rc.ico | Bin 0 -> 42222 bytes RedPandaIDE/images/associations/template.ico | Bin 0 -> 42222 bytes RedPandaIDE/mainwindow.cpp | 82 ++++++++ RedPandaIDE/mainwindow.h | 3 + RedPandaIDE/mainwindow.ui | 16 +- RedPandaIDE/project.cpp | 62 +++++- RedPandaIDE/project.h | 7 +- RedPandaIDE/projecttemplate.cpp | 8 +- RedPandaIDE/projecttemplate.h | 2 + RedPandaIDE/systemconsts.cpp | 2 +- RedPandaIDE/systemconsts.h | 2 +- RedPandaIDE/widgets/newprojectdialog.cpp | 189 +++++++++++++++--- RedPandaIDE/widgets/newprojectdialog.h | 18 +- RedPandaIDE/widgets/newprojectdialog.ui | 12 +- 28 files changed, 395 insertions(+), 45 deletions(-) create mode 100644 RedPandaIDE/images/associations/IDE2.ico create mode 100644 RedPandaIDE/images/associations/c.ico create mode 100644 RedPandaIDE/images/associations/cpp.ico create mode 100644 RedPandaIDE/images/associations/dev.ico create mode 100644 RedPandaIDE/images/associations/devpackage.ico create mode 100644 RedPandaIDE/images/associations/devpak.ico create mode 100644 RedPandaIDE/images/associations/h.ico create mode 100644 RedPandaIDE/images/associations/hpp.ico create mode 100644 RedPandaIDE/images/associations/ide.ico create mode 100644 RedPandaIDE/images/associations/o.ico create mode 100644 RedPandaIDE/images/associations/obj.ico create mode 100644 RedPandaIDE/images/associations/rc.ico create mode 100644 RedPandaIDE/images/associations/template.ico diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 52ac6b9e..8e091a7f 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -149,10 +149,13 @@ Editor::~Editor() { this->setParent(nullptr); } -void Editor::loadFile() { +void Editor::loadFile(const QString& filename) { + if (!filename.isEmpty()) { + mFilename = filename; + } QFile file(mFilename); this->lines()->LoadFromFile(file,mEncodingOption,mFileEncoding); - this->setModified(false); + //this->setModified(false); updateCaption(); pMainWindow->updateForEncodingInfo(); switch(getFileType(mFilename)) { @@ -1680,6 +1683,20 @@ void Editor::reparse() parseFile(mParser,mFilename,mInProject); } +void Editor::insertString(const QString &value, bool moveCursor) +{ + beginUpdate(); + auto action = finally([this]{ + endUpdate(); + }); + + BufferCoord oldCursorPos = caretXY(); + setSelText(value); + if (!moveCursor) { + setCaretXY(oldCursorPos); + } +} + void Editor::showCompletion(bool autoComplete) { if (!pSettings->codeCompletion().enabled()) diff --git a/RedPandaIDE/editor.h b/RedPandaIDE/editor.h index 4e959bad..674ba319 100644 --- a/RedPandaIDE/editor.h +++ b/RedPandaIDE/editor.h @@ -104,7 +104,7 @@ public: bool inProject() const noexcept; bool isNew() const noexcept; - void loadFile(); + void loadFile(const QString& filename = ""); void saveFile(const QString& filename); void convertToEncoding(const QByteArray& encoding); bool save(bool force=false, bool reparse=true); @@ -143,6 +143,7 @@ public: void gotoDeclaration(const BufferCoord& pos); void gotoDefinition(const BufferCoord& pos); void reparse(); + void insertString(const QString& value, bool moveCursor); const PCppParser &parser(); diff --git a/RedPandaIDE/icons.qrc b/RedPandaIDE/icons.qrc index bc92b7f2..1ec686ec 100644 --- a/RedPandaIDE/icons.qrc +++ b/RedPandaIDE/icons.qrc @@ -454,5 +454,18 @@ images/editor/currentline.png images/editor/syntaxerror.png images/editor/syntaxwarning.png + images/associations/c.ico + images/associations/cpp.ico + images/associations/dev.ico + images/associations/devpackage.ico + images/associations/devpak.ico + images/associations/h.ico + images/associations/hpp.ico + images/associations/ide.ico + images/associations/IDE2.ico + images/associations/o.ico + images/associations/obj.ico + images/associations/rc.ico + images/associations/template.ico diff --git a/RedPandaIDE/images/associations/IDE2.ico b/RedPandaIDE/images/associations/IDE2.ico new file mode 100644 index 0000000000000000000000000000000000000000..6bc9223a06fc41d3ab72d14c49c09b970fe4fa28 GIT binary patch literal 42222 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 literal 0 HcmV?d00001 diff --git a/RedPandaIDE/images/associations/c.ico b/RedPandaIDE/images/associations/c.ico new file mode 100644 index 0000000000000000000000000000000000000000..a83443768ff78cc67dbada7fe16b62797e911d64 GIT binary patch literal 42222 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 DLv+_u$<7`w3wp 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 literal 0 HcmV?d00001 diff --git a/RedPandaIDE/images/associations/o.ico b/RedPandaIDE/images/associations/o.ico new file mode 100644 index 0000000000000000000000000000000000000000..2294679417b0a5d0599b7386cac09f5ccf7e7221 GIT binary patch literal 3262 zcmc(hSxi({7{`w`2xD577t^FKiVtd&CiT@c0dz!RkXo%tpIQ}y2vRGcC^StIAB6By z0&R>Ejqw4+fe;ocBAb9Lf(#5h!wd{Fz_1O=urKXzykrVgE=HU5aOURT@80|Sf7>}+ zA-3_id$-{Dsd)6U5W9pB`}tuK-u&!#`}mc68;7&A^Yu3)IyyQkD(YHHOk{NQPmz(A zuUv_^d^tQKBJ9$o(6F%3ix)41hK5|Y5F8S6J~)_pE-2`SbLW`fpFMj%C`c6$0Q#?g z4Ods!wzf8t$<*E5Z7>*qPfiZ>^*y6fo$>eo*3a+s@#CkC9s9=D_vF!|Un`Y?O67?o zM*Fw>Utgpx7lIgy;{Bx0~ z5KlMGnD(DTwBZgrmrP}i%3)bODcvc4bP}Gc{LaqK!NEZ!H0|y1cRc=NPr(79R)`Ge z4O6Nf#*o)xYb#l2tzY*fj)ggiz1yIt_5IZ5(7!61>n- z6yK33ou`}B|46LolNqbkIyyR9r`5uDPT!O-5m15IZPQDa%5pzRVlzIOnVOm!A0KZs z807P_mXGrepgf<<%*@On(P=ck3*X_e=b!tLATw*jv5T(HkHun{pPxr!HUFE}*WoY) zm3(#_5p~?%z#kqSURqjOSXk&boAG~p+Ro4NJ;h@ekuEpW`!Xarg;19HuX{MhMFcyE zJ@)=|cXuBf8(Udffp3|Zz;Yn}%TR5Es_Nv4>eKHxPiel}_s19Fz$%~0N}d=@CipSM zaW`vkU9Grrts?en`Hj{2<`T=gSs5Es8E2mrak16E+-$lf&G_cT5KXuu(pB<*Vq!w# z508wnzhV5Z1`CY*Nc_dc#W9vZeSL#QqtokqO(yf;;KK6q%>2AvrbNqSgk{& zqXQO;d0@b3GUM0AFI`PT4o3ENB#&54vB)gkXU*D$svn{wkKYqkaq03xj7QTrwer_3Y;g6 z6k1x0gu^9pE{S(bzSJZnA0cQ&1W-cB9N9*=OVZ@|pdiC6FE0nqYGqGg5wZM9z6@Ww z#l!M^5<)hp6g26Ct{`a)wzw_%b#--b<$HK|OioU2`TCX*(5`RgD-?>Pq@?8Jie;t1V(M)$Q literal 0 HcmV?d00001 diff --git a/RedPandaIDE/images/associations/obj.ico b/RedPandaIDE/images/associations/obj.ico new file mode 100644 index 0000000000000000000000000000000000000000..8ebc5d342d2d424dd438b2de4208707b27c4e480 GIT binary patch literal 42222 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 #include @@ -87,6 +89,11 @@ MainWindow::MainWindow(QWidget *parent) ui->tableIssues->setWarningColor(QColor("Orange")); + mMenuNew = new QMenu(); + mMenuNew->setTitle(tr("New")); + mMenuNew->addAction(ui->actionNew); + mMenuNew->addAction(ui->actionNew_Project); + ui->menuFile->insertMenu(ui->actionOpen,mMenuNew); mMenuEncoding = new QMenu(); mMenuEncoding->setTitle(tr("File Encoding")); mMenuEncoding->addAction(ui->actionAuto_Detect); @@ -2881,3 +2888,78 @@ void MainWindow::on_actionProject_options_triggered() dialog->exec(); } + +void MainWindow::on_actionNew_Project_triggered() +{ + NewProjectDialog dialog; + if (dialog.exec() == QDialog::Accepted) { + // Take care of the currently opened project + QString s; + if (mProject) { + if (mProject->name().isEmpty()) + s = mProject->filename(); + else + s = mProject->name(); + + // Ask if the user wants to close the current one. If not, abort + if (QMessageBox::question(this, + tr("New project"), + tr("Close %1 and start new project?").arg(s), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::Yes)==QMessageBox::Yes) { + closeProject(false); + } else + return; + } + + //Create the project folder + QDir dir(dialog.getLocation()); + if (!dir.exists()) { + if (QMessageBox::question(this, + tr("Folder not exist"), + tr("Folder '%1' doesn't exist. Create it now?").arg(dialog.getLocation()), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::Yes) != QMessageBox::Yes) { + return; + } + if (!dir.mkpath(dialog.getLocation())) { + QMessageBox::critical(this, + tr("Can't create folder"), + tr("Failed to create folder '%1'.").arg(dialog.getLocation()), + QMessageBox::Yes); + return; + } + } + openCloseLeftPanel(true); + ui->tabInfos->setCornerWidget(ui->tabProject); + +// if cbDefault.Checked then +// devData.DefCpp := rbCpp.Checked; + + s = includeTrailingPathDelimiter(dialog.getLocation()) + + dialog.getProjectName() + "." + DEV_PROJECT_EXT; + + if (fileExists(s)) { + QString saveName = QFileDialog::getSaveFileName( + this, + tr("Save new project as"), + dialog.getLocation(), + tr("Red panda Dev-C++ project file (*.dev)")); + if (!saveName.isEmpty()) { + s = saveName; + } + } + + // Create an empty project + mProject = std::make_shared(s,dialog.getProjectName()); + if (!mProject->assignTemplate(dialog.getTemplate())) { + mProject = nullptr; + QMessageBox::critical(this, + tr("New project fail"), + tr("Can't assign project template"), + QMessageBox::Ok); + } + mProject->saveAll(); + } +} + diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index bcfe695a..8d8dcdfa 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -308,6 +308,8 @@ private slots: void on_actionProject_options_triggered(); + void on_actionNew_Project_triggered(); + private: Ui::MainWindow *ui; EditorList *mEditorList; @@ -317,6 +319,7 @@ private: QMenu *mMenuEncoding; QMenu *mMenuEncodingList; QMenu *mMenuRecentFiles; + QMenu *mMenuNew; QComboBox *mCompilerSet; CompilerManager *mCompilerManager; Debugger *mDebugger; diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui index 654250ad..308375f4 100644 --- a/RedPandaIDE/mainwindow.ui +++ b/RedPandaIDE/mainwindow.ui @@ -780,7 +780,6 @@ File - @@ -992,7 +991,10 @@ - New + New File + + + New File Ctrl+N @@ -1621,6 +1623,16 @@ Project options + + + + :/icons/images/newlook24/049-newproj.png + + + + New Project... + + diff --git a/RedPandaIDE/project.cpp b/RedPandaIDE/project.cpp index d9261d4f..d8423cf6 100644 --- a/RedPandaIDE/project.cpp +++ b/RedPandaIDE/project.cpp @@ -7,6 +7,7 @@ #include #include "utils.h" #include "platform.h" +#include "projecttemplate.h" #include #include @@ -209,7 +210,7 @@ PFolderNode Project::makeProjectNode() return node; } -int Project::newUnit(PFolderNode parentNode, const QString customFileName) +PProjectUnit Project::newUnit(PFolderNode parentNode, const QString& customFileName) { PProjectUnit newUnit = std::make_shared(this); @@ -231,7 +232,7 @@ int Project::newUnit(PFolderNode parentNode, const QString customFileName) s = dir.absoluteFilePath(customFileName); } // Add - int result = mUnits.count(); + int count = mUnits.count(); mUnits.append(newUnit); // Set all properties @@ -241,7 +242,7 @@ int Project::newUnit(PFolderNode parentNode, const QString customFileName) newUnit->setFolder(getFolderPath(parentNode)); newUnit->setNode(makeNewFileNode(extractFileName(newUnit->fileName()), false, parentNode)); - newUnit->node()->unitIndex = result; + newUnit->node()->unitIndex = count; //parentNode.Expand(True); newUnit->setCompile(true); newUnit->setCompileCpp(mOptions.useGPP); @@ -250,7 +251,7 @@ int Project::newUnit(PFolderNode parentNode, const QString customFileName) newUnit->setOverrideBuildCmd(false); newUnit->setBuildCmd(""); newUnit->setModified(true); - return result; + return newUnit; } Editor *Project::openUnit(int index) @@ -575,6 +576,59 @@ void Project::updateNodeIndexes() mUnits[idx]->node()->unitIndex = idx; } +bool Project::assignTemplate(const std::shared_ptr aTemplate) +{ + if (!aTemplate) { + return true; + } + + mOptions = aTemplate->options(); + + // Copy icon to project directory + if (!mOptions.icon.isEmpty()) { + QString originIcon = QDir(pSettings->dirs().templateDir()).absoluteFilePath(mOptions.icon); + if (fileExists(originIcon)) { + QString destIcon = changeFileExt(mFilename,".ico"); + QFile::copy(originIcon,destIcon); + mOptions.icon = destIcon; + } else { + mOptions.icon = ""; + } + } + // Add list of files + if (aTemplate->version() > 0) { + for (int i=0;iunitCount();i++) { + // Pick file contents + PTemplateUnit templateUnit = aTemplate->unit(i); + QString s; + PProjectUnit unit; + if (aTemplate->options().useGPP) { + s = templateUnit->CppText; + unit = newUnit(mNode,templateUnit->CppName); + } else { + s = templateUnit->CText; + unit = newUnit(mNode,templateUnit->CName); + } + Editor * editor = pMainWindow->editorList()->newEditor( + unit->fileName(), + unit->encoding(), + true, + true); + + QString s2 = QDir(pSettings->dirs().templateDir()).absoluteFilePath(s); + if (QFile(s2).exists()) { + editor->loadFile(s2); + } else { + s.replace("#13#10","\r\n"); + editor->insertString(s,false); + } + editor->save(true,false); + editor->activate(); + } + } + return true; +} + void Project::saveOptions() { SimpleIni ini; diff --git a/RedPandaIDE/project.h b/RedPandaIDE/project.h index 4bc59b95..811db295 100644 --- a/RedPandaIDE/project.h +++ b/RedPandaIDE/project.h @@ -96,6 +96,7 @@ public: QVariant data(const QModelIndex &index, int role) const override; }; +class ProjectTemplate; class Project : public QObject { Q_OBJECT @@ -132,8 +133,8 @@ public: void loadUnitLayout(Editor *e, int index); // load single [UnitX] cursor positions PFolderNode makeNewFileNode(const QString& s, bool isFolder, PFolderNode newParent); PFolderNode makeProjectNode(); - int newUnit(PFolderNode parentNode, - const QString customFileName); + PProjectUnit newUnit(PFolderNode parentNode, + const QString& customFileName); Editor* openUnit(int index); void rebuildNodes(); bool removeEditor(int index, bool doClose); @@ -152,7 +153,7 @@ public: void updateNodeIndexes(); //void showOptions(); - // bool assignTemplate(const QString& aFileName, const PTemplate& aTemplate); + bool assignTemplate(const std::shared_ptr aTemplate); //void saveToLog(); std::shared_ptr cppParser(); diff --git a/RedPandaIDE/projecttemplate.cpp b/RedPandaIDE/projecttemplate.cpp index 2df7ec31..3159baaf 100644 --- a/RedPandaIDE/projecttemplate.cpp +++ b/RedPandaIDE/projecttemplate.cpp @@ -11,6 +11,7 @@ ProjectTemplate::ProjectTemplate(QObject *parent) : QObject(parent) int ProjectTemplate::unitCount() { if (!mIni || mVersion<=0) + return 0; return mIni->GetLongValue("Project","UnitCount",0); } @@ -48,7 +49,7 @@ int ProjectTemplate::addUnit() if (!mIni || mVersion<=0) return -1; int count = unitCount() +1; - QByteArray section = toByteArray(QString("Unit%1").arg(count)); + QByteArray section = toByteArray(QString("Unit%1").arg(count-1)); mIni->SetValue(section, "C", ""); mIni->SetValue(section, "Cpp", ""); mIni->SetLongValue("Project", "UnitCount", count); @@ -188,3 +189,8 @@ void ProjectTemplate::setOptions(const ProjectOptions &newOptions) mOptions = newOptions; } +int ProjectTemplate::version() const +{ + return mVersion; +} + diff --git a/RedPandaIDE/projecttemplate.h b/RedPandaIDE/projecttemplate.h index ce803c01..bc360319 100644 --- a/RedPandaIDE/projecttemplate.h +++ b/RedPandaIDE/projecttemplate.h @@ -43,6 +43,8 @@ public: const ProjectOptions &options() const; void setOptions(const ProjectOptions &newOptions); + int version() const; + private: QString mFileName; ProjectOptions mOptions; diff --git a/RedPandaIDE/systemconsts.cpp b/RedPandaIDE/systemconsts.cpp index 5ff4e1dd..324b6a8b 100644 --- a/RedPandaIDE/systemconsts.cpp +++ b/RedPandaIDE/systemconsts.cpp @@ -70,7 +70,7 @@ void SystemConsts::addDefaultFileFilter(const QString &name, const QString &file addFileFilter(mDefaultFileFilters,name,fileExtensions); } -void SystemConsts::addFileFilter(QStringList filters, const QString &name, const QString &fileExtensions) +void SystemConsts::addFileFilter(QStringList& filters, const QString &name, const QString &fileExtensions) { filters.append(name+ " (" + fileExtensions+")"); } diff --git a/RedPandaIDE/systemconsts.h b/RedPandaIDE/systemconsts.h index dffd0843..b8d875cd 100644 --- a/RedPandaIDE/systemconsts.h +++ b/RedPandaIDE/systemconsts.h @@ -67,7 +67,7 @@ public: const QStringList &codecNames() const; private: - void addFileFilter(QStringList filters, const QString& name, const QString& fileExtensions); + void addFileFilter(QStringList& filters, const QString& name, const QString& fileExtensions); QStringList mDefaultFileFilters; QStringList mIconFileFilters; QStringList mCodecNames; diff --git a/RedPandaIDE/widgets/newprojectdialog.cpp b/RedPandaIDE/widgets/newprojectdialog.cpp index 0ce7e346..7aaca7d6 100644 --- a/RedPandaIDE/widgets/newprojectdialog.cpp +++ b/RedPandaIDE/widgets/newprojectdialog.cpp @@ -5,6 +5,8 @@ #include #include +#include +#include NewProjectDialog::NewProjectDialog(QWidget *parent) : QDialog(parent), @@ -13,6 +15,30 @@ NewProjectDialog::NewProjectDialog(QWidget *parent) : ui->setupUi(this); mTemplatesTabBar = new QTabBar(this); ui->verticalLayout->insertWidget(0,mTemplatesTabBar); + + readTemplateDir(); + int i=0; + QString projectName; + QString location; + while (true) { + i++; + projectName = tr("Project %1").arg(i); + location = includeTrailingPathDelimiter(pSettings->dirs().projectDir()) + projectName; + if (!QDir(location).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() @@ -20,6 +46,40 @@ 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::isCProject() +{ + return ui->rdCProject->isChecked(); +} + +bool NewProjectDialog::isCppProject() +{ + return ui->rdCppProject->isChecked(); +} + +bool NewProjectDialog::makeProjectDefault() +{ + return ui->chkMakeDefault->isChecked(); +} + void NewProjectDialog::addTemplate(const QString &filename) { if (!QFile(filename).exists()) @@ -40,48 +100,125 @@ void NewProjectDialog::readTemplateDir() addTemplate(fileInfo.absoluteFilePath()); } } + rebuildTabs(); updateView(); } -void NewProjectDialog::updateView() +void NewProjectDialog::rebuildTabs() { while (mTemplatesTabBar->count()>0) { mTemplatesTabBar->removeTab(0); } - QMap categories; + + 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 = categories.value(category,-1); + int tabIndex = mCategories.value(category,-1); if (tabIndex<0) { tabIndex = mTemplatesTabBar->addTab(category); - categories.insert(category,tabIndex); + mCategories.insert(category,tabIndex); } } + mTemplatesTabBar->setCurrentIndex(0); +} - - // Only add if we're viewing this category - if SameText(TemplateItem.Category, TabsMain.Tabs[TabsMain.TabIndex]) then begin - ListItem := ProjView.Items.Add; - ListItem.Caption := TemplateItem.Name; - ListItem.Data := pointer(I); - IconFileName := ValidateFile(TemplateItem.Icon, '', true); - if IconFileName <> '' then begin - - // Add icon to central dump and tell ListItem to use it - IconItem := TIcon.Create; - try - IconItem.LoadFromFile(IconFileName); // ValidateFile prepends path - ListItem.ImageIndex := ImageList.AddIcon(IconItem); - if ListItem.ImageIndex = -1 then - ListItem.ImageIndex := 0; - finally - IconItem.Free; - end; - end else - ListItem.ImageIndex := 0; // don't use an icon - end; +void NewProjectDialog::updateView() +{ + int index = std::max(0,mTemplatesTabBar->currentIndex()); + if (index>=mTemplatesTabBar->count()) + return; + ui->lstTemplates->clear(); + for (int i=0;icategory(); + 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::UserRole,i); + ui->lstTemplates->addItem(item); + } } } + +void NewProjectDialog::updateProjectLocation() +{ + ui->txtLocation->setText( + includeTrailingPathDelimiter( + extractFilePath( + ui->txtLocation->text())) + + ui->txtProjectName->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->rdCppProject->setChecked(true); + } else { + ui->rdCProject->setChecked(true); + } + } else { + ui->lblDescription->setText(""); + ui->rdCProject->setChecked(false); + ui->rdCppProject->setChecked(false); + ui->chkMakeDefault->setChecked(false); + } + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled( + current && !ui->txtProjectName->text().isEmpty() + ); +} + + +void NewProjectDialog::on_btnBrowse_triggered(QAction *) +{ + QString dirPath = ui->txtLocation->text(); + if (!QDir(dirPath).exists()) { + dirPath = pSettings->dirs().projectDir(); + } + QString dir = QFileDialog::getExistingDirectory( + this, + "Project 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() + ); + } +} + diff --git a/RedPandaIDE/widgets/newprojectdialog.h b/RedPandaIDE/widgets/newprojectdialog.h index dcda903e..0d59da5a 100644 --- a/RedPandaIDE/widgets/newprojectdialog.h +++ b/RedPandaIDE/widgets/newprojectdialog.h @@ -2,6 +2,7 @@ #define NEWPROJECTDIALOG_H #include +#include #include #include "projecttemplate.h" @@ -16,14 +17,29 @@ class NewProjectDialog : public QDialog public: explicit NewProjectDialog(QWidget *parent = nullptr); ~NewProjectDialog(); + PProjectTemplate getTemplate(); + QString getLocation(); + QString getProjectName(); + bool isCProject(); + bool isCppProject(); + bool makeProjectDefault(); +private slots: + void updateView(); + void updateProjectLocation(); + void on_lstTemplates_itemDoubleClicked(QListWidgetItem *item); + + void on_lstTemplates_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); + void on_btnBrowse_triggered(QAction *arg1); + private: void addTemplate(const QString& filename); void readTemplateDir(); - void updateView(); + void rebuildTabs(); private: Ui::NewProjectDialog *ui; QList mTemplates; QTabBar* mTemplatesTabBar; + QMap mCategories; }; #endif // NEWPROJECTDIALOG_H diff --git a/RedPandaIDE/widgets/newprojectdialog.ui b/RedPandaIDE/widgets/newprojectdialog.ui index 70b50628..533bad7e 100644 --- a/RedPandaIDE/widgets/newprojectdialog.ui +++ b/RedPandaIDE/widgets/newprojectdialog.ui @@ -15,10 +15,16 @@ - + QListView::LeftToRight + + QListView::IconMode + + + Qt::AlignCenter + @@ -97,7 +103,7 @@ - + ... @@ -109,7 +115,7 @@ - +