diff --git a/NEWS.md b/NEWS.md
index eddccfbe..b4989c66 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -17,6 +17,8 @@ Version 0.7.8
- enhancement: can set the color for the current line's number in the gutter
- all predefined color schemes updated.
- enhancement: check syntax/parse symbols when modifed and cursor's line changed.
+ - enhancement: edit problem properties
+ - enhancement: show problem description in the problem name lable's tooltip
Version 0.7.7
- enhancement: Problem Set
diff --git a/RedPandaIDE/RedPandaIDE.pro b/RedPandaIDE/RedPandaIDE.pro
index fe5e1f84..7774d172 100644
--- a/RedPandaIDE/RedPandaIDE.pro
+++ b/RedPandaIDE/RedPandaIDE.pro
@@ -126,6 +126,7 @@ SOURCES += \
widgets/labelwithmenu.cpp \
widgets/macroinfomodel.cpp \
widgets/newprojectdialog.cpp \
+ widgets/ojproblempropertywidget.cpp \
widgets/ojproblemsetmodel.cpp \
widgets/qconsole.cpp \
widgets/qpatchedcombobox.cpp \
@@ -247,6 +248,7 @@ HEADERS += \
widgets/labelwithmenu.h \
widgets/macroinfomodel.h \
widgets/newprojectdialog.h \
+ widgets/ojproblempropertywidget.h \
widgets/ojproblemsetmodel.h \
widgets/qconsole.h \
widgets/qpatchedcombobox.h \
@@ -294,6 +296,7 @@ FORMS += \
widgets/custommakefileinfodialog.ui \
widgets/filepropertiesdialog.ui \
widgets/newprojectdialog.ui \
+ widgets/ojproblempropertywidget.ui \
widgets/searchdialog.ui
TRANSLATIONS += \
diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts
index f1099955..f2c9acd2 100644
--- a/RedPandaIDE/RedPandaIDE_zh_CN.ts
+++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts
@@ -1016,7 +1016,7 @@ Are you really want to continue?
Editor
-
+
无标题
@@ -1029,12 +1029,12 @@ Are you really want to continue?
失败
-
-
-
-
-
-
+
+
+
+
+
+
错误
@@ -1043,60 +1043,60 @@ Are you really want to continue?
无法写入文件"%1"
-
+
另存为
-
+
要复制的内容超过了行数限制!
-
+
要复制的内容超过了字符数限制!
-
+
要剪切的内容超过了行数限制!
-
+
要剪切的内容超过了字符数限制!
-
+
打印文档
-
-
-
+
+
+
Ctrl+单击以获取更多信息
-
-
+
+
未找到符号'%1'!
-
+
断点条件
-
+
输入当前断点的生效条件:
-
+
只读
@@ -2833,11 +2833,11 @@ Are you really want to continue?
-
-
-
-
-
+
+
+
+
+
编译器
@@ -2981,7 +2981,7 @@ Are you really want to continue?
工具栏2
-
+
新建
@@ -3039,10 +3039,10 @@ Are you really want to continue?
-
-
-
-
+
+
+
+
编译
@@ -3088,8 +3088,8 @@ Are you really want to continue?
-
-
+
+
复制
@@ -3100,7 +3100,7 @@ Are you really want to continue?
-
+
粘贴
@@ -3111,7 +3111,7 @@ Are you really want to continue?
-
+
选择全部
@@ -3230,14 +3230,14 @@ Are you really want to continue?
-
+
试题集
-
+
新建试题集
@@ -3256,14 +3256,14 @@ Are you really want to continue?
-
+
保存试题集
-
+
载入试题集
@@ -3296,7 +3296,7 @@ Are you really want to continue?
-
+
试题
@@ -3579,7 +3579,7 @@ Are you really want to continue?
-
+
删除所有断点
@@ -3680,7 +3680,7 @@ Are you really want to continue?
-
+
重命名符号
@@ -3701,13 +3701,13 @@ Are you really want to continue?
-
+
导出为RTF
-
+
导出为HTML
@@ -3763,7 +3763,7 @@ Are you really want to continue?
-
+
打开文件夹
@@ -3773,42 +3773,42 @@ Are you really want to continue?
运行参数...
-
+
文件编码
-
+
文件历史
-
-
-
-
-
-
+
+
+
+
+
+
正在调试
-
-
-
-
-
-
+
+
+
+
+
+
正在运行
-
-
-
-
-
-
+
+
+
+
+
+
正在编译
@@ -3817,654 +3817,655 @@ 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
-
- 监听失败
+ 监听失败
-
- 无法在网络端口"%1"监听Competitive Companion连接。
+ 无法在网络端口"%1"监听Competitive Companion连接。
-
- 您可以在“试题集”选项卡中关闭监听Competitive Companion选项。
+ 您可以在“试题集”选项卡中关闭监听Competitive Companion选项。
-
- 或者选择使用其他的网络端口。
+ 或者选择使用其他的网络端口。
-
+
小熊猫Dev-C++
-
+
+
+ 试题属性...
+
+
+
删除
-
+
删除全部书签
-
+
修改描述
-
-
-
+
+
+
书签描述
-
-
-
+
+
+
描述:
-
+
在调试主控台中显示调试器输出
-
+
清除这次搜索
-
+
删除所有搜索
-
+
断点条件...
-
+
断点条件
-
+
输入当前断点的生效条件:
-
+
Remove all breakpoints
删除所有断点
-
+
删除当前断点
-
+
重命名文件
-
-
+
+
添加文件夹
-
+
新文件夹
-
+
文件夹:
-
+
重命名
-
+
删除文件夹
-
+
按类型排序
-
+
按名称排序
-
+
显示继承的成员
-
+
跳转到声明处
-
+
跳转到定义处
-
+
在编辑器中打开
-
+
使用外部程序打开
-
+
在终端中打开
-
+
在Windows浏览器中打开
-
+
字符集
-
+
已自动保存%1个文件
-
+
保存项目
-
+
项目'%1'有改动。
-
-
+
+
需要保存吗?
-
-
-
-
+
+
+
+
保存失败
-
+
改变项目编译器配置集
-
+
改变项目的编译器配置集会导致所有的自定义编译器选项被重置。
-
+
你真的想要做那些吗?
-
+
您真的要清除该文件的所有断点吗?
-
+
新建项目
-
+
关闭'%1'以打开新项目?
-
+
文件夹不存在
-
+
文件夹'%1'不存在。是否创建?
-
+
无法创建文件夹
-
+
创建文件夹'%1'失败。
-
+
-
+
小熊猫Dev-C++项目文件 (*.dev)
-
+
新建项目失败
-
+
无法使用模板创建项目
-
+
无标题
-
+
新的项目文件名
-
+
文件名:
-
+
文件已存在!
-
+
文件'%1'已经存在!
-
+
添加到项目
-
+
重命名出错
-
+
符号'%1'在系统头文件中定义,无法修改。
-
+
新名称
-
-
+
+
替换出错
-
+
无法打开文件'%1'进行替换!
-
+
内容和上次查找时不一致。
-
+
RTF格式文件 (*.rtf)
-
+
HTML文件 (*.html)
-
+
当前的试题集不是空的。
-
+
试题%1
-
-
+
+
试题集文件 (*.pbs)
-
+
载入失败
-
-
+
+
试题案例%1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
错误
-
+
项目历史
-
+
磁盘文件'%1'已被修改。
-
+
是否重新读取它的内容?
-
+
磁盘文件'%1'已被删除。
-
+
是否保持它在小熊猫C++中打开的编辑窗口?
-
+
打开
-
+
编译失败
-
+
运行失败
-
-
+
+
确认转换
-
-
+
+
当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗?
-
+
新监视表达式
-
+
输入监视表达式
-
+
(%1/%2)正在解析文件"%3"
-
-
+
+
完成%1个文件的解析,用时%2秒
-
+
(每秒%1个文件)
@@ -4541,6 +4542,39 @@ Are you really want to continue?
在从程序运行进程读取内容时出错。
+
+ OJProblemPropertyWidget
+
+
+
+ 表单
+
+
+
+
+ URL
+
+
+
+
+
+
+
+
+
+ 描述
+
+
+
+
+ 确定
+
+
+
+
+ 取消
+
+
Project
@@ -5918,8 +5952,8 @@ Are you really want to continue?
-
-
+
+
无法读取文件'%1'.
@@ -5930,7 +5964,7 @@ Are you really want to continue?
无法写入文件'%1'.
-
+
无法解析试题集文件"%1":%2
@@ -6331,7 +6365,7 @@ Are you really want to continue?
自动链接
-
+
@@ -6407,7 +6441,7 @@ Are you really want to continue?
杂项
-
+
diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp
index 0a0a0bf4..fc06b8bc 100644
--- a/RedPandaIDE/mainwindow.cpp
+++ b/RedPandaIDE/mainwindow.cpp
@@ -19,6 +19,7 @@
#include "thememanager.h"
#include "widgets/darkfusionstyle.h"
#include "problems/problemcasevalidator.h"
+#include "widgets/ojproblempropertywidget.h"
#include
#include
@@ -569,13 +570,13 @@ void MainWindow::applySettings()
if (pSettings->executor().enableProblemSet()) {
if (pSettings->executor().enableCompetitiveCompanion()) {
if (!mTcpServer.listen(QHostAddress::LocalHost,pSettings->executor().competivieCompanionPort())) {
- QMessageBox::critical(nullptr,
- tr("Listen failed"),
- tr("Can't listen to port %1 form Competitve Companion.").arg(10045)
- + "
"
- +tr("You can turn off competitive companion support in the Problem Set options.")
- + "
"
- +tr("Or You can choose a different port number and try again."));
+// QMessageBox::critical(nullptr,
+// tr("Listen failed"),
+// tr("Can't listen to port %1 form Competitve Companion.").arg(10045)
+// + "
"
+// +tr("You can turn off competitive companion support in the Problem Set options.")
+// + "
"
+// +tr("Or You can choose a different port number and try again."));
}
}
if (idxProblem<0)
@@ -1799,6 +1800,35 @@ void MainWindow::newEditor()
void MainWindow::buildContextMenus()
{
+ //context menu signal for the problem list view
+ ui->lstProblemSet->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(ui->lstProblemSet, &QWidget::customContextMenuRequested,
+ this, &MainWindow::onLstProblemSetContextMenu);
+ mProblem_Properties = createActionFor(
+ tr("Properties..."),
+ ui->lstProblemSet
+ );
+ connect(mProblem_Properties, &QAction::triggered,
+ [this]() {
+ QModelIndex idx = ui->lstProblemSet->currentIndex();
+ if (!idx.isValid())
+ return;
+ POJProblem problem=mOJProblemSetModel.problem(idx.row());
+ if (!problem)
+ return;
+ OJProblemPropertyWidget dialog;
+ dialog.setName(problem->name);
+ dialog.setUrl(problem->url);
+ dialog.setDescription(problem->description);
+ if (dialog.exec() == QDialog::Accepted) {
+ problem->url = dialog.url();
+ problem->description = dialog.description();
+ if (problem == mOJProblemModel.problem()) {
+ ui->lblProblem->setText(mOJProblemModel.getTitle());
+ ui->lblProblem->setToolTip(mOJProblemModel.getTooltip());
+ }
+ }
+ });
//context menu signal for the watch view
ui->watchView->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -2586,6 +2616,15 @@ void MainWindow::onFilesViewContextMenu(const QPoint &pos)
menu.exec(ui->treeFiles->mapToGlobal(pos));
}
+void MainWindow::onLstProblemSetContextMenu(const QPoint &pos)
+{
+ QMenu menu(this);
+ menu.addAction(mProblem_Properties);
+ QModelIndex idx =ui->lstProblemCases->currentIndex();
+ mProblem_Properties->setEnabled(idx.isValid());
+ menu.exec(ui->lstProblemSet->mapToGlobal(pos));
+}
+
void MainWindow::onProblemSetIndexChanged(const QModelIndex ¤t, const QModelIndex &/* previous */)
{
QModelIndex idx = current;
@@ -2597,11 +2636,13 @@ void MainWindow::onProblemSetIndexChanged(const QModelIndex ¤t, const QMod
ui->txtProblemCaseOutput->clear();
ui->tabProblem->setEnabled(false);
ui->lblProblem->clear();
+ ui->lblProblem->setToolTip("");
} else {
ui->btnRemoveProblem->setEnabled(true);
POJProblem problem = mOJProblemSetModel.problem(idx.row());
mOJProblemModel.setProblem(problem);
ui->lblProblem->setText(mOJProblemModel.getTitle());
+ ui->lblProblem->setToolTip(mOJProblemModel.getTooltip());
ui->lstProblemCases->setCurrentIndex(mOJProblemModel.index(0,0));
openCloseBottomPanel(true);
ui->tabMessages->setCurrentWidget(ui->tabProblem);
@@ -2643,6 +2684,7 @@ void MainWindow::onProblemNameChanged(int index)
if (idx.isValid() && index == idx.row()) {
POJProblem problem = mOJProblemSetModel.problem(idx.row());
ui->lblProblem->setText(mOJProblemModel.getTitle());
+ ui->lblProblem->setToolTip(mOJProblemModel.getTooltip());
}
}
@@ -3498,7 +3540,7 @@ void MainWindow::onOJProblemCaseFinished(const QString &id, int current, int tot
}
ui->pbProblemCases->setMaximum(total);
ui->pbProblemCases->setValue(current);
- ui->lblProblem->setText(mOJProblemModel.getTitle());
+// ui->lblProblem->setText(mOJProblemModel.getProblemTitle());
}
void MainWindow::cleanUpCPUDialog()
diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h
index 2a22961d..ea0fc399 100644
--- a/RedPandaIDE/mainwindow.h
+++ b/RedPandaIDE/mainwindow.h
@@ -227,6 +227,7 @@ private slots:
void onDebugConsoleContextMenu(const QPoint& pos);
void onFileEncodingContextMenu(const QPoint& pos);
void onFilesViewContextMenu(const QPoint& pos);
+ void onLstProblemSetContextMenu(const QPoint& pos);
void onProblemSetIndexChanged(const QModelIndex ¤t, const QModelIndex &previous);
void onProblemCaseIndexChanged(const QModelIndex ¤t, const QModelIndex &previous);
void onProblemNameChanged(int index);
@@ -582,6 +583,9 @@ private:
QAction * mBookmark_RemoveAll;
QAction * mBookmark_Modify;
+ //action for problem set
+ QAction * mProblem_Properties;
+
// QWidget interface
protected:
void closeEvent(QCloseEvent *event) override;
diff --git a/RedPandaIDE/problems/ojproblemset.h b/RedPandaIDE/problems/ojproblemset.h
index 74040b07..a7a97b9f 100644
--- a/RedPandaIDE/problems/ojproblemset.h
+++ b/RedPandaIDE/problems/ojproblemset.h
@@ -31,6 +31,7 @@ using POJProblemCase = std::shared_ptr;
struct OJProblem {
QString name;
QString url;
+ QString description;
QVector cases;
};
diff --git a/RedPandaIDE/systemconsts.h b/RedPandaIDE/systemconsts.h
index 9bc6a70c..e6deb8dd 100644
--- a/RedPandaIDE/systemconsts.h
+++ b/RedPandaIDE/systemconsts.h
@@ -3,7 +3,7 @@
#include
-#define DEVCPP_VERSION "0.7.9"
+#define DEVCPP_VERSION "0.7.8"
#define APP_SETTSINGS_FILENAME "redpandacpp.ini"
#ifdef Q_OS_WIN
diff --git a/RedPandaIDE/widgets/ojproblempropertywidget.cpp b/RedPandaIDE/widgets/ojproblempropertywidget.cpp
new file mode 100644
index 00000000..597444af
--- /dev/null
+++ b/RedPandaIDE/widgets/ojproblempropertywidget.cpp
@@ -0,0 +1,60 @@
+#include "ojproblempropertywidget.h"
+#include "ui_ojproblempropertywidget.h"
+
+OJProblemPropertyWidget::OJProblemPropertyWidget(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::OJProblemPropertyWidget)
+{
+ ui->setupUi(this);
+}
+
+OJProblemPropertyWidget::~OJProblemPropertyWidget()
+{
+ delete ui;
+}
+
+void OJProblemPropertyWidget::setName(const QString &name)
+{
+ QFont f = ui->lbName->font();
+ f.setPointSize(f.pointSize()+2);
+ f.setBold(true);
+ ui->lbName->setFont(f);
+ ui->lbName->setText(name);
+}
+
+void OJProblemPropertyWidget::setUrl(const QString &url)
+{
+ ui->txtURL->setText(url);
+}
+
+void OJProblemPropertyWidget::setDescription(const QString &description)
+{
+ ui->txtDescription->setHtml(description);
+}
+
+QString OJProblemPropertyWidget::name()
+{
+ return ui->lbName->text();
+}
+
+QString OJProblemPropertyWidget::url()
+{
+ return ui->txtURL->text();
+}
+
+QString OJProblemPropertyWidget::description()
+{
+ return ui->txtDescription->toHtml();
+}
+
+void OJProblemPropertyWidget::on_btnOk_clicked()
+{
+ this->accept();
+}
+
+
+void OJProblemPropertyWidget::on_btnCancel_clicked()
+{
+ this->reject();
+}
+
diff --git a/RedPandaIDE/widgets/ojproblempropertywidget.h b/RedPandaIDE/widgets/ojproblempropertywidget.h
new file mode 100644
index 00000000..4efa22f2
--- /dev/null
+++ b/RedPandaIDE/widgets/ojproblempropertywidget.h
@@ -0,0 +1,33 @@
+#ifndef OJPROBLEMPROPERTYWIDGET_H
+#define OJPROBLEMPROPERTYWIDGET_H
+
+#include
+
+namespace Ui {
+class OJProblemPropertyWidget;
+}
+
+class OJProblemPropertyWidget : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit OJProblemPropertyWidget(QWidget *parent = nullptr);
+ ~OJProblemPropertyWidget();
+ void setName(const QString& name);
+ void setUrl(const QString& url);
+ void setDescription(const QString& description);
+ QString name();
+ QString url();
+ QString description();
+
+private slots:
+ void on_btnOk_clicked();
+
+ void on_btnCancel_clicked();
+
+private:
+ Ui::OJProblemPropertyWidget *ui;
+};
+
+#endif // OJPROBLEMPROPERTYWIDGET_H
diff --git a/RedPandaIDE/widgets/ojproblempropertywidget.ui b/RedPandaIDE/widgets/ojproblempropertywidget.ui
new file mode 100644
index 00000000..2514028a
--- /dev/null
+++ b/RedPandaIDE/widgets/ojproblempropertywidget.ui
@@ -0,0 +1,93 @@
+
+
+ OJProblemPropertyWidget
+
+
+
+ 0
+ 0
+ 400
+ 300
+
+
+
+ Form
+
+
+ -
+
+
+ URL
+
+
+
+ -
+
+
+ TextLabel
+
+
+
+ -
+
+
+ -
+
+
+ Description
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ OK
+
+
+
+ -
+
+
+ Cancel
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/RedPandaIDE/widgets/ojproblemsetmodel.cpp b/RedPandaIDE/widgets/ojproblemsetmodel.cpp
index f2d0c79c..2917f431 100644
--- a/RedPandaIDE/widgets/ojproblemsetmodel.cpp
+++ b/RedPandaIDE/widgets/ojproblemsetmodel.cpp
@@ -87,6 +87,7 @@ void OJProblemSetModel::saveToFile(const QString &fileName)
QJsonObject problemObj;
problemObj["name"]=problem->name;
problemObj["url"]=problem->url;
+ problemObj["description"]=problem->description;
QJsonArray cases;
foreach (const POJProblemCase& problemCase, problem->cases) {
QJsonObject caseObj;
@@ -131,6 +132,7 @@ void OJProblemSetModel::loadFromFile(const QString &fileName)
POJProblem problem = std::make_shared();
problem->name = problemObj["name"].toString();
problem->url = problemObj["url"].toString();
+ problem->description = problemObj["description"].toString();
QJsonArray casesArray = problemObj["cases"].toArray();
foreach (const QJsonValue& caseVal, casesArray) {
QJsonObject caseObj = caseVal.toObject();
@@ -292,6 +294,18 @@ QString OJProblemModel::getTitle()
return title;
}
+QString OJProblemModel::getTooltip()
+{
+ if (!mProblem)
+ return "";
+ QString s;
+ s=QString("%1
").arg(mProblem->name);
+ if (!mProblem->description.isEmpty())
+ s+=QString("%1
")
+ .arg(mProblem->description);
+ return s;
+}
+
int OJProblemModel::rowCount(const QModelIndex &) const
{
if (mProblem==nullptr)
diff --git a/RedPandaIDE/widgets/ojproblemsetmodel.h b/RedPandaIDE/widgets/ojproblemsetmodel.h
index fd2f7c83..d20e4334 100644
--- a/RedPandaIDE/widgets/ojproblemsetmodel.h
+++ b/RedPandaIDE/widgets/ojproblemsetmodel.h
@@ -20,6 +20,7 @@ public:
int count();
void update(int row);
QString getTitle();
+ QString getTooltip();
private:
POJProblem mProblem;