From 3d6d3c521015f40c57e15368953d8848e047b1c8 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Thu, 16 Jun 2022 21:34:31 +0800 Subject: [PATCH] - fix: when run/debug the executable, add current compiler set's bin folders to path - fix: when open in shell, add current compiler set's bin folders to path --- NEWS.md | 3 + RedPandaIDE/RedPandaIDE_pt.ts | 4 + RedPandaIDE/RedPandaIDE_zh_CN.ts | 609 +++++++++--------- RedPandaIDE/RedPandaIDE_zh_TW.ts | 4 + RedPandaIDE/compiler/compiler.cpp | 4 +- RedPandaIDE/compiler/compilermanager.cpp | 11 +- RedPandaIDE/compiler/compilermanager.h | 6 +- RedPandaIDE/compiler/executablerunner.cpp | 25 +- RedPandaIDE/compiler/executablerunner.h | 5 + RedPandaIDE/debugger.cpp | 42 +- RedPandaIDE/debugger.h | 8 +- RedPandaIDE/mainwindow.cpp | 105 ++- RedPandaIDE/mainwindow.h | 15 +- RedPandaIDE/project.cpp | 24 +- RedPandaIDE/project.h | 2 + RedPandaIDE/projectoptions.h | 5 +- RedPandaIDE/projecttemplate.cpp | 5 +- .../projectdirectorieswidget.cpp | 12 +- .../settingsdialog/projectdirectorieswidget.h | 1 + 19 files changed, 520 insertions(+), 370 deletions(-) diff --git a/NEWS.md b/NEWS.md index 7e78f3ba..7b961cb3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,9 @@ Red Panda C++ Version 1.1.1 - enhancement: when problem case panel is positioned at right, problem case's input, output and expected controls is layouted vertically - enhancement: add ignore spaces checkbox in problem cases panel - fix: can't paste contents copied from Clion/IDEA/PyCharm + - fix: project don't have compiler set bin folder setting + - fix: when run/debug the executable, add current compiler set's bin folders to path + - fix: when open in shell, add current compiler set's bin folders to path Red Panda C++ Version 1.1.0 - enhancement: when ctrl+mouse cursor hovered an identifier or header name, use underline to highlight it diff --git a/RedPandaIDE/RedPandaIDE_pt.ts b/RedPandaIDE/RedPandaIDE_pt.ts index 0a3b7ad1..ce8cdec0 100644 --- a/RedPandaIDE/RedPandaIDE_pt.ts +++ b/RedPandaIDE/RedPandaIDE_pt.ts @@ -4927,6 +4927,10 @@ Resources + + Binaries + + ProjectFilesWidget diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts index f0afcd5e..c864bf19 100644 --- a/RedPandaIDE/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts @@ -183,17 +183,17 @@ p, li { white-space: pre-wrap; } BacktraceModel - + Function 函数 - + Filename 文件名 - + Line @@ -239,37 +239,37 @@ p, li { white-space: pre-wrap; } BreakpointModel - + Filename 文件名 - + Line - + Condition 条件 - + Save file '%1' failed. 保存文件'%1'失败。 - + Can't open file '%1' for write. 无法写入文件'%1'. - + Error in json file '%1':%2 : %3 JSON文件'%1':%2中存在错误:%3 - + Can't open file '%1' for read. 无法读取文件'%1'. @@ -728,12 +728,12 @@ p, li { white-space: pre-wrap; } 程序中的文字内容可能无法被正确处理和显示。 - + Can't find Console Pauser 找不到Console Pauser程序 - + Console Pauser "%1" doesn't exists! 找不到Console Pauser程序"%1"! @@ -1219,7 +1219,7 @@ Are you really want to continue? 无法在"%1"找到gdb server - + Execute to evaluate 执行以求值 @@ -1228,22 +1228,22 @@ Are you really want to continue? 不在当前语境中 - + Compile 编译 - + Source file is more recent than executable. 源文件比程序文件新。 - + Recompile? 重新编译? - + Signal "%1" Received: 收到信号"%1": @@ -2312,7 +2312,7 @@ Are you really want to continue? ExecutableRunner - + The runner process '%1' failed to start. The runner process failed to start. 无法启动程序运行进程'%1'。 @@ -2322,17 +2322,17 @@ Are you really want to continue? 程序运行进程启动后崩溃。 - + The last waitFor...() function timed out. waitFor()函数等待超时。 - + An error occurred when attempting to write to the runner process. 在向程序运行进程写入内容时出错。 - + An error occurred when attempting to read from the runner process. 在从程序运行进程读取内容时出错。 @@ -3837,11 +3837,11 @@ Are you really want to continue? - - - - - + + + + + Issues 编译器 @@ -4049,8 +4049,8 @@ Are you really want to continue? - - + + Compile 编译 @@ -4123,9 +4123,9 @@ Are you really want to continue? - - - + + + Copy 复制 @@ -4136,7 +4136,7 @@ Are you really want to continue? - + Paste 粘贴 @@ -4147,8 +4147,8 @@ Are you really want to continue? - - + + Select All 选择全部 @@ -4274,7 +4274,7 @@ Are you really want to continue? - + New Problem Set 新建试题集 @@ -4293,14 +4293,14 @@ Are you really want to continue? - + Save Problem Set 保存试题集 - + Load Problem Set 载入试题集 @@ -4361,7 +4361,7 @@ Are you really want to continue? - + Run All Cases Run Current Case 运行所有案例 @@ -4431,9 +4431,9 @@ Are you really want to continue? 消息 - + Ignore Spaces - 忽略空格 + 忽略空格 @@ -4654,7 +4654,7 @@ Are you really want to continue? - + Clear all breakpoints 删除所有断点 @@ -4790,7 +4790,7 @@ Are you really want to continue? Ctrl+F10 - + New File 新建文件 @@ -4831,7 +4831,7 @@ Are you really want to continue? - + Rename Symbol 重命名符号 @@ -4852,13 +4852,13 @@ Are you really want to continue? - + Export As RTF 导出为RTF - + Export As HTML 导出为HTML @@ -5127,7 +5127,7 @@ Are you really want to continue? 运行参数... - + File Encoding 文件编码 @@ -5202,146 +5202,146 @@ Are you really want to continue? 你确定要关闭'%1'吗? - - + + Confirm 确认 - - - + + + Source file is not compiled. 源文件尚未编译。 - - + + Compile now? 现在编译? - - + + Source file is more recent than executable. 源文件比可执行程序新。 - + Recompile now? 重新编译? - + No compiler set 无编译器设置 - + No compiler set is configured. 没有配置编译器设置。 - + Can't start debugging. 无法启动调试器 - - + + Enable debugging 启用调试参数 - - + + You have not enabled debugging info (-g3) and/or stripped it from the executable (-s) in Compiler Options.<BR /><BR />Do you want to correct this now? 当前编译设置中未启用调试选项(-g3),或启用了信息剥除选项(-s)<br /><br/>是否纠正这一问题? - + Project not built 项目尚未构建 - + Project hasn't been built. Build it now? 项目尚未构建。是否构建? - + Host applcation missing 宿主程序不存在 - + DLL project needs a host application to run. 动态链接库(DLL)需要一个宿主程序来运行。 - + But it's missing. 但它不存在。 - + Host application not exists 宿主程序不存在 - + Host application file '%1' doesn't exist. 宿主程序'%1'不存在。 - + Recompile? 重新编译? - + Save last open info error 保存上次打开信息失败 - + Can't remove old last open information file '%1' 无法删除旧上次打开信息文件'%1' - + Can't save last open info file '%1' 无法保存上次打开信息文件'%1' - + Load last open info error 载入上次打开信息失败 - + Can't load last open info file '%1' 无法载入上次打开信息文件'%1' - + Open Source File 打开源代码文件 - - + + Batch Set Cases 批量设置案例 - + Show detail debug logs 显示详细调试器日志 - + Copy all 全部复制 @@ -5349,9 +5349,9 @@ Are you really want to continue? - - - + + + Clear 清除 @@ -5367,7 +5367,7 @@ Are you really want to continue? - + Problem Set %1 试题集%1 @@ -5388,68 +5388,68 @@ Are you really want to continue? 或者选择使用其他的网络端口。 - - + + Rebuild Project 重新构建项目 - - + + Project has been modified, do you want to rebuild it? 项目已经被修改过,是否需要重新构建? - + Auto Save Error 自动保存出错 - + Auto save "%1" to "%2" failed:%3 自动保存"%1"到"%2"失败:%3 - + Properties... 试题属性... - + Set Problem Set Name 设置试题集名称 - + Problem Set Name: 试题集名称: - + Remove 删除 - + Remove All Bookmarks 删除全部书签 - + Modify Description 修改描述 - - - + + + Bookmark Description 书签描述 - - - + + + Description: 描述: @@ -5458,178 +5458,178 @@ Are you really want to continue? 在调试主控台中显示调试器输出 - + Remove this search 清除这次搜索 - + Clear all searches 删除所有搜索 - + Breakpoint condition... 断点条件... - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Remove All Breakpoints Remove all breakpoints 删除所有断点 - + Remove Breakpoint 删除当前断点 - + Rename File 重命名文件 - - + + Add Folder 添加文件夹 - + New folder 新文件夹 - + Folder name: 文件夹: - + Rename Folder 重命名 - + Run Current Case 运行当前案例 - + Remove Folder 删除文件夹 - + Switch to normal view 切换为普通视图 - + Switch to custom view 切换为自定义视图 - + Sort By Type 按类型排序 - + Sort alphabetically 按名称排序 - + Show inherited members 显示继承的成员 - + Goto declaration 跳转到声明处 - + Goto definition 跳转到定义处 - - + + New Folder 新建文件夹 - + Rename 重命名 - - - - + + + + Delete 删除 - + Open in Editor 在编辑器中打开 - + Open in External Program 使用外部程序打开 - + Open in Terminal 在终端中打开 - + Open in Windows Explorer 在Windows浏览器中打开 - + Character sets 字符集 - + Convert to %1 转换为%1编码 - + %1 files autosaved 已自动保存%1个文件 - + Set answer to... 设置答案源代码... - + select other file... 选择其他文件... - + Select Answer Source File 选择答案源代码文件 @@ -5639,83 +5639,83 @@ Are you really want to continue? C/C++源代码文件 (*.c *.cpp *.cc *.cxx) - + New Folder %1 新建文件夹%1 - + Untitled 无标题 - + Untitled %1 无标题%1 - + Do you really want to delete %1? 你真的要删除%1吗? - + Do you really want to delete %1 files? 你真的要删除%1个文件吗? - + Save project 保存项目 - + The project '%1' has modifications. 项目'%1'有改动。 - - + + Do you want to save it? 需要保存吗? - - + + File Changed 文件已发生变化 - + New Project File? 新建项目文件? - + Do you want to add the new file to the project? 您是否要将新建的文件加入项目? - - - - + + + + Save Error 保存失败 - + Change Project Compiler Set 改变项目编译器配置集 - + Change the project's compiler set will lose all custom compiler set options. 改变项目的编译器配置集会导致所有的自定义编译器选项被重置。 - - + + Do you really want to do that? 你真的想要那么做吗? @@ -5724,114 +5724,114 @@ Are you really want to continue? 批量设置案例 - + Choose input files 选择输入数据文件 - + Input data files (*.in) 输入数据文件 (*.in) - + Modify Watch 修改监视表达式 - + Watch Expression 监视表达式 - + Do you really want to clear all breakpoints in this file? 您真的要清除该文件的所有断点吗? - + New project 新建项目 - + Close %1 and start new project? 关闭'%1'以打开新项目? - + Folder not exist 文件夹不存在 - + Folder '%1' doesn't exist. Create it now? 文件夹'%1'不存在。是否创建? - + Can't create folder 无法创建文件夹 - + Failed to create folder '%1'. 创建文件夹'%1'失败。 - + Save new project as - + Folder %1 is not empty. 文件夹%1不是空的。 - + Do you really want to delete it? 你真的要删除它吗? - + Change working folder 改变工作文件夹 - + File '%1' is not in the current working folder. File '%1' is not in the current working folder 文件'%1'不在当前工作文件夹中。 - + Do you want to change working folder to '%1'? 是否将工作文件夹改设为'%1'? - + Can't Commit 无法提交 - + Git needs user info to commit. Git需要用信息进行提交。 - + Choose Input Data File 选择输入数据文件 - - + + All files (*.*) 所有文件 (*.*) - + Choose Expected Output Data File Choose Expected Input Data File 选择期望输出文件 @@ -5843,59 +5843,59 @@ Are you really want to continue? - + Choose Working Folder 选择工作文件夹 - - + + Header Exists 头文件已存在 - - + + Header file "%1" already exists! 头文件"%1"已存在! - + Source Exists 源文件已存在! - + Source file "%1" already exists! 源文件"%1"已存在! - + Can't commit! 无法提交! - + The following files are in conflicting: 下列文件处于冲突状态,请解决后重新添加和提交: - + Commit Message 提交信息 - + Commit Message: 提交信息: - + Commit Failed 提交失败 - + Commit message shouldn't be empty! 提交信息不能为空! @@ -5904,135 +5904,135 @@ Are you really want to continue? 小熊猫Dev-C++项目文件 (*.dev) - + New project fail 新建项目失败 - + Can't assign project template 无法使用模板创建项目 - + Remove file 删除文件 - + Remove the file from disk? 同时从硬盘上删除文件? - + untitled 无标题 - + New Project File Name 新的项目文件名 - + File Name: 文件名: - + File Already Exists! 文件已存在! - + File '%1' already exists! 文件'%1'已经存在! - + Add to project 添加到项目 - + C/C++ Source Files (*.c *.cpp *.cc *.cxx) C/C++源代码文件 (*.c *.cpp *.cc *.cxx) - + This operation will remove all cases for the current problem. 本操作会删除此试题的所有案例。 - + Red Panda C++ project file (*.dev) 小熊猫C++项目文件(*.dev) - + Rename Error 重命名出错 - + Symbol '%1' is defined in system header. 符号'%1'在系统头文件中定义,无法修改。 - + New Name 新名称 - - + + Replace Error 替换出错 - + Can't open file '%1' for replace! 无法打开文件'%1'进行替换! - + Contents has changed since last search! 内容和上次查找时不一致。 - + Rich Text Format Files (*.rtf) RTF格式文件 (*.rtf) - + HTML Files (*.html) HTML文件 (*.html) - + The current problem set is not empty. 当前的试题集不是空的。 - + Problem %1 试题%1 - - + + Problem Set Files (*.pbs) 试题集文件 (*.pbs) - + Load Error 载入失败 - - + + Problem Case %1 试题案例%1 @@ -6044,15 +6044,15 @@ Are you really want to continue? - - - - - - - - - + + + + + + + + + Error 错误 @@ -6073,85 +6073,85 @@ Are you really want to continue? 清除历史 - - + + Version Control 版本控制 - + File '%1' was changed. 磁盘文件'%1'已被修改。 - + Reload its content from disk? 是否重新读取它的内容? - + File '%1' was removed. 磁盘文件'%1'已被删除。 - + Keep it open? 是否保持它在小熊猫C++中打开的编辑窗口? - + Open 打开 - + Compile Failed 编译失败 - + Run Failed 运行失败 - - - - + + + + Confirm Convertion 确认转换 - - - - + + + + The editing file will be saved using %1 encoding. <br />This operation can't be reverted. <br />Are you sure to continue? 当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗? - + New Watch Expression 新监视表达式 - + Enter Watch Expression (it is recommended to use 'this->' for class members): 输入监视表达式 - + Parsing file %1 of %2: "%3" (%1/%2)正在解析文件"%3" - - + + Done parsing %1 files in %2 seconds 完成%1个文件的解析,用时%2秒 - + (%1 files per second) (每秒%1个文件) @@ -6473,78 +6473,78 @@ Are you really want to continue? 载入文件错误 - + File Exists 文件已存在 - + File '%1' is already in the project 文件'%1'已在项目中 - + Project Updated 项目已升级 - + Your project was succesfully updated to a newer file format! 已成功将项目升级到新的格式 - + If something has gone wrong, we kept a backup-file: '%1'... 旧项目文件备份在'%1'。 - + Headers 头文件 - + Sources 源文件 - + Others 其他文件 - + Settings need update 设置需要更新 - + The compiler settings format of Red Panda C++ has changed. The compiler settings format of Dev-C++ has changed. 小熊猫C++的编译器设置格式已发生改变。 - + Please update your settings at Project >> Project Options >> Compiler and save your project. 请在项目 >> 项目属性 >> 编译器设置中修改您的设置并保存您的项目 - + Compiler not found 未找到编译器 - + The compiler set you have selected for this project, no longer exists. 您为该项目设置的编译器不存在。 - + It will be substituted by the global compiler set. 它将会被全局编译器设置代替。 - + Developed using the Red Panda C++ IDE Developed using the Red Panda Dev-C++ IDE 使用小熊猫C++编辑器开发 @@ -6726,16 +6726,21 @@ Are you really want to continue? + Binaries + 二进制文件 + + + Libraries 库文件夹 - + Includes 头文件夹 - + Resources 资源文件夹 @@ -6961,32 +6966,32 @@ Are you really want to continue? ProjectModel - + File exists 文件已存在 - + File '%1' already exists. Delete it now? 文件'%1'已存在。是否删除? - + Remove failed 删除失败 - + Failed to remove file '%1' 无法删除文件'%1' - + Rename failed 改名失败 - + Failed to rename file '%1' to '%2' 无法将文件'%1'改名为'%2' @@ -7938,12 +7943,12 @@ Are you really want to continue? RegisterModel - + Register 寄存器 - + Value @@ -8371,14 +8376,14 @@ Are you really want to continue? 性能 - + Compiler Set 编译器配置集 - + Compiler @@ -8390,7 +8395,7 @@ Are you really want to continue? 自动链接 - + @@ -8466,15 +8471,15 @@ Are you really want to continue? 杂项 - - + + Program Runner 程序运行 - + Problem Set 试题集 @@ -8956,49 +8961,49 @@ Are you really want to continue? WatchModel - + Save file '%1' failed. 保存文件'%1'失败。 - + Can't open file '%1' for write. 无法写入文件'%1'. - + Error in json file '%1':%2 : %3 JSON文件'%1':%2中存在错误:%3 - - + + Execute to evaluate 执行以求值 - - + + Not Valid 在当前作用域中无效 - + Can't open file '%1' for read. 无法读取文件'%1'. - + Expression 表达式 - + Type 类型 - + Value diff --git a/RedPandaIDE/RedPandaIDE_zh_TW.ts b/RedPandaIDE/RedPandaIDE_zh_TW.ts index 0694ad15..d2414a67 100644 --- a/RedPandaIDE/RedPandaIDE_zh_TW.ts +++ b/RedPandaIDE/RedPandaIDE_zh_TW.ts @@ -4927,6 +4927,10 @@ Resources + + Binaries + + ProjectFilesWidget diff --git a/RedPandaIDE/compiler/compiler.cpp b/RedPandaIDE/compiler/compiler.cpp index 70054c89..89a9b901 100644 --- a/RedPandaIDE/compiler/compiler.cpp +++ b/RedPandaIDE/compiler/compiler.cpp @@ -422,7 +422,7 @@ QString Compiler::getProjectIncludeArguments() { QString result; if (mProject) { - foreach (const QString& folder,mProject->options().includes) { + foreach (const QString& folder,mProject->options().includeDirs) { result += QString(" -I\"%1\"").arg(folder); } // result += QString(" -I\"%1\"").arg(extractFilePath(mProject->filename())); @@ -450,7 +450,7 @@ QString Compiler::getLibraryArguments(FileType fileType) //add libs added via project if (mProject) { - foreach (const QString& folder, mProject->options().libs){ + foreach (const QString& folder, mProject->options().libDirs){ result += QString(" -L\"%1\"").arg(folder); } } diff --git a/RedPandaIDE/compiler/compilermanager.cpp b/RedPandaIDE/compiler/compilermanager.cpp index 144b7ebd..ae3bea5b 100644 --- a/RedPandaIDE/compiler/compilermanager.cpp +++ b/RedPandaIDE/compiler/compilermanager.cpp @@ -206,7 +206,11 @@ void CompilerManager::checkSyntax(const QString &filename, const QByteArray& enc } } -void CompilerManager::run(const QString &filename, const QString &arguments, const QString &workDir) +void CompilerManager::run( + const QString &filename, + const QString &arguments, + const QString &workDir, + const QStringList& binDirs) { QMutexLocker locker(&mRunnerMutex); if (mRunner!=nullptr && !mRunner->pausing()) { @@ -279,7 +283,12 @@ void CompilerManager::run(const QString &filename, const QString &arguments, con execRunner->setRedirectInput(true); execRunner->setRedirectInputFilename(redirectInputFilename); } + execRunner->addBinDirs(binDirs); + + execRunner->addBinDir(pSettings->dirs().appDir()); + mRunner = execRunner; + connect(mRunner, &Runner::finished, this ,&CompilerManager::onRunnerTerminated); connect(mRunner, &Runner::finished, mRunner ,&Runner::deleteLater); connect(mRunner, &Runner::finished, pMainWindow ,&MainWindow::onRunFinished); diff --git a/RedPandaIDE/compiler/compilermanager.h b/RedPandaIDE/compiler/compilermanager.h index df350a63..76e3f83e 100644 --- a/RedPandaIDE/compiler/compilermanager.h +++ b/RedPandaIDE/compiler/compilermanager.h @@ -42,7 +42,11 @@ public: void cleanProject(std::shared_ptr project); void buildProjectMakefile(std::shared_ptr project); void checkSyntax(const QString&filename, const QByteArray& encoding, const QString& content, std::shared_ptr project); - void run(const QString& filename, const QString& arguments, const QString& workDir); + void run( + const QString& filename, + const QString& arguments, + const QString& workDir, + const QStringList& extraBinDir); void runProblem(const QString& filename, const QString& arguments, const QString& workDir, POJProblemCase problemCase); void runProblem(const QString& filename, const QString& arguments, const QString& workDir, const QVector &problemCases); void stopRun(); diff --git a/RedPandaIDE/compiler/executablerunner.cpp b/RedPandaIDE/compiler/executablerunner.cpp index 50127b06..206bc828 100644 --- a/RedPandaIDE/compiler/executablerunner.cpp +++ b/RedPandaIDE/compiler/executablerunner.cpp @@ -62,6 +62,21 @@ void ExecutableRunner::setShareMemoryId(const QString &newShareMemoryId) mShareMemoryId = newShareMemoryId; } +const QStringList &ExecutableRunner::binDirs() const +{ + return mBinDirs; +} + +void ExecutableRunner::addBinDirs(const QStringList &binDirs) +{ + mBinDirs.append(binDirs); +} + +void ExecutableRunner::addBinDir(const QString &binDir) +{ + mBinDirs.append(binDir); +} + bool ExecutableRunner::redirectInput() const { return mRedirectInput; @@ -100,15 +115,9 @@ void ExecutableRunner::run() mProcess->setWorkingDirectory(mWorkDir); QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QString path = env.value("PATH"); - QStringList pathAdded; - if (pSettings->compilerSets().defaultSet()) { - foreach(const QString& dir, pSettings->compilerSets().defaultSet()->binDirs()) { - pathAdded.append(dir); - } - } - pathAdded.append(pSettings->dirs().appDir()); + QStringList pathAdded = mBinDirs; if (!path.isEmpty()) { - path= pathAdded.join(PATH_SEPARATOR) + PATH_SEPARATOR + path; + path = pathAdded.join(PATH_SEPARATOR) + PATH_SEPARATOR + path; } else { path = pathAdded.join(PATH_SEPARATOR); } diff --git a/RedPandaIDE/compiler/executablerunner.h b/RedPandaIDE/compiler/executablerunner.h index bcfa15a5..65874580 100644 --- a/RedPandaIDE/compiler/executablerunner.h +++ b/RedPandaIDE/compiler/executablerunner.h @@ -41,6 +41,10 @@ public: void setShareMemoryId(const QString &newShareMemoryId); + const QStringList &binDirs() const; + void addBinDirs(const QStringList &binDirs); + void addBinDir(const QString &binDir); + private: QString mRedirectInputFilename; QString mShareMemoryId; @@ -48,6 +52,7 @@ private: bool mStartConsole; std::shared_ptr mProcess; QSemaphore mQuitSemaphore; + QStringList mBinDirs; // QThread interface protected: diff --git a/RedPandaIDE/debugger.cpp b/RedPandaIDE/debugger.cpp index e5ce1c42..7c6bfad7 100644 --- a/RedPandaIDE/debugger.cpp +++ b/RedPandaIDE/debugger.cpp @@ -55,7 +55,7 @@ Debugger::Debugger(QObject *parent) : QObject(parent), this, &Debugger::fetchVarChildren); } -bool Debugger::start(int compilerSetIndex, const QString& inferior) +bool Debugger::start(int compilerSetIndex, const QString& inferior, const QStringList& binDirs) { Settings::PCompilerSet compilerSet = pSettings->compilerSets().getSet(compilerSetIndex); @@ -126,6 +126,8 @@ bool Debugger::start(int compilerSetIndex, const QString& inferior) mTarget->waitStart(); } mReader = new DebugReader(this); + mReader->addBinDirs(binDirs); + mReader->addBinDir(pSettings->dirs().appDir()); mReader->setDebuggerPath(debuggerPath); connect(mReader, &QThread::finished,this,&Debugger::cleanUpReader); connect(mReader, &QThread::finished,mMemoryModel,&MemoryModel::reset); @@ -1327,6 +1329,21 @@ void DebugReader::asyncUpdate() mAsyncUpdated = false; } +const QStringList &DebugReader::binDirs() const +{ + return mBinDirs; +} + +void DebugReader::addBinDirs(const QStringList &binDirs) +{ + mBinDirs.append(binDirs); +} + +void DebugReader::addBinDir(const QString &binDir) +{ + mBinDirs.append(binDir); +} + const QString &DebugReader::signalMeaning() const { return mSignalMeaning; @@ -1420,19 +1437,22 @@ void DebugReader::run() mProcess->setProgram(cmd); mProcess->setArguments(splitProcessCommand(arguments)); mProcess->setProcessChannelMode(QProcess::MergedChannels); + + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + QString path = env.value("PATH"); + QStringList pathAdded = mBinDirs; + if (!path.isEmpty()) { + path = pathAdded.join(PATH_SEPARATOR) + PATH_SEPARATOR + path; + } else { + path = pathAdded.join(PATH_SEPARATOR); + } QString cmdDir = extractFileDir(cmd); if (!cmdDir.isEmpty()) { - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - QString path = env.value("PATH"); - cmdDir.replace("/",QDir::separator()); - if (path.isEmpty()) { - path = cmdDir; - } else { - path = cmdDir + PATH_SEPARATOR + path; - } - env.insert("PATH",path); - mProcess->setProcessEnvironment(env); + path = cmdDir + PATH_SEPARATOR + path; } + env.insert("PATH",path); + mProcess->setProcessEnvironment(env); + mProcess->setWorkingDirectory(workingDir); connect(mProcess.get(), &QProcess::errorOccurred, diff --git a/RedPandaIDE/debugger.h b/RedPandaIDE/debugger.h index e7460545..c55c3453 100644 --- a/RedPandaIDE/debugger.h +++ b/RedPandaIDE/debugger.h @@ -259,7 +259,7 @@ class Debugger : public QObject public: explicit Debugger(QObject *parent = nullptr); // Play/pause - bool start(int compilerSetIndex, const QString& inferior); + bool start(int compilerSetIndex, const QString& inferior, const QStringList& binDirs); void sendCommand(const QString& command, const QString& params, DebugCommandSource source = DebugCommandSource::Other); bool commandRunning(); @@ -428,6 +428,10 @@ public: const QString &signalMeaning() const; + const QStringList &binDirs() const; + void addBinDirs(const QStringList &binDirs); + void addBinDir(const QString &binDir); + signals: void parseStarted(); void invalidateAllVars(); @@ -463,6 +467,7 @@ signals: const QString& newType, int newNumChildren, bool hasMore); void varsValueUpdated(); + private: void clearCmdQueue(); @@ -502,6 +507,7 @@ private: bool mCmdRunning; PDebugCommand mCurrentCmd; std::shared_ptr mProcess; + QStringList mBinDirs; //fWatchView: TTreeView; diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index ce06b626..3f1bb9c6 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -1550,7 +1550,7 @@ bool MainWindow::compile(bool rebuild) } mProject->buildPrivateResource(); if (mCompileSuccessionTask) { - mCompileSuccessionTask->filename = mProject->executable(); + mCompileSuccessionTask->execName = mProject->executable(); } stretchMessagesPanel(true); ui->tabMessages->setCurrentWidget(ui->tabToolsOutput); @@ -1566,7 +1566,7 @@ bool MainWindow::compile(bool rebuild) return false; } if (mCompileSuccessionTask) { - mCompileSuccessionTask->filename = getCompiledExecutableName(editor->filename()); + mCompileSuccessionTask->execName = getCompiledExecutableName(editor->filename()); } stretchMessagesPanel(true); ui->tabMessages->setCurrentWidget(ui->tabToolsOutput); @@ -1579,7 +1579,11 @@ bool MainWindow::compile(bool rebuild) return false; } -void MainWindow::runExecutable(const QString &exeName,const QString &filename,RunType runType) +void MainWindow::runExecutable( + const QString &exeName, + const QString &filename, + RunType runType, + const QStringList& binDirs) { mCompilerManager->stopPausing(); // Check if it exists @@ -1622,7 +1626,7 @@ void MainWindow::runExecutable(const QString &exeName,const QString &filename,Ru if (pSettings->executor().minimizeOnRun()) { showMinimized(); } - mCompilerManager->run(exeName,params,QFileInfo(exeName).absolutePath()); + mCompilerManager->run(exeName,params,QFileInfo(exeName).absolutePath(),binDirs); } else if (runType == RunType::ProblemCases) { POJProblem problem = mOJProblemModel.problem(); if (problem) { @@ -1649,6 +1653,7 @@ void MainWindow::runExecutable(RunType runType) { CompileTarget target =getCompileTarget(); if (target == CompileTarget::Project) { + QStringList binDirs = mProject->binDirs(); if (mProject->modified() && QMessageBox::question( this, @@ -1658,10 +1663,14 @@ void MainWindow::runExecutable(RunType runType) mProject->saveAll(); mCompileSuccessionTask=std::make_shared(); mCompileSuccessionTask->type = CompileSuccessionTaskType::RunNormal; + mCompileSuccessionTask->execName=mProject->executable(); + mCompileSuccessionTask->binDirs=binDirs; compile(); return; } - runExecutable(mProject->executable(),mProject->filename(),runType); + + runExecutable(mProject->executable(),mProject->filename(),runType, + binDirs); } else { Editor * editor = mEditorList->getEditor(); if (editor != NULL ) { @@ -1669,8 +1678,9 @@ void MainWindow::runExecutable(RunType runType) if (!editor->save(false,false)) return; } + QStringList binDirs = getDefaultCompilerSetBinDirs(); QString exeName= getCompiledExecutableName(editor->filename()); - runExecutable(exeName,editor->filename(),runType); + runExecutable(exeName,editor->filename(),runType,binDirs); } } } @@ -1691,8 +1701,10 @@ void MainWindow::debug() bool stripEnabled; QString filePath; QFileInfo debugFile; + QStringList binDirs; switch(getCompileTarget()) { case CompileTarget::Project: + binDirs = mProject->binDirs(); // Check if we enabled proper options debugEnabled = mProject->getCompileOption(CC_CMD_OPT_DEBUG_INFO) == COMPILER_OPTION_ON; stripEnabled = mProject->getCompileOption(LINK_CMD_OPT_STRIP_EXE) == COMPILER_OPTION_ON; @@ -1711,6 +1723,8 @@ void MainWindow::debug() mCompileSuccessionTask=std::make_shared(); mCompileSuccessionTask->type = CompileSuccessionTaskType::Debug; + mCompileSuccessionTask->execName = mProject->executable(); + mCompileSuccessionTask->binDirs = binDirs; compile(); return; @@ -1725,7 +1739,8 @@ void MainWindow::debug() QMessageBox::Yes) == QMessageBox::Yes) { mCompileSuccessionTask=std::make_shared(); mCompileSuccessionTask->type = CompileSuccessionTaskType::Debug; - + mCompileSuccessionTask->execName = mProject->executable(); + mCompileSuccessionTask->binDirs = binDirs; compile(); } return; @@ -1738,6 +1753,8 @@ void MainWindow::debug() ) == QMessageBox::Yes) { mCompileSuccessionTask=std::make_shared(); mCompileSuccessionTask->type = CompileSuccessionTaskType::Debug; + mCompileSuccessionTask->execName = mProject->executable(); + mCompileSuccessionTask->binDirs = binDirs; compile(); return; } @@ -1766,7 +1783,7 @@ void MainWindow::debug() // mDebugger->setUseUTF8(e->fileEncoding() == ENCODING_UTF8 || e->fileEncoding() == ENCODING_UTF8_BOM); - if (!mDebugger->start(mProject->options().compilerSet, filePath)) + if (!mDebugger->start(mProject->options().compilerSet, filePath, binDirs)) return; filePath.replace('\\','/'); mDebugger->sendCommand("-file-exec-and-symbols", '"' + filePath + '"'); @@ -1777,12 +1794,16 @@ void MainWindow::debug() mDebugger->sendCommand("-file-exec-file", '"' + host + '"'); } - includeOrSkipDirs(mProject->options().includes, + includeOrSkipDirs(mProject->options().includeDirs, pSettings->debugger().skipProjectLibraries()); - includeOrSkipDirs(mProject->options().libs, + includeOrSkipDirs(mProject->options().libDirs, pSettings->debugger().skipProjectLibraries()); break; case CompileTarget::File: { + if (pSettings->compilerSets().defaultSet()) { + binDirs = pSettings->compilerSets().defaultSet()->binDirs(); + } + // Check if we enabled proper options debugEnabled = compilerSet->getCompileOptionValue(CC_CMD_OPT_DEBUG_INFO) == COMPILER_OPTION_ON; stripEnabled = compilerSet->getCompileOptionValue(LINK_CMD_OPT_STRIP_EXE) == COMPILER_OPTION_ON; @@ -1801,7 +1822,7 @@ void MainWindow::debug() mCompileSuccessionTask=std::make_shared(); mCompileSuccessionTask->type = CompileSuccessionTaskType::Debug; - + mCompileSuccessionTask->binDirs = binDirs; compile(); return; } @@ -1825,6 +1846,7 @@ void MainWindow::debug() QMessageBox::Yes) == QMessageBox::Yes) { mCompileSuccessionTask=std::make_shared(); mCompileSuccessionTask->type = CompileSuccessionTaskType::Debug; + mCompileSuccessionTask->binDirs = binDirs; compile(); return; } @@ -1836,6 +1858,7 @@ void MainWindow::debug() QMessageBox::Yes) == QMessageBox::Yes) { mCompileSuccessionTask=std::make_shared(); mCompileSuccessionTask->type = CompileSuccessionTaskType::Debug; + mCompileSuccessionTask->binDirs = binDirs; compile(); return; } @@ -1844,7 +1867,7 @@ void MainWindow::debug() prepareDebugger(); QString filePath = debugFile.filePath().replace('\\','/'); - if (!mDebugger->start(pSettings->compilerSets().defaultIndex(),filePath)) + if (!mDebugger->start(pSettings->compilerSets().defaultIndex(),filePath, binDirs)) return; mDebugger->sendCommand("-file-exec-and-symbols", QString("\"%1\"").arg(filePath)); } @@ -2746,7 +2769,29 @@ void MainWindow::maximizeEditor() } } -void MainWindow::openShell(const QString &folder, const QString &shellCommand) +QStringList MainWindow::getBinDirsForCurrentEditor() +{ + Editor * e=mEditorList->getEditor(); + if (e) { + if (e->inProject() && mProject) { + return mProject->binDirs(); + } else { + return getDefaultCompilerSetBinDirs(); + } + } else if (mProject) { + return mProject->binDirs(); + } + return QStringList(); +} + +QStringList MainWindow::getDefaultCompilerSetBinDirs() +{ + if (pSettings->compilerSets().defaultSet()) + return pSettings->compilerSets().defaultSet()->binDirs(); + return QStringList(); +} + +void MainWindow::openShell(const QString &folder, const QString &shellCommand, const QStringList& binDirs) { QProcess process; process.setWorkingDirectory(folder); @@ -2760,11 +2805,7 @@ void MainWindow::openShell(const QString &folder, const QString &shellCommand) QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QString path = env.value("PATH"); QStringList pathAdded; - if (pSettings->compilerSets().defaultSet()) { - foreach(const QString& dir, pSettings->compilerSets().defaultSet()->binDirs()) { - pathAdded.append(dir); - } - } + pathAdded.append(binDirs); pathAdded.append(pSettings->dirs().appDir()); if (!path.isEmpty()) { path= pathAdded.join(PATH_SEPARATOR) + PATH_SEPARATOR + path; @@ -3702,9 +3743,9 @@ void MainWindow::onFilesViewOpenInTerminal() if (!path.isEmpty()) { QFileInfo fileInfo(path); #ifdef Q_OS_WIN - openShell(fileInfo.path(),"cmd.exe"); + openShell(fileInfo.path(),"cmd.exe",getDefaultCompilerSetBinDirs()); #else - openShell(fileInfo.path(),pSettings->environment().terminalPath()); + openShell(fileInfo.path(),pSettings->environment().terminalPath(),getDefaultCompilerSetBinDirs()); #endif } } @@ -4656,13 +4697,13 @@ void MainWindow::onCompileFinished(bool isCheckSyntax) if (mCompileSuccessionTask && mCompilerManager->compileErrorCount()==0) { switch (mCompileSuccessionTask->type) { case MainWindow::CompileSuccessionTaskType::RunNormal: - runExecutable(mCompileSuccessionTask->filename); + runExecutable(mCompileSuccessionTask->execName,QString(),RunType::Normal, mCompileSuccessionTask->binDirs); break; case MainWindow::CompileSuccessionTaskType::RunProblemCases: - runExecutable(mCompileSuccessionTask->filename,QString(),RunType::ProblemCases); + runExecutable(mCompileSuccessionTask->execName,QString(),RunType::ProblemCases, mCompileSuccessionTask->binDirs); break; case MainWindow::CompileSuccessionTaskType::RunCurrentProblemCase: - runExecutable(mCompileSuccessionTask->filename,QString(),RunType::CurrentProblemCase); + runExecutable(mCompileSuccessionTask->execName,QString(),RunType::CurrentProblemCase, mCompileSuccessionTask->binDirs); break; case MainWindow::CompileSuccessionTaskType::Debug: debug(); @@ -5566,9 +5607,9 @@ void MainWindow::on_actionOpen_Terminal_triggered() QFileInfo info(editor->filename()); if (!info.path().isEmpty()) { #ifdef Q_OS_WIN - openShell(info.path(),"cmd.exe"); + openShell(info.path(),"cmd.exe",getBinDirsForCurrentEditor()); #else - openShell(info.path(),pSettings->environment().terminalPath()); + openShell(info.path(),pSettings->environment().terminalPath(),getBinDirsForCurrentEditor()); #endif } } @@ -5889,9 +5930,9 @@ void MainWindow::on_actionProject_Open_In_Terminal_triggered() if (!mProject) return; #ifdef Q_OS_WIN - openShell(mProject->directory(),"cmd.exe"); + openShell(mProject->directory(),"cmd.exe",mProject->binDirs()); #else - openShell(mProject->directory(),pSettings->environment().terminalPath()); + openShell(mProject->directory(),pSettings->environment().terminalPath(),mProject->binDirs()); #endif } @@ -6489,7 +6530,17 @@ void MainWindow::clearIssues() void MainWindow::doCompileRun(RunType runType) { + CompileTarget target =getCompileTarget(); + QStringList binDirs; + QString execName; + if (target == CompileTarget::Project) { + binDirs = mProject->binDirs(); + execName = mProject->executable(); + } else { + binDirs = getDefaultCompilerSetBinDirs(); + } mCompileSuccessionTask = std::make_shared(); + mCompileSuccessionTask->binDirs=binDirs; switch (runType) { case RunType::CurrentProblemCase: mCompileSuccessionTask->type = CompileSuccessionTaskType::RunCurrentProblemCase; diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index 6881815d..1dac7a20 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -56,6 +56,7 @@ enum class RunType { ProblemCases }; + class EditorList; class QLabel; class QComboBox; @@ -85,8 +86,10 @@ class MainWindow : public QMainWindow struct CompileSuccessionTask { CompileSuccessionTaskType type; - QString filename; + QString execName; + QStringList binDirs; }; + using PCompileSuccessionTask = std::shared_ptr; struct TabWidgetInfo { @@ -114,7 +117,11 @@ public: void updateActionIcons(); void checkSyntaxInBack(Editor* e); bool compile(bool rebuild=false); - void runExecutable(const QString& exeName, const QString& filename=QString(),RunType runType = RunType::Normal); + void runExecutable( + const QString& exeName, + const QString& filename, + RunType runType, + const QStringList& binDirs); void runExecutable(RunType runType = RunType::Normal); void debug(); void showSearchPanel(bool showReplace = false); @@ -241,7 +248,9 @@ private: void buildContextMenus(); void buildEncodingMenu(); void maximizeEditor(); - void openShell(const QString& folder, const QString& shellCommand); + QStringList getBinDirsForCurrentEditor(); + QStringList getDefaultCompilerSetBinDirs(); + void openShell(const QString& folder, const QString& shellCommand, const QStringList& binDirs); QAction* createActionFor(const QString& text, QWidget* parent, QKeySequence shortcut=QKeySequence()); diff --git a/RedPandaIDE/project.cpp b/RedPandaIDE/project.cpp index 6a1fe1bd..42028165 100644 --- a/RedPandaIDE/project.cpp +++ b/RedPandaIDE/project.cpp @@ -463,7 +463,7 @@ void Project::resetParserProjectFiles() foreach (const PProjectUnit& unit, mUnits) { mParser->addFileToScan(unit->fileName()); } - foreach (const QString& s, mOptions.includes) { + foreach (const QString& s, mOptions.includeDirs) { mParser->addProjectIncludePath(s); } } @@ -876,8 +876,9 @@ void Project::saveOptions() ini.SetLongValue("Project","Type", static_cast(mOptions.type)); ini.SetLongValue("Project","Ver", 3); // Is 3 as of Red Panda C++.0 ini.SetValue("Project","ObjFiles", toByteArray(mOptions.objFiles.join(";"))); - ini.SetValue("Project","Includes", toByteArray(mOptions.includes.join(";"))); - ini.SetValue("Project","Libs", toByteArray(mOptions.libs.join(";"))); + ini.SetValue("Project","Includes", toByteArray(mOptions.includeDirs.join(";"))); + ini.SetValue("Project","Libs", toByteArray(mOptions.libDirs.join(";"))); + ini.SetValue("Project","Bins", toByteArray(mOptions.binDirs.join(";"))); ini.SetValue("Project","PrivateResource", toByteArray(mOptions.privateResource)); ini.SetValue("Project","ResourceIncludes", toByteArray(mOptions.resourceIncludes.join(";"))); ini.SetValue("Project","MakeIncludes", toByteArray(mOptions.makeIncludes.join(";"))); @@ -1589,8 +1590,9 @@ void Project::loadOptions(SimpleIni& ini) mOptions.cppCompilerCmd = fromByteArray(ini.GetValue("Project", "CppCompiler", "")); mOptions.linkerCmd = fromByteArray(ini.GetValue("Project", "Linker", "")); mOptions.objFiles = fromByteArray(ini.GetValue("Project", "ObjFiles", "")).split(";",QString::SkipEmptyParts); - mOptions.libs = fromByteArray(ini.GetValue("Project", "Libs", "")).split(";",QString::SkipEmptyParts); - mOptions.includes = fromByteArray(ini.GetValue("Project", "Includes", "")).split(";",QString::SkipEmptyParts); + mOptions.binDirs = fromByteArray(ini.GetValue("Project", "Bins", "")).split(";",QString::SkipEmptyParts); + mOptions.libDirs = fromByteArray(ini.GetValue("Project", "Libs", "")).split(";",QString::SkipEmptyParts); + mOptions.includeDirs = fromByteArray(ini.GetValue("Project", "Includes", "")).split(";",QString::SkipEmptyParts); mOptions.privateResource = fromByteArray(ini.GetValue("Project", "PrivateResource", "")); mOptions.resourceIncludes = fromByteArray(ini.GetValue("Project", "ResourceIncludes", "")).split(";",QString::SkipEmptyParts); mOptions.makeIncludes = fromByteArray(ini.GetValue("Project", "MakeIncludes", "")).split(";",QString::SkipEmptyParts); @@ -1708,7 +1710,7 @@ void Project::loadOptions(SimpleIni& ini) mOptions.privateResource = fromByteArray(ini.GetValue("Project", "PrivateResource", "")); mOptions.resourceIncludes = fromByteArray(ini.GetValue("Project", "ResourceIncludes", "")).split(";",QString::SkipEmptyParts); mOptions.objFiles = fromByteArray(ini.GetValue("Project", "ObjFiles", "")).split(";",QString::SkipEmptyParts); - mOptions.includes = fromByteArray(ini.GetValue("Project", "IncludeDirs", "")).split(";",QString::SkipEmptyParts); + mOptions.includeDirs = fromByteArray(ini.GetValue("Project", "IncludeDirs", "")).split(";",QString::SkipEmptyParts); mOptions.compilerCmd = fromByteArray(ini.GetValue("Project", "CompilerOptions", "")); mOptions.isCpp = ini.GetBoolValue("Project", "Use_GPP", false); mOptions.exeOutput = fromByteArray(ini.GetValue("Project", "ExeOutput", "")); @@ -1826,6 +1828,16 @@ QString Project::fileSystemNodeFolderPath(const PProjectModelNode &node) return result; } +QStringList Project::binDirs() +{ + QStringList lst = options().binDirs; + Settings::PCompilerSet compilerSet = pSettings->compilerSets().getSet(options().compilerSet); + if (compilerSet) { + lst.append(compilerSet->binDirs()); + } + return lst; +} + EditorList *Project::editorList() const { return mEditorList; diff --git a/RedPandaIDE/project.h b/RedPandaIDE/project.h index 9d34ce9c..e25c5398 100644 --- a/RedPandaIDE/project.h +++ b/RedPandaIDE/project.h @@ -245,6 +245,8 @@ public: QString fileSystemNodeFolderPath(const PProjectModelNode& node); + QStringList binDirs(); + signals: void nodesChanged(); void modifyChanged(bool value); diff --git a/RedPandaIDE/projectoptions.h b/RedPandaIDE/projectoptions.h index 204d64a8..123b6393 100644 --- a/RedPandaIDE/projectoptions.h +++ b/RedPandaIDE/projectoptions.h @@ -61,8 +61,9 @@ struct ProjectOptions{ QString compilerCmd; QString cppCompilerCmd; QString linkerCmd; - QStringList includes; - QStringList libs; + QStringList binDirs; + QStringList includeDirs; + QStringList libDirs; QString privateResource; QStringList resourceIncludes; QStringList makeIncludes; diff --git a/RedPandaIDE/projecttemplate.cpp b/RedPandaIDE/projecttemplate.cpp index 78582aec..8fa5560f 100644 --- a/RedPandaIDE/projecttemplate.cpp +++ b/RedPandaIDE/projecttemplate.cpp @@ -130,8 +130,9 @@ void ProjectTemplate::readTemplateFile(const QString &fileName) mOptions.icon = mIni->GetValue("Project", "Icon", ""); mOptions.type = static_cast(mIni->GetLongValue("Project", "Type", 0)); // default = gui mOptions.objFiles = fromByteArray(mIni->GetValue("Project", "ObjFiles", "")).split(";",QString::SkipEmptyParts); - mOptions.includes = fromByteArray(mIni->GetValue("Project", "Includes", "")).split(";",QString::SkipEmptyParts); - mOptions.libs = fromByteArray(mIni->GetValue("Project", "Libs", "")).split(";",QString::SkipEmptyParts); + mOptions.includeDirs = fromByteArray(mIni->GetValue("Project", "Includes", "")).split(";",QString::SkipEmptyParts); + mOptions.binDirs = fromByteArray(mIni->GetValue("Project", "Bins", "")).split(";",QString::SkipEmptyParts); + mOptions.libDirs = fromByteArray(mIni->GetValue("Project", "Libs", "")).split(";",QString::SkipEmptyParts); mOptions.resourceIncludes = fromByteArray(mIni->GetValue("Project", "ResourceIncludes", "")).split(";",QString::SkipEmptyParts); mOptions.compilerCmd = fromByteArray(mIni->GetValue("Project", "Compiler", "")); mOptions.cppCompilerCmd = fromByteArray(mIni->GetValue("Project", "CppCompiler", "")); diff --git a/RedPandaIDE/settingsdialog/projectdirectorieswidget.cpp b/RedPandaIDE/settingsdialog/projectdirectorieswidget.cpp index ab3587ac..7f0ad921 100644 --- a/RedPandaIDE/settingsdialog/projectdirectorieswidget.cpp +++ b/RedPandaIDE/settingsdialog/projectdirectorieswidget.cpp @@ -26,6 +26,8 @@ ProjectDirectoriesWidget::ProjectDirectoriesWidget(const QString &name, const QS { ui->setupUi(this); + mBinDirWidget = new CompilerSetDirectoriesWidget(); + ui->tabDirs->addTab(mBinDirWidget,tr("Binaries")); mLibDirWidget = new CompilerSetDirectoriesWidget(); ui->tabDirs->addTab(mLibDirWidget,tr("Libraries")); mIncludeDirWidget = new CompilerSetDirectoriesWidget(); @@ -42,16 +44,18 @@ ProjectDirectoriesWidget::~ProjectDirectoriesWidget() void ProjectDirectoriesWidget::doLoad() { - mLibDirWidget->setDirList(pMainWindow->project()->options().libs); - mIncludeDirWidget->setDirList(pMainWindow->project()->options().includes); + mBinDirWidget->setDirList(pMainWindow->project()->options().binDirs); + mLibDirWidget->setDirList(pMainWindow->project()->options().libDirs); + mIncludeDirWidget->setDirList(pMainWindow->project()->options().includeDirs); mResourceDirWidget->setDirList(pMainWindow->project()->options().resourceIncludes); } void ProjectDirectoriesWidget::doSave() { - pMainWindow->project()->options().libs = mLibDirWidget->dirList(); - pMainWindow->project()->options().includes = mIncludeDirWidget->dirList(); + pMainWindow->project()->options().binDirs = mBinDirWidget->dirList(); + pMainWindow->project()->options().libDirs = mLibDirWidget->dirList(); + pMainWindow->project()->options().includeDirs = mIncludeDirWidget->dirList(); pMainWindow->project()->options().resourceIncludes = mResourceDirWidget->dirList(); pMainWindow->project()->saveOptions(); } diff --git a/RedPandaIDE/settingsdialog/projectdirectorieswidget.h b/RedPandaIDE/settingsdialog/projectdirectorieswidget.h index 7a5834a0..b2c07cd8 100644 --- a/RedPandaIDE/settingsdialog/projectdirectorieswidget.h +++ b/RedPandaIDE/settingsdialog/projectdirectorieswidget.h @@ -35,6 +35,7 @@ public: private: Ui::ProjectDirectoriesWidget *ui; + CompilerSetDirectoriesWidget *mBinDirWidget; CompilerSetDirectoriesWidget *mLibDirWidget; CompilerSetDirectoriesWidget *mIncludeDirWidget; CompilerSetDirectoriesWidget *mResourceDirWidget;