diff --git a/NEWS.md b/NEWS.md
index 123bc1c5..1198aa61 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -8,6 +8,9 @@ Red Panda C++ Version 1.0.2
- enhancement: timeout for problem case test
- enhancement: slightly reduce start up time
- enhancement: use icon to indicate missing project files in the project view
+ - enhancement: display problem case running time
+ - enhancement: set problem case input/expected output file
+ - enhancement: auto position cursor in expected with output's cursor
Red Panda C++ Version 1.0.1
- fix: only convert project icon file when it's filename doesn't end with ".ico"
diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts
index 11c03ea5..3f653502 100644
--- a/RedPandaIDE/RedPandaIDE_zh_CN.ts
+++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts
@@ -3807,18 +3807,18 @@ Are you really want to continue?
MainWindow
-
+
小熊猫C++
-
-
-
-
-
-
+
+
+
+
+
+
编译器
@@ -3827,48 +3827,48 @@ Are you really want to continue?
编译日志
-
+
文件
-
+
工具
-
-
+
+
运行
-
+
编辑
-
-
+
+
项目
-
+
监视
-
+
结构
-
+
文件
@@ -3878,10 +3878,10 @@ Are you really want to continue?
-
-
-
-
+
+
+
+
调试
@@ -3892,7 +3892,7 @@ Are you really want to continue?
-
+
调试主控台
@@ -3913,8 +3913,8 @@ Are you really want to continue?
-
-
+
+
查找
@@ -3939,23 +3939,23 @@ Are you really want to continue?
替换
-
+
关闭
-
+
运行
-
-
+
+
代码
-
+
窗口
@@ -3968,279 +3968,290 @@ Are you really want to continue?
工具栏2
-
+
新建
-
+
Ctrl+N
-
+
打开...
-
+
Ctrl+O
-
+
保存
-
+
Ctrl+S
-
+
另存为...
-
+
另存为
-
+
全部保存
-
+
Ctrl+Shift+S
-
+
选项
-
-
-
-
-
+
+
+
+
+
编译
-
+
工具输出
-
+
+
+
+ 选择输入文件
+
+
+
+
+ ...
+
+
+
工具面板
-
+
Git
-
+
F9
-
+
F10
-
+
恢复
-
+
Ctrl+Z
-
+
重做
-
+
Ctrl+Y
-
+
剪切
-
+
Ctrl+X
-
-
-
-
+
+
+
+
复制
-
+
Ctrl+C
-
-
+
+
粘贴
-
+
Ctrl+V
-
-
-
+
+
+
选择全部
-
+
Ctrl+A
-
+
缩进
-
+
取消缩进
-
+
切换注释
-
+
Ctrl+/
-
+
全部收起
-
+
全部展开
-
+
使用ANSI编码
-
+
使用UTF-8编码
-
+
自动检测
-
+
转换为ANSI编码
-
+
转换为UTF-8编码
-
-
+
+
编译运行
-
+
F11
-
-
+
+
全部重编译
-
+
F12
-
+
停止执行
-
+
F6
-
+
F5
-
+
单步跳过
-
+
F7
-
+
单步进入
-
+
试题集
-
+
新建试题集
@@ -4259,14 +4270,14 @@ Are you really want to continue?
-
+
保存试题集
-
+
载入试题集
@@ -4288,20 +4299,20 @@ Are you really want to continue?
-
+
TODO
-
+
书签
-
+
试题
@@ -4342,32 +4353,32 @@ Are you really want to continue?
%v/%m
-
+
输出
-
+
输入
-
+
期望输出
-
+
帮助
-
+
重构
-
+
视图
@@ -4376,503 +4387,503 @@ Are you really want to continue?
工具窗口
-
+
主工具栏
-
+
编译器配置集
-
-
+
+
新建源代码文件
-
+
Tab
-
+
Shift+Tab
-
+
F8
-
+
单步跳出
-
+
Ctrl+F8
-
+
执行到光标处
-
+
Ctrl+F5
-
+
继续执行
-
+
F4
-
+
添加监视
-
+
打开CPU信息窗口...
-
+
退出
-
+
查找...
-
+
Ctrl+F
-
+
在文件中查找...
-
+
Ctrl+Shift+F
-
+
替换
-
+
Ctrl+R
-
+
查找下一个
-
+
F3
-
+
查找前一个
-
+
Shift+F3
-
+
删除监视值
-
+
Remove All
删除全部监视值
-
+
修改监视值
-
+
对代码重新排版
-
+
Ctrl+Shift+A
-
+
前一次编辑位置
-
+
Ctrl+Alt+Left
-
+
后一次编辑位置
-
+
Ctrl+Alt+Right
-
+
Ctrl+W
-
+
全部关闭
-
+
Ctrl+Shift+W
-
+
最大化编辑器
-
+
Ctrl+F11
-
+
下一窗口
-
+
Ctrl+Tab
-
+
前一窗口
-
+
Ctrl+Shift+Tab
-
+
切换断点
-
+
Ctrl+F4
-
-
+
+
删除所有断点
-
+
设置断点条件...
-
+
跳转到声明处
-
+
Ctrl+Shift+G
-
+
跳转到定义处
-
+
Ctrl+G
-
+
查找符号的引用
-
+
打开所在的文件夹
-
+
Ctrl+B
-
+
打开命令行窗口
-
+
文件属性...
-
+
关闭项目
-
+
项目属性
-
+
新建项目...
-
-
+
+
新建项目文件
-
+
新建文件
-
+
添加到项目...
-
+
从项目删除
-
+
查看Makefile
-
+
清理构建文件
-
+
在浏览器中打开
-
+
在终端中打开
-
+
关于
-
-
+
+
重命名符号
-
+
Shift+F6
-
+
打印...
-
+
Ctrl+P
-
-
+
+
导出为RTF
-
-
+
+
导出为HTML
-
+
移动到其他视图
-
+
Ctrl+M
-
-
+
+
C++参考手册
-
+
C参考手册
-
+
显示全部工具面板
-
+
Create Repository
创建Git仓库
-
+
提交(Commit)
-
+
撤销(Revert)
-
+
回滚(Reset)
-
+
添加文件
-
+
还原(Restore)
-
+
官方网站
-
+
分支切换(Switch)
-
+
合并(Merge)
-
-
+
+
Log
显示日志(Log)
-
+
远程仓库...
-
+
取回(Fetch)
-
+
拉取(Pull)
-
+
推送(Push)
-
+
隐藏不支持的文件
-
+
切换块注释
-
+
Alt+Shift+A
-
+
匹配当前括号
-
+
Ctrl+]
@@ -4881,50 +4892,50 @@ Are you really want to continue?
工具窗口栏
-
+
状态栏
-
+
Ctrl+Backspace
-
+
中断
-
-
+
+
删除到单词开头
-
+
Ctrl+Shift+B
-
+
删除到单词结尾
-
+
Ctrl+Shift+E
-
+
Add Class...
新建类...
-
-
+
+
New Header
新建头文件...
@@ -4934,47 +4945,47 @@ Are you really want to continue?
插入行
-
+
删除当前行
-
+
Ctrl+D
-
+
复制当前行
-
+
Ctrl+E
-
+
删除当前单词
-
+
Ctrl+Shift+D
-
+
删除到行尾
-
+
Ctrl+Del
-
+
删除到行首
@@ -4983,27 +4994,27 @@ Are you really want to continue?
C/C++参考
-
+
EGE图形库手册
-
+
添加书签
-
+
删除书签
-
+
修改书签说明
-
+
在文件视图中定位
@@ -5012,47 +5023,47 @@ Are you really want to continue?
打开文件夹
-
+
运行参数...
-
+
文件编码
-
+
文件历史
-
-
-
-
-
-
+
+
+
+
+
+
正在调试
-
-
-
-
-
-
+
+
+
+
+
+
正在运行
-
-
-
-
-
-
+
+
+
+
+
+
正在编译
@@ -5061,194 +5072,197 @@ Are you really want to continue?
行:%1 列:%2 已选择:%3 总行数:%4 总长度:%5
-
+
Line: %1 Col: %2 Selected: %3 Lines: %4 Length: %5
行: %1 列: %2 已选择 :%3 总行数: %4 总长度: %5
-
+
只读
-
+
插入
-
+
覆写
-
+
关闭项目
-
+
你确定要关闭'%1'吗?
-
-
+
+
确认
-
-
+
+
源文件尚未编译。
-
-
+
+
现在编译?
-
-
+
+
源文件比可执行程序新。
-
+
重新编译?
-
+
无编译器设置
-
+
没有配置编译器设置。
-
+
无法启动调试器
-
-
+
+
启用调试参数
-
-
+
+
当前编译设置中未启用调试选项(-g3),或启用了信息剥除选项(-s)<br /><br/>是否纠正这一问题?
-
+
项目尚未构建
-
+
项目尚未构建。是否构建?
-
+
宿主程序不存在
-
+
动态链接库(DLL)需要一个宿主程序来运行。
-
+
但它不存在。
-
+
宿主程序不存在
-
+
宿主程序'%1'不存在。
-
+
重新编译?
-
-
+
+
保存上次打开信息失败
-
+
无法删除旧上次打开信息文件'%1'
-
+
无法保存上次打开信息文件'%1'
-
+
载入上次打开信息失败
-
+
无法载入上次打开信息文件'%1'
-
+
打开源代码文件
-
+
显示详细调试器日志
-
+
全部复制
-
-
-
+
+
+
+
+
+
清除
-
+
导出
-
+
插入代码段
-
-
+
+
试题集%1
@@ -5269,68 +5283,68 @@ Are you really want to continue?
或者选择使用其他的网络端口。
-
-
+
+
重新构建项目
-
-
+
+
项目已经被修改过,是否需要重新构建?
-
+
自动保存出错
-
+
自动保存"%1"到"%2"失败:%3
-
+
试题属性...
-
+
设置试题集名称
-
+
试题集名称:
-
+
删除
-
+
删除全部书签
-
+
修改描述
-
-
-
+
+
+
书签描述
-
-
-
+
+
+
描述:
@@ -5339,389 +5353,406 @@ Are you really want to continue?
在调试主控台中显示调试器输出
-
+
清除这次搜索
-
+
删除所有搜索
-
+
断点条件...
-
+
断点条件
-
+
输入当前断点的生效条件:
-
+
Remove all breakpoints
删除所有断点
-
+
删除当前断点
-
+
重命名文件
-
-
+
+
添加文件夹
-
+
新文件夹
-
+
文件夹:
-
+
重命名
-
+
删除文件夹
-
+
切换为普通视图
-
+
切换为自定义视图
-
+
按类型排序
-
+
按名称排序
-
+
显示继承的成员
-
+
跳转到声明处
-
+
跳转到定义处
-
-
+
+
新建文件夹
-
-
-
-
+
+
+
+
删除
-
+
在编辑器中打开
-
+
使用外部程序打开
-
+
在终端中打开
-
+
在Windows浏览器中打开
-
+
字符集
-
+
转换为%1编码
-
+
已自动保存%1个文件
-
+
设置答案源代码...
-
+
选择其他文件...
-
+
选择答案源代码文件
-
+
C/C++Source Files (*.c *.cpp *.cc *.cxx
C/C++源代码文件 (*.c *.cpp *.cc *.cxx)
-
+
新建文件夹%1
-
+
无标题
-
+
无标题%1
-
+
你真的要删除%1吗?
-
+
你真的要删除%1个文件吗?
-
+
保存项目
-
+
项目'%1'有改动。
-
-
+
+
需要保存吗?
-
-
+
+
文件已发生变化
-
+
新建项目文件?
-
+
您是否要将新建的文件加入项目?
-
-
-
+
+
+
保存失败
-
+
改变项目编译器配置集
-
+
改变项目的编译器配置集会导致所有的自定义编译器选项被重置。
-
+
你真的想要做那些吗?
-
+
您真的要清除该文件的所有断点吗?
-
+
新建项目
-
+
关闭'%1'以打开新项目?
-
+
文件夹不存在
-
+
文件夹'%1'不存在。是否创建?
-
+
无法创建文件夹
-
+
创建文件夹'%1'失败。
-
+
-
+
文件夹%1不是空的。
-
+
你真的要删除它吗?
-
+
改变工作文件夹
-
+
File '%1' is not in the current working folder
文件'%1'不在当前工作文件夹中。
-
+
是否将工作文件夹改设为'%1'?
-
+
无法提交
-
+
Git需要用信息进行提交。
-
-
-
+
+
+ 选择输入数据文件
+
+
+
+
+
+ 所有文件 (*.*)
+
+
+
+
+ Choose Expected Input Data File
+ 选择期望输出文件
+
+
+
+
+
选择工作文件夹
-
-
+
+
头文件已存在
-
-
+
+
头文件"%1"已存在!
-
+
源文件已存在!
-
+
源文件"%1"已存在!
-
+
无法提交!
-
+
下列文件处于冲突状态,请解决后重新添加和提交:
-
+
提交信息
-
+
提交信息:
-
+
提交失败
-
+
提交信息不能为空!
@@ -5730,241 +5761,241 @@ Are you really want to continue?
小熊猫Dev-C++项目文件 (*.dev)
-
+
新建项目失败
-
+
无法使用模板创建项目
-
+
删除文件
-
+
同时从硬盘上删除文件?
-
+
无标题
-
+
新的项目文件名
-
+
文件名:
-
+
文件已存在!
-
+
文件'%1'已经存在!
-
+
添加到项目
-
+
小熊猫C++项目文件(*.dev)
-
+
重命名出错
-
+
符号'%1'在系统头文件中定义,无法修改。
-
+
新名称
-
-
+
+
替换出错
-
+
无法打开文件'%1'进行替换!
-
+
内容和上次查找时不一致。
-
+
RTF格式文件 (*.rtf)
-
+
HTML文件 (*.html)
-
+
当前的试题集不是空的。
-
+
试题%1
-
-
+
+
试题集文件 (*.pbs)
-
+
载入失败
-
-
+
+
试题案例%1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
错误
-
+
项目历史
-
+
载入主题失败
-
-
+
+
清除历史
-
-
+
+
版本控制
-
+
磁盘文件'%1'已被修改。
-
+
是否重新读取它的内容?
-
+
磁盘文件'%1'已被删除。
-
+
是否保持它在小熊猫C++中打开的编辑窗口?
-
+
打开
-
+
编译失败
-
+
运行失败
-
-
-
+
+
+
确认转换
-
-
-
+
+
+
当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗?
-
+
新监视表达式
-
+
输入监视表达式
-
+
(%1/%2)正在解析文件"%3"
-
-
+
+
完成%1个文件的解析,用时%2秒
-
+
(每秒%1个文件)
@@ -6130,31 +6161,44 @@ Are you really want to continue?
OJProblemCasesRunner
-
+
案例运行超时
-
+
无法启动程序运行进程'%1'。
-
+
waitFor()函数等待超时。
-
+
在向程序运行进程写入内容时出错。
-
+
在从程序运行进程读取内容时出错。
+
+ OJProblemModel
+
+
+
+ 名称
+
+
+
+
+ 时间(秒)
+
+
OJProblemPropertyWidget
@@ -6191,14 +6235,12 @@ Are you really want to continue?
Project
-
- 未找到文件
+ 未找到文件
-
- 找不到项目文件'%1'!
+ 找不到项目文件'%1'!
@@ -6206,93 +6248,93 @@ Are you really want to continue?
无标题
-
+
无法保存文件
-
+
无法保存文件'%1'.
-
+
载入文件错误
-
+
文件已存在
-
+
文件'%1'已在项目中
-
+
项目已升级
-
+
已成功将项目升级到新的格式
-
+
旧项目文件备份在'%1'。
-
+
头文件
-
+
源文件
-
+
其他文件
-
+
设置需要更新
-
+
The compiler settings format of Dev-C++ has changed.
小熊猫C++的编译器设置格式已发生改变。
-
+
请在项目 >> 项目属性 >> 编译器设置中修改您的设置并保存您的项目
-
+
未找到编译器
-
+
您为该项目设置的编译器不存在。
-
+
它将会被全局编译器设置代替。
-
+
Developed using the Red Panda Dev-C++ IDE
使用小熊猫C++编辑器开发
@@ -6699,32 +6741,32 @@ Are you really want to continue?
ProjectModel
-
+
文件已存在
-
+
文件'%1'已存在。是否删除?
-
+
删除失败
-
+
无法删除文件'%1'
-
+
改名失败
-
+
无法将文件'%1'改名为'%2'
@@ -7026,7 +7068,7 @@ Are you really want to continue?
无法写入配置文件夹"%1"
-
+
无法载入自动链接设置
@@ -7328,22 +7370,22 @@ Are you really want to continue?
下标"%1"越界
-
+
字节
-
+
KB
-
+
MB
-
+
GB
@@ -7644,8 +7686,8 @@ Are you really want to continue?
-
-
+
+
无法读取文件'%1'.
@@ -7656,7 +7698,7 @@ Are you really want to continue?
无法写入文件'%1'.
-
+
无法解析试题集文件"%1":%2
@@ -8120,7 +8162,7 @@ Are you really want to continue?
自动链接
-
+
@@ -8196,15 +8238,15 @@ Are you really want to continue?
杂项
-
-
+
+
程序运行
-
+
试题集
diff --git a/RedPandaIDE/compiler/ojproblemcasesrunner.cpp b/RedPandaIDE/compiler/ojproblemcasesrunner.cpp
index 96d9188c..ed0f91a9 100644
--- a/RedPandaIDE/compiler/ojproblemcasesrunner.cpp
+++ b/RedPandaIDE/compiler/ojproblemcasesrunner.cpp
@@ -54,7 +54,11 @@ void OJProblemCasesRunner::runCase(int index,POJProblemCase problemCase)
});
QProcess process;
bool errorOccurred = false;
-
+ QByteArray readed;
+ QByteArray buffer;
+ QByteArray output;
+ int noOutputTime = 0;
+ QElapsedTimer elapsedTimer;
process.setProgram(mFilename);
process.setArguments(splitProcessCommand(mArguments));
process.setWorkingDirectory(mWorkDir);
@@ -84,14 +88,13 @@ void OJProblemCasesRunner::runCase(int index,POJProblemCase problemCase)
process.start();
process.waitForStarted(5000);
if (process.state()==QProcess::Running) {
- process.write(problemCase->input.toUtf8());
+ if (fileExists(problemCase->inputFileName))
+ process.write(readFileToByteArray(problemCase->inputFileName));
+ else
+ process.write(problemCase->input.toUtf8());
process.closeWriteChannel();
}
- QByteArray readed;
- QByteArray buffer;
- QByteArray output;
- int noOutputTime = 0;
- QElapsedTimer elapsedTimer;
+
elapsedTimer.start();
while (true) {
process.waitForFinished(mWaitForFinishTime);
@@ -127,6 +130,7 @@ void OJProblemCasesRunner::runCase(int index,POJProblemCase problemCase)
noOutputTime += mWaitForFinishTime;
}
}
+ problemCase->runningTime=elapsedTimer.elapsed();
if (mExecTimeouted) {
problemCase->output = tr("Case Timeout");
emit resetOutput(problemCase->getId(), problemCase->output);
diff --git a/RedPandaIDE/main.cpp b/RedPandaIDE/main.cpp
index b8d5cbea..d53a410f 100644
--- a/RedPandaIDE/main.cpp
+++ b/RedPandaIDE/main.cpp
@@ -249,7 +249,6 @@ int main(int argc, char *argv[])
// qputenv("QT_DEVICE_PIXEL_RATIO ","auto");
// qputenv("QT_AUTO_SCREEN_SCALE_FACTOR","false");
//#endif
-
QApplication app(argc, argv);
QFile tempFile(QDir::tempPath()+QDir::separator()+"RedPandaDevCppStartUp.lock");
{
@@ -389,6 +388,7 @@ int main(int argc, char *argv[])
tempFile.close();
tempFile.remove();
}
+
int retCode = app.exec();
QString configDir = pSettings->dirs().config();
// save settings
diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp
index eda7c97d..3c0751a9 100644
--- a/RedPandaIDE/mainwindow.cpp
+++ b/RedPandaIDE/mainwindow.cpp
@@ -67,7 +67,8 @@
#include
#include
#include
-#include
+#include "MainWindow.h"
+#include
#include "settingsdialog/settingsdialog.h"
#include "compiler/compilermanager.h"
@@ -277,11 +278,11 @@ MainWindow::MainWindow(QWidget *parent)
mOJProblemSetNameCounter=1;
mOJProblemSetModel.rename(tr("Problem Set %1").arg(mOJProblemSetNameCounter));
ui->lstProblemSet->setModel(&mOJProblemSetModel);
- ui->lstProblemCases->setModel(&mOJProblemModel);
+ ui->tblProblemCases->setModel(&mOJProblemModel);
connect(ui->lstProblemSet->selectionModel(),
&QItemSelectionModel::currentRowChanged,
this, &MainWindow::onProblemSetIndexChanged);
- connect(ui->lstProblemCases->selectionModel(),
+ connect(ui->tblProblemCases->selectionModel(),
&QItemSelectionModel::currentRowChanged,
this, &MainWindow::onProblemCaseIndexChanged);
connect(&mOJProblemSetModel, &OJProblemSetModel::problemNameChanged,
@@ -1382,6 +1383,11 @@ void MainWindow::updateActionIcons()
pIconsManager->setIcon(ui->btnRunAllProblemCases, IconsManager::ACTION_PROBLEM_RUN_CASES);
pIconsManager->setIcon(ui->btnCaseValidateOptions, IconsManager::ACTION_MISC_GEAR);
+ pIconsManager->setIcon(ui->btnProblemCaseClearInputFileName, IconsManager::ACTION_MISC_CLEAN);
+ pIconsManager->setIcon(ui->btnProblemCaseInputFileName, IconsManager::ACTION_MISC_FOLDER);
+ pIconsManager->setIcon(ui->btnProblemCaseClearExpectedOutputFileName, IconsManager::ACTION_MISC_CLEAN);
+ pIconsManager->setIcon(ui->btnProblemCaseExpectedOutputFileName, IconsManager::ACTION_MISC_FOLDER);
+
mProblem_Properties->setIcon(pIconsManager->getIcon(IconsManager::ACTION_PROBLEM_PROPERTIES));
@@ -1559,7 +1565,7 @@ void MainWindow::runExecutable(const QString &exeName,const QString &filename,Ru
ui->tabMessages->setCurrentWidget(ui->tabProblem);
}
} else if (runType == RunType::CurrentProblemCase) {
- QModelIndex index = ui->lstProblemCases->currentIndex();
+ QModelIndex index = ui->tblProblemCases->currentIndex();
if (index.isValid()) {
POJProblemCase problemCase =mOJProblemModel.getCase(index.row());
mCompilerManager->runProblem(exeName,params,QFileInfo(exeName).absolutePath(),
@@ -3141,7 +3147,7 @@ void MainWindow::onProblemSetIndexChanged(const QModelIndex ¤t, const QMod
mOJProblemModel.setProblem(problem);
updateProblemTitle();
if (mOJProblemModel.count()>0) {
- ui->lstProblemCases->setCurrentIndex(mOJProblemModel.index(0,0));
+ ui->tblProblemCases->setCurrentIndex(mOJProblemModel.index(0,0));
} else {
onProblemCaseIndexChanged(QModelIndex(),QModelIndex());
}
@@ -3163,18 +3169,32 @@ void MainWindow::onProblemCaseIndexChanged(const QModelIndex ¤t, const QMo
if (idx.isValid()) {
POJProblemCase problemCase = mOJProblemModel.getCase(idx.row());
if (problemCase) {
+ ui->btnProblemCaseInputFileName->setEnabled(false);
+ ui->txtProblemCaseInputFileName->setEnabled(false);
ui->btnRemoveProblemCase->setEnabled(true);
- ui->txtProblemCaseInput->setPlainText(problemCase->input);
- ui->txtProblemCaseInput->setReadOnly(false);
- ui->txtProblemCaseExpected->setPlainText(problemCase->expected);
- ui->txtProblemCaseExpected->setReadOnly(false);
+ ui->btnProblemCaseInputFileName->setEnabled(true);
+ fillProblemCaseInputAndExpected(problemCase);
ui->txtProblemCaseOutput->clear();
ui->txtProblemCaseOutput->setPlainText(problemCase->output);
updateProblemCaseOutput(problemCase);
return;
}
}
+ ui->btnProblemCaseClearInputFileName->setVisible(false);
+ ui->btnProblemCaseInputFileName->setEnabled(false);
+ ui->txtProblemCaseInputFileName->setEnabled(false);
+ ui->txtProblemCaseInputFileName->clear();
+ ui->txtProblemCaseInputFileName->setToolTip("");
+
+ ui->btnProblemCaseClearExpectedOutputFileName->setVisible(false);
+ ui->btnProblemCaseExpectedOutputFileName->setEnabled(false);
+ ui->txtProblemCaseExpectedOutputFileName->setEnabled(false);
+ ui->txtProblemCaseExpectedOutputFileName->clear();
+ ui->txtProblemCaseExpectedOutputFileName->setToolTip("");
+
ui->btnRemoveProblemCase->setEnabled(false);
+ ui->txtProblemCaseInputFileName->clear();
+ ui->btnProblemCaseInputFileName->setEnabled(false);
ui->txtProblemCaseInput->clear();
ui->txtProblemCaseInput->setReadOnly(true);
ui->txtProblemCaseExpected->clear();
@@ -4606,9 +4626,9 @@ void MainWindow::onOJProblemCaseStarted(const QString& id,int current, int total
POJProblemCase problemCase = mOJProblemModel.getCase(row);
problemCase->testState = ProblemCaseTestState::Testing;
mOJProblemModel.update(row);
- QModelIndex idx = ui->lstProblemCases->currentIndex();
+ QModelIndex idx = ui->tblProblemCases->currentIndex();
if (!idx.isValid() || row != idx.row()) {
- ui->lstProblemCases->setCurrentIndex(mOJProblemModel.index(row,0));
+ ui->tblProblemCases->setCurrentIndex(mOJProblemModel.index(row,0));
}
ui->txtProblemCaseOutput->clear();
}
@@ -5922,6 +5942,38 @@ void MainWindow::newProjectUnitFile()
updateProjectView();
}
+void MainWindow::fillProblemCaseInputAndExpected(const POJProblemCase &problemCase)
+{
+ ui->btnProblemCaseInputFileName->setEnabled(true);
+ if (fileExists(problemCase->inputFileName)) {
+ ui->txtProblemCaseInput->setReadOnly(true);
+ ui->txtProblemCaseInput->setPlainText(readFileToByteArray(problemCase->inputFileName));
+ ui->btnProblemCaseClearInputFileName->setVisible(true);
+ ui->txtProblemCaseInputFileName->setText(extractFileName(problemCase->inputFileName));
+ ui->txtProblemCaseInputFileName->setToolTip(problemCase->inputFileName);
+ } else {
+ ui->txtProblemCaseInput->setReadOnly(false);
+ ui->txtProblemCaseInput->setPlainText(problemCase->input);
+ ui->btnProblemCaseClearInputFileName->setVisible(false);
+ ui->txtProblemCaseInputFileName->clear();
+ ui->txtProblemCaseInputFileName->setToolTip("");
+ }
+ ui->btnProblemCaseExpectedOutputFileName->setEnabled(true);
+ if (fileExists(problemCase->expectedOutputFileName)) {
+ ui->txtProblemCaseExpected->setReadOnly(true);
+ ui->txtProblemCaseExpected->setPlainText(readFileToByteArray(problemCase->expectedOutputFileName));
+ ui->btnProblemCaseClearExpectedOutputFileName->setVisible(true);
+ ui->txtProblemCaseExpectedOutputFileName->setText(extractFileName(problemCase->expectedOutputFileName));
+ ui->txtProblemCaseExpectedOutputFileName->setToolTip(problemCase->inputFileName);
+ } else {
+ ui->txtProblemCaseExpected->setReadOnly(false);
+ ui->txtProblemCaseExpected->setPlainText(problemCase->expected);
+ ui->btnProblemCaseClearExpectedOutputFileName->setVisible(false);
+ ui->txtProblemCaseExpectedOutputFileName->clear();
+ ui->txtProblemCaseExpectedOutputFileName->setToolTip("");
+ }
+}
+
void MainWindow::doFilesViewRemoveFile(const QModelIndex &index)
{
if (!index.isValid())
@@ -6166,7 +6218,11 @@ void MainWindow::updateProblemCaseOutput(POJProblemCase problemCase)
{
if (problemCase->testState == ProblemCaseTestState::Failed) {
QStringList output = textToLines(problemCase->output);
- QStringList expected = textToLines(problemCase->expected);
+ QStringList expected;
+ if (fileExists(problemCase->expectedOutputFileName))
+ expected = readFileToLines(problemCase->expectedOutputFileName);
+ else
+ expected = textToLines(problemCase->expected);
for (int i=0;i=expected.count() || output[i]!=expected[i]) {
QTextBlock block = ui->txtProblemCaseOutput->document()->findBlockByLineNumber(i);
@@ -6192,11 +6248,12 @@ void MainWindow::updateProblemCaseOutput(POJProblemCase problemCase)
void MainWindow::applyCurrentProblemCaseChanges()
{
- QModelIndex idx = ui->lstProblemCases->currentIndex();
+ QModelIndex idx = ui->tblProblemCases->currentIndex();
if (idx.isValid()) {
POJProblemCase problemCase = mOJProblemModel.getCase(idx.row());
if (problemCase) {
- problemCase->input = ui->txtProblemCaseInput->toPlainText();
+ if (!fileExists(problemCase->inputFileName))
+ problemCase->input = ui->txtProblemCaseInput->toPlainText();
problemCase->expected = ui->txtProblemCaseExpected->toPlainText();
}
}
@@ -6495,7 +6552,7 @@ void MainWindow::on_btnAddProblem_clicked()
int startCount = mOJProblemSetModel.count();
QString name;
while (true) {
- name = tr("Problem %1").arg(startCount);
+ name = tr("Problem %1").arg(startCount+1);
if (!mOJProblemSetModel.problemNameUsed(name))
break;
}
@@ -6565,7 +6622,7 @@ void MainWindow::on_btnAddProblemCase_clicked()
int startCount = mOJProblemModel.count();
QString name;
while (true) {
- name = tr("Problem Case %1").arg(startCount);
+ name = tr("Problem Case %1").arg(startCount+1);
if (!mOJProblemSetModel.problemNameUsed(name))
break;
}
@@ -6573,7 +6630,7 @@ void MainWindow::on_btnAddProblemCase_clicked()
problemCase->name = name;
problemCase->testState = ProblemCaseTestState::NotTested;
mOJProblemModel.addCase(problemCase);
- ui->lstProblemCases->setCurrentIndex(mOJProblemModel.index(mOJProblemModel.count()-1));
+ ui->tblProblemCases->setCurrentIndex(mOJProblemModel.index(mOJProblemModel.count()-1,0));
}
void MainWindow::on_btnRunAllProblemCases_clicked()
@@ -6595,7 +6652,7 @@ void MainWindow::on_actionC_Reference_triggered()
void MainWindow::on_btnRemoveProblemCase_clicked()
{
- QModelIndex idx = ui->lstProblemCases->currentIndex();
+ QModelIndex idx = ui->tblProblemCases->currentIndex();
if (idx.isValid()) {
mOJProblemModel.removeCase(idx.row());
}
@@ -7322,3 +7379,74 @@ void MainWindow::on_actionMatch_Bracket_triggered()
}
}
+
+void MainWindow::on_btnProblemCaseInputFileName_clicked()
+{
+ QString fileName = QFileDialog::getOpenFileName(
+ this,
+ tr("Choose Input Data File"),
+ QString(),
+ tr("All files (*.*)"));
+ if (!fileName.isEmpty()) {
+ QModelIndex idx = ui->tblProblemCases->currentIndex();
+ POJProblemCase problemCase = mOJProblemModel.getCase(idx.row());
+ if (!problemCase)
+ return;
+ if (problemCase->inputFileName == fileName)
+ return;
+ problemCase->inputFileName = fileName;
+ fillProblemCaseInputAndExpected(problemCase);
+ }
+}
+
+
+void MainWindow::on_btnProblemCaseClearExpectedOutputFileName_clicked()
+{
+ QModelIndex idx = ui->tblProblemCases->currentIndex();
+ POJProblemCase problemCase = mOJProblemModel.getCase(idx.row());
+ if (!problemCase)
+ return;
+ problemCase->expectedOutputFileName = "";
+ fillProblemCaseInputAndExpected(problemCase);
+}
+
+
+void MainWindow::on_btnProblemCaseClearInputFileName_clicked()
+{
+ QModelIndex idx = ui->tblProblemCases->currentIndex();
+ POJProblemCase problemCase = mOJProblemModel.getCase(idx.row());
+ if (!problemCase)
+ return;
+ problemCase->inputFileName = "";
+ fillProblemCaseInputAndExpected(problemCase);
+}
+
+
+void MainWindow::on_btnProblemCaseExpectedOutputFileName_clicked()
+{
+ QString fileName = QFileDialog::getOpenFileName(
+ this,
+ tr("Choose Expected Output Data File"),
+ QString(),
+ tr("All files (*.*)"));
+ if (!fileName.isEmpty()) {
+ QModelIndex idx = ui->tblProblemCases->currentIndex();
+ POJProblemCase problemCase = mOJProblemModel.getCase(idx.row());
+ if (!problemCase)
+ return;
+ if (problemCase->expectedOutputFileName == fileName)
+ return;
+ problemCase->expectedOutputFileName = fileName;
+ fillProblemCaseInputAndExpected(problemCase);
+ }
+}
+
+
+void MainWindow::on_txtProblemCaseOutput_cursorPositionChanged()
+{
+ QTextCursor cursor = ui->txtProblemCaseOutput->textCursor();
+ int val = ui->txtProblemCaseOutput->verticalScrollBar()->value();
+ ui->txtProblemCaseExpected->setTextCursor(cursor);
+ ui->txtProblemCaseExpected->verticalScrollBar()->setValue(val);
+}
+
diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h
index 22717bb0..90479e7c 100644
--- a/RedPandaIDE/mainwindow.h
+++ b/RedPandaIDE/mainwindow.h
@@ -254,6 +254,7 @@ private:
void prepareTabInfosData();
void prepareTabMessagesData();
void newProjectUnitFile();
+ void fillProblemCaseInputAndExpected(const POJProblemCase &problemCase);
void doFilesViewRemoveFile(const QModelIndex& index);
@@ -646,6 +647,16 @@ private slots:
void on_actionMatch_Bracket_triggered();
+ void on_btnProblemCaseInputFileName_clicked();
+
+ void on_btnProblemCaseClearExpectedOutputFileName_clicked();
+
+ void on_btnProblemCaseClearInputFileName_clicked();
+
+ void on_btnProblemCaseExpectedOutputFileName_clicked();
+
+ void on_txtProblemCaseOutput_cursorPositionChanged();
+
private:
Ui::MainWindow *ui;
EditorList *mEditorList;
diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui
index 93aa83b9..7659eedc 100644
--- a/RedPandaIDE/mainwindow.ui
+++ b/RedPandaIDE/mainwindow.ui
@@ -1338,13 +1338,22 @@
-
-
+
true
+
+ QAbstractItemView::SingleSelection
+
QAbstractItemView::SelectRows
+
+ 200
+
+
+ true
+
@@ -1363,6 +1372,80 @@
0
+ -
+
+
+ QPlainTextEdit::NoWrap
+
+
+ true
+
+
+
+ -
+
+
+ QPlainTextEdit::NoWrap
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ true
+
+
+
+ -
+
+
+ Input
+
+
+
+ -
+
+
+ Choose Input File
+
+
+ Choose Input File
+
+
+
+ :/icons/images/newlook24/053-open.png:/icons/images/newlook24/053-open.png
+
+
+
+ -
+
+
+ Clear
+
+
+
+ :/icons/images/newlook24/008-close.png:/icons/images/newlook24/008-close.png
+
+
+
+
+
+
-
@@ -1370,39 +1453,68 @@
- -
-
-
- Input
-
-
-
- -
-
-
- Expected
-
-
-
- -
-
-
- QPlainTextEdit::NoWrap
-
-
-
- -
+
-
QPlainTextEdit::NoWrap
- -
-
-
- QPlainTextEdit::NoWrap
-
+
-
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Expected
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Clear
+
+
+ Clear
+
+
+
+ :/icons/images/newlook24/008-close.png:/icons/images/newlook24/008-close.png
+
+
+
+ -
+
+
+ ...
+
+
+
+ :/icons/images/newlook24/053-open.png:/icons/images/newlook24/053-open.png
+
+
+
+
@@ -1422,7 +1534,7 @@
0
0
1114
- 25
+ 26