From 88a7c46edaf5d468adb26cb9470fac6b54f191af Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Tue, 2 Nov 2021 13:12:36 +0800 Subject: [PATCH] - enhancement: Problem Set - enhancement: Competitive Companion Support - fix: when search in project, files opened for search shouldn't be parsed for symbols. - fix: when search in project, the search history is not correctly updated. --- NEWS.md | 6 +- RedPandaIDE/RedPandaIDE.pro | 3 + RedPandaIDE/mainwindow.cpp | 32 +++++-- RedPandaIDE/settings.cpp | 35 ++++++++ RedPandaIDE/settings.h | 14 +++ .../executorproblemsetwidget.cpp | 32 +++++++ .../settingsdialog/executorproblemsetwidget.h | 26 ++++++ .../executorproblemsetwidget.ui | 88 +++++++++++++++++++ RedPandaIDE/settingsdialog/settingsdialog.cpp | 5 ++ RedPandaIDE/widgets/searchdialog.cpp | 52 ++++++----- RedPandaIDE/widgets/searchdialog.h | 4 +- 11 files changed, 261 insertions(+), 36 deletions(-) create mode 100644 RedPandaIDE/settingsdialog/executorproblemsetwidget.cpp create mode 100644 RedPandaIDE/settingsdialog/executorproblemsetwidget.h create mode 100644 RedPandaIDE/settingsdialog/executorproblemsetwidget.ui diff --git a/NEWS.md b/NEWS.md index cc186b5d..fbe63aa2 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,11 +1,13 @@ Version 0.7.7 + - enhancement: Problem Set + - enhancement: Competitive Companion Support - change: "save" action will be enabled no matter contents in the current editor is modified or not - fix: focus not correctly set when the current editor is closed - fix: can't parse old c-style enum variable definition like "enum Test test;" - fix: remove the file change monitor if it's remove from the disk - fix: don't test if a file is writable before save to it (because qt can't do that test reliably). - - enhancement: Problem Set - - enhancement: Competitive Companion Support + - fix: when search in project, files opened for search shouldn't be parsed for symbols. + - fix: when search in project, the search history is not correctly updated. Version 0.7.6 - change: don't auto insert a new line when input an enter between '(' and ')' or between '[' and ']' (indent instead) diff --git a/RedPandaIDE/RedPandaIDE.pro b/RedPandaIDE/RedPandaIDE.pro index a2c900e0..fe5e1f84 100644 --- a/RedPandaIDE/RedPandaIDE.pro +++ b/RedPandaIDE/RedPandaIDE.pro @@ -54,6 +54,7 @@ SOURCES += \ settingsdialog/environmentfileassociationwidget.cpp \ settingsdialog/environmentfolderswidget.cpp \ settingsdialog/environmentshortcutwidget.cpp \ + settingsdialog/executorproblemsetwidget.cpp \ settingsdialog/formattergeneralwidget.cpp \ settingsdialog/projectcompileparamaterswidget.cpp \ settingsdialog/projectcompilerwidget.cpp \ @@ -173,6 +174,7 @@ HEADERS += \ settingsdialog/environmentfileassociationwidget.h \ settingsdialog/environmentfolderswidget.h \ settingsdialog/environmentshortcutwidget.h \ + settingsdialog/executorproblemsetwidget.h \ settingsdialog/formattergeneralwidget.h \ settingsdialog/projectcompileparamaterswidget.h \ settingsdialog/projectcompilerwidget.h \ @@ -262,6 +264,7 @@ FORMS += \ settingsdialog/environmentfileassociationwidget.ui \ settingsdialog/environmentfolderswidget.ui \ settingsdialog/environmentshortcutwidget.ui \ + settingsdialog/executorproblemsetwidget.ui \ settingsdialog/formattergeneralwidget.ui \ settingsdialog/projectcompileparamaterswidget.ui \ settingsdialog/projectcompilerwidget.ui \ diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index c8fec49a..84b7abac 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -536,10 +536,32 @@ void MainWindow::applySettings() qApp->setFont(font); this->setFont(font); - if (!mTcpServer.listen(QHostAddress::LocalHost,10045)) { - QMessageBox::critical(nullptr, - tr("Listen failed"), - tr("Can't listen to port %1").arg(10045)); + mTcpServer.close(); + int idxProblem = ui->tabMessages->indexOf(ui->tabProblem); + ui->tabMessages->setTabEnabled(idxProblem,pSettings->executor().enableProblemSet()); + int idxProblemSet = ui->tabInfos->indexOf(ui->tabProblemSet); + ui->tabInfos->setTabEnabled(idxProblemSet,pSettings->executor().enableProblemSet()); + 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.")); + } + } + if (idxProblem<0) + ui->tabMessages->addTab(ui->tabProblem,tr("Problem")); + if (idxProblemSet<0) + ui->tabInfos->addTab(ui->tabProblemSet, tr("Problem Set")); + } else { + if (idxProblem>=0) + ui->tabMessages->removeTab(idxProblem); + if (idxProblemSet>=0) + ui->tabInfos->removeTab(idxProblemSet); } updateDebuggerSettings(); } @@ -3118,7 +3140,7 @@ void MainWindow::closeEvent(QCloseEvent *event) { } } - + mTcpServer.close(); mCompilerManager->stopCompile(); mCompilerManager->stopRun(); if (!mShouldRemoveAllSettings) diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp index 94eecb5e..ac9d1bbf 100644 --- a/RedPandaIDE/settings.cpp +++ b/RedPandaIDE/settings.cpp @@ -2757,6 +2757,36 @@ void Settings::Executor::setInputFilename(const QString &newInputFilename) mInputFilename = newInputFilename; } +int Settings::Executor::competivieCompanionPort() const +{ + return mCompetivieCompanionPort; +} + +void Settings::Executor::setCompetivieCompanionPort(int newCompetivieCompanionPort) +{ + mCompetivieCompanionPort = newCompetivieCompanionPort; +} + +bool Settings::Executor::enableCompetitiveCompanion() const +{ + return mEnableCompetitiveCompanion; +} + +void Settings::Executor::setEnableCompetitiveCompanion(bool newEnableCompetitiveCompanion) +{ + mEnableCompetitiveCompanion = newEnableCompetitiveCompanion; +} + +bool Settings::Executor::enableProblemSet() const +{ + return mEnableProblemSet; +} + +void Settings::Executor::setEnableProblemSet(bool newEnableProblemSet) +{ + mEnableProblemSet = newEnableProblemSet; +} + void Settings::Executor::doSave() { saveValue("pause_console", mPauseConsole); @@ -2765,6 +2795,8 @@ void Settings::Executor::doSave() saveValue("params",mParams); saveValue("redirect_input",mRedirectInput); saveValue("input_filename",mInputFilename); + //problem set + } bool Settings::Executor::pauseConsole() const @@ -2786,6 +2818,9 @@ void Settings::Executor::doLoad() mRedirectInput = boolValue("redirect_input",false); mInputFilename = stringValue("input_filename",""); + mEnableProblemSet = boolValue("enable_proble_set",true); + mEnableCompetitiveCompanion = boolValue("enable_competivie_companion",true); + mCompetivieCompanionPort = intValue("competitive_companion_port",10045); } diff --git a/RedPandaIDE/settings.h b/RedPandaIDE/settings.h index 1ee758b2..e65c90e8 100644 --- a/RedPandaIDE/settings.h +++ b/RedPandaIDE/settings.h @@ -763,6 +763,15 @@ public: const QString &inputFilename() const; void setInputFilename(const QString &newInputFilename); + bool enableProblemSet() const; + void setEnableProblemSet(bool newEnableProblemSet); + + bool enableCompetitiveCompanion() const; + void setEnableCompetitiveCompanion(bool newEnableCompetitiveCompanion); + + int competivieCompanionPort() const; + void setCompetivieCompanionPort(int newCompetivieCompanionPort); + private: // general bool mPauseConsole; @@ -772,6 +781,11 @@ public: bool mRedirectInput; QString mInputFilename; + //Problem Set + bool mEnableProblemSet; + bool mEnableCompetitiveCompanion; + int mCompetivieCompanionPort; + protected: void doSave() override; void doLoad() override; diff --git a/RedPandaIDE/settingsdialog/executorproblemsetwidget.cpp b/RedPandaIDE/settingsdialog/executorproblemsetwidget.cpp new file mode 100644 index 00000000..b07438fb --- /dev/null +++ b/RedPandaIDE/settingsdialog/executorproblemsetwidget.cpp @@ -0,0 +1,32 @@ +#include "executorproblemsetwidget.h" +#include "ui_executorproblemsetwidget.h" +#include "../settings.h" +#include "../mainwindow.h" + +ExecutorProblemSetWidget::ExecutorProblemSetWidget(const QString& name, const QString& group, QWidget *parent): + SettingsWidget(name,group,parent), + ui(new Ui::ExecutorProblemSetWidget) +{ + ui->setupUi(this); +} + +ExecutorProblemSetWidget::~ExecutorProblemSetWidget() +{ + delete ui; +} + +void ExecutorProblemSetWidget::doLoad() +{ + ui->grpProblemSet->setChecked(pSettings->executor().enableProblemSet()); + ui->grpCompetitiveCompanion->setChecked(pSettings->executor().enableCompetitiveCompanion()); + ui->spinPortNumber->setValue(pSettings->executor().competivieCompanionPort()); +} + +void ExecutorProblemSetWidget::doSave() +{ + pSettings->executor().setEnableProblemSet(ui->grpProblemSet->isChecked()); + pSettings->executor().setEnableCompetitiveCompanion(ui->grpCompetitiveCompanion->isChecked()); + pSettings->executor().setCompetivieCompanionPort(ui->spinPortNumber->value()); + pSettings->executor().save(); + pMainWindow->applySettings(); +} diff --git a/RedPandaIDE/settingsdialog/executorproblemsetwidget.h b/RedPandaIDE/settingsdialog/executorproblemsetwidget.h new file mode 100644 index 00000000..cbae0196 --- /dev/null +++ b/RedPandaIDE/settingsdialog/executorproblemsetwidget.h @@ -0,0 +1,26 @@ +#ifndef EXECUTORPROBLEMSETWIDGET_H +#define EXECUTORPROBLEMSETWIDGET_H + +#include +#include "settingswidget.h" + +namespace Ui { +class ExecutorProblemSetWidget; +} + +class ExecutorProblemSetWidget : public SettingsWidget +{ + Q_OBJECT + +public: + explicit ExecutorProblemSetWidget(const QString& name, const QString& group, QWidget *parent = nullptr); + ~ExecutorProblemSetWidget(); + +private: + Ui::ExecutorProblemSetWidget *ui; +protected: + void doLoad() override; + void doSave() override; +}; + +#endif // EXECUTORPROBLEMSETWIDGET_H diff --git a/RedPandaIDE/settingsdialog/executorproblemsetwidget.ui b/RedPandaIDE/settingsdialog/executorproblemsetwidget.ui new file mode 100644 index 00000000..30ef1cf8 --- /dev/null +++ b/RedPandaIDE/settingsdialog/executorproblemsetwidget.ui @@ -0,0 +1,88 @@ + + + ExecutorProblemSetWidget + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + Enable Problem Set + + + true + + + + + + Listen for Competitive Companion + + + true + + + + + + 1025 + + + 65535 + + + + + + + Port Number + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + diff --git a/RedPandaIDE/settingsdialog/settingsdialog.cpp b/RedPandaIDE/settingsdialog/settingsdialog.cpp index fbfc64d5..4547eba3 100644 --- a/RedPandaIDE/settingsdialog/settingsdialog.cpp +++ b/RedPandaIDE/settingsdialog/settingsdialog.cpp @@ -19,6 +19,7 @@ #include "environmentfileassociationwidget.h" #include "environmentfolderswidget.h" #include "executorgeneralwidget.h" +#include "executorproblemsetwidget.h" #include "debuggeneralwidget.h" #include "formattergeneralwidget.h" #include "projectgeneralwidget.h" @@ -175,6 +176,10 @@ PSettingsDialog SettingsDialog::optionDialog() widget->init(); dialog->addWidget(widget); + widget = new ExecutorProblemSetWidget(tr("Problem Set"),tr("Program Runner")); + widget->init(); + dialog->addWidget(widget); + widget = new DebugGeneralWidget(tr("General"),tr("Debugger")); widget->init(); dialog->addWidget(widget); diff --git a/RedPandaIDE/widgets/searchdialog.cpp b/RedPandaIDE/widgets/searchdialog.cpp index fae38ccd..ad3a0568 100644 --- a/RedPandaIDE/widgets/searchdialog.cpp +++ b/RedPandaIDE/widgets/searchdialog.cpp @@ -262,8 +262,10 @@ void SearchDialog::on_btnExecute_clicked() Editor * e=pMainWindow->editorList()->operator[](i); if (e!=nullptr) { fileSearched++; - PSearchResultTreeItem parentItem = batchFindInEditor(e, - keyword); + PSearchResultTreeItem parentItem = batchFindInEditor( + e, + e->filename(), + keyword); int t = parentItem->results.size(); findCount+=t; if (t>0) { @@ -282,8 +284,10 @@ void SearchDialog::on_btnExecute_clicked() Editor * e= pMainWindow->editorList()->getEditor(); if (e!=nullptr) { fileSearched++; - PSearchResultTreeItem parentItem = batchFindInEditor(e, - keyword); + PSearchResultTreeItem parentItem = batchFindInEditor( + e, + e->filename(), + keyword); int t = parentItem->results.size(); findCount+=t; if (t>0) { @@ -303,8 +307,10 @@ void SearchDialog::on_btnExecute_clicked() QString curFilename = pMainWindow->project()->units()[i]->fileName(); if (e) { fileSearched++; - PSearchResultTreeItem parentItem = batchFindInEditor(e, - keyword); + PSearchResultTreeItem parentItem = batchFindInEditor( + e, + e->filename(), + keyword); int t = parentItem->results.size(); findCount+=t; if (t>0) { @@ -312,10 +318,14 @@ void SearchDialog::on_btnExecute_clicked() results->results.append(parentItem); } } else if (fileExists(curFilename)) { - Editor editor(nullptr,curFilename,ENCODING_AUTO_DETECT,false,false,nullptr); + SynEdit editor; + QByteArray realEncoding; + editor.lines()->loadFromFile(curFilename,ENCODING_AUTO_DETECT, realEncoding); fileSearched++; - PSearchResultTreeItem parentItem = batchFindInEditor(&editor, - keyword); + PSearchResultTreeItem parentItem = batchFindInEditor( + &editor, + curFilename, + keyword); int t = parentItem->results.size(); findCount+=t; if (t>0) { @@ -325,26 +335,14 @@ void SearchDialog::on_btnExecute_clicked() } } - // end else if rbProjectFiles.Checked then begin - // for I := 0 to MainForm.Project.Units.Count - 1 do begin - // e := MainForm.Project.Units[i].Editor; - // fCurFile := MainForm.Project.Units[i].FileName; - - // // file is already open, use memory - // if Assigned(e) then begin begin - // inc(fileSearched); - // t:=Execute(e->text, actiontype); - // Inc(findcount, t); - // if t>0 then - // inc(filehitted); - // end; + pMainWindow->searchResultModel()->notifySearchResultsUpdated(); } if (findCount>0) pMainWindow->showSearchPanel(actionType == SearchAction::ReplaceFiles); } } -int SearchDialog::execute(Editor *editor, const QString &sSearch, const QString &sReplace, SynSearchMathedProc matchCallback) +int SearchDialog::execute(SynEdit *editor, const QString &sSearch, const QString &sReplace, SynSearchMathedProc matchCallback) { if (editor==nullptr) return 0; @@ -369,7 +367,7 @@ int SearchDialog::execute(Editor *editor, const QString &sSearch, const QString mSearchEngine, matchCallback); } -std::shared_ptr SearchDialog::batchFindInEditor(Editor *e, const QString &keyword) +std::shared_ptr SearchDialog::batchFindInEditor(SynEdit *e, const QString& filename,const QString &keyword) { //backup BufferCoord caretBackup = e->caretXY(); @@ -379,13 +377,13 @@ std::shared_ptr SearchDialog::batchFindInEditor(Editor *e, int leftCharBackup = e->leftChar(); PSearchResultTreeItem parentItem = std::make_shared(); - parentItem->filename = e->filename(); + parentItem->filename = filename; parentItem->parent = nullptr; execute(e,keyword,"", - [e,&parentItem](const QString&, + [e,&parentItem, filename](const QString&, const QString&, int Line, int ch, int wordLen){ PSearchResultTreeItem item = std::make_shared(); - item->filename = e->filename(); + item->filename = filename; item->line = Line; item->start = ch; item->len = wordLen; diff --git a/RedPandaIDE/widgets/searchdialog.h b/RedPandaIDE/widgets/searchdialog.h index 3f68f9cb..efbc1af3 100644 --- a/RedPandaIDE/widgets/searchdialog.h +++ b/RedPandaIDE/widgets/searchdialog.h @@ -44,9 +44,9 @@ private slots: void on_btnExecute_clicked(); private: - int execute(Editor* editor, const QString& sSearch, + int execute(SynEdit* editor, const QString& sSearch, const QString& sReplace, SynSearchMathedProc matchCallback = nullptr); - std::shared_ptr batchFindInEditor(Editor* editor,const QString& keyword); + std::shared_ptr batchFindInEditor(SynEdit * editor,const QString& filename, const QString& keyword); private: Ui::SearchDialog *ui; QTabBar *mTabBar;