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 @@
+
+
+
+
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
-
+
函数
-
+
文件名
-
+
行
@@ -239,37 +239,37 @@ p, li { white-space: pre-wrap; }
BreakpointModel
-
+
文件名
-
+
行
-
+
条件
-
+
保存文件'%1'失败。
-
+
无法写入文件'%1'.
-
+
JSON文件'%1':%2中存在错误:%3
-
+
无法读取文件'%1'.
@@ -728,12 +728,12 @@ p, li { white-space: pre-wrap; }
程序中的文字内容可能无法被正确处理和显示。
-
+
找不到Console Pauser程序
-
+
找不到Console Pauser程序"%1"!
@@ -1219,7 +1219,7 @@ Are you really want to continue?
无法在"%1"找到gdb server
-
+
执行以求值
@@ -1228,22 +1228,22 @@ Are you really want to continue?
不在当前语境中
-
+
编译
-
+
源文件比程序文件新。
-
+
重新编译?
-
+
收到信号"%1":
@@ -2312,7 +2312,7 @@ Are you really want to continue?
ExecutableRunner
-
+
The runner process failed to start.
无法启动程序运行进程'%1'。
@@ -2322,17 +2322,17 @@ Are you really want to continue?
程序运行进程启动后崩溃。
-
+
waitFor()函数等待超时。
-
+
在向程序运行进程写入内容时出错。
-
+
在从程序运行进程读取内容时出错。
@@ -3837,11 +3837,11 @@ Are you really want to continue?
-
-
-
-
-
+
+
+
+
+
编译器
@@ -4049,8 +4049,8 @@ Are you really want to continue?
-
-
+
+
编译
@@ -4123,9 +4123,9 @@ Are you really want to continue?
-
-
-
+
+
+
复制
@@ -4136,7 +4136,7 @@ Are you really want to continue?
-
+
粘贴
@@ -4147,8 +4147,8 @@ Are you really want to continue?
-
-
+
+
选择全部
@@ -4274,7 +4274,7 @@ Are you really want to continue?
-
+
新建试题集
@@ -4293,14 +4293,14 @@ Are you really want to continue?
-
+
保存试题集
-
+
载入试题集
@@ -4361,7 +4361,7 @@ Are you really want to continue?
-
+
Run Current Case
运行所有案例
@@ -4431,9 +4431,9 @@ Are you really want to continue?
消息
-
+
- 忽略空格
+ 忽略空格
@@ -4654,7 +4654,7 @@ Are you really want to continue?
-
+
删除所有断点
@@ -4790,7 +4790,7 @@ Are you really want to continue?
Ctrl+F10
-
+
新建文件
@@ -4831,7 +4831,7 @@ Are you really want to continue?
-
+
重命名符号
@@ -4852,13 +4852,13 @@ Are you really want to continue?
-
+
导出为RTF
-
+
导出为HTML
@@ -5127,7 +5127,7 @@ Are you really want to continue?
运行参数...
-
+
文件编码
@@ -5202,146 +5202,146 @@ Are you really want to continue?
你确定要关闭'%1'吗?
-
-
+
+
确认
-
-
-
+
+
+
源文件尚未编译。
-
-
+
+
现在编译?
-
-
+
+
源文件比可执行程序新。
-
+
重新编译?
-
+
无编译器设置
-
+
没有配置编译器设置。
-
+
无法启动调试器
-
-
+
+
启用调试参数
-
-
+
+
当前编译设置中未启用调试选项(-g3),或启用了信息剥除选项(-s)<br /><br/>是否纠正这一问题?
-
+
项目尚未构建
-
+
项目尚未构建。是否构建?
-
+
宿主程序不存在
-
+
动态链接库(DLL)需要一个宿主程序来运行。
-
+
但它不存在。
-
+
宿主程序不存在
-
+
宿主程序'%1'不存在。
-
+
重新编译?
-
+
保存上次打开信息失败
-
+
无法删除旧上次打开信息文件'%1'
-
+
无法保存上次打开信息文件'%1'
-
+
载入上次打开信息失败
-
+
无法载入上次打开信息文件'%1'
-
+
打开源代码文件
-
-
+
+
批量设置案例
-
+
显示详细调试器日志
-
+
全部复制
@@ -5349,9 +5349,9 @@ Are you really want to continue?
-
-
-
+
+
+
清除
@@ -5367,7 +5367,7 @@ Are you really want to continue?
-
+
试题集%1
@@ -5388,68 +5388,68 @@ Are you really want to continue?
或者选择使用其他的网络端口。
-
-
+
+
重新构建项目
-
-
+
+
项目已经被修改过,是否需要重新构建?
-
+
自动保存出错
-
+
自动保存"%1"到"%2"失败:%3
-
+
试题属性...
-
+
设置试题集名称
-
+
试题集名称:
-
+
删除
-
+
删除全部书签
-
+
修改描述
-
-
-
+
+
+
书签描述
-
-
-
+
+
+
描述:
@@ -5458,178 +5458,178 @@ Are you really want to continue?
在调试主控台中显示调试器输出
-
+
清除这次搜索
-
+
删除所有搜索
-
+
断点条件...
-
+
断点条件
-
+
输入当前断点的生效条件:
-
+
Remove all breakpoints
删除所有断点
-
+
删除当前断点
-
+
重命名文件
-
-
+
+
添加文件夹
-
+
新文件夹
-
+
文件夹:
-
+
重命名
-
+
运行当前案例
-
+
删除文件夹
-
+
切换为普通视图
-
+
切换为自定义视图
-
+
按类型排序
-
+
按名称排序
-
+
显示继承的成员
-
+
跳转到声明处
-
+
跳转到定义处
-
-
+
+
新建文件夹
-
+
重命名
-
-
-
-
+
+
+
+
删除
-
+
在编辑器中打开
-
+
使用外部程序打开
-
+
在终端中打开
-
+
在Windows浏览器中打开
-
+
字符集
-
+
转换为%1编码
-
+
已自动保存%1个文件
-
+
设置答案源代码...
-
+
选择其他文件...
-
+
选择答案源代码文件
@@ -5639,83 +5639,83 @@ Are you really want to continue?
C/C++源代码文件 (*.c *.cpp *.cc *.cxx)
-
+
新建文件夹%1
-
+
无标题
-
+
无标题%1
-
+
你真的要删除%1吗?
-
+
你真的要删除%1个文件吗?
-
+
保存项目
-
+
项目'%1'有改动。
-
-
+
+
需要保存吗?
-
-
+
+
文件已发生变化
-
+
新建项目文件?
-
+
您是否要将新建的文件加入项目?
-
-
-
-
+
+
+
+
保存失败
-
+
改变项目编译器配置集
-
+
改变项目的编译器配置集会导致所有的自定义编译器选项被重置。
-
-
+
+
你真的想要那么做吗?
@@ -5724,114 +5724,114 @@ Are you really want to continue?
批量设置案例
-
+
选择输入数据文件
-
+
输入数据文件 (*.in)
-
+
修改监视表达式
-
+
监视表达式
-
+
您真的要清除该文件的所有断点吗?
-
+
新建项目
-
+
关闭'%1'以打开新项目?
-
+
文件夹不存在
-
+
文件夹'%1'不存在。是否创建?
-
+
无法创建文件夹
-
+
创建文件夹'%1'失败。
-
+
-
+
文件夹%1不是空的。
-
+
你真的要删除它吗?
-
+
改变工作文件夹
-
+
File '%1' is not in the current working folder
文件'%1'不在当前工作文件夹中。
-
+
是否将工作文件夹改设为'%1'?
-
+
无法提交
-
+
Git需要用信息进行提交。
-
+
选择输入数据文件
-
-
+
+
所有文件 (*.*)
-
+
Choose Expected Input Data File
选择期望输出文件
@@ -5843,59 +5843,59 @@ Are you really want to continue?
-
+
选择工作文件夹
-
-
+
+
头文件已存在
-
-
+
+
头文件"%1"已存在!
-
+
源文件已存在!
-
+
源文件"%1"已存在!
-
+
无法提交!
-
+
下列文件处于冲突状态,请解决后重新添加和提交:
-
+
提交信息
-
+
提交信息:
-
+
提交失败
-
+
提交信息不能为空!
@@ -5904,135 +5904,135 @@ Are you really want to continue?
小熊猫Dev-C++项目文件 (*.dev)
-
+
新建项目失败
-
+
无法使用模板创建项目
-
+
删除文件
-
+
同时从硬盘上删除文件?
-
+
无标题
-
+
新的项目文件名
-
+
文件名:
-
+
文件已存在!
-
+
文件'%1'已经存在!
-
+
添加到项目
-
+
C/C++源代码文件 (*.c *.cpp *.cc *.cxx)
-
+
本操作会删除此试题的所有案例。
-
+
小熊猫C++项目文件(*.dev)
-
+
重命名出错
-
+
符号'%1'在系统头文件中定义,无法修改。
-
+
新名称
-
-
+
+
替换出错
-
+
无法打开文件'%1'进行替换!
-
+
内容和上次查找时不一致。
-
+
RTF格式文件 (*.rtf)
-
+
HTML文件 (*.html)
-
+
当前的试题集不是空的。
-
+
试题%1
-
-
+
+
试题集文件 (*.pbs)
-
+
载入失败
-
-
+
+
试题案例%1
@@ -6044,15 +6044,15 @@ Are you really want to continue?
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
错误
@@ -6073,85 +6073,85 @@ Are you really want to continue?
清除历史
-
-
+
+
版本控制
-
+
磁盘文件'%1'已被修改。
-
+
是否重新读取它的内容?
-
+
磁盘文件'%1'已被删除。
-
+
是否保持它在小熊猫C++中打开的编辑窗口?
-
+
打开
-
+
编译失败
-
+
运行失败
-
-
-
-
+
+
+
+
确认转换
-
-
-
-
+
+
+
+
当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗?
-
+
新监视表达式
-
+
输入监视表达式
-
+
(%1/%2)正在解析文件"%3"
-
-
+
+
完成%1个文件的解析,用时%2秒
-
+
(每秒%1个文件)
@@ -6473,78 +6473,78 @@ Are you really want to continue?
载入文件错误
-
+
文件已存在
-
+
文件'%1'已在项目中
-
+
项目已升级
-
+
已成功将项目升级到新的格式
-
+
旧项目文件备份在'%1'。
-
+
头文件
-
+
源文件
-
+
其他文件
-
+
设置需要更新
-
+
The compiler settings format of Dev-C++ has changed.
小熊猫C++的编译器设置格式已发生改变。
-
+
请在项目 >> 项目属性 >> 编译器设置中修改您的设置并保存您的项目
-
+
未找到编译器
-
+
您为该项目设置的编译器不存在。
-
+
它将会被全局编译器设置代替。
-
+
Developed using the Red Panda Dev-C++ IDE
使用小熊猫C++编辑器开发
@@ -6726,16 +6726,21 @@ Are you really want to continue?
+
+ 二进制文件
+
+
+
库文件夹
-
+
头文件夹
-
+
资源文件夹
@@ -6961,32 +6966,32 @@ Are you really want to continue?
ProjectModel
-
+
文件已存在
-
+
文件'%1'已存在。是否删除?
-
+
删除失败
-
+
无法删除文件'%1'
-
+
改名失败
-
+
无法将文件'%1'改名为'%2'
@@ -7938,12 +7943,12 @@ Are you really want to continue?
RegisterModel
-
+
寄存器
-
+
值
@@ -8371,14 +8376,14 @@ Are you really want to continue?
性能
-
+
编译器配置集
-
+
@@ -8390,7 +8395,7 @@ Are you really want to continue?
自动链接
-
+
@@ -8466,15 +8471,15 @@ Are you really want to continue?
杂项
-
-
+
+
程序运行
-
+
试题集
@@ -8956,49 +8961,49 @@ Are you really want to continue?
WatchModel
-
+
保存文件'%1'失败。
-
+
无法写入文件'%1'.
-
+
JSON文件'%1':%2中存在错误:%3
-
-
+
+
执行以求值
-
-
+
+
在当前作用域中无效
-
+
无法读取文件'%1'.
-
+
表达式
-
+
类型
-
+
值
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 @@
+
+
+
+
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;