From ea3b4ea8e5170884d7509302eea45fe785d9efa5 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Tue, 13 Dec 2022 12:36:16 +0800 Subject: [PATCH 1/5] - enhancement: Show memory usage after console program exited. - fix: If clang and g++ are in the same folder, only the compiler sets for gcc are auto generated. --- NEWS.md | 3 ++- RedPandaIDE/settings.cpp | 6 ++++-- tools/consolepauser/main.windows.cpp | 16 ++++++++++++---- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/NEWS.md b/NEWS.md index 6d74921c..b9f920fc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -11,7 +11,8 @@ Red Panda C++ Version 2.6 - enhancement: Prevent error of "del" to stop make when rebuild project. - enhancement: Import FPS (free problem set) files. - enhancement: Show current problem's description in the problem list's mouse tip. - - enhancement: Show memory usage for problem cases. + - enhancement: Show memory usage for problem cases (windows only). + - enhancement: Show memory usage after console program exited. Red Panda C++ Version 2.5 diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp index bd51e4f9..a871b471 100644 --- a/RedPandaIDE/settings.cpp +++ b/RedPandaIDE/settings.cpp @@ -2653,8 +2653,10 @@ static void setDebugOptions(Settings::PCompilerSet pSet) { bool Settings::CompilerSets::addSets(const QString &folder, const QString& cc_prog) { foreach (const PCompilerSet& set, mList) { - if (set->binDirs().contains(folder)) - return false; + if (set->binDirs().contains(folder)) { + if (extractFileName(set->cppCompiler())==cc_prog) + return false; + } } // Default, release profile PCompilerSet baseSet = addSet(folder,cc_prog); diff --git a/tools/consolepauser/main.windows.cpp b/tools/consolepauser/main.windows.cpp index d4ed90b3..fcaf6fc2 100644 --- a/tools/consolepauser/main.windows.cpp +++ b/tools/consolepauser/main.windows.cpp @@ -20,6 +20,7 @@ using std::string; #include #include +#include #include #ifndef WINBOOL @@ -114,7 +115,7 @@ string GetCommand(int argc,char** argv,bool &reInp,bool &pauseAfterExit) { return result; } -DWORD ExecuteCommand(string& command,bool reInp) { +DWORD ExecuteCommand(string& command,bool reInp, LONGLONG &peakMemory) { STARTUPINFOA si; PROCESS_INFORMATION pi; @@ -139,7 +140,13 @@ DWORD ExecuteCommand(string& command,bool reInp) { WaitForSingleObject(pi.hProcess, INFINITE); // Wait for it to finish - + peakMemory = 0; + PROCESS_MEMORY_COUNTERS counter; + counter.cb = sizeof(counter); + if (GetProcessMemoryInfo(pi.hProcess,&counter, + sizeof(counter))){ + peakMemory = counter.PeakWorkingSetSize/1024; + } DWORD result = 0; GetExitCodeProcess(pi.hProcess, &result); return result; @@ -225,8 +232,9 @@ int main(int argc, char** argv) { // Save starting timestamp LONGLONG starttime = GetClockTick(); + LONGLONG peakMemory=0; // Then execute said command - DWORD returnvalue = ExecuteCommand(command,reInp); + DWORD returnvalue = ExecuteCommand(command,reInp,peakMemory); // Get ending timestamp LONGLONG endtime = GetClockTick(); @@ -242,7 +250,7 @@ int main(int argc, char** argv) { // Done? Print return value of executed program printf("\n--------------------------------"); - printf("\nProcess exited after %.4g seconds with return value %lu\n",seconds,returnvalue); + printf("\nProcess exited after %.4g seconds with return value %lu, %d KB mem used.\n",seconds,returnvalue,peakMemory); if (pauseAfterExit) PauseExit(returnvalue,reInp); return 0; From e81c08d6c8ba9f5e3c2261a0cab1469b6e20aa57 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Tue, 13 Dec 2022 12:40:54 +0800 Subject: [PATCH 2/5] refactor: correct var name --- NEWS.md | 1 + RedPandaIDE/settings.cpp | 48 +++++++++++++++++----------------------- RedPandaIDE/settings.h | 8 +++---- 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/NEWS.md b/NEWS.md index b9f920fc..0d699ad1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -13,6 +13,7 @@ Red Panda C++ Version 2.6 - enhancement: Show current problem's description in the problem list's mouse tip. - enhancement: Show memory usage for problem cases (windows only). - enhancement: Show memory usage after console program exited. + - fix: If clang and g++ are in the same folder, only the compiler sets for gcc are auto generated. Red Panda C++ Version 2.5 diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp index a871b471..88943cb7 100644 --- a/RedPandaIDE/settings.cpp +++ b/RedPandaIDE/settings.cpp @@ -1557,7 +1557,7 @@ Settings::CompilerSet::CompilerSet(): } -Settings::CompilerSet::CompilerSet(const QString& compilerFolder, const QString& cc_prog): +Settings::CompilerSet::CompilerSet(const QString& compilerFolder, const QString& c_prog): mAutoAddCharsetParams(true), mExecCharset(ENCODING_SYSTEM_DEFAULT), mStaticLink(true), @@ -1568,7 +1568,7 @@ Settings::CompilerSet::CompilerSet(const QString& compilerFolder, const QString& mCompilationStage(Settings::CompilerSet::CompilationStage::GenerateExecutable) { if (QDir(compilerFolder).exists()) { - setProperties(compilerFolder, cc_prog); + setProperties(compilerFolder, c_prog); //manually set the directories setDirectories(compilerFolder, mCompilerType); @@ -2051,21 +2051,15 @@ static void addExistingDirectory(QStringList& dirs, const QString& directory) { dirs.append(dirPath); } -void Settings::CompilerSet::setProperties(const QString &binDir, const QString& cc_prog) +void Settings::CompilerSet::setProperties(const QString &binDir, const QString& c_prog) { - if (cc_prog.isEmpty()) + if (c_prog.isEmpty()) return; -// QString cc_prog; -// if (fileExists(binDir, CLANG_PROGRAM)) -// cc_prog = CLANG_PROGRAM; -// else if (fileExists(binDir,GCC_PROGRAM)) -// cc_prog = GCC_PROGRAM; -// else -// return; + // Obtain version number and compiler distro etc QStringList arguments; arguments.append("-v"); - QByteArray output = getCompilerOutput(binDir,cc_prog,arguments); + QByteArray output = getCompilerOutput(binDir,c_prog,arguments); //Target QByteArray targetStr = "Target: "; @@ -2169,7 +2163,7 @@ void Settings::CompilerSet::setProperties(const QString &binDir, const QString& // Obtain compiler target arguments.clear(); arguments.append("-dumpmachine"); - mDumpMachine = getCompilerOutput(binDir, cc_prog, arguments); + mDumpMachine = getCompilerOutput(binDir, c_prog, arguments); // Add the default directories addExistingDirectory(mBinDirs, includeTrailingPathDelimiter(folder) + "bin"); @@ -2257,11 +2251,11 @@ void Settings::CompilerSet::setExecutables() void Settings::CompilerSet::setDirectories(const QString& binDir,CompilerType compilerType) { QString folder = QFileInfo(binDir).absolutePath(); - QString cc_prog; + QString c_prog; if (compilerType==CompilerType::Clang) - cc_prog = CLANG_PROGRAM; + c_prog = CLANG_PROGRAM; else - cc_prog = GCC_PROGRAM; + c_prog = GCC_PROGRAM; // Find default directories // C include dirs QStringList arguments; @@ -2270,7 +2264,7 @@ void Settings::CompilerSet::setDirectories(const QString& binDir,CompilerType co arguments.append("-v"); arguments.append("-E"); arguments.append(NULL_FILE); - QByteArray output = getCompilerOutput(binDir,cc_prog,arguments); + QByteArray output = getCompilerOutput(binDir,c_prog,arguments); int delimPos1 = output.indexOf("#include <...> search starts here:"); int delimPos2 = output.indexOf("End of search list."); @@ -2292,7 +2286,7 @@ void Settings::CompilerSet::setDirectories(const QString& binDir,CompilerType co arguments.append("-E"); arguments.append("-v"); arguments.append(NULL_FILE); - output = getCompilerOutput(binDir,cc_prog,arguments); + output = getCompilerOutput(binDir,c_prog,arguments); //gcc -xc++ -E -v NUL delimPos1 = output.indexOf("#include <...> search starts here:"); @@ -2312,7 +2306,7 @@ void Settings::CompilerSet::setDirectories(const QString& binDir,CompilerType co arguments.clear(); arguments.append("-print-search-dirs"); arguments.append(NULL_FILE); - output = getCompilerOutput(binDir,cc_prog,arguments); + output = getCompilerOutput(binDir,c_prog,arguments); // bin dirs QByteArray targetStr = QByteArray("programs: ="); delimPos1 = output.indexOf(targetStr); @@ -2608,10 +2602,10 @@ Settings::PCompilerSet Settings::CompilerSets::addSet() return p; } -Settings::PCompilerSet Settings::CompilerSets::addSet(const QString &folder, const QString& cc_prog) +Settings::PCompilerSet Settings::CompilerSets::addSet(const QString &folder, const QString& c_prog) { - PCompilerSet p=std::make_shared(folder,cc_prog); - if (cc_prog==GCC_PROGRAM && p->compilerType()==CompilerType::Clang) + PCompilerSet p=std::make_shared(folder,c_prog); + if (c_prog==GCC_PROGRAM && p->compilerType()==CompilerType::Clang) return PCompilerSet(); mList.push_back(p); return p; @@ -2651,15 +2645,13 @@ static void setDebugOptions(Settings::PCompilerSet pSet) { pSet->setStaticLink(false); } -bool Settings::CompilerSets::addSets(const QString &folder, const QString& cc_prog) { +bool Settings::CompilerSets::addSets(const QString &folder, const QString& c_prog) { foreach (const PCompilerSet& set, mList) { - if (set->binDirs().contains(folder)) { - if (extractFileName(set->cppCompiler())==cc_prog) - return false; - } + if (set->binDirs().contains(folder) && extractFileName(set->CCompiler())==c_prog) + return false; } // Default, release profile - PCompilerSet baseSet = addSet(folder,cc_prog); + PCompilerSet baseSet = addSet(folder,c_prog); if (!baseSet) return false; QString baseName = baseSet->name(); diff --git a/RedPandaIDE/settings.h b/RedPandaIDE/settings.h index e25dbff9..332a3a27 100644 --- a/RedPandaIDE/settings.h +++ b/RedPandaIDE/settings.h @@ -1230,14 +1230,14 @@ public: }; explicit CompilerSet(); - explicit CompilerSet(const QString& compilerFolder, const QString& cc_prog); + explicit CompilerSet(const QString& compilerFolder, const QString& c_prog); explicit CompilerSet(const CompilerSet& set); CompilerSet& operator= (const CompilerSet& ) = delete; CompilerSet& operator= (const CompilerSet&& ) = delete; // Initialization - void setProperties(const QString& binDir, const QString& cc_prog); + void setProperties(const QString& binDir, const QString& c_prog); void resetCompileOptionts(); bool setCompileOption(const QString& key, int valIndex); @@ -1425,9 +1425,9 @@ public: QString getKeyFromCompilerCompatibleIndex(int idx) const; private: - PCompilerSet addSet(const QString& folder, const QString& cc_prog); + PCompilerSet addSet(const QString& folder, const QString& c_prog); PCompilerSet addSet(const PCompilerSet &pSet); - bool addSets(const QString& folder, const QString& cc_prog); + bool addSets(const QString& folder, const QString& c_prog); void savePath(const QString& name, const QString& path); void savePathList(const QString& name, const QStringList& pathList); From 02e6748db53d54ce1ff50707bdb5154a861a001f Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Tue, 13 Dec 2022 15:58:27 +0800 Subject: [PATCH 3/5] - fix: Buttons in options -> compiler -> compiler set -> programs are not usable. - enhancement: Don't check existence of gcc/g++/make/gdb at startup. - enhancement: Auto disable "compile" button if gcc doesn't exist. - enhancement: Auto disable "debug" button if gdb doesn't exist. - enhancement: Auto disable "compile" button for project if make doesn't exist. --- NEWS.md | 5 + RedPandaIDE/compiler/compilerinfo.h | 3 +- RedPandaIDE/compiler/stdincompiler.cpp | 10 +- RedPandaIDE/mainwindow.cpp | 27 +- RedPandaIDE/settings.cpp | 96 ++- RedPandaIDE/settings.h | 6 +- .../compilersetoptionwidget.cpp | 95 +++ .../settingsdialog/compilersetoptionwidget.h | 8 + RedPandaIDE/translations/RedPandaIDE_pt_BR.ts | 42 +- RedPandaIDE/translations/RedPandaIDE_zh_CN.ts | 705 ++++++++++-------- RedPandaIDE/translations/RedPandaIDE_zh_TW.ts | 52 +- 11 files changed, 653 insertions(+), 396 deletions(-) diff --git a/NEWS.md b/NEWS.md index 0d699ad1..033892a9 100644 --- a/NEWS.md +++ b/NEWS.md @@ -14,6 +14,11 @@ Red Panda C++ Version 2.6 - enhancement: Show memory usage for problem cases (windows only). - enhancement: Show memory usage after console program exited. - fix: If clang and g++ are in the same folder, only the compiler sets for gcc are auto generated. + - fix: Buttons in options -> compiler -> compiler set -> programs are not usable. + - enhancement: Don't check existence of gcc/g++/make/gdb at startup. + - enhancement: Auto disable "compile" button if gcc doesn't exist. + - enhancement: Auto disable "debug" button if gdb doesn't exist. + - enhancement: Auto disable "compile" button for project if make doesn't exist. Red Panda C++ Version 2.5 diff --git a/RedPandaIDE/compiler/compilerinfo.h b/RedPandaIDE/compiler/compilerinfo.h index 5793f80b..1a94a3e3 100644 --- a/RedPandaIDE/compiler/compilerinfo.h +++ b/RedPandaIDE/compiler/compilerinfo.h @@ -54,7 +54,8 @@ enum class CompilerSetType { enum class CompilerType { GCC, GCC_UTF8, - Clang + Clang, + Unknown }; using CompileOptionChoiceList = QList>; diff --git a/RedPandaIDE/compiler/stdincompiler.cpp b/RedPandaIDE/compiler/stdincompiler.cpp index 34665820..e5dbf6d1 100644 --- a/RedPandaIDE/compiler/stdincompiler.cpp +++ b/RedPandaIDE/compiler/stdincompiler.cpp @@ -30,7 +30,10 @@ StdinCompiler::StdinCompiler(const QString &filename,const QByteArray& encoding, bool StdinCompiler::prepareForCompile() { - log(tr("Checking file syntax...")); + if (mOnlyCheckSyntax) + log(tr("Checking file syntax...")); + else + log(tr("Compiling...")); log("------------------"); log(tr("- Filename: %1").arg(mFilename)); log(tr("- Compiler Set Name: %1").arg(compilerSet()->name())); @@ -68,7 +71,10 @@ bool StdinCompiler::prepareForCompile() mArguments += getLibraryArguments(fileType); if (!fileExists(mCompiler)) { - throw CompileError(tr("The Compiler '%1' doesn't exists!").arg(mCompiler)); + if (!mOnlyCheckSyntax) + throw CompileError(tr("The Compiler '%1' doesn't exists!").arg(mCompiler)); + else + return false; } log(tr("Processing %1 source file:").arg(strFileType)); diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 337fabc3..0cd20ea2 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -650,14 +650,28 @@ void MainWindow::updateCompileActions() bool forProject=false; bool canCompile = false; bool canRun = false; + bool canDebug = false; Editor * e = mEditorList->getEditor(); if (e) { if (!e->inProject()) { FileType fileType = getFileType(e->filename()); if (fileType == FileType::CSource || fileType == FileType::CppSource || e->isNew()) { - canCompile = true; canRun = true; + Settings::PCompilerSet set = pSettings->compilerSets().defaultSet(); + if (set) { + canDebug = set->canDebug(); + switch(fileType) { + case FileType::CSource: + canCompile = set->canCompileC(); + break; + case FileType::CppSource: + canCompile = set->canCompileCPP(); + break; + default: + break; + } + } } } else { forProject = (mProject!=nullptr); @@ -666,9 +680,13 @@ void MainWindow::updateCompileActions() forProject = (mProject!=nullptr); } if (forProject) { - canCompile = true; canRun = (mProject->options().type !=ProjectType::DynamicLib) && (mProject->options().type !=ProjectType::StaticLib); + Settings::PCompilerSet set = pSettings->compilerSets().getSet(mProject->options().compilerSet); + if (set) { + canDebug = set->canDebug(); + canCompile = set->canMake(); + } } if (mCompilerManager->compiling() || mCompilerManager->running() || mDebugger->executing() || (!canCompile)) { @@ -681,11 +699,11 @@ void MainWindow::updateCompileActions() ui->btnRunAllProblemCases->setEnabled(false); } else { ui->actionCompile->setEnabled(true); - ui->actionCompile_Run->setEnabled(canRun); + ui->actionCompile_Run->setEnabled(canRun && canCompile); ui->actionRun->setEnabled(canRun); ui->actionRebuild->setEnabled(true); ui->actionGenerate_Assembly->setEnabled(!forProject); - ui->actionDebug->setEnabled(canRun); + ui->actionDebug->setEnabled(canDebug); ui->btnRunAllProblemCases->setEnabled(canRun); } if (!mDebugger->executing()) { @@ -5170,6 +5188,7 @@ void MainWindow::onCompilerSetChanged(int index) if (index<0) return; Editor *e = mEditorList->getEditor(); + updateCompileActions(); if ( mProject && (!e || e->inProject()) ) { if (index==mProject->options().compilerSet) diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp index 88943cb7..eede0cf5 100644 --- a/RedPandaIDE/settings.cpp +++ b/RedPandaIDE/settings.cpp @@ -1544,9 +1544,11 @@ void Settings::Editor::setTabToSpaces(bool tabToSpaces) Settings::CompilerSet::CompilerSet(): mFullLoaded(false), - mAutoAddCharsetParams(true), + mCompilerType(CompilerType::Unknown), + mCompilerSetType(CompilerSetType::RELEASE), + mAutoAddCharsetParams(false), mExecCharset(ENCODING_SYSTEM_DEFAULT), - mStaticLink(true), + mStaticLink(false), mPreprocessingSuffix(DEFAULT_PREPROCESSING_SUFFIX), mCompilationProperSuffix(DEFAULT_COMPILATION_SUFFIX), mAssemblingSuffix(DEFAULT_ASSEMBLING_SUFFIX), @@ -1770,34 +1772,34 @@ bool Settings::CompilerSet::dirsValid(QString &msg) return true; } -bool Settings::CompilerSet::validateExes(QString &msg) -{ - msg =""; - if (!fileExists(mCCompiler)) { - msg += QObject::tr("Cannot find the %1 \"%2\"") - .arg(QObject::tr("C Compiler")) - .arg(mCCompiler); - } - if (!fileExists(mCppCompiler)) { - msg += QObject::tr("Cannot find the %1 \"%2\"") - .arg(QObject::tr("C++ Compiler")) - .arg(mCppCompiler); - } - if (!mMake.isEmpty() && !fileExists(mMake)) { - msg += QObject::tr("Cannot find the %1 \"%2\"") - .arg(QObject::tr("Maker")) - .arg(mMake); - } - if (!fileExists(mDebugger)) { - msg += QObject::tr("Cannot find the %1 \"%2\"") - .arg(QObject::tr("Debugger")) - .arg(mDebugger); - } - if (!msg.isEmpty()) - return false; - else - return true; -} +//bool Settings::CompilerSet::validateExes(QString &msg) +//{ +// msg =""; +// if (!fileExists(mCCompiler)) { +// msg += QObject::tr("Cannot find the %1 \"%2\"") +// .arg(QObject::tr("C Compiler")) +// .arg(mCCompiler); +// } +// if (!fileExists(mCppCompiler)) { +// msg += QObject::tr("Cannot find the %1 \"%2\"") +// .arg(QObject::tr("C++ Compiler")) +// .arg(mCppCompiler); +// } +// if (!mMake.isEmpty() && !fileExists(mMake)) { +// msg += QObject::tr("Cannot find the %1 \"%2\"") +// .arg(QObject::tr("Maker")) +// .arg(mMake); +// } +// if (!fileExists(mDebugger)) { +// msg += QObject::tr("Cannot find the %1 \"%2\"") +// .arg(QObject::tr("Debugger")) +// .arg(mDebugger); +// } +// if (!msg.isEmpty()) +// return false; +// else +// return true; +//} const QString &Settings::CompilerSet::CCompiler() const { @@ -1806,7 +1808,17 @@ const QString &Settings::CompilerSet::CCompiler() const void Settings::CompilerSet::setCCompiler(const QString &name) { - mCCompiler = name; + if (mCCompiler!=name) { + mCCompiler = name; + if (mCompilerType == CompilerType::Unknown) { + QString temp=extractFileName(mCCompiler); + if (temp == CLANG_PROGRAM) { + setCompilerType(CompilerType::Clang); + } else if (temp == GCC_PROGRAM) { + setCompilerType(CompilerType::GCC); + } + } + } } const QString &Settings::CompilerSet::cppCompiler() const @@ -2403,6 +2415,26 @@ int Settings::CompilerSet::mainVersion() } +bool Settings::CompilerSet::canCompileC() +{ + return fileExists(mCCompiler); +} + +bool Settings::CompilerSet::canCompileCPP() +{ + return fileExists(mCppCompiler); +} + +bool Settings::CompilerSet::canMake() +{ + return fileExists(mMake); +} + +bool Settings::CompilerSet::canDebug() +{ + return fileExists(mDebugger); +} + void Settings::CompilerSet::setUserInput() { mUseCustomCompileParams = false; @@ -2800,7 +2832,7 @@ void Settings::CompilerSets::loadSets() PCompilerSet pCurrentSet = defaultSet(); if (pCurrentSet) { QString msg; - if (!pCurrentSet->dirsValid(msg) || !pCurrentSet->validateExes(msg)) { + if (!pCurrentSet->dirsValid(msg)) { if (QMessageBox::warning(nullptr,QObject::tr("Confirm"), QObject::tr("The following problems were found during validation of compiler set \"%1\":") .arg(pCurrentSet->name()) diff --git a/RedPandaIDE/settings.h b/RedPandaIDE/settings.h index 332a3a27..1cb9ebcd 100644 --- a/RedPandaIDE/settings.h +++ b/RedPandaIDE/settings.h @@ -1249,8 +1249,12 @@ public: int mainVersion(); + bool canCompileC(); + bool canCompileCPP(); + bool canMake(); + bool canDebug(); bool dirsValid(QString& msg); - bool validateExes(QString& msg); +// bool validateExes(QString& msg); //properties const QString& CCompiler() const; void setCCompiler(const QString& name); diff --git a/RedPandaIDE/settingsdialog/compilersetoptionwidget.cpp b/RedPandaIDE/settingsdialog/compilersetoptionwidget.cpp index 8698aef2..983d6547 100644 --- a/RedPandaIDE/settingsdialog/compilersetoptionwidget.cpp +++ b/RedPandaIDE/settingsdialog/compilersetoptionwidget.cpp @@ -51,6 +51,7 @@ CompilerSetOptionWidget::CompilerSetOptionWidget(const QString& name, const QStr #ifdef Q_OS_WIN ui->txtExecutableSuffix->setReadOnly(true); #endif + ui->settingTabs->setCurrentWidget(ui->tabGeneral); } CompilerSetOptionWidget::~CompilerSetOptionWidget() @@ -235,6 +236,16 @@ void CompilerSetOptionWidget::saveCurrentCompilerSet() pSet->setExecutableSuffix(ui->txtExecutableSuffix->text()); } +QString CompilerSetOptionWidget::getBinDir() +{ + Settings::PCompilerSet pSet = pSettings->compilerSets().defaultSet(); + if (!pSet->binDirs().isEmpty()) + return pSet->binDirs().front(); + if (!mBinDirWidget->dirList().isEmpty()) + return mBinDirWidget->dirList().front(); + return QDir().absolutePath(); +} + void CompilerSetOptionWidget::on_btnFindCompilers_pressed() { #ifdef Q_OS_WIN @@ -338,3 +349,87 @@ void CompilerSetOptionWidget::on_cbEncodingDetails_currentTextChanged(const QStr } + +void CompilerSetOptionWidget::on_btnChooseCCompiler_clicked() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Locate C Compiler"), + getBinDir(), + tr("Executable files (*.exe)")); + if (fileExists(fileName)) + ui->txtCCompiler->setText(fileName); +} + + +void CompilerSetOptionWidget::on_btnChooseCppCompiler_clicked() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Locate C++ Compiler"), + getBinDir(), + tr("Executable files (*.exe)")); + if (fileExists(fileName)) + ui->txtCppCompiler->setText(fileName); +} + + +void CompilerSetOptionWidget::on_btnChooseMake_clicked() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Locate Make"), + getBinDir(), + tr("Executable files (*.exe)")); + if (fileExists(fileName)) + ui->txtMake->setText(fileName); +} + + +void CompilerSetOptionWidget::on_btnChooseGDB_clicked() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Locate GDB"), + getBinDir(), + tr("Executable files (*.exe)")); + if (fileExists(fileName)) + ui->txtDebugger->setText(fileName); +} + + +void CompilerSetOptionWidget::on_btnChooseGDBServer_clicked() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Locate GDB Server"), + getBinDir(), + tr("Executable files (*.exe)")); + if (fileExists(fileName)) + ui->txtGDBServer->setText(fileName); +} + + +void CompilerSetOptionWidget::on_btnChooseResourceCompiler_clicked() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Locate windres"), + getBinDir(), + tr("Executable files (*.exe)")); + if (fileExists(fileName)) + ui->txtResourceCompiler->setText(fileName); +} + + +void CompilerSetOptionWidget::on_btnChooseProfiler_clicked() +{ + QString fileName = QFileDialog::getOpenFileName( + this, + tr("Locate gprof"), + getBinDir(), + tr("Executable files (*.exe)")); + if (fileExists(fileName)) + ui->txtProfiler->setText(fileName); +} + diff --git a/RedPandaIDE/settingsdialog/compilersetoptionwidget.h b/RedPandaIDE/settingsdialog/compilersetoptionwidget.h index b2e6c1ea..ceb6d135 100644 --- a/RedPandaIDE/settingsdialog/compilersetoptionwidget.h +++ b/RedPandaIDE/settingsdialog/compilersetoptionwidget.h @@ -52,6 +52,7 @@ protected: private: void reloadCurrentCompilerSet(); void saveCurrentCompilerSet(); + QString getBinDir(); private slots: void on_cbCompilerSet_currentIndexChanged(int index); @@ -63,6 +64,13 @@ private slots: void on_cbEncoding_currentTextChanged(const QString &arg1); void on_cbEncodingDetails_currentTextChanged(const QString &arg1); + void on_btnChooseCCompiler_clicked(); + void on_btnChooseCppCompiler_clicked(); + void on_btnChooseMake_clicked(); + void on_btnChooseGDB_clicked(); + void on_btnChooseGDBServer_clicked(); + void on_btnChooseResourceCompiler_clicked(); + void on_btnChooseProfiler_clicked(); }; #endif // COMPILERSETOPTIONWIDGET_H diff --git a/RedPandaIDE/translations/RedPandaIDE_pt_BR.ts b/RedPandaIDE/translations/RedPandaIDE_pt_BR.ts index b8aaa0cd..2e3673c7 100644 --- a/RedPandaIDE/translations/RedPandaIDE_pt_BR.ts +++ b/RedPandaIDE/translations/RedPandaIDE_pt_BR.ts @@ -723,6 +723,38 @@ Executable suffix + + Locate C Compiler + + + + Executable files (*.exe) + Arquivos executáveis (*.exe) + + + Locate C++ Compiler + + + + Locate Make + + + + Locate GDB + + + + Locate GDB Server + + + + Locate windres + + + + Locate gprof + + CppRefacter @@ -5977,23 +6009,23 @@ Cannot find the %1 "%2" - Impossível encontrar %1 "%2" + Impossível encontrar %1 "%2" C Compiler - Compilar C + Compilar C C++ Compiler - Compilador C++ + Compilador C++ Maker - Maker + Maker Debugger - Depurador + Depurador C options diff --git a/RedPandaIDE/translations/RedPandaIDE_zh_CN.ts b/RedPandaIDE/translations/RedPandaIDE_zh_CN.ts index 0325edf1..10db32e9 100644 --- a/RedPandaIDE/translations/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/translations/RedPandaIDE_zh_CN.ts @@ -967,12 +967,12 @@ p, li { white-space: pre-wrap; } 选择性能分析器 - + Confirm 确认 - + Red Panda C++ will clear current compiler list and search for compilers in the following locations:<br /> '%1'<br /> '%2'<br />Are you really want to continue? Red Panda C++ will clear current compiler list and search for compilers in the following locations: '%1' @@ -991,43 +991,89 @@ Are you really want to continue? UTF-8 - + Red Panda C++ will clear current compiler list and search for compilers in the the PATH. <br />Are you really want to continue? 小熊猫C++ 将会清除现有的编译器配置列表,然后在PATH路径中搜索gcc编译器.<br />你确定要继续吗? - - + + Failed 失败 - - + + Can't find any compiler. 找不到编译器 - - + + Compiler Set Name 编译器配置名称 - + Name 名称 - + Compiler Set Folder 编译器所在文件夹 - + New name 新名称 + + + Locate C Compiler + 定位C编译器 + + + + + + + + + + Executable files (*.exe) + 可执行文件 (*.exe) + + + + Locate C++ Compiler + 定位C++编译器 + + + + Locate Make + 定位make程序 + + + + Locate GDB + 定位gdb程序 + + + + Locate GDB Server + 定位gdb server程序 + + + + Locate windres + 定位windres程序 + + + + Locate gprof + 定位gprof程序 + CppRefacter @@ -3937,18 +3983,18 @@ Are you really want to continue? MainWindow - + Red Panda C++ 小熊猫C++ - - - - - + + + + + Issues 编译器 @@ -4022,7 +4068,7 @@ Are you really want to continue? - + Debug Console 调试主控台 @@ -4156,8 +4202,8 @@ Are you really want to continue? - - + + Compile 编译 @@ -4235,9 +4281,9 @@ Are you really want to continue? - - - + + + Copy 复制 @@ -4248,7 +4294,7 @@ Are you really want to continue? - + Paste 粘贴 @@ -4259,8 +4305,8 @@ Are you really want to continue? - - + + Select All 选择全部 @@ -4386,7 +4432,7 @@ Are you really want to continue? - + New Problem Set 新建试题集 @@ -4405,14 +4451,14 @@ Are you really want to continue? - + Save Problem Set 保存试题集 - + Load Problem Set 载入试题集 @@ -4473,7 +4519,7 @@ Are you really want to continue? - + Run All Cases Run Current Case 运行所有案例 @@ -4539,7 +4585,7 @@ Are you really want to continue? - + Import FPS Problem Set 导入FPS试题集 @@ -4771,7 +4817,7 @@ Are you really want to continue? - + Clear all breakpoints 删除所有断点 @@ -4972,7 +5018,7 @@ Are you really want to continue? - + New File 新建文件 @@ -5013,7 +5059,7 @@ Are you really want to continue? - + Rename Symbol 重命名符号 @@ -5034,13 +5080,13 @@ Are you really want to continue? - + Export As RTF 导出为RTF - + Export As HTML 导出为HTML @@ -5309,7 +5355,7 @@ Are you really want to continue? 运行参数... - + File Encoding 文件编码 @@ -5319,32 +5365,32 @@ Are you really want to continue? 文件历史 - - - - - - + + + + + + Debugging 正在调试 - - - - - - + + + + + + Running 正在运行 - - - - - - + + + + + + Compiling 正在编译 @@ -5353,23 +5399,23 @@ Are you really want to continue? 行:%1 列:%2 已选择:%3 总行数:%4 总长度:%5 - + Line:%1 Col:%2 Selected:%3 Lines:%4 Length:%5 Line: %1 Col: %2 Selected: %3 Lines: %4 Length: %5 行: %1 列: %2 已选择 :%3 总行数: %4 总长度: %5 - + Read Only 只读 - + Insert 插入 - + Overwrite 覆写 @@ -5382,133 +5428,133 @@ Are you really want to continue? 你确定要关闭'%1'吗? - - + + Confirm 确认 - - - + + + Source file is not compiled. 源文件尚未编译。 - - + + Compile now? 现在编译? - - + + Source file is more recent than executable. 源文件比可执行程序新。 - + Recompile now? 重新编译? - - - - + + + + Wrong Compiler Settings 错误的编译器设置 - - - - + + + + Compiler is set not to generate executable. 编译器被设置为不生成可执行文件。 - - + + We need the executabe to run problem case. 我们需要可执行文件来运行试题案例。 - + No compiler set 无编译器设置 - + No compiler set is configured. 没有配置编译器设置。 - + Can't start debugging. 无法启动调试器 - - + + Enable debugging 启用调试参数 - - + + You have not enabled debugging info (-g3) and/or stripped it from the executable (-s) in Compiler Options.<BR /><BR />Do you want to correct this now? 当前编译设置中未启用调试选项(-g3),或启用了信息剥除选项(-s)<br /><br/>是否纠正这一问题? - + Project not built 项目尚未构建 - + Project hasn't been built. Build it now? 项目尚未构建。是否构建? - + Host applcation missing 宿主程序不存在 - + DLL project needs a host application to run. 动态链接库(DLL)需要一个宿主程序来运行。 - + But it's missing. 但它不存在。 - + Host application not exists 宿主程序不存在 - + Host application file '%1' doesn't exist. 宿主程序'%1'不存在。 - - + + Please correct this before start debugging 请在调试前改正设置。 - + Recompile? 重新编译? - - + + Save last open info error 保存上次打开信息失败 @@ -5517,60 +5563,60 @@ Are you really want to continue? 无法删除旧上次打开信息文件'%1' - + Can't save last open info file '%1' 无法保存上次打开信息文件'%1' - - + + Load last open info error 载入上次打开信息失败 - - + + Can't load last open info file '%1' 无法载入上次打开信息文件'%1' - + Open Source File 打开源代码文件 - - + + Batch Set Cases 批量设置案例 - + Show detail debug logs 显示详细调试器日志 - + Copy all 全部复制 - + Go to Line 跳转到行 - + Line - + Template Exists 模板已存在 - + Template %1 already exists. Do you want to overwrite? 模板%1已存在。是否覆盖? @@ -5578,9 +5624,9 @@ Are you really want to continue? - - - + + + Clear 清除 @@ -5596,7 +5642,7 @@ Are you really want to continue? - + Problem Set %1 试题集%1 @@ -5617,68 +5663,68 @@ Are you really want to continue? 或者选择使用其他的网络端口。 - - + + Rebuild Project 重新构建项目 - - + + Project has been modified, do you want to rebuild it? 项目已经被修改过,是否需要重新构建? - + Auto Save Error 自动保存出错 - + Auto save "%1" to "%2" failed:%3 自动保存"%1"到"%2"失败:%3 - + Properties... 试题属性... - + Set Problem Set Name 设置试题集名称 - + Problem Set Name: 试题集名称: - + Remove 删除 - + Remove All Bookmarks 删除全部书签 - + Modify Description 修改描述 - - - + + + Bookmark Description 书签描述 - - - + + + Description: 描述: @@ -5687,209 +5733,209 @@ Are you really want to continue? 在调试主控台中显示调试器输出 - + Remove this search 清除这次搜索 - + Clear all searches 删除所有搜索 - + Breakpoint condition... 断点条件... - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Remove All Breakpoints Remove all breakpoints 删除所有断点 - + Remove Breakpoint 删除当前断点 - + Rename File 重命名文件 - - + + Add Folder 添加文件夹 - - + + New folder 新文件夹 - + Folder name: 文件夹: - + Rename Folder 重命名 - + Can't open last open information file '%1' for write! 无法写入配置文件'%1'。 - + Rename Problem 修改试题名称 - + Goto Url 跳转到试题网址 - + Run Current Case 运行当前案例 - + Remove Folder 删除文件夹 - + Switch to normal view 切换为普通视图 - + Switch to custom view 切换为自定义视图 - + Sort By Type 按类型排序 - + Sort alphabetically 按名称排序 - + Show inherited members 显示继承的成员 - + Goto declaration 跳转到声明处 - + Goto definition 跳转到定义处 - + In current file 仅当前文件 - + In current project 整个项目 - - + + New Folder 新建文件夹 - + Rename 重命名 - - - - + + + + Delete 删除 - + Open in Editor 在编辑器中打开 - + Open in External Program 使用外部程序打开 - + Open in Terminal 在终端中打开 - + Open in Windows Explorer 在Windows浏览器中打开 - + Character sets 字符集 - + Convert to %1 转换为%1编码 - + %1 files autosaved 已自动保存%1个文件 - + Set answer to... 设置答案源代码... - + select other file... 选择其他文件... - + Select Answer Source File 选择答案源代码文件 - + FPS Problem Set Files (*.fps;*.xml) FPS试题集文件(*.fps;*.xml) @@ -5903,7 +5949,7 @@ Are you really want to continue? C/C++源代码文件 (*.c *.cpp *.cc *.cxx) - + New Folder %1 新建文件夹%1 @@ -5916,68 +5962,68 @@ Are you really want to continue? 无标题%1 - + Do you really want to delete %1? 你真的要删除%1吗? - + Do you really want to delete %1 files? 你真的要删除%1个文件吗? - + Save project 保存项目 - + The project '%1' has modifications. 项目'%1'有改动。 - - + + Do you want to save it? 需要保存吗? - - + + File Changed 文件已发生变化 - + New Project File? 新建项目文件? - + Do you want to add the new file to the project? 您是否要将新建的文件加入项目? - - - + + + Save Error 保存失败 - + Change Project Compiler Set 改变项目编译器配置集 - + Change the project's compiler set will lose all custom compiler set options. 改变项目的编译器配置集会导致所有的自定义编译器选项被重置。 - - + + Do you really want to do that? 你真的想要那么做吗? @@ -5986,12 +6032,12 @@ Are you really want to continue? 批量设置案例 - + Choose input files 选择输入数据文件 - + Input data files (*.in) 输入数据文件 (*.in) @@ -6000,104 +6046,104 @@ Are you really want to continue? 无标题%1 - + Modify Watch 修改监视表达式 - + Watch Expression 监视表达式 - + Do you really want to clear all breakpoints in this file? 您真的要清除该文件的所有断点吗? - + New project 新建项目 - + Close %1 and start new project? 关闭'%1'以打开新项目? - + Folder not exist 文件夹不存在 - + Folder '%1' doesn't exist. Create it now? 文件夹'%1'不存在。是否创建? - + Can't create folder 无法创建文件夹 - + Failed to create folder '%1'. 创建文件夹'%1'失败。 - + Save new project as - + Folder %1 is not empty. 文件夹%1不是空的。 - + Do you really want to delete it? 你真的要删除它吗? - + Change working folder 改变工作文件夹 - + File '%1' is not in the current working folder. File '%1' is not in the current working folder 文件'%1'不在当前工作文件夹中。 - + Do you want to change working folder to '%1'? 是否将工作文件夹改设为'%1'? - + Can't Commit 无法提交 - + Git needs user info to commit. Git需要用信息进行提交。 - + Choose Input Data File 选择输入数据文件 - - + + All files (*.*) 所有文件 (*.*) - + Choose Expected Output Data File Choose Expected Input Data File 选择期望输出文件 @@ -6109,59 +6155,59 @@ Are you really want to continue? - + Choose Working Folder 选择工作文件夹 - - + + Header Exists 头文件已存在 - - + + Header file "%1" already exists! 头文件"%1"已存在! - + Source Exists 源文件已存在! - + Source file "%1" already exists! 源文件"%1"已存在! - + Can't commit! 无法提交! - + The following files are in conflicting: 下列文件处于冲突状态,请解决后重新添加和提交: - + Commit Message 提交信息 - + Commit Message: 提交信息: - + Commit Failed 提交失败 - + Commit message shouldn't be empty! 提交信息不能为空! @@ -6170,22 +6216,22 @@ Are you really want to continue? 小熊猫Dev-C++项目文件 (*.dev) - + New project fail 新建项目失败 - + Can't assign project template 无法使用模板创建项目 - + Remove file 删除文件 - + Remove the file from disk? 同时从硬盘上删除文件? @@ -6194,111 +6240,111 @@ Are you really want to continue? 无标题 - + New Project File Name 新的项目文件名 - + File Name: 文件名: - + File Already Exists! 文件已存在! - + File '%1' already exists! 文件'%1'已经存在! - + Add to project 添加到项目 - + C/C++ Source Files (*.c *.cpp *.cc *.cxx) C/C++源代码文件 (*.c *.cpp *.cc *.cxx) - + This operation will remove all cases for the current problem. 本操作会删除此试题的所有案例。 - + Red Panda C++ project file (*.dev) 小熊猫C++项目文件(*.dev) - + Rename Error 重命名出错 - + Symbol '%1' is defined in system header. 符号'%1'在系统头文件中定义,无法修改。 - + New Name 新名称 - - + + Replace Error 替换出错 - + Can't open file '%1' for replace! 无法打开文件'%1'进行替换! - + Contents has changed since last search! 内容和上次查找时不一致。 - + Rich Text Format Files (*.rtf) RTF格式文件 (*.rtf) - + HTML Files (*.html) HTML文件 (*.html) - + The current problem set is not empty. 当前的试题集不是空的。 - + Problem %1 试题%1 - - + + Problem Set Files (*.pbs) 试题集文件 (*.pbs) - - + + Load Error 载入失败 - - + + Problem Case %1 试题案例%1 @@ -6309,16 +6355,16 @@ Are you really want to continue? - - - - - - - - - - + + + + + + + + + + Error 错误 @@ -6328,96 +6374,96 @@ Are you really want to continue? 项目历史 - + Load Theme Error 载入主题失败 - - + + Clear History 清除历史 - - + + Version Control 版本控制 - + File '%1' was changed. 磁盘文件'%1'已被修改。 - + Reload its content from disk? 是否重新读取它的内容? - + File '%1' was removed. 磁盘文件'%1'已被删除。 - + Keep it open? 是否保持它在小熊猫C++中打开的编辑窗口? - + Open 打开 - + Compile Failed 编译失败 - + Run Failed 运行失败 - - - - + + + + Confirm Convertion 确认转换 - - - - + + + + The editing file will be saved using %1 encoding. <br />This operation can't be reverted. <br />Are you sure to continue? 当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗? - + New Watch Expression 新监视表达式 - + Enter Watch Expression (it is recommended to use 'this->' for class members): 输入监视表达式 - + Parsing file %1 of %2: "%3" (%1/%2)正在解析文件"%3" - - + + Done parsing %1 files in %2 seconds 完成%1个文件的解析,用时%2秒 - + (%1 files per second) (每秒%1个文件) @@ -6708,18 +6754,18 @@ Are you really want to continue? OJProblemModel - + Name 名称 - + Time(ms) Time(sec) 时间(毫秒) - + Memory(kb) 内存(kb) @@ -6768,26 +6814,31 @@ Are you really want to continue? + sec + ms 毫秒 + KB KB + MB MB + GB GB @@ -7757,32 +7808,24 @@ Are you really want to continue? C++包含 - - - - Cannot find the %1 "%2" - 无法找到%1程序"%2" + 无法找到%1程序"%2" - C Compiler - C编译器 + C编译器 - C++ Compiler - C++编译器 + C++编译器 - Maker - 构建程序(Make) + 构建程序(Make) - Debugger - 调试器 + 调试器 @@ -7846,7 +7889,7 @@ Are you really want to continue? 生成调试信息(-g3) - + Would you like Red Panda C++ to search for compilers in PATH? 您同意小熊猫C++在PATH路径中寻找gcc编译器吗? @@ -7959,23 +8002,23 @@ Are you really want to continue? 只生成汇编代码(-S) - - + + Confirm 确认 - + The following problems were found during validation of compiler set "%1": 在验证编译器设置"%1"时遇到了下列问题: - + Leaving those directories will lead to problems during compilation. 在配置中保留这些文件夹可能会导致编译出错。 - + Would you like Red Panda C++ to remove them for you and add the default paths to the valid paths? 是否让小熊猫C++删除这些配置,并尝试重新建立配置? @@ -7984,13 +8027,13 @@ Are you really want to continue? 如果仍然保留这些设置,可能会导致编译错误。<br /><br />请选择“是”,除非您清楚的知道选择“否”的后果, - - + + Compiler set not configuared. 未配置编译器设置。 - + Would you like Red Panda C++ to search for compilers in the following locations: <BR />'%1'<BR />'%2'? 您需要小熊猫C++在下列位置搜索编译器吗:<br />%1<br />%2 @@ -9053,14 +9096,14 @@ Are you really want to continue? 性能 - + Compiler Set 编译器配置集 - + Compiler @@ -9072,7 +9115,7 @@ Are you really want to continue? 自动链接 - + @@ -9149,15 +9192,15 @@ Are you really want to continue? 杂项 - - + + Program Runner 程序运行 - + Problem Set 试题集 diff --git a/RedPandaIDE/translations/RedPandaIDE_zh_TW.ts b/RedPandaIDE/translations/RedPandaIDE_zh_TW.ts index 63fc4c76..b9529bf2 100644 --- a/RedPandaIDE/translations/RedPandaIDE_zh_TW.ts +++ b/RedPandaIDE/translations/RedPandaIDE_zh_TW.ts @@ -632,6 +632,38 @@ Executable suffix + + Locate C Compiler + + + + Executable files (*.exe) + + + + Locate C++ Compiler + + + + Locate Make + + + + Locate GDB + + + + Locate GDB Server + + + + Locate windres + + + + Locate gprof + + CppRefacter @@ -5752,26 +5784,6 @@ C++ include - - Cannot find the %1 "%2" - - - - C Compiler - - - - C++ Compiler - - - - Maker - - - - Debugger - - C options From 4093f29ac4b1d11d33752bd89ca5d666fe4f0411 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Wed, 14 Dec 2022 09:12:37 +0800 Subject: [PATCH 4/5] - Fix: Crash when scroll file which has more than 65535 lines. --- NEWS.md | 1 + libs/qsynedit/qsynedit/SynEdit.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 033892a9..1d4026a0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -19,6 +19,7 @@ Red Panda C++ Version 2.6 - enhancement: Auto disable "compile" button if gcc doesn't exist. - enhancement: Auto disable "debug" button if gdb doesn't exist. - enhancement: Auto disable "compile" button for project if make doesn't exist. + - Fix: Crash when scroll file which has more than 65535 lines. Red Panda C++ Version 2.5 diff --git a/libs/qsynedit/qsynedit/SynEdit.cpp b/libs/qsynedit/qsynedit/SynEdit.cpp index 72b6892f..343e0aec 100644 --- a/libs/qsynedit/qsynedit/SynEdit.cpp +++ b/libs/qsynedit/qsynedit/SynEdit.cpp @@ -3244,7 +3244,7 @@ void SynEdit::updateScrollbars() nPage = mCharsInWindow; nPos = mLeftChar; } else { - nMin = 0; + nMin = 1; nMax = MAX_SCROLL; nPage = mulDiv(MAX_SCROLL, mCharsInWindow, nMaxScroll); nPos = mulDiv(MAX_SCROLL, mLeftChar, nMaxScroll); @@ -3265,7 +3265,7 @@ void SynEdit::updateScrollbars() nPage = mLinesInWindow; nPos = mTopLine; } else { - nMin = 0; + nMin = 1; nMax = MAX_SCROLL; nPage = mulDiv(MAX_SCROLL, mLinesInWindow, nMaxScroll); nPos = mulDiv(MAX_SCROLL, mTopLine, nMaxScroll); From 13f0be31548b2acc2b1c8d9c1ec16731cc1d81fa Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Wed, 14 Dec 2022 09:20:53 +0800 Subject: [PATCH 5/5] - fix: Crash when scroll file which has more than 65535 lines. - fix: Can't scroll to lines greater than 65535. --- NEWS.md | 3 ++- libs/qsynedit/qsynedit/Constants.h | 3 --- libs/qsynedit/qsynedit/SynEdit.cpp | 30 ++++++++---------------------- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/NEWS.md b/NEWS.md index 1d4026a0..aa2ac379 100644 --- a/NEWS.md +++ b/NEWS.md @@ -19,7 +19,8 @@ Red Panda C++ Version 2.6 - enhancement: Auto disable "compile" button if gcc doesn't exist. - enhancement: Auto disable "debug" button if gdb doesn't exist. - enhancement: Auto disable "compile" button for project if make doesn't exist. - - Fix: Crash when scroll file which has more than 65535 lines. + - fix: Crash when scroll file which has more than 65535 lines. + - fix: Can't scroll to lines greater than 65535. Red Panda C++ Version 2.5 diff --git a/libs/qsynedit/qsynedit/Constants.h b/libs/qsynedit/qsynedit/Constants.h index aa26d42e..c9bbf4f9 100644 --- a/libs/qsynedit/qsynedit/Constants.h +++ b/libs/qsynedit/qsynedit/Constants.h @@ -27,9 +27,6 @@ extern const QChar TabGlyph; extern const QChar LineBreakGlyph; extern const QChar SoftBreakGlyph; - -#define MAX_SCROLL 65535 - // names for token attributes #define SYNS_AttrAssembler "Assembler" #define SYNS_AttrCharacter "Character" diff --git a/libs/qsynedit/qsynedit/SynEdit.cpp b/libs/qsynedit/qsynedit/SynEdit.cpp index 343e0aec..9ff7b091 100644 --- a/libs/qsynedit/qsynedit/SynEdit.cpp +++ b/libs/qsynedit/qsynedit/SynEdit.cpp @@ -3238,17 +3238,10 @@ void SynEdit::updateScrollbars() } if (mScrollBars == ScrollStyle::ssBoth || mScrollBars == ScrollStyle::ssHorizontal) { nMaxScroll = maxScrollWidth(); - if (nMaxScroll <= MAX_SCROLL) { - nMin = 1; - nMax = nMaxScroll; - nPage = mCharsInWindow; - nPos = mLeftChar; - } else { - nMin = 1; - nMax = MAX_SCROLL; - nPage = mulDiv(MAX_SCROLL, mCharsInWindow, nMaxScroll); - nPos = mulDiv(MAX_SCROLL, mLeftChar, nMaxScroll); - } + nMin = 1; + nMax = nMaxScroll; + nPage = mCharsInWindow; + nPos = mLeftChar; horizontalScrollBar()->setMinimum(nMin); horizontalScrollBar()->setMaximum(nMax); horizontalScrollBar()->setPageStep(nPage); @@ -3259,17 +3252,10 @@ void SynEdit::updateScrollbars() if (mScrollBars == ScrollStyle::ssBoth || mScrollBars == ScrollStyle::ssVertical) { nMaxScroll = maxScrollHeight(); - if (nMaxScroll <= MAX_SCROLL) { - nMin = 1; - nMax = std::max(1, nMaxScroll); - nPage = mLinesInWindow; - nPos = mTopLine; - } else { - nMin = 1; - nMax = MAX_SCROLL; - nPage = mulDiv(MAX_SCROLL, mLinesInWindow, nMaxScroll); - nPos = mulDiv(MAX_SCROLL, mTopLine, nMaxScroll); - } + nMin = 1; + nMax = std::max(1, nMaxScroll); + nPage = mLinesInWindow; + nPos = mTopLine; verticalScrollBar()->setMinimum(nMin); verticalScrollBar()->setMaximum(nMax); verticalScrollBar()->setPageStep(nPage);