From f21eded1adede1067ad82d344508e828e9ff2f2e Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 24 Jan 2022 15:41:23 +0800 Subject: [PATCH 01/12] - fix: when open a file, all blank lines's indents are removed. --- NEWS.md | 1 + RedPandaIDE/RedPandaIDE_zh_CN.ts | 463 +++++++++--------- RedPandaIDE/qsynedit/TextBuffer.cpp | 20 +- .../settingsdialog/compilersetoptionwidget.ui | 2 +- 4 files changed, 261 insertions(+), 225 deletions(-) diff --git a/NEWS.md b/NEWS.md index 632b63d5..dd190cdb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -18,6 +18,7 @@ Red Panda C++ Version 0.13.3 - add a new template for raylib shader apps - fix: project files' charset settings doesn't work correctly - enhancement: add exec charset option to compiler set settings + - fix: when open a file, all blank lines's indents are removed. Red Panda C++ Version 0.13.2 - fix: "delete and exit" button in the environtment / folder option page doesn't work correctly diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts index 4dd712ba..c37a15bc 100644 --- a/RedPandaIDE/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts @@ -1262,45 +1262,45 @@ Are you really want to continue? 要剪切的内容超过了字符数限制! - + Print Document 打印文档 - - - + + + Ctrl+click for more info Ctrl+单击以获取更多信息 - - + + Symbol '%1' not found! 未找到符号'%1'! - + astyle not found 找不到astyle程序 - + Can't find astyle in "%1". 找不到astyle程序"%1". - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Readonly 只读 @@ -3219,7 +3219,7 @@ Are you really want to continue? - + @@ -3229,54 +3229,54 @@ Are you really want to continue? 编译器 - - + + Compile Log 编译日志 - + File 文件 - + Tools 工具 - - + + Run 运行 - + Edit 编辑 - - + + Project 项目 - + Watch 监视 - + Structure 结构 - + Files 文件 @@ -3285,85 +3285,85 @@ Are you really want to continue? 资源 - - - - - + + + + + Debug 调试 - + Evaluate: 求值 - + Debug Console 调试主控台 - + Call Stack 调用栈 - + Breakpoints 断点 - + Locals 局部变量 - - - + + + Search 查找 - + History: 历史: - + Search Again 重新查找 - + Replace with: 替换为: - + Replace 替换 - + Close 关闭 - + Execute 运行 - - + + Code 代码 - + Window 窗口 @@ -3381,249 +3381,249 @@ Are you really want to continue? 新建 - + Ctrl+N Ctrl+N - + Open... 打开... - + Ctrl+O Ctrl+O - + Save 保存 - + Ctrl+S Ctrl+S - + Save As... 另存为... - + Save As 另存为 - + Save All 全部保存 - + Ctrl+Shift+S Ctrl+Shift+S - + Options 选项 - - - + + + Compile 编译 - + F9 F9 - + F10 F10 - + Undo 恢复 - + Ctrl+Z Ctrl+Z - + Redo 重做 - + Ctrl+Y Ctrl+Y - + Cut 剪切 - + Ctrl+X Ctrl+X - + Copy 复制 - + Ctrl+C Ctrl+C - + Paste 粘贴 - + Ctrl+V Ctrl+V - + Select All 选择全部 - + Ctrl+A Ctrl+A - + Indent 缩进 - + UnIndent 取消缩进 - + Toggle Comment 切换注释 - + Ctrl+/ Ctrl+/ - + Collapse All 全部收起 - + Uncollapse All 全部展开 - + Encode in ANSI 使用ANSI编码 - + Encode in UTF-8 使用UTF-8编码 - + Auto Detect 自动检测 - + Convert to ANSI 转换为ANSI编码 - + Convert to UTF-8 转换为UTF-8编码 - - + + Compile & Run 编译运行 - + F11 F11 - - + + Rebuild All 全部重编译 - + F12 F12 - + Stop Execution 停止执行 - + F6 F6 - + F5 F5 - + Step Over 单步跳过 - + F7 F7 - + Step Into 单步进入 - + Problem Set 试题集 @@ -3662,560 +3662,581 @@ Are you really want to continue? 载入试题集 - + Memory 内存 - + Address Expression: Address: 地址表达式: - + Cancel 取消 - - + + TODO TODO - - + + Bookmark 书签 - - - + + + Problem 试题 - - + + Add Probem Case 添加试题案例 - - + + Remove Problem Case Remove Problem Set 删除试题集 - - + + Open Anwser Source File 打开答案源代码文件 - - + + Run All Cases Run Current Case 运行所有案例 - + Problem Cases Validation Options 测试案例验证选项 - + %v/%m %v/%m - + Output 输出 - + Input 输入 - + Expected 期望输出 - + Help 帮助 - + Refactor 重构 - + View 视图 - + Tool Windows 工具窗口 - + Main 主工具栏 - + Compiler Set 编译器配置集 - - + + New Source File 新建源代码文件 - + Tab Tab - + Shift+Tab Shift+Tab - + F8 F8 - + Step Out 单步跳出 - + Ctrl+F8 Ctrl+F8 - + Run To Cursor 执行到光标处 - + Ctrl+F5 Ctrl+F5 - + Continue 继续执行 - + F4 F4 - + Add Watch... 添加监视 - + View CPU Window... 打开CPU信息窗口... - + Exit 退出 - + Find... 查找... - + Ctrl+F Ctrl+F - + Find in Files... 在文件中查找... - + Ctrl+Shift+F Ctrl+Shift+F - + Replace... 替换 - + Ctrl+R Ctrl+R - + Find Next 查找下一个 - + F3 F3 - + Find Previous 查找前一个 - + Shift+F3 Shift+F3 - + Remove Watch 删除监视值 - + Remove All Watches Remove All 删除全部监视值 - + Modify Watch... 修改监视值 - + Reformat Code 对代码重新排版 - + Ctrl+Shift+A Ctrl+Shift+A - + Go back 前一次编辑位置 - + Ctrl+Alt+Left Ctrl+Alt+Left - + Forward 后一次编辑位置 - + Ctrl+Alt+Right Ctrl+Alt+Right - + Ctrl+W Ctrl+W - + Close All 全部关闭 - + Ctrl+Shift+W Ctrl+Shift+W - + Maximize Editor 最大化编辑器 - + Ctrl+F11 Ctrl+F11 - + Next 下一窗口 - + Ctrl+Tab Ctrl+Tab - + Previous 前一窗口 - + Ctrl+Shift+Tab Ctrl+Shift+Tab - + Toggle breakpoint 切换断点 - + Ctrl+F4 Ctrl+F4 - + Clear all breakpoints 删除所有断点 - + Breakpoint property... 设置断点条件... - + Goto Declaration 跳转到声明处 - + Goto Definition 跳转到定义处 - + Find references 查找符号的引用 - + Open containing folder 打开所在的文件夹 - + Ctrl+B Ctrl+B - + Open a terminal here 打开命令行窗口 - + File Properties... 文件属性... - + Close Project 关闭项目 - + Project options 项目属性 - + New Project... 新建项目... - + New File 新建项目文件 - + Add to project... 添加到项目... - + Remove from project 从项目删除 - + View Makefile 查看Makefile - + Clean 清理构建文件 - + Open Folder in Explorer 在浏览器中打开 - + Open In Terminal 在终端中打开 - + About 关于 - + Rename Symbol 重命名符号 - + Shift+F6 Shift+F6 - + Print... 打印... - + Ctrl+P Ctrl+P - + Export As RTF 导出为RTF - + Export As HTML 导出为HTML - + Move To Other View 移动到其他视图 - + Ctrl+M Ctrl+M - - + + C++ Reference C++参考手册 - + C Reference C参考手册 - + Tool Window Bars 工具窗口栏 - + Status Bar 状态栏 - + Ctrl+Backspace Ctrl+Backspace - + Interrupt 中断 + + + + Delete To Word Begin + 删除到单词开头 + + + + Ctrl+Shift+B + Ctrl+Shift+B + + + + Delete to Word End + 删除到单词结尾 + + + + Ctrl+Shift+E + Ctrl+Shift+E + Insert Line 插入行 - + Delete Line 删除当前行 - + Ctrl+D Ctrl+D - + Duplicate Line 复制当前行 - + Ctrl+E Ctrl+E - + Delete Word 删除当前单词 - + Ctrl+Shift+D Ctrl+Shift+D - + Delete to EOL 删除到行尾 - + Ctrl+Del Ctrl+Del - + Delete to BOL 删除到行首 @@ -4224,38 +4245,38 @@ Are you really want to continue? C/C++参考 - + EGE Manual EGE图形库手册 - + Add Bookmark 添加书签 - + Remove Bookmark 删除书签 - + Modify Bookmark Description 修改书签说明 - + Locate in Files View 在文件视图中定位 - + Open Folder 打开文件夹 - + Running Parameters... 运行参数... diff --git a/RedPandaIDE/qsynedit/TextBuffer.cpp b/RedPandaIDE/qsynedit/TextBuffer.cpp index c5196e8a..4ca7f828 100644 --- a/RedPandaIDE/qsynedit/TextBuffer.cpp +++ b/RedPandaIDE/qsynedit/TextBuffer.cpp @@ -556,18 +556,25 @@ void SynEditStringList::loadFromFile(const QString& filename, const QByteArray& } internalClear(); while (true) { + if (line.endsWith("\r\n")) { + line.remove(line.length()-2,2); + } else if (line.endsWith("\r")) { + line.remove(line.length()-1,1); + } else if (line.endsWith("\n")){ + line.remove(line.length()-1,1); + } if (allAscii) { allAscii = isTextAllAscii(line); } if (allAscii) { - addItem(trimRight(QString::fromLatin1(line))); + addItem(QString::fromLatin1(line)); } else { QString newLine = codec->toUnicode(line.constData(),line.length(),&state); if (state.invalidChars>0) { needReread = true; break; } - addItem(trimRight(newLine)); + addItem(newLine); } if (file.atEnd()){ break; @@ -600,7 +607,14 @@ void SynEditStringList::loadFromFile(const QString& filename, const QByteArray& QString line; internalClear(); while (textStream.readLineInto(&line)) { - addItem(trimRight(line)); + if (line.endsWith("\r\n")) { + line.remove(line.length()-2,2); + } else if (line.endsWith("\r")) { + line.remove(line.length()-1,1); + } else if (line.endsWith("\n")){ + line.remove(line.length()-1,1); + } + addItem(line); } emit inserted(0,mList.count()); } diff --git a/RedPandaIDE/settingsdialog/compilersetoptionwidget.ui b/RedPandaIDE/settingsdialog/compilersetoptionwidget.ui index 19fa4142..0757cec2 100644 --- a/RedPandaIDE/settingsdialog/compilersetoptionwidget.ui +++ b/RedPandaIDE/settingsdialog/compilersetoptionwidget.ui @@ -138,7 +138,7 @@ - Add Charset arguments when calling the compiler + Convert Executable's Charset From 2c8a7d29dd0d18959dcbdee9c4f2ed94224a8e50 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 24 Jan 2022 16:08:24 +0800 Subject: [PATCH 02/12] - fix: indent lines displayed at wrong position, when there are folded lines --- NEWS.md | 1 + RedPandaIDE/qsynedit/TextPainter.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index dd190cdb..10976ea7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -19,6 +19,7 @@ Red Panda C++ Version 0.13.3 - fix: project files' charset settings doesn't work correctly - enhancement: add exec charset option to compiler set settings - fix: when open a file, all blank lines's indents are removed. + - fix: indent lines displayed at wrong position, when there are folded lines Red Panda C++ Version 0.13.2 - fix: "delete and exit" button in the environtment / folder option page doesn't work correctly diff --git a/RedPandaIDE/qsynedit/TextPainter.cpp b/RedPandaIDE/qsynedit/TextPainter.cpp index 23a69019..b083d499 100644 --- a/RedPandaIDE/qsynedit/TextPainter.cpp +++ b/RedPandaIDE/qsynedit/TextPainter.cpp @@ -720,10 +720,11 @@ void SynEditTextPainter::PaintFoldAttributes() // Now loop through all the lines. The indices are valid for Lines. for (cRow = aFirstRow; cRow<=aLastRow;cRow++) { vLine = edit->rowToLine(cRow); + qDebug()< edit->mLines->count() && edit->mLines->count() > 0) break; // Set vertical coord - Y = (vLine - edit->mTopLine) * edit->mTextHeight; // limit inside clip rect + Y = (cRow - edit->mTopLine) * edit->mTextHeight; // limit inside clip rect if (edit->mTextHeight % 2 == 1 && vLine % 2 == 0) { Y++; } From 3c132d69f349cc6edfd56462c96607e53161894c Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 24 Jan 2022 16:20:16 +0800 Subject: [PATCH 03/12] - fix: if editor's active line color is disabled, caret's position may not be correct redrawn --- NEWS.md | 1 + RedPandaIDE/qsynedit/SynEdit.cpp | 10 ++-------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/NEWS.md b/NEWS.md index 10976ea7..b0969fe8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -20,6 +20,7 @@ Red Panda C++ Version 0.13.3 - enhancement: add exec charset option to compiler set settings - fix: when open a file, all blank lines's indents are removed. - fix: indent lines displayed at wrong position, when there are folded lines + - fix: if editor's active line color is disabled, caret's position may not be correct redrawn Red Panda C++ Version 0.13.2 - fix: "delete and exit" button in the environtment / folder option page doesn't work correctly diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 6e60382a..7741f853 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -266,14 +266,8 @@ void SynEdit::setCaretXYEx(bool CallEnsureCursorPosVisible, BufferCoord value) if (mCaretY != value.Line) { int oldCaretY = mCaretY; mCaretY = value.Line; - if (mActiveLineColor.isValid()) { - invalidateLine(mCaretY); - invalidateLine(oldCaretY); - } - if (mGutter.activeLineTextColor().isValid()) { - invalidateGutterLine(mCaretY); - invalidateGutterLine(oldCaretY); - } + invalidateLine(mCaretY); + invalidateLine(oldCaretY); mStatusChanges.setFlag(SynStatusChange::scCaretY); } // Call UpdateLastCaretX before DecPaintLock because the event handler it From 05e7d4244779cb1f641ab2d6793fdf70afbbedaa Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 24 Jan 2022 16:45:43 +0800 Subject: [PATCH 04/12] - fix: crash if compiler set's include dir list is not empty and lib dir list is empry --- NEWS.md | 1 + RedPandaIDE/settings.cpp | 19 ++++++++++++------- RedPandaIDE/utils.cpp | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/NEWS.md b/NEWS.md index b0969fe8..855d3dd0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -21,6 +21,7 @@ Red Panda C++ Version 0.13.3 - fix: when open a file, all blank lines's indents are removed. - fix: indent lines displayed at wrong position, when there are folded lines - fix: if editor's active line color is disabled, caret's position may not be correct redrawn + - fix: crash if compiler set's include dir list is not empty and lib dir list is empry Red Panda C++ Version 0.13.2 - fix: "delete and exit" button in the environtment / folder option page doesn't work correctly diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp index b2b09137..60e05332 100644 --- a/RedPandaIDE/settings.cpp +++ b/RedPandaIDE/settings.cpp @@ -1591,22 +1591,22 @@ bool Settings::CompilerSet::validateExes(QString &msg) msg =""; if (!fileExists(mCCompiler)) { msg += QObject::tr("Cannot find the %1 \"%2\"") - .arg("C Compiler") + .arg(QObject::tr("C Compiler")) .arg(mCCompiler); } if (!fileExists(mCppCompiler)) { msg += QObject::tr("Cannot find the %1 \"%2\"") - .arg("C++ Compiler") + .arg(QObject::tr("C++ Compiler")) .arg(mCppCompiler); } - if (!fileExists(mMake)) { + if (!mMake.isEmpty() && !fileExists(mMake)) { msg += QObject::tr("Cannot find the %1 \"%2\"") - .arg("Maker") + .arg(QObject::tr("Maker")) .arg(mMake); } if (!fileExists(mDebugger)) { msg += QObject::tr("Cannot find the %1 \"%2\"") - .arg("Maker") + .arg(QObject::tr("Debugger")) .arg(mDebugger); } if (!msg.isEmpty()) @@ -2533,22 +2533,27 @@ void Settings::CompilerSets::clearSets() void Settings::CompilerSets::findSets() { clearSets(); + QSet searched; #ifdef Q_OS_WIN addSets(includeTrailingPathDelimiter(mSettings->dirs().appDir())+"MinGW32"+QDir::separator()+"bin"); addSets(includeTrailingPathDelimiter(mSettings->dirs().appDir())+"MinGW64"+QDir::separator()+"bin"); + searched.insert(includeTrailingPathDelimiter(mSettings->dirs().appDir())+"MinGW32"+QDir::separator()+"bin"); + searched.insert(includeTrailingPathDelimiter(mSettings->dirs().appDir())+"MinGW64"+QDir::separator()+"bin"); #endif + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QString path = env.value("PATH"); QStringList pathList = path.split(PATH_SEPARATOR); - QSet searched; foreach (const QString& s, pathList){ if (searched.contains(s)) continue;; searched.insert(s); - if (s!="/bin") // /bin/gcc is symbolic link to /usr/bin/gcc + if (s!="/bin") { // /bin/gcc is symbolic link to /usr/bin/gcc addSets(s); + } } + } void Settings::CompilerSets::saveSets() diff --git a/RedPandaIDE/utils.cpp b/RedPandaIDE/utils.cpp index 66c5baf4..5648003f 100644 --- a/RedPandaIDE/utils.cpp +++ b/RedPandaIDE/utils.cpp @@ -825,7 +825,7 @@ QString parseMacros(const QString &s) // Only provide the first lib dir if (compilerSet->defaultLibDirs().count()>0) - result.replace("", localizePath(compilerSet->defaultCppIncludeDirs().front())); + result.replace("", localizePath(compilerSet->defaultLibDirs().front())); else result.replace("",""); } From c100c5c3e8883b20a424869fde6911e56d81fbc0 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 24 Jan 2022 16:51:38 +0800 Subject: [PATCH 05/12] update NEWS.md --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 855d3dd0..01eebbce 100644 --- a/NEWS.md +++ b/NEWS.md @@ -21,7 +21,7 @@ Red Panda C++ Version 0.13.3 - fix: when open a file, all blank lines's indents are removed. - fix: indent lines displayed at wrong position, when there are folded lines - fix: if editor's active line color is disabled, caret's position may not be correct redrawn - - fix: crash if compiler set's include dir list is not empty and lib dir list is empry + - fix: insert code snippets will crash, if current compiler set's include dir list is not empty and lib dir list is empty Red Panda C++ Version 0.13.2 - fix: "delete and exit" button in the environtment / folder option page doesn't work correctly From 1135fcf7dd77616aa1108632494be3680c1832f8 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 24 Jan 2022 18:03:35 +0800 Subject: [PATCH 06/12] - fix: search around option can't be disabled - enhancement: show a confirm dialog when search/replace around --- NEWS.md | 2 + RedPandaIDE/RedPandaIDE_zh_CN.qm | Bin 110837 -> 112067 bytes RedPandaIDE/RedPandaIDE_zh_CN.ts | 111 +++++++++++++----- RedPandaIDE/qsynedit/SynEdit.cpp | 9 +- RedPandaIDE/qsynedit/SynEdit.h | 4 +- RedPandaIDE/qsynedit/TextPainter.cpp | 1 - .../compilersetoptionwidget.cpp | 2 - .../settingsdialog/compilersetoptionwidget.ui | 2 +- RedPandaIDE/widgets/searchdialog.cpp | 24 +++- RedPandaIDE/widgets/searchdialog.h | 4 +- 10 files changed, 116 insertions(+), 43 deletions(-) diff --git a/NEWS.md b/NEWS.md index 01eebbce..fb5ae43d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -22,6 +22,8 @@ Red Panda C++ Version 0.13.3 - fix: indent lines displayed at wrong position, when there are folded lines - fix: if editor's active line color is disabled, caret's position may not be correct redrawn - fix: insert code snippets will crash, if current compiler set's include dir list is not empty and lib dir list is empty + - fix: search around option can't be disabled + - enhancement: show a confirm dialog when search/replace around Red Panda C++ Version 0.13.2 - fix: "delete and exit" button in the environtment / folder option page doesn't work correctly diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.qm b/RedPandaIDE/RedPandaIDE_zh_CN.qm index 6fb3940ae753c06678367dfad36d17b34f455858..be776f37b1d810d1ac2e0899a70d4444f36147e8 100644 GIT binary patch delta 11494 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 diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts index c37a15bc..4e8299eb 100644 --- a/RedPandaIDE/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts @@ -773,9 +773,8 @@ p, li { white-space: pre-wrap; } 链接时加入下列选项 - Add Charset arguments when calling the compiler - 编译时自动加入字符编码选项 + 编译时自动加入字符编码选项 @@ -807,6 +806,12 @@ p, li { white-space: pre-wrap; } Remove 删除 + + + Convert Executable's Charset as + Convert Executable's Charset + 将可执行文件中的字符串转码为 + Statically link libraries @@ -902,12 +907,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' @@ -916,50 +921,50 @@ Are you really want to continue? 小熊猫C++ 将会清除现有的编译器配置列表,然后在下列文件夹中搜索编译器:<br/> '%1'<br/> '%2'<br />你确定要继续吗? - + ANSI ANSI - + UTF-8 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 新名称 @@ -6027,6 +6032,26 @@ Are you really want to continue? Cannot find the %1 "%2" 无法找到%1程序"%2" + + + C Compiler + C编译器 + + + + C++ Compiler + C++编译器 + + + + Maker + 构建程序(Make) + + + + Debugger + 调试器 + C options @@ -6093,7 +6118,7 @@ Are you really want to continue? 生成调试信息(-g3) - + Would you like Red Panda C++ to search for compilers in PATH? 您同意小熊猫C++在PATH路径中寻找gcc编译器吗? @@ -6192,34 +6217,34 @@ Are you really want to continue? 只生成汇编代码(-S) - - + + Confirm 确认 - + The following problems were found during validation of compiler set "%1": 在验证编译器设置"%1"时遇到了下列问题: - + Would you like Red Panda C++ to remove them for you and add the default paths to the valid paths? 是否让小熊猫C++删除这些配置,并尝试重新建立配置? - + Leaving those directories will lead to problems during compilation.<br /><br />Unless you know exactly what you're doing, it is recommended that you click Yes. 如果仍然保留这些设置,可能会导致编译错误。<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 @@ -6244,13 +6269,13 @@ Are you really want to continue? C++包含文件 - + No - + Yes @@ -6753,7 +6778,7 @@ Are you really want to continue? - + Replace 替换 @@ -6763,10 +6788,36 @@ Are you really want to continue? 在文件中替换 - + + Continue Search + Search Around + 继续查找 + + + + + End of file has been reached. + End of file has been reached. + 已到达文件结尾。 + + + + + Do you want to continue from file's beginning? + Do you want to start from beginning? + 是否从文件开头继续? + + + Replace this occurrence of ''%1''? 替换这里的"%1"? + + + Continue Replace + Replace Around + 继续替换 + SearchResultListModel @@ -7368,7 +7419,7 @@ Are you really want to continue? 无法读取文件'%1'! - + Can't open file '%1' for save! 无法写入文件'%2'! diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 7741f853..6086f79a 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -4755,7 +4755,7 @@ void SynEdit::doSetSelText(const QString &Value) } int SynEdit::searchReplace(const QString &sSearch, const QString &sReplace, SynSearchOptions sOptions, PSynSearchBase searchEngine, - SynSearchMathedProc matchedCallback) + SynSearchMathedProc matchedCallback, SynSearchConfirmAroundProc confirmAroundCallback) { if (!searchEngine) return 0; @@ -4917,9 +4917,10 @@ int SynEdit::searchReplace(const QString &sSearch, const QString &sReplace, SynS ptCurrent.Line--; else ptCurrent.Line++; - if ( - ((ptCurrent.Line < ptStart.Line) || (ptCurrent.Line > ptEnd.Line)) - && bFromCursor){ + if (((ptCurrent.Line < ptStart.Line) || (ptCurrent.Line > ptEnd.Line)) + && bFromCursor && sOptions.testFlag(ssoWrapAround)){ + if (confirmAroundCallback && !confirmAroundCallback()) + break; //search start from cursor, search has finished but no result founds bFromCursor = false; ptStart.Char = 1; diff --git a/RedPandaIDE/qsynedit/SynEdit.h b/RedPandaIDE/qsynedit/SynEdit.h index 542db9f3..d30f1210 100644 --- a/RedPandaIDE/qsynedit/SynEdit.h +++ b/RedPandaIDE/qsynedit/SynEdit.h @@ -147,6 +147,7 @@ using SynPaintProc = std::function; // SynFontStyles& style, QColor& foreground, QColor& background)>; using SynSearchMathedProc = std::function; +using SynSearchConfirmAroundProc = std::function; class SynEdit; using PSynEdit = std::shared_ptr; @@ -244,7 +245,8 @@ public: void setSelText(const QString& text); int searchReplace(const QString& sSearch, const QString& sReplace, SynSearchOptions options, - PSynSearchBase searchEngine, SynSearchMathedProc matchedCallback = nullptr); + PSynSearchBase searchEngine, SynSearchMathedProc matchedCallback = nullptr, + SynSearchConfirmAroundProc confirmAroundCallback = nullptr); int maxScrollWidth() const; int maxScrollHeight() const; diff --git a/RedPandaIDE/qsynedit/TextPainter.cpp b/RedPandaIDE/qsynedit/TextPainter.cpp index b083d499..fb633f9e 100644 --- a/RedPandaIDE/qsynedit/TextPainter.cpp +++ b/RedPandaIDE/qsynedit/TextPainter.cpp @@ -720,7 +720,6 @@ void SynEditTextPainter::PaintFoldAttributes() // Now loop through all the lines. The indices are valid for Lines. for (cRow = aFirstRow; cRow<=aLastRow;cRow++) { vLine = edit->rowToLine(cRow); - qDebug()< edit->mLines->count() && edit->mLines->count() > 0) break; // Set vertical coord diff --git a/RedPandaIDE/settingsdialog/compilersetoptionwidget.cpp b/RedPandaIDE/settingsdialog/compilersetoptionwidget.cpp index 08ddb91e..5a8a535f 100644 --- a/RedPandaIDE/settingsdialog/compilersetoptionwidget.cpp +++ b/RedPandaIDE/settingsdialog/compilersetoptionwidget.cpp @@ -59,7 +59,6 @@ CompilerSetOptionWidget::~CompilerSetOptionWidget() void CompilerSetOptionWidget::init() { - ui->cbEncoding->setVisible(false); ui->cbEncodingDetails->setVisible(false); ui->cbEncoding->clear(); ui->cbEncoding->addItem(tr("ANSI"),ENCODING_SYSTEM_DEFAULT); @@ -144,7 +143,6 @@ static void loadCompilerSetSettings(Settings::PCompilerSet pSet, Ui::CompilerSet ui->txtResourceCompiler->setText(pSet->resourceCompiler()); ui->txtProfiler->setText(pSet->profiler()); - ui->cbEncoding->setVisible(pSet->autoAddCharsetParams()); if (pSet->execCharset() == ENCODING_AUTO_DETECT || pSet->execCharset() == ENCODING_SYSTEM_DEFAULT || pSet->execCharset() == ENCODING_UTF8) { diff --git a/RedPandaIDE/settingsdialog/compilersetoptionwidget.ui b/RedPandaIDE/settingsdialog/compilersetoptionwidget.ui index 0757cec2..9fcb6130 100644 --- a/RedPandaIDE/settingsdialog/compilersetoptionwidget.ui +++ b/RedPandaIDE/settingsdialog/compilersetoptionwidget.ui @@ -138,7 +138,7 @@ - Convert Executable's Charset + Convert Executable's Charset as diff --git a/RedPandaIDE/widgets/searchdialog.cpp b/RedPandaIDE/widgets/searchdialog.cpp index fb42d035..a84485bf 100644 --- a/RedPandaIDE/widgets/searchdialog.cpp +++ b/RedPandaIDE/widgets/searchdialog.cpp @@ -250,7 +250,15 @@ void SearchDialog::on_btnExecute_clicked() if (actionType == SearchAction::Find) { Editor *e = pMainWindow->editorList()->getEditor(); if (e!=nullptr) { - findCount+=execute(e,ui->cbFind->currentText(),""); + findCount+=execute(e,ui->cbFind->currentText(),"",nullptr, + [](){ + return QMessageBox::question(pMainWindow, + tr("Continue Search"), + tr("End of file has been reached. ") + +tr("Do you want to continue from file's beginning?"), + QMessageBox::Yes|QMessageBox::No, + QMessageBox::Yes) == QMessageBox::Yes; + }); } } else if (actionType == SearchAction::Replace) { Editor *e = pMainWindow->editorList()->getEditor(); @@ -279,6 +287,14 @@ void SearchDialog::on_btnExecute_clicked() } else { return SynSearchAction::ReplaceAll; } + }, + [](){ + return QMessageBox::question(pMainWindow, + tr("Continue Replace"), + tr("End of file has been reached. ") + +tr("Do you want to continue from file's beginning?"), + QMessageBox::Yes|QMessageBox::No, + QMessageBox::Yes) == QMessageBox::Yes; }); } @@ -376,7 +392,9 @@ void SearchDialog::on_btnExecute_clicked() } } -int SearchDialog::execute(SynEdit *editor, const QString &sSearch, const QString &sReplace, SynSearchMathedProc matchCallback) +int SearchDialog::execute(SynEdit *editor, const QString &sSearch, const QString &sReplace, + SynSearchMathedProc matchCallback, + SynSearchConfirmAroundProc confirmAroundCallback) { if (editor==nullptr) return 0; @@ -398,7 +416,7 @@ int SearchDialog::execute(SynEdit *editor, const QString &sSearch, const QString } return editor->searchReplace(sSearch, sReplace, mSearchOptions, - mSearchEngine, matchCallback); + mSearchEngine, matchCallback, confirmAroundCallback); } std::shared_ptr SearchDialog::batchFindInEditor(SynEdit *e, const QString& filename,const QString &keyword) diff --git a/RedPandaIDE/widgets/searchdialog.h b/RedPandaIDE/widgets/searchdialog.h index 5d88ded0..260c0067 100644 --- a/RedPandaIDE/widgets/searchdialog.h +++ b/RedPandaIDE/widgets/searchdialog.h @@ -61,7 +61,9 @@ private slots: void on_btnExecute_clicked(); private: int execute(SynEdit* editor, const QString& sSearch, - const QString& sReplace, SynSearchMathedProc matchCallback = nullptr); + const QString& sReplace, + SynSearchMathedProc matchCallback = nullptr, + SynSearchConfirmAroundProc confirmAroundCallback = nullptr); std::shared_ptr batchFindInEditor(SynEdit * editor,const QString& filename, const QString& keyword); private: Ui::SearchDialog *ui; From e89ac584629ae5ea636bf7c3a35337b2ee08b178 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 24 Jan 2022 18:37:16 +0800 Subject: [PATCH 07/12] - enhancement: auto zoom ui when screen's zoom factor changed (windows) --- NEWS.md | 1 + RedPandaIDE/main.cpp | 5 ++++- RedPandaIDE/mainwindow.cpp | 6 ++++++ RedPandaIDE/mainwindow.h | 1 + RedPandaIDE/utils.cpp | 14 +++++++++++--- RedPandaIDE/utils.h | 2 ++ 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/NEWS.md b/NEWS.md index fb5ae43d..72b933d5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -24,6 +24,7 @@ Red Panda C++ Version 0.13.3 - fix: insert code snippets will crash, if current compiler set's include dir list is not empty and lib dir list is empty - fix: search around option can't be disabled - enhancement: show a confirm dialog when search/replace around + - enhancement: auto zoom ui when screen's zoom factor changed (windows) Red Panda C++ Version 0.13.2 - fix: "delete and exit" button in the environtment / folder option page doesn't work correctly diff --git a/RedPandaIDE/main.cpp b/RedPandaIDE/main.cpp index 8121bc0f..a8bf6420 100644 --- a/RedPandaIDE/main.cpp +++ b/RedPandaIDE/main.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include "common.h" #include "colorscheme.h" @@ -60,7 +61,8 @@ bool WindowLogoutEventFilter::nativeEventFilter(const QByteArray & /*eventType*/ } break; case WM_DPICHANGED: - //todo + setDesktopDpi(HIWORD(pMsg->wParam)); + pMainWindow->updateDPI(); break; } return false; @@ -159,6 +161,7 @@ int main(int argc, char *argv[]) //set default open folder QDir::setCurrent(pSettings->environment().defaultOpenFolder()); + setDesktopDpi(qApp->desktop()->logicalDpiY()); MainWindow mainWindow; pMainWindow = &mainWindow; diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 22ce6e38..15929910 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -689,6 +689,12 @@ void MainWindow::setActiveBreakpoint(QString FileName, int Line, bool setFocus) } } +void MainWindow::updateDPI() +{ + qDebug()<<"dpi changed!"<desktop()->logicalDpiY() / 72; + return point * desktopDpi() / 72; } float pixelToPoint(float pixel) { - return pixel * 72 / qApp->desktop()->logicalDpiY(); + return pixel * 72 / desktopDpi(); } @@ -1076,9 +1076,12 @@ QStringList splitProcessCommand(const QString &cmd) return result; } +static float saved_desktop_dpi = -1; float desktopDpi() { - return qApp->desktop()->logicalDpiY(); + if (saved_desktop_dpi<1) + saved_desktop_dpi = qApp->desktop()->logicalDpiY(); + return saved_desktop_dpi; } qulonglong stringToHex(const QString &str, qulonglong defaultValue) @@ -1089,3 +1092,8 @@ qulonglong stringToHex(const QString &str, qulonglong defaultValue) return value; return defaultValue; } + +void setDesktopDpi(float dpi) +{ + saved_desktop_dpi = dpi; +} diff --git a/RedPandaIDE/utils.h b/RedPandaIDE/utils.h index fee53bab..de920531 100644 --- a/RedPandaIDE/utils.h +++ b/RedPandaIDE/utils.h @@ -232,6 +232,8 @@ class CppParser; void resetCppParser(std::shared_ptr parser, int compilerSetIndex=-1); float desktopDpi(); +void setDesktopDpi(float dpi); + float pointToPixel(float point); float pixelToPoint(float pixel); From d0faf50bad3c074f4ade5557d140c68cff5cf460 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 24 Jan 2022 18:39:06 +0800 Subject: [PATCH 08/12] remove debug output --- RedPandaIDE/mainwindow.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 15929910..7eeac5a0 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -691,7 +691,6 @@ void MainWindow::setActiveBreakpoint(QString FileName, int Line, bool setFocus) void MainWindow::updateDPI() { - qDebug()<<"dpi changed!"< Date: Mon, 24 Jan 2022 20:59:02 +0800 Subject: [PATCH 09/12] - enhancement: parser not called when open a file, if option "clean parser symbols when hidden" is turned on. --- NEWS.md | 1 + RedPandaIDE/HighlighterManager.cpp | 2 +- RedPandaIDE/autolinkmanager.cpp | 10 ++- RedPandaIDE/compiler/compiler.cpp | 3 +- RedPandaIDE/editor.cpp | 65 ++++++++++++++----- RedPandaIDE/editor.h | 5 ++ RedPandaIDE/mainwindow.cpp | 49 -------------- RedPandaIDE/mainwindow.h | 2 - .../editorcodecompletionwidget.cpp | 2 + 9 files changed, 66 insertions(+), 73 deletions(-) diff --git a/NEWS.md b/NEWS.md index 72b933d5..3bc631a8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -25,6 +25,7 @@ Red Panda C++ Version 0.13.3 - fix: search around option can't be disabled - enhancement: show a confirm dialog when search/replace around - enhancement: auto zoom ui when screen's zoom factor changed (windows) + - enhancement: parser not called when open a file, if option "clean parser symbols when hidden" is turned on. Red Panda C++ Version 0.13.2 - fix: "delete and exit" button in the environtment / folder option page doesn't work correctly diff --git a/RedPandaIDE/HighlighterManager.cpp b/RedPandaIDE/HighlighterManager.cpp index 3a27b035..3d2489a4 100644 --- a/RedPandaIDE/HighlighterManager.cpp +++ b/RedPandaIDE/HighlighterManager.cpp @@ -43,7 +43,7 @@ PSynHighlighter HighlighterManager::getHighlighter(const QString &filename) || suffix == "CPP" || suffix =="H" || suffix == "c++" || suffix == "h++") { return getCppHighlighter(); - } else if (suffix == "vs" || suffix == "fs") { + } else if (suffix == "vs" || suffix == "fs" || suffix == "frag") { return getGLSLHighlighter(); } } diff --git a/RedPandaIDE/autolinkmanager.cpp b/RedPandaIDE/autolinkmanager.cpp index c7d8c421..cff90af0 100644 --- a/RedPandaIDE/autolinkmanager.cpp +++ b/RedPandaIDE/autolinkmanager.cpp @@ -32,7 +32,15 @@ AutolinkManager::AutolinkManager() PAutolink AutolinkManager::getLink(const QString &header) const { - return mLinks.value(header,PAutolink()); + PAutolink link = mLinks.value(header,PAutolink()); + if (link) + return link; + foreach (QString key, mLinks.keys()) { + if (header.endsWith("/"+key, PATH_SENSITIVITY)) { + return mLinks.value(key); + } + } + return PAutolink(); } void AutolinkManager::load() diff --git a/RedPandaIDE/compiler/compiler.cpp b/RedPandaIDE/compiler/compiler.cpp index 055e5857..be4fbaec 100644 --- a/RedPandaIDE/compiler/compiler.cpp +++ b/RedPandaIDE/compiler/compiler.cpp @@ -534,11 +534,10 @@ QString Compiler::parseFileIncludesForAutolink( PCppParser& parser) { QString result; - QString baseName = extractFileName(filename); if (parsedFiles.contains(filename)) return result; parsedFiles.insert(filename); - PAutolink autolink = pAutolinkManager->getLink(baseName); + PAutolink autolink = pAutolinkManager->getLink(filename); if (autolink) { result += ' '+autolink->linkOption; } diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 913e4a55..5063c7fe 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -94,16 +94,16 @@ Editor::Editor(QWidget *parent, const QString& filename, mCurrentHighlightedWord(), mSaving(false) { + qDebug()<<"inited1 "; mCurrentLineModified = false; mUseCppSyntax = pSettings->editor().defaultFileCpp(); if (mFilename.isEmpty()) { mFilename = tr("untitled")+QString("%1").arg(getNewFileNumber()); } + qDebug()<<"inited2 "; QFileInfo fileInfo(mFilename); - if (mParentPageControl!=nullptr) { - mParentPageControl->addTab(this,""); - updateCaption(); - } + + qDebug()<<"inited3 "; PSynHighlighter highlighter; if (!isNew) { @@ -117,6 +117,8 @@ Editor::Editor(QWidget *parent, const QString& filename, highlighter=highlighterManager.getCppHighlighter(); } + qDebug()<<"----------inited"; + if (highlighter) { setHighlighter(highlighter); setUseCodeFolding(true); @@ -134,7 +136,6 @@ Editor::Editor(QWidget *parent, const QString& filename, && mParser && (mParser->isSystemHeaderFile(mFilename) || mParser->isProjectHeaderFile(mFilename))) { this->setModified(false); setReadOnly(true); - updateCaption(); } mCompletionPopup = pMainWindow->completionPopup(); @@ -180,6 +181,10 @@ Editor::Editor(QWidget *parent, const QString& filename, resetBreakpoints(); } mStatementColors = pMainWindow->statementColors(); + if (mParentPageControl!=nullptr) { + mParentPageControl->addTab(this,""); + updateCaption(); + } } Editor::~Editor() { @@ -524,12 +529,6 @@ void Editor::wheelEvent(QWheelEvent *event) { void Editor::focusInEvent(QFocusEvent *event) { SynEdit::focusInEvent(event); - if (mParser) { - connect(mParser.get(), - &CppParser::onEndParsing, - this, - &SynEdit::invalidate); - } pMainWindow->updateAppTitle(); pMainWindow->updateEditorActions(); pMainWindow->updateStatusbarForLineCol(); @@ -540,12 +539,6 @@ void Editor::focusInEvent(QFocusEvent *event) void Editor::focusOutEvent(QFocusEvent *event) { SynEdit::focusOutEvent(event); - if (mParser) { - disconnect(mParser.get(), - &CppParser::onEndParsing, - this, - &SynEdit::invalidate); - } //pMainWindow->updateClassBrowserForEditor(nullptr); pMainWindow->updateStatusbarForLineCol(); pMainWindow->updateForStatusbarModeInfo(); @@ -1195,6 +1188,41 @@ void Editor::closeEvent(QCloseEvent *) pMainWindow->functionTip()->hide(); } +void Editor::showEvent(QShowEvent */*event*/) +{ + qDebug()<<"show event"; + if (pSettings->codeCompletion().clearWhenEditorHidden() + && !inProject()) { + initParser(); + } + if (mParser) { + connect(mParser.get(), + &CppParser::onEndParsing, + this, + &SynEdit::invalidate); + } + if (pSettings->codeCompletion().clearWhenEditorHidden() + && !inProject()) { + reparse(); + } + reparseTodo(); + setHideTime(QDateTime()); +} + +void Editor::hideEvent(QHideEvent */*event*/) +{ + if (mParser) { + disconnect(mParser.get(), + &CppParser::onEndParsing, + this, + &SynEdit::invalidate); + } + if (pSettings->codeCompletion().clearWhenEditorHidden() + && !inProject() && mParser) + mParser->reset(); + setHideTime(QDateTime::currentDateTime()); +} + void Editor::copyToClipboard() { if (pSettings->editor().copySizeLimit()) { @@ -2407,6 +2435,7 @@ void Editor::reparse() if (highlighter()->language() != SynHighlighterLanguage::Cpp && highlighter()->language() != SynHighlighterLanguage::GLSL) return; + qDebug()<<"reparse"<mEditorList->endUpdate(); mOpenningFiles = false; - updateEditorParser(ui->EditorTabsLeft); - updateEditorParser(ui->EditorTabsRight); }); //Check if there is a project file in the list and open it for (const QString& file:files) { @@ -5222,39 +5220,6 @@ PSymbolUsageManager &MainWindow::symbolUsageManager() return mSymbolUsageManager; } -void MainWindow::updateEditorParser(QTabWidget* tabWidget) { - if (mOpenningFiles) - return; - Editor * editor = mEditorList->getEditor(-1,tabWidget); - if (pSettings->codeCompletion().clearWhenEditorHidden()) { - for (int i=0;icount();i++) { - Editor * e = (Editor*)(tabWidget->widget(i)); - if (!e->inProject()) { - if (e!=editor && e->parser() && !e->notParsed()) { - e->parser()->reset(); - } - } - } - } - if (editor && editor->parser() && editor->notParsed()) { - resetCppParser(editor->parser()); - editor->reparse(); - } -} - -void MainWindow::updateEditorHideTime(QTabWidget* tabWidget) { - Editor * editor = mEditorList->getEditor(-1,tabWidget); - for (int i=0;icount();i++) { - Editor * e = (Editor*)(tabWidget->widget(i)); - if (e!=editor) { - if (!e->hideTime().isValid()) - e->setHideTime(QDateTime::currentDateTime()); - } else { - e->setHideTime(QDateTime()); - } - } -} - void MainWindow::showHideInfosTab(QWidget *widget, bool show) { int idx = findTabIndex(ui->tabInfos,widget); @@ -5393,26 +5358,13 @@ void MainWindow::onEditorRenamed(const QString &oldFilename, const QString &newF void MainWindow::on_EditorTabsLeft_currentChanged(int) { - Editor * editor = mEditorList->getEditor(-1,ui->EditorTabsLeft); - if (editor) { - editor->reparseTodo(); - } - updateEditorParser(ui->EditorTabsLeft); - updateEditorHideTime(ui->EditorTabsLeft); } void MainWindow::on_EditorTabsRight_currentChanged(int) { - Editor * editor = mEditorList->getEditor(-1,ui->EditorTabsRight); - if (editor) { - editor->reparseTodo(); - } - updateEditorParser(ui->EditorTabsRight); - updateEditorHideTime(ui->EditorTabsRight); } - void MainWindow::on_tableTODO_doubleClicked(const QModelIndex &index) { PTodoItem item = mTodoModel.getItem(index); @@ -5422,7 +5374,6 @@ void MainWindow::on_tableTODO_doubleClicked(const QModelIndex &index) editor->setCaretPositionAndActivate(item->lineNo,item->ch+1); } } - } diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index 433567d8..ebb689ca 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -243,8 +243,6 @@ private: void doCompileRun(RunType runType); void updateProblemCaseOutput(POJProblemCase problemCase); void applyCurrentProblemCaseChanges(); - void updateEditorParser(QTabWidget* tabWidget); - void updateEditorHideTime(QTabWidget* tabWidget); void showHideInfosTab(QWidget *widget, bool show); void showHideMessagesTab(QWidget *widget, bool show); void prepareTabInfosData(); diff --git a/RedPandaIDE/settingsdialog/editorcodecompletionwidget.cpp b/RedPandaIDE/settingsdialog/editorcodecompletionwidget.cpp index eb05e37e..9e35d2a6 100644 --- a/RedPandaIDE/settingsdialog/editorcodecompletionwidget.cpp +++ b/RedPandaIDE/settingsdialog/editorcodecompletionwidget.cpp @@ -50,6 +50,7 @@ void EditorCodeCompletionWidget::doLoad() ui->chkIgnoreCases->setChecked(pSettings->codeCompletion().ignoreCase()); ui->chkAppendFunc->setChecked(pSettings->codeCompletion().appendFunc()); ui->chkShowCodeIns->setChecked(pSettings->codeCompletion().showCodeIns()); + ui->chkClearWhenEditorHidden->setChecked(pSettings->codeCompletion().clearWhenEditorHidden()); ui->spinMinCharRequired->setValue(pSettings->codeCompletion().minCharRequired()); } @@ -74,6 +75,7 @@ void EditorCodeCompletionWidget::doSave() pSettings->codeCompletion().setShowCodeIns(ui->chkShowCodeIns->isChecked()); pSettings->codeCompletion().setMinCharRequired(ui->spinMinCharRequired->value()); + pSettings->codeCompletion().setClearWhenEditorHidden(ui->chkClearWhenEditorHidden->isChecked()); pSettings->codeCompletion().save(); } From 0e620381d34082f07cd9cc908bfe5428c724479e Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 24 Jan 2022 21:46:38 +0800 Subject: [PATCH 10/12] remove debug output --- RedPandaIDE/editor.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 5063c7fe..3b042902 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -94,17 +94,12 @@ Editor::Editor(QWidget *parent, const QString& filename, mCurrentHighlightedWord(), mSaving(false) { - qDebug()<<"inited1 "; mCurrentLineModified = false; mUseCppSyntax = pSettings->editor().defaultFileCpp(); if (mFilename.isEmpty()) { mFilename = tr("untitled")+QString("%1").arg(getNewFileNumber()); } - qDebug()<<"inited2 "; QFileInfo fileInfo(mFilename); - - qDebug()<<"inited3 "; - PSynHighlighter highlighter; if (!isNew) { loadFile(); @@ -117,8 +112,6 @@ Editor::Editor(QWidget *parent, const QString& filename, highlighter=highlighterManager.getCppHighlighter(); } - qDebug()<<"----------inited"; - if (highlighter) { setHighlighter(highlighter); setUseCodeFolding(true); @@ -1190,7 +1183,6 @@ void Editor::closeEvent(QCloseEvent *) void Editor::showEvent(QShowEvent */*event*/) { - qDebug()<<"show event"; if (pSettings->codeCompletion().clearWhenEditorHidden() && !inProject()) { initParser(); @@ -2435,7 +2427,6 @@ void Editor::reparse() if (highlighter()->language() != SynHighlighterLanguage::Cpp && highlighter()->language() != SynHighlighterLanguage::GLSL) return; - qDebug()<<"reparse"< Date: Mon, 24 Jan 2022 21:51:48 +0800 Subject: [PATCH 11/12] update debian package script --- packages/debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/debian/changelog b/packages/debian/changelog index 913747cf..46595c61 100644 --- a/packages/debian/changelog +++ b/packages/debian/changelog @@ -1,3 +1,9 @@ +redpanda-cpp (0.13.3-1) unstable; urgency=medium + + * Update to 0.13.3 + + -- Roy Qu (瞿华) Mon, 24 Jan 2022 21:50:00 +0800 + redpanda-cpp (0.13.2-1) unstable; urgency=medium * Update to 0.13.2 From 7d9d36f18fad25c0dc386aa69234b71f92b56045 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Tue, 25 Jan 2022 09:20:04 +0800 Subject: [PATCH 12/12] update windows installer scripts --- windows/installer-scripts/redpanda-i686-nocompiler.nsi | 2 +- windows/installer-scripts/redpanda-i686.nsi | 2 +- windows/installer-scripts/redpanda-nocompiler.nsi | 2 +- windows/installer-scripts/redpanda-x64.nsi | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/windows/installer-scripts/redpanda-i686-nocompiler.nsi b/windows/installer-scripts/redpanda-i686-nocompiler.nsi index ae93fa74..272564ed 100644 --- a/windows/installer-scripts/redpanda-i686-nocompiler.nsi +++ b/windows/installer-scripts/redpanda-i686-nocompiler.nsi @@ -2,7 +2,7 @@ # Startup !include "config32.nsh" -!define FINALNAME "RedPanda.C++.32bit.${DEVCPP_VERSION}.No.Compiler.Setup.exe" +!define FINALNAME "RedPanda.C++.${DEVCPP_VERSION}.win32.No.Compiler.Setup.exe" !define DISPLAY_NAME "Red Panda C++ 32bit ${DEVCPP_VERSION}" !include "MUI2.nsh" diff --git a/windows/installer-scripts/redpanda-i686.nsi b/windows/installer-scripts/redpanda-i686.nsi index fbe40f68..7217a43e 100644 --- a/windows/installer-scripts/redpanda-i686.nsi +++ b/windows/installer-scripts/redpanda-i686.nsi @@ -3,7 +3,7 @@ !include "config32.nsh" !define COMPILERFOLDER "MinGW32" -!define FINALNAME "RedPanda.C++.32bit.${DEVCPP_VERSION}.${COMPILERNAME}.Setup.exe" +!define FINALNAME "RedPanda.C++.${DEVCPP_VERSION}.win32.${COMPILERNAME}.Setup.exe" !define DISPLAY_NAME "Red Panda C++ 32 bit ${DEVCPP_VERSION}" !include "MUI2.nsh" diff --git a/windows/installer-scripts/redpanda-nocompiler.nsi b/windows/installer-scripts/redpanda-nocompiler.nsi index 1a6e0a3b..1ab78745 100644 --- a/windows/installer-scripts/redpanda-nocompiler.nsi +++ b/windows/installer-scripts/redpanda-nocompiler.nsi @@ -2,7 +2,7 @@ # Startup !include "config.nsh" -!define FINALNAME "RedPanda.C++.${DEVCPP_VERSION}.No.Compiler.Setup.exe" +!define FINALNAME "RedPanda.C++.${DEVCPP_VERSION}.win64.No.Compiler.Setup.exe" !define DISPLAY_NAME "Red Panda C++ ${DEVCPP_VERSION}" !include "MUI2.nsh" diff --git a/windows/installer-scripts/redpanda-x64.nsi b/windows/installer-scripts/redpanda-x64.nsi index 43def0dc..6fde0fe8 100644 --- a/windows/installer-scripts/redpanda-x64.nsi +++ b/windows/installer-scripts/redpanda-x64.nsi @@ -3,7 +3,7 @@ !include "config.nsh" !define COMPILERFOLDER "MinGW64" -!define FINALNAME "RedPanda.C++.${DEVCPP_VERSION}.${COMPILERNAME}.Setup.exe" +!define FINALNAME "RedPanda.C++.${DEVCPP_VERSION}.win64.${COMPILERNAME}.Setup.exe" !define DISPLAY_NAME "Red Panda C++ ${DEVCPP_VERSION}" !include "MUI2.nsh"