From 2763ef1c60b7602d003d66a934a44eb848dfe4ed Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Mon, 22 Nov 2021 15:50:28 +0800 Subject: [PATCH 01/10] work ave --- NEWS.md | 1 + RedPandaIDE/qsynedit/SynEdit.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 53727ccb..daffe860 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,7 @@ Version 0.9.2 For Dev-C++ 7 Beta - fix: problem set & problem views not correctly hidden when disabled in the executor / problem set options - fix: executor / problem set options not correctly saved - fix: option "Move caret to the first non-space char in the current line when press HOME key" dosen't work fine. + - fix: ctrl+left can't correctly move to the beginning of the last word Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index a5d404ea..621152ac 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -1375,7 +1375,7 @@ BufferCoord SynEdit::prevWordPosEx(const BufferCoord &XY) } } else { // if previous char is a "whitespace" search for the last IdentChar - if (Line[CX - 2].isSpace()) + if (!isWordChar(Line[CX - 2])) CX = StrRScanForWordChar(Line, CX - 1); if (CX > 0) // search for the first IdentChar of this "word" CX = StrRScanForNonWordChar(Line, CX - 1)+1; From 6ba2d47c81f28145408c21a1e7fffd46eeb54008 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Mon, 22 Nov 2021 16:16:58 +0800 Subject: [PATCH 02/10] - enhancement: add "delete line"/"duplicate line"/"delete word"/"delete to EOL"/"delete to BOL" in the edit menu --- NEWS.md | 1 + RedPandaIDE/RedPandaIDE_zh_CN.qm | Bin 105699 -> 106064 bytes RedPandaIDE/RedPandaIDE_zh_CN.ts | 760 +++++++++++++++------------- RedPandaIDE/editor.cpp | 30 ++ RedPandaIDE/editor.h | 6 + RedPandaIDE/mainwindow.cpp | 54 ++ RedPandaIDE/mainwindow.h | 12 + RedPandaIDE/mainwindow.ui | 31 ++ RedPandaIDE/qsynedit/KeyStrokes.cpp | 12 +- RedPandaIDE/qsynedit/SynEdit.cpp | 2 + 10 files changed, 538 insertions(+), 370 deletions(-) diff --git a/NEWS.md b/NEWS.md index daffe860..a918d8aa 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,7 @@ Version 0.9.2 For Dev-C++ 7 Beta - fix: executor / problem set options not correctly saved - fix: option "Move caret to the first non-space char in the current line when press HOME key" dosen't work fine. - fix: ctrl+left can't correctly move to the beginning of the last word + - enhancement: add "delete line"/"duplicate line"/"delete word"/"delete to EOL"/"delete to BOL" in the edit menu Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.qm b/RedPandaIDE/RedPandaIDE_zh_CN.qm index 743bdf76743bd13efbc9e6004791f6c7e805b093..5148f564acfda7203df617b37fb663481920e8fa 100644 GIT binary patch delta 7144 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 UO_=oK1X;s$%&_;b&-NSt3mi6_7XSbN delta 6888 zcmX9@c|c9;7v0~v=iKq!do^7t-O@;pWXcd3q7jkMKvFWK@{B*8r)$of98qL=rk*K7 zW|@b~naTX5456oFe)%okzt%mcbIv#HwbtJI>w2NQ^ss!X(KM2XmxwO)04@h60keP^ zz!kuKz?HxfU^cK8m_u~g1-O@(PkUe$vG)HE36{hbd z43SS<9WpL)M&>#r_r)^vguyOh3Q=$uqKj97U4eKxxEls_$gK40aLNwGB3?H3L z^xq)hIHD>eQOrW3EpnnEXNU!EA>Jbj&-oFLFEY_j8pw>E=ktg!=7}ymB>uV^R*(zq zPAudT@wb-}HBu9QH-cFIj?y}I!1Uu3E*BHyO=eVeF{ApN88yAlsQufF7E8@&ur_0Z zY%>}ko6#k~jEOd8OsyvVtvAt)>BN7FC1!Do1m!8BwQ3T)dysUSYhu}FX5DYrXRjF( z`b&D5A^OfX61qs3>2(r<+7LAjBcbOMRLo@p#QZ5{ip}X{2apL)3gTDF%QhIU;Gx z?-296L;5&ZqFS9)B=fOMXhKahj}h&BK+V>VA~sGf>3M_Y{XA+>1cG?YCEw-(F}Lwj zTi(4}Upoq#UrjW_hJqIMBi1;Wg4?V{KzmZ~ytBko{3&>$idf4R6ue1BEEIUsm6&rJ zg*4ts%sWR~$Gh8wXHrPouen%K$l-%TXYNwSxl&@kM@Ub3qvwUe)H5fZnEMkmwsE0e z+!>;)m+O#4JfmK1W)o|3RPqqq)#7&QGw>|Y&DYXE!QI*QJ4Fb1+pR4{%vwP7HLebs zWe*y#U^CH^_R>1R-PCOvMNeo!Omzm>68MFp=PQZnwo>%5Wst@ZiqW_c8_}3zhPNX6 zc)1Q)l!*q-+D~lsG8()9()#2@BW}Z-zb=YQR2WYsC7^SgAbKEzmZeqnsK;Sq-Ad`n7_8qjnO=+m zgF62~<&pWAZ6=jhwIkeH@xYi?Fg*PhCce#5;;7ipE;Q5&=^K- zYltF)n4-xrqQFpQ!C~K>bD2}Fi6=HJP&%jxu#El4hFM|()_<{K^+jM`Nv|}jFP~x4 z-nArpSR%Dmx?84ZvcG-r5v3=y{4OS<`(Dx*rMoG(nqBfvB>G#yE~OO{i+aMYGk>Cv z7uoX)U?tDW%WH@^MX^s4KN54vX5UpHLyt@BM|=d4-#m^zeGPxi;P^)khys+Hu}2lc{%|N}B=_nHHu33zI%ET? zxVMAh{1#PQ&H2+ro-*#+-;n*ZvE28TV9>iG+|R%;qTSvye%Ep+vRWpFdO`QLGW`)u zcY?dD{xfU}S;(B+EQ!1`WlsG=NW(0r$eM~!{>xJ7soKERI7^?^KF*2VWidnh6KlFv z7PEg8u^x?Og9gta7C&7!cz7nzT?*3}otsAC5{n*nRW`&j6$vOvmN*f%o3cxmSk@l= zz9(g9-0f0+$_jnTke6o5&YPSunQyY9G(_s3XHv1oz&(B}z0|mKm48Zl(P%eb&D))9 zP2@I}ci3wr)?ymp$k2dT2bmNo!V*UEkt)0!k;F$S+7h$<$VV%{a#waqm7+o2ybC{DiCz5ZE9tccQ)E1! z9b8CsV5%8^^r=G@oMFa<`+Rl?nA7(IpOczJOuyKSHkoEL=9w`ek6+a#iCCYm{HhAL z>>tT|Zii|js}=ml6Og}V7QZO~L3~igZ{Cp(E_L9ybo4_o;vevNm3W}ZercC>i7BKp zzq{Ozs9p_!qzS&K{=^^Ez`a|im@%R|UzoFzXmT&Uu=oL(uIG;rx<-`hV#aS}{OPoP zpz>$_0tftU8-HbJci8hGzIf7d6eBJ8>rL@pix~c9pAAI$TlqU}XMsdD{GD+FNh;K- zqR$TFA6x}rhfL>7BmYF!I?TU_!?$+N=gVW=h}PKiuM$Bl$N%_OuUZgI46Q>ZEH~re zaeRfWH&OkEd_{9L(TG-c$Xq)}j(VfIZ4drkHuBT${ZgRb=zQ~}Amn0Zw=4wVn2uP_ zeS&%>cCOzsLA@P;x;0ix*ZY`Qs^Gp58nx*yc=tVxispzJJ6Z{?Pl_=5RH03FE229c zgf?e}5``QRItJvxBJ@JfJWOWo79r|!8=^7ALbL<&$|sW$YxRaGbfhrEAP}qHTo@Kw zOLTpPFuV>w3CRaB%g6KTuodeZQTKxl2p3W~>{!f}I%G}CgcLs|)HGI@NRXptt}v+y zT%xqOG^U;*=|!5bC;eUqeoZ#M|J4%mm3Tr+-)7XF%a3->!omGulE?K%qE zmj)v392N4KUCl@fs-ZO=#0n3Q?B?`|%M__LU z2rm-w)}V1hx$jq^?OTNMJdig0jPPy(LS1o4cwefTaR9-MCp*4>`{>jzd~BNbV? zbK&o$N=t*?pl9-g{m^vOc6qWzEI8yPPxk!?&qgA*O2J2qrA?G?0(8ug&)T1&&yZU z_@k7nm9I@ZP860Q-yDKkCsZcSi;M!Ly2`iZH6dn4@*NGLNJDX9@*T0B#1uEAA}cSu z-_zyAmVJmewUpnmfHaQWmERZ+{g*gPdTXO|=p6Yk`7?2>yzEL3M9Czt2$)E;)l2^G zi6u~2J1NZC;OSkcP+s!FWtu|OwJS0Cc!f6SHk@^n!lrN-kxNsBb7(FcC|b&}HiY}^ zQ3Tv}AzI+52wY|jbFWeaGZ<1udL6Rp5Jj(&Yq$$S<36w?YE(O#{WI@{DYX%+KN6~G-& zD6*EJsC;rtk#&6{lGYAI)~ja3hKDFtXb`App>@ax4pFS=jq5L66xnewmqX5q_1B=T z`ss?l$_FAV{Gr(J2(?#mykeX03v9_O#m;2Z8;&~_yW>Fcp7x6UzKG0khZF~9V{su3 zrYj1M>xo5PQxx6?A(w1d9Lqp@arvS+VUJL@>Z7>$7dn7DBNR98{u+3);$~}1beBQ# z{Pb;vq#qFXzb=;?4Tf%lzoP8aKg0&RC|(cVOSJ8a;&t3On8hf?n_lpuTe*ri&(%cp zm5LAC9HLG|b;yz)De460Xd(U2V6=-}uVi~?5aYfoWy$cs4>Og@zjt9fc1pVpMw5%P z(*88~IwMnQ|I4EKXDN*rk!Q#6RyuB~CR$jcblw?(5>=*jx$pw1Y@xDoDpVP_UFq%j z9!@@9={?|IqV6k|?bYpx`8g}wpS2>En6LCbAA(+Xj$n!=#{AsS-ci}zz}R*JRE{3F|6q;EEw%*CdsO8S6pT{y zsj7(`)X?Ues>uk1B4WJix2t&W-4vDALd^9^g{sBrG@|8OC4B<}=dF`G8u+yQF;~^w z1{$l`tP1N?iJY@T6&B!vo+LpP6{;h0+@gw|1==^Ory3%lH~dX5Wi&8$aQmT}v>7S3 z+ZL56X+N<>-&EU`u39rzxJxe^7@bE4sxtqFuP(?^ zN%^TTiW{n&kquD)W~){;#cZxFl058;(N{fGTib!^<>jjFQ@l`h^jGbwM9{~^sg9Jl z0Z9j_j-^$jw`i_9w&F9<+19Ev58%~}omA)g)W;Uasm@===dK5+in1`fG4;*({U2$a zox$#TuQ*FAnzDz@`-c3Q2f$-tVy5TsXl{)kj zCfjVix(~`Q7U`{y+#8R^N~?~IfRTiis)tUUK#a9l59^5Gyep+VdoRxx7u1P6aG5~r zQ5(Wh^n6v1-V0}*G@uSyY^*x@h73DiEB&;0@TH&Y)eHGqL@)Bxi>K^GhvK2mD9(p4 zvej8zA@Iik1I`2%0%t*~3^*GYAPsC7z$rYWbq$T4LH_E(MH7f}51R4I8};!kg9V8mEc%--J@4 zk!Hk;7vS0v&7@PV#9Sw7rnu(7c|A2#5=IdVs?toAw@2$>&`ga#Ow^@ZGjj>P*P>E0 zYY=wK{iSBsjz1un0L_AqX~=M+^2~9Yt4$h z8^nbBn$;y>Rlld2HHy<1CrQdM8o0N$Ql8N(DWt#VP&c&CFPdtOhpvHPR%ni=A%nhj z)|^OM1{=SlIr*H!P9cdZsDb{T#Jnk>;WkSY-27bM4x{aLyvltv)H>x=!AihYXGiz&e{D6D2cYtY*_waP+(dgjQuE>ZuSr>Js>1Bh zP6ued6~avZbP(B4Y)<<`Q8oh4dxnb|em2_XTv77?e?2`=aGm z%<5Hr(aOgSU4EcwV^x8^w?MSHit?-LAEF^X5SbnQQwn0>kty1a-h=yXMEg~J(XciY z?ROyXE3{(6f@-4QgGAR8daQbx=!UMI{{0}jb0?5B?@FDW4BP`ZX`qwQu6&>9bryR! z?lJX+#^>1gD}}%5o_o&_P;{>d^;Gmd@J!w9_qeF>$Ni9 zTB32!wEWoKFq!*WK64DLtFe~fis1rFv=$3c?RK};TE#&1IfYtVZ4I?z!AG>VId^a@ z9P1^V!w@?p=+L3jqn~vI1_s?RNp41@=jnXFdx`xs$K$~3nC-@bt zO+MocXKt)bF0w)g^{5V+=LYS>7voV~o3vAho+fG>r2W%vEsg}M0;CKVLx)EXwKGoQ zSYSwB?R+>p>v2cBG87$G;Rfx>X?ZxJY^Ys*ECN;AZEfyFxZmt6+O>9@V9Hg}Qx^m0 zRW5yYF{=BI(4Gs*K(>#S99<3STOG7j1u%#)E>dS#Lx{Yw_M0ErSgh23UxGQ`FV+5B z1*vH7>F5SxQ@cwi%SX&?$Lo}9QCkI!>mpTT1I(jh0Ch zboFN;L~{@5Y=5=kwdGQ=tHF|;(RCbu3oC7{^XrALyU&n5yLy>!+}0%=yM!#zMwfi4 z6cVV`rFI6{cRbgn_Qaquak}v(kjA*Zy4m6XVZnEFb5+BTyGnKQvk`#NpLLl}FxnLh z-Rdu(?bBnr+=zUlRgZM*syVbTk-EG!X+&BZ-QO=FU}jBp`QyO{n{&E7$6d&U(w^(~ z-StA*uvvGo=sl4!Qg`C;e$+B>aEkeQRB9EJWGvtr_2M z*43VFk7{MGUNoT~XltR@HcY_Y?$$dwfbecd^{(r&NlOOkTXtECb&b}yxjPI;O}rH5 zZd8|f=)=BV#Ilvr|J=QtFLL_d%U0o>ORoQ8Kgz?*C;FN1qtTpY=@*{d02*zTirkH+ z|2*`|oN+o~wZx2(YxOx55MOdP{c0s7K7W^fbz`jItDSz$I!wxLr+$M3tuLOV-!urS$-Vl-zxo$ zMG{3aD{uX+&erJU)AaZH!R+6U);}7Oicb8p{!It0dP0i6;wfzKY?l7ro8CCh3f0$q z*o>xNvi|EHd$i&&^xp?HAj-a=uZ>4E<5wV$O&nNI=rQta!MC?+uE4kQidfM0M}rOj E2Z(o8^8f$< diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts index 4088ca1d..a9078b29 100644 --- a/RedPandaIDE/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts @@ -1068,35 +1068,35 @@ Are you really want to continue? 要剪切的内容超过了字符数限制! - + Print Document 打印文档 - - - + + + Ctrl+click for more info Ctrl+单击以获取更多信息 - + Symbol '%1' not found! 未找到符号'%1'! - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Readonly 只读 @@ -2856,18 +2856,18 @@ Are you really want to continue? - - - - - - + + + + + + Issues 编译器 - + Compile Log 编译日志 @@ -2882,8 +2882,8 @@ Are you really want to continue? 工具 - - + + Run 运行 @@ -2894,26 +2894,26 @@ Are you really want to continue? - - + + Project 项目 - + Watch 监视 - + Structure 结构 - + Files 文件 @@ -2923,10 +2923,10 @@ Are you really want to continue? - - - - + + + + Debug 调试 @@ -2957,8 +2957,8 @@ Are you really want to continue? - - + + Search 查找 @@ -2983,7 +2983,7 @@ Are you really want to continue? 替换 - + Close 关闭 @@ -2993,13 +2993,13 @@ Are you really want to continue? 运行 - - + + Code 代码 - + Window 窗口 @@ -3017,249 +3017,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 试题集 @@ -3267,7 +3267,7 @@ Are you really want to continue? - + New Problem Set 新建试题集 @@ -3286,14 +3286,14 @@ Are you really want to continue? - + Save Problem Set 保存试题集 - + Load Problem Set 载入试题集 @@ -3315,20 +3315,20 @@ Are you really want to continue? - + TODO TODO - + Bookmark 书签 - + Problem 试题 @@ -3380,459 +3380,489 @@ Are you really want to continue? 期望输出 - + 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 状态栏 + + + Insert Line + 插入行 + + + + Delete Line + 删除当前行 + + + + Duplicate Line + 复制当前行 + + + + Delete Word + 删除当前单词 + + + + Delete to EOL + 删除到行尾 + + + + Delete to BOL + 删除到行首 + C/C++ Reference C/C++参考 - + EGE Manual EGE图形库手册 - + Add Bookmark 添加书签 - + Remove Bookmark 删除书签 - + Modify Bookmark Description 修改书签说明 - + Locate in Files View 在文件视图中定位 - - + + Open Folder 打开文件夹 - + Running Parameters... 运行参数... - + File Encoding 文件编码 @@ -3842,32 +3872,32 @@ Are you really want to continue? 文件历史 - - + - + + Debugging 正在调试 - - + - + + Running 正在运行 - - + - + + Compiling 正在编译 @@ -3876,168 +3906,168 @@ 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 覆写 - + Close project 关闭项目 - + Are you sure you want to close %1? 你确定要关闭'%1'吗? - - + + Confirm 确认 - - - + + + Source file is not compiled. 源文件尚未编译。 - - + + Compile now? 现在编译? - - - + + + Source file is more recent than executable. 源文件比可执行程序新。 - + Recompile now? 重新编译? - + 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'不存在。 - + Recompile? 重新编译? - - + + Save last open info error 保存上次打开信息失败 - + Can't remove old last open information file '%1' 无法删除旧上次打开信息文件'%1' - + Can't save last open info file '%1' 无法保存上次打开信息文件'%1' - + Load last open info error 载入上次打开信息失败 - + Can't load last open info file '%1' 无法载入上次打开信息文件'%1' - + Copy all 全部复制 - - + + Clear 清除 @@ -4053,7 +4083,7 @@ Are you really want to continue? - + Problem Set %1 试题集%1 @@ -4074,427 +4104,427 @@ Are you really want to continue? 或者选择使用其他的网络端口。 - + Red Panda Dev-C++ 小熊猫Dev-C++ - + 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: 描述: - + Show debug logs in the debug console 在调试主控台中显示调试器输出 - + 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 重命名 - + Remove Folder 删除文件夹 - + Sort By Type 按类型排序 - + Sort alphabetically 按名称排序 - + Show inherited members 显示继承的成员 - + Goto declaration 跳转到声明处 - + Goto definition 跳转到定义处 - + Open in Editor 在编辑器中打开 - + Open in External Program 使用外部程序打开 - + Open in Terminal 在终端中打开 - + Open in Windows Explorer 在Windows浏览器中打开 - + Character sets 字符集 - + %1 files autosaved 已自动保存%1个文件 - + Set answer to... 设置答案源代码... - + select other file... 选择其他文件... - + Select Answer Source File 选择答案源代码文件 - + C/C++Source Files (*.c *.cpp *.cc *.cxx) C/C++Source Files (*.c *.cpp *.cc *.cxx C/C++源代码文件 (*.c *.cpp *.cc *.cxx) - + 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? 你真的想要做那些吗? - + 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 - + Red panda Dev-C++ project file (*.dev) 小熊猫Dev-C++项目文件 (*.dev) - + New project fail 新建项目失败 - + Can't assign project template 无法使用模板创建项目 - + Remove file 删除文件 - + Remove the file from disk? 同时从硬盘上删除文件? - + untitled 无标题 - + New Project File Name 新的项目文件名 - + File Name: 文件名: - + File Already Exists! 文件已存在! - + File '%1' already exists! 文件'%1'已经存在! - + Add to project 添加到项目 - + 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 @@ -4505,15 +4535,15 @@ Are you really want to continue? - - - - - - - - - + + + + + + + + + Error 错误 @@ -4523,75 +4553,75 @@ Are you really want to continue? 项目历史 - + 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个文件) @@ -6516,7 +6546,7 @@ Are you really want to continue? 自动链接 - + @@ -6592,7 +6622,7 @@ Are you really want to continue? 杂项 - + Program Runner diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 2996326d..7873cbb1 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -1593,6 +1593,36 @@ bool Editor::notParsed() return mParser->findFileIncludes(mFilename)==nullptr; } +void Editor::insertLine() +{ + ExecuteCommand(SynEditorCommand::ecInsertLine,QChar(),nullptr); +} + +void Editor::deleteWord() +{ + ExecuteCommand(SynEditorCommand::ecDeleteWord,QChar(),nullptr); +} + +void Editor::deleteLine() +{ + ExecuteCommand(SynEditorCommand::ecDeleteLine,QChar(),nullptr); +} + +void Editor::duplicateLine() +{ + ExecuteCommand(SynEditorCommand::ecDuplicateLine,QChar(),nullptr); +} + +void Editor::deleteToEOL() +{ + ExecuteCommand(SynEditorCommand::ecDeleteEOL,QChar(),nullptr); +} + +void Editor::deleteToBOL() +{ + ExecuteCommand(SynEditorCommand::ecDeleteBOL,QChar(),nullptr); +} + QChar Editor::getCurrentChar() { if (lineText().length()tabProblem,state); } + +void MainWindow::on_actionInsert_Line_triggered() +{ + Editor *e=mEditorList->getEditor(); + if (e) { + e->insertLine(); + } +} + + +void MainWindow::on_actionDelete_Line_triggered() +{ + Editor *e=mEditorList->getEditor(); + if (e) { + e->deleteLine(); + } +} + + +void MainWindow::on_actionDuplicate_Line_triggered() +{ + Editor *e=mEditorList->getEditor(); + if (e) { + e->duplicateLine(); + } +} + + +void MainWindow::on_actionDelete_Word_triggered() +{ + Editor *e=mEditorList->getEditor(); + if (e) { + e->deleteWord(); + } +} + + +void MainWindow::on_actionDelete_to_EOL_triggered() +{ + Editor *e=mEditorList->getEditor(); + if (e) { + e->deleteToEOL(); + } +} + + +void MainWindow::on_actionDelete_to_BOL_triggered() +{ + Editor *e=mEditorList->getEditor(); + if (e) { + e->deleteToBOL(); + } +} + diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index c11f45b7..693299e8 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -518,6 +518,18 @@ private slots: void on_actionProblem_triggered(); + void on_actionInsert_Line_triggered(); + + void on_actionDelete_Line_triggered(); + + void on_actionDuplicate_Line_triggered(); + + void on_actionDelete_Word_triggered(); + + void on_actionDelete_to_EOL_triggered(); + + void on_actionDelete_to_BOL_triggered(); + private: Ui::MainWindow *ui; EditorList *mEditorList; diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui index 70747547..52bd5973 100644 --- a/RedPandaIDE/mainwindow.ui +++ b/RedPandaIDE/mainwindow.ui @@ -1449,6 +1449,12 @@ + + + + + + @@ -2603,6 +2609,31 @@ Problem + + + Delete Line + + + + + Duplicate Line + + + + + Delete Word + + + + + Delete to EOL + + + + + Delete to BOL + + diff --git a/RedPandaIDE/qsynedit/KeyStrokes.cpp b/RedPandaIDE/qsynedit/KeyStrokes.cpp index e0c991e2..4aba2d29 100644 --- a/RedPandaIDE/qsynedit/KeyStrokes.cpp +++ b/RedPandaIDE/qsynedit/KeyStrokes.cpp @@ -219,11 +219,13 @@ void SynEditKeyStrokes::resetDefaults() add(SynEditorCommand::ecCut, Qt::Key_X, Qt::ControlModifier); add(SynEditorCommand::ecBlockIndent, Qt::Key_I, Qt::ControlModifier|Qt::ShiftModifier); add(SynEditorCommand::ecBlockUnindent, Qt::Key_U, Qt::ControlModifier|Qt::ShiftModifier); - add(SynEditorCommand::ecLineBreak, Qt::Key_M, Qt::ControlModifier); - add(SynEditorCommand::ecInsertLine, Qt::Key_N, Qt::ControlModifier); - add(SynEditorCommand::ecDeleteWord, Qt::Key_T, Qt::ControlModifier); - add(SynEditorCommand::ecDeleteLine, Qt::Key_Y, Qt::ControlModifier); - add(SynEditorCommand::ecDeleteEOL, Qt::Key_Y, Qt::ControlModifier|Qt::ShiftModifier); +// add(SynEditorCommand::ecLineBreak, Qt::Key_M, Qt::ControlModifier); +// add(SynEditorCommand::ecInsertLine, Qt::Key_N, Qt::ControlModifier); +// add(SynEditorCommand::ecDeleteWord, Qt::Key_T, Qt::ControlModifier); +// add(SynEditorCommand::ecDeleteLine, Qt::Key_Y, Qt::ControlModifier); +// add(SynEditorCommand::ecDeleteEOL, Qt::Key_Y, Qt::ControlModifier|Qt::ShiftModifier); +// add(SynEditorCommand::ecDuplicateLine, Qt::Key_D, Qt::ControlModifier); + add(SynEditorCommand::ecUndo, Qt::Key_Z, Qt::ControlModifier); add(SynEditorCommand::ecRedo, Qt::Key_Z, Qt::ControlModifier|Qt::ShiftModifier); add(SynEditorCommand::ecGotoMarker0, Qt::Key_0, Qt::ControlModifier); diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 621152ac..5194d8f3 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -5436,6 +5436,8 @@ void SynEdit::ExecuteCommand(SynEditorCommand Command, QChar AChar, void *pData) clearAll(); break; case SynEditorCommand::ecInsertLine: + insertLine(Command == SynEditorCommand::ecInsertLine); + break; case SynEditorCommand::ecLineBreak: insertLine(Command == SynEditorCommand::ecLineBreak); break; From a14257971c14b5ab21bf278ab4447bf5a7073740 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Mon, 22 Nov 2021 16:40:50 +0800 Subject: [PATCH 03/10] - fix: when make project and del non-existing files, shouldn't show error messages --- NEWS.md | 2 ++ RedPandaIDE/compiler/compilermanager.cpp | 2 +- RedPandaIDE/compiler/projectcompiler.cpp | 9 +++++---- RedPandaIDE/mainwindow.cpp | 10 ---------- RedPandaIDE/mainwindow.h | 2 -- 5 files changed, 8 insertions(+), 17 deletions(-) diff --git a/NEWS.md b/NEWS.md index a918d8aa..e86b69c8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,6 +5,8 @@ Version 0.9.2 For Dev-C++ 7 Beta - fix: option "Move caret to the first non-space char in the current line when press HOME key" dosen't work fine. - fix: ctrl+left can't correctly move to the beginning of the last word - enhancement: add "delete line"/"duplicate line"/"delete word"/"delete to EOL"/"delete to BOL" in the edit menu + - fix: crash when run "Project" / "Clean Make files" + - fix: when make project and del non-existing files, shouldn't show error messages Version 0.9.1 For Dev-C++ 7 Beta - enhancement: code completion suggestion for "__func__" variable diff --git a/RedPandaIDE/compiler/compilermanager.cpp b/RedPandaIDE/compiler/compilermanager.cpp index 9c680f9e..ebc96c31 100644 --- a/RedPandaIDE/compiler/compilermanager.cpp +++ b/RedPandaIDE/compiler/compilermanager.cpp @@ -133,8 +133,8 @@ void CompilerManager::cleanProject(std::shared_ptr project) mCompileIssueCount = 0; ProjectCompiler* compiler = new ProjectCompiler(project,false,false); compiler->setOnlyClean(true); - mCompiler->setRebuild(false); mCompiler = compiler; + mCompiler->setRebuild(false); connect(mCompiler, &Compiler::finished, mCompiler, &QObject::deleteLater); connect(mCompiler, &Compiler::compileFinished, this, &CompilerManager::onCompileFinished); diff --git a/RedPandaIDE/compiler/projectcompiler.cpp b/RedPandaIDE/compiler/projectcompiler.cpp index d6b65313..90a04d91 100644 --- a/RedPandaIDE/compiler/projectcompiler.cpp +++ b/RedPandaIDE/compiler/projectcompiler.cpp @@ -9,7 +9,8 @@ #include ProjectCompiler::ProjectCompiler(std::shared_ptr project, bool silent, bool onlyCheckSyntax): - Compiler("",silent,onlyCheckSyntax) + Compiler("",silent,onlyCheckSyntax), + mOnlyClean(false) { setProject(project); } @@ -264,9 +265,9 @@ void ProjectCompiler::writeMakeClean(QFile &file) { writeln(file, "clean: clean-custom"); if (mProject->options().type == ProjectType::DynamicLib) - writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) $(DEF) $(STATIC)"); + writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) $(DEF) $(STATIC) > NUL 2>&1 "); else - writeln(file, "\t${RM} $(CLEANOBJ) $(BIN)"); + writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) > NUL 2>&1 "); writeln(file); } @@ -465,7 +466,7 @@ bool ProjectCompiler::prepareForCompile() mArguments = QString("-f \"%1\" clean").arg(extractRelativePath( mProject->directory(), mProject->makeFileName())); - } if (mRebuild) { + } else if (mRebuild) { mArguments = QString("-f \"%1\" clean all").arg(extractRelativePath( mProject->directory(), mProject->makeFileName())); diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 300df729..89568946 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -5695,16 +5695,6 @@ void MainWindow::on_actionProblem_triggered() showHideMessagesTab(ui->tabProblem,state); } - -void MainWindow::on_actionInsert_Line_triggered() -{ - Editor *e=mEditorList->getEditor(); - if (e) { - e->insertLine(); - } -} - - void MainWindow::on_actionDelete_Line_triggered() { Editor *e=mEditorList->getEditor(); diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index 693299e8..4e0383b4 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -518,8 +518,6 @@ private slots: void on_actionProblem_triggered(); - void on_actionInsert_Line_triggered(); - void on_actionDelete_Line_triggered(); void on_actionDuplicate_Line_triggered(); From eefd2a314094d5958a4ad42f4f7b66f46d3e9e70 Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Mon, 22 Nov 2021 16:51:16 +0800 Subject: [PATCH 04/10] update version number --- RedPandaIDE/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RedPandaIDE/version.h b/RedPandaIDE/version.h index 30938498..e80b2153 100644 --- a/RedPandaIDE/version.h +++ b/RedPandaIDE/version.h @@ -2,6 +2,6 @@ #define VERSION_H #include -#define DEVCPP_VERSION "beta.0.9.2" +#define DEVCPP_VERSION "beta.0.9.3" #endif // VERSION_H From 69ba84fc86503dafb9e6fadf6860fb390a2eb4ad Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 22 Nov 2021 18:42:58 +0800 Subject: [PATCH 05/10] - fix: the count in the title of issues view isn't correct --- NEWS.md | 3 +++ RedPandaIDE/compiler/compilermanager.cpp | 5 +++-- RedPandaIDE/mainwindow.ui | 6 +++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/NEWS.md b/NEWS.md index a918d8aa..9604af37 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +Version 0.9.3 For Dev-C++ 7 Beta + - fix: the count in the title of issues view isn't correct + Version 0.9.2 For Dev-C++ 7 Beta - fix: gutter of the disassembly code control in the cpu info dialog is grayed - fix: problem set & problem views not correctly hidden when disabled in the executor / problem set options diff --git a/RedPandaIDE/compiler/compilermanager.cpp b/RedPandaIDE/compiler/compilermanager.cpp index 9c680f9e..9caf66f2 100644 --- a/RedPandaIDE/compiler/compilermanager.cpp +++ b/RedPandaIDE/compiler/compilermanager.cpp @@ -330,8 +330,9 @@ void CompilerManager::onSyntaxCheckIssue(PCompileIssue issue) { if (issue->type == CompileIssueType::Error) mSyntaxCheckErrorCount++; - mSyntaxCheckIssueCount++; - + if (issue->type == CompileIssueType::Error || + issue->type == CompileIssueType::Warning) + mSyntaxCheckIssueCount++; } int CompilerManager::syntaxCheckIssueCount() const diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui index 52bd5973..47e7a255 100644 --- a/RedPandaIDE/mainwindow.ui +++ b/RedPandaIDE/mainwindow.ui @@ -506,7 +506,7 @@ QTabWidget::South - 6 + 0 @@ -702,7 +702,7 @@ QTabWidget::North - 2 + 0 @@ -1381,7 +1381,7 @@ 0 0 1114 - 25 + 30 From dda0f82b4d0a39b3192b5c44a0efb53fd272ad4c Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 22 Nov 2021 19:10:56 +0800 Subject: [PATCH 06/10] - fix: columns calculation not correct when paint lines containing chinese characters --- NEWS.md | 1 + RedPandaIDE/editor.cpp | 1 - RedPandaIDE/mainwindow.cpp | 11 ----------- RedPandaIDE/mainwindow.h | 2 -- RedPandaIDE/qsynedit/SynEdit.cpp | 6 +++++- RedPandaIDE/qsynedit/TextPainter.cpp | 2 +- 6 files changed, 7 insertions(+), 16 deletions(-) diff --git a/NEWS.md b/NEWS.md index 9604af37..6bbcf14e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ Version 0.9.3 For Dev-C++ 7 Beta - fix: the count in the title of issues view isn't correct + - fix: columns calculation not correct when paint lines containing chinese characters Version 0.9.2 For Dev-C++ 7 Beta - fix: gutter of the disassembly code control in the cpu info dialog is grayed diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 7873cbb1..94d48b1a 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -876,7 +876,6 @@ void Editor::onPreparePaintHighlightToken(int line, int aChar, const QString &to if (token.isEmpty()) return; -// qDebug()<name()<<" - "<identifierAttribute())) { BufferCoord p{aChar,line}; BufferCoord pBeginPos,pEndPos; diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 300df729..87fb4e50 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -5695,16 +5695,6 @@ void MainWindow::on_actionProblem_triggered() showHideMessagesTab(ui->tabProblem,state); } - -void MainWindow::on_actionInsert_Line_triggered() -{ - Editor *e=mEditorList->getEditor(); - if (e) { - e->insertLine(); - } -} - - void MainWindow::on_actionDelete_Line_triggered() { Editor *e=mEditorList->getEditor(); @@ -5713,7 +5703,6 @@ void MainWindow::on_actionDelete_Line_triggered() } } - void MainWindow::on_actionDuplicate_Line_triggered() { Editor *e=mEditorList->getEditor(); diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index 693299e8..4e0383b4 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -518,8 +518,6 @@ private slots: void on_actionProblem_triggered(); - void on_actionInsert_Line_triggered(); - void on_actionDelete_Line_triggered(); void on_actionDuplicate_Line_triggered(); diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 5194d8f3..3c1793f3 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -250,6 +250,10 @@ void SynEdit::setCaretXYEx(bool CallEnsureCursorPos, BufferCoord value) invalidateLine(mCaretY); invalidateLine(oldCaretY); } + if (mGutter.activeLineTextColor().isValid()) { + invalidateGutterLine(mCaretY); + invalidateGutterLine(oldCaretY); + } mStatusChanges.setFlag(SynStatusChange::scCaretY); } // Call UpdateLastCaretX before DecPaintLock because the event handler it @@ -829,7 +833,7 @@ int SynEdit::columnToChar(int aLine, int aColumn) const int SynEdit::stringColumns(const QString &line, int colsBefore) const { - int columns = colsBefore; + int columns = std::max(0,colsBefore); int charCols; for (int i=0;imHighlighter->next(); } // Don't assume HL.GetTokenPos is valid after HL.GetEOL == True. - nTokenColumnsBefore += edit->stringColumns(sToken,nTokenColumnsBefore-1); + nTokenColumnsBefore += edit->stringColumns(sToken,nTokenColumnsBefore); if (edit->mHighlighter->eol() && (nTokenColumnsBefore < vLastChar)) { int lineColumns = edit->mLines->lineColumns(vLine-1); // Draw text that couldn't be parsed by the highlighter, if any. From cd1e20c2d7f76f03d4cc0624ee00bcc2d85fb11c Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Tue, 23 Nov 2021 10:32:33 +0800 Subject: [PATCH 07/10] - fix: restore caret position after reformat code - enhancement: ask user to rebuild project, when run/debug the project and it has been modified - fix: correct set the enabled state of "delete line"/"insert line"/"delete word"/"delete to BOL"/"delete to EOL" menu items --- NEWS.md | 3 ++ RedPandaIDE/compiler/compilermanager.cpp | 2 +- RedPandaIDE/compiler/projectcompiler.cpp | 9 ++-- RedPandaIDE/editor.cpp | 4 ++ RedPandaIDE/mainwindow.cpp | 54 ++++++++++++++++-------- RedPandaIDE/mainwindow.ui | 9 ++++ 6 files changed, 58 insertions(+), 23 deletions(-) diff --git a/NEWS.md b/NEWS.md index 6bbcf14e..f78aa83d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,9 @@ Version 0.9.3 For Dev-C++ 7 Beta - fix: the count in the title of issues view isn't correct - fix: columns calculation not correct when paint lines containing chinese characters + - fix: restore caret position after reformat code + - enhancement: ask user to rebuild project, when run/debug the project and it has been modified + - fix: correct set the enabled state of "delete line"/"insert line"/"delete word"/"delete to BOL"/"delete to EOL" menu items Version 0.9.2 For Dev-C++ 7 Beta - fix: gutter of the disassembly code control in the cpu info dialog is grayed diff --git a/RedPandaIDE/compiler/compilermanager.cpp b/RedPandaIDE/compiler/compilermanager.cpp index 9caf66f2..c9ddc372 100644 --- a/RedPandaIDE/compiler/compilermanager.cpp +++ b/RedPandaIDE/compiler/compilermanager.cpp @@ -133,8 +133,8 @@ void CompilerManager::cleanProject(std::shared_ptr project) mCompileIssueCount = 0; ProjectCompiler* compiler = new ProjectCompiler(project,false,false); compiler->setOnlyClean(true); - mCompiler->setRebuild(false); mCompiler = compiler; + mCompiler->setRebuild(false); connect(mCompiler, &Compiler::finished, mCompiler, &QObject::deleteLater); connect(mCompiler, &Compiler::compileFinished, this, &CompilerManager::onCompileFinished); diff --git a/RedPandaIDE/compiler/projectcompiler.cpp b/RedPandaIDE/compiler/projectcompiler.cpp index d6b65313..379053f7 100644 --- a/RedPandaIDE/compiler/projectcompiler.cpp +++ b/RedPandaIDE/compiler/projectcompiler.cpp @@ -9,7 +9,8 @@ #include ProjectCompiler::ProjectCompiler(std::shared_ptr project, bool silent, bool onlyCheckSyntax): - Compiler("",silent,onlyCheckSyntax) + Compiler("",silent,onlyCheckSyntax), + mOnlyClean(false) { setProject(project); } @@ -264,9 +265,9 @@ void ProjectCompiler::writeMakeClean(QFile &file) { writeln(file, "clean: clean-custom"); if (mProject->options().type == ProjectType::DynamicLib) - writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) $(DEF) $(STATIC)"); + writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) $(DEF) $(STATIC) > NUL 2>&1"); else - writeln(file, "\t${RM} $(CLEANOBJ) $(BIN)"); + writeln(file, "\t${RM} $(CLEANOBJ) $(BIN) > NUL 2>&1"); writeln(file); } @@ -465,7 +466,7 @@ bool ProjectCompiler::prepareForCompile() mArguments = QString("-f \"%1\" clean").arg(extractRelativePath( mProject->directory(), mProject->makeFileName())); - } if (mRebuild) { + } else if (mRebuild) { mArguments = QString("-f \"%1\" clean all").arg(extractRelativePath( mProject->directory(), mProject->makeFileName())); diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 94d48b1a..5755af9e 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -3568,6 +3568,8 @@ void Editor::reformat() pSettings->dirs().app(), args, content); + int oldTopLine = topLine(); + BufferCoord mOldCaret = caretXY(); selectAll(); SynEditorOptions oldOptions = getOptions(); @@ -3575,6 +3577,8 @@ void Editor::reformat() newOptions.setFlag(SynEditorOption::eoAutoIndent,false); setOptions(newOptions); setSelText(QString::fromUtf8(newContent)); + setCaretXY(mOldCaret); + setTopLine(oldTopLine); setOptions(oldOptions); reparse(); checkSyntaxInBack(); diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 87fb4e50..dd964017 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -339,6 +339,12 @@ void MainWindow::updateEditorActions() ui->actionUnIndent->setEnabled(false); ui->actionUndo->setEnabled(false); ui->actionUnfoldAll->setEnabled(false); + ui->actionDelete_Line->setEnabled(false); + ui->actionDelete_Word->setEnabled(false); + ui->actionDuplicate_Line->setEnabled(false); + ui->actionDelete_to_BOL->setEnabled(false); + ui->actionDelete_to_EOL->setEnabled(false); + ui->actionFind->setEnabled(false); ui->actionReplace->setEnabled(false); ui->actionFind_Next->setEnabled(false); @@ -379,6 +385,11 @@ void MainWindow::updateEditorActions() ui->actionToggleComment->setEnabled(!e->readOnly() && e->lines()->count()>0); ui->actionUnIndent->setEnabled(!e->readOnly() && e->lines()->count()>0); ui->actionUnfoldAll->setEnabled(e->lines()->count()>0); + ui->actionDelete_Line->setEnabled(!e->readOnly() && e->lines()->count()>0); + ui->actionDelete_Word->setEnabled(!e->readOnly() && e->lines()->count()>0); + ui->actionDuplicate_Line->setEnabled(!e->readOnly() && e->lines()->count()>0); + ui->actionDelete_to_BOL->setEnabled(!e->readOnly() && e->lines()->count()>0); + ui->actionDelete_to_EOL->setEnabled(!e->readOnly() && e->lines()->count()>0); ui->actionFind->setEnabled(true); ui->actionReplace->setEnabled(true); @@ -1079,30 +1090,14 @@ void MainWindow::checkSyntaxInBack(Editor *e) mCompilerManager->checkSyntax(e->filename(),e->text(), e->fileEncoding() == ENCODING_ASCII, nullptr); } -// if not PrepareForCompile(cttStdin,True) then begin -// fCheckSyntaxInBack:=False; -// Exit; -// end; -// if e.InProject then begin -// if not assigned(MainForm.fProject) then -// Exit; -// fSyntaxChecker.Project := MainForm.fProject; -// end; - // fSyntaxChecker.CheckSyntax(True); } bool MainWindow::compile(bool rebuild) { CompileTarget target =getCompileTarget(); if (target == CompileTarget::Project) { - if (!mProject->saveUnits()) - return false; - // Check if saves have been succesful - for (int i=0; ipageCount();i++) { - Editor * e= (*(mEditorList))[i]; - if (e->inProject() && e->modified()) - return false; - } + if (mProject->modified()) + mProject->saveAll(); clearIssues(); // Increment build number automagically @@ -1209,6 +1204,18 @@ void MainWindow::runExecutable(RunType runType) { CompileTarget target =getCompileTarget(); if (target == CompileTarget::Project) { + if (mProject->modified() && + QMessageBox::question( + this, + tr("Rebuild Project"), + tr("Project has been modified, do you want to rebuild it?") + ) == QMessageBox::Yes) { + mProject->saveAll(); + mCompileSuccessionTask=std::make_shared(); + mCompileSuccessionTask->type = CompileSuccessionTaskType::RunNormal; + compile(); + return; + } runExecutable(mProject->executable(),mProject->filename(),runType); } else { Editor * editor = mEditorList->getEditor(); @@ -1277,6 +1284,17 @@ void MainWindow::debug() } return; } + if (mProject->modified() && + QMessageBox::question( + this, + tr("Compile Project"), + tr("Project has been modified, do you want to rebuild it?") + ) == QMessageBox::Yes) { + mCompileSuccessionTask=std::make_shared(); + mCompileSuccessionTask->type = CompileSuccessionTaskType::Debug; + compile(); + return; + } // Did we choose a host application for our DLL? if (mProject->options().type == ProjectType::DynamicLib) { if (mProject->options().hostApplication.isEmpty()) { diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui index 47e7a255..7bac4e6a 100644 --- a/RedPandaIDE/mainwindow.ui +++ b/RedPandaIDE/mainwindow.ui @@ -2613,16 +2613,25 @@ Delete Line + + Ctrl+D + Duplicate Line + + Ctrl+E + Delete Word + + Ctrl+Shift+D + From 39e32e2fc54a5cc1a71573c988b32b671d9b7e29 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Tue, 23 Nov 2021 10:34:38 +0800 Subject: [PATCH 08/10] short cut for actions --- RedPandaIDE/mainwindow.ui | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui index 7bac4e6a..d45c3e17 100644 --- a/RedPandaIDE/mainwindow.ui +++ b/RedPandaIDE/mainwindow.ui @@ -2637,11 +2637,17 @@ Delete to EOL + + Ctrl+Del + Delete to BOL + + Ctrl+Backspace + From 9c2ffa2f80be21411dcdd71f450010011f9ae1eb Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Tue, 23 Nov 2021 12:39:32 +0800 Subject: [PATCH 09/10] update translation --- RedPandaIDE/RedPandaIDE_zh_CN.qm | Bin 106064 -> 106597 bytes RedPandaIDE/RedPandaIDE_zh_CN.ts | 844 ++++++++++++++++--------------- RedPandaIDE/mainwindow.cpp | 2 +- 3 files changed, 443 insertions(+), 403 deletions(-) diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.qm b/RedPandaIDE/RedPandaIDE_zh_CN.qm index 5148f564acfda7203df617b37fb663481920e8fa..398781d0ae69e8e4f7bdd74763b6bdb35ac0c033 100644 GIT binary patch delta 7767 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 delta 7370 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 diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts index a9078b29..c125c874 100644 --- a/RedPandaIDE/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts @@ -1031,10 +1031,10 @@ Are you really want to continue? - - - - + + + + Error 错误 @@ -1048,55 +1048,55 @@ Are you really want to continue? 另存为 - + The text to be copied exceeds count limit! 要复制的内容超过了行数限制! - + The text to be copied exceeds character limit! 要复制的内容超过了字符数限制! - + The text to be cut exceeds count limit! 要剪切的内容超过了行数限制! - + The text to be cut exceeds character limit! 要剪切的内容超过了字符数限制! - + Print Document 打印文档 - - - + + + Ctrl+click for more info Ctrl+单击以获取更多信息 - - + + Symbol '%1' not found! 未找到符号'%1'! - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Readonly 只读 @@ -2856,18 +2856,18 @@ Are you really want to continue? - - - - - - + + + + + + Issues 编译器 - + Compile Log 编译日志 @@ -2882,8 +2882,8 @@ Are you really want to continue? 工具 - - + + Run 运行 @@ -2894,26 +2894,26 @@ Are you really want to continue? - - + + Project 项目 - + Watch 监视 - + Structure 结构 - + Files 文件 @@ -2923,10 +2923,10 @@ Are you really want to continue? - - - - + + + + Debug 调试 @@ -2957,8 +2957,8 @@ Are you really want to continue? - - + + Search 查找 @@ -2983,7 +2983,7 @@ Are you really want to continue? 替换 - + Close 关闭 @@ -2993,13 +2993,13 @@ Are you really want to continue? 运行 - - + + Code 代码 - + Window 窗口 @@ -3017,257 +3017,257 @@ 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 试题集 - + New Problem Set 新建试题集 @@ -3286,14 +3286,14 @@ Are you really want to continue? - + Save Problem Set 保存试题集 - + Load Problem Set 载入试题集 @@ -3315,21 +3315,21 @@ Are you really want to continue? - + TODO TODO - + Bookmark 书签 - - + + Problem 试题 @@ -3380,444 +3380,468 @@ Are you really want to continue? 期望输出 - + 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 状态栏 - - Insert Line - 插入行 + + Ctrl+Backspace + Ctrl+Backspace - + 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 删除到行首 @@ -3826,43 +3850,43 @@ 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... 运行参数... - + File Encoding 文件编码 @@ -3872,32 +3896,32 @@ Are you really want to continue? 文件历史 - - - - - - + + + + + + Debugging 正在调试 - - - - - - + + + + + + Running 正在运行 - - - - - - + + + + + + Compiling 正在编译 @@ -3906,168 +3930,168 @@ 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 覆写 - + Close project 关闭项目 - + Are you sure you want to close %1? 你确定要关闭'%1'吗? - - + + Confirm 确认 - - - + + + Source file is not compiled. 源文件尚未编译。 - - + + Compile now? 现在编译? - - - + + + Source file is more recent than executable. 源文件比可执行程序新。 - + Recompile now? 重新编译? - + 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'不存在。 - + Recompile? 重新编译? - - + + Save last open info error 保存上次打开信息失败 - + Can't remove old last open information file '%1' 无法删除旧上次打开信息文件'%1' - + Can't save last open info file '%1' 无法保存上次打开信息文件'%1' - + Load last open info error 载入上次打开信息失败 - + Can't load last open info file '%1' 无法载入上次打开信息文件'%1' - + Copy all 全部复制 - - + + Clear 清除 @@ -4083,7 +4107,7 @@ Are you really want to continue? - + Problem Set %1 试题集%1 @@ -4104,427 +4128,443 @@ Are you really want to continue? 或者选择使用其他的网络端口。 - + Red Panda Dev-C++ 小熊猫Dev-C++ - + + Rebuild Project + 重新构建项目 + + + + + Project has been modified, do you want to rebuild it? + 项目已经被修改过,是否需要重新构建? + + + + Compile Project + 编译项目 + + + 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: 描述: - + Show debug logs in the debug console 在调试主控台中显示调试器输出 - + 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 重命名 - + Remove Folder 删除文件夹 - + Sort By Type 按类型排序 - + Sort alphabetically 按名称排序 - + Show inherited members 显示继承的成员 - + Goto declaration 跳转到声明处 - + Goto definition 跳转到定义处 - + Open in Editor 在编辑器中打开 - + Open in External Program 使用外部程序打开 - + Open in Terminal 在终端中打开 - + Open in Windows Explorer 在Windows浏览器中打开 - + Character sets 字符集 - + %1 files autosaved 已自动保存%1个文件 - + Set answer to... 设置答案源代码... - + select other file... 选择其他文件... - + Select Answer Source File 选择答案源代码文件 - + C/C++Source Files (*.c *.cpp *.cc *.cxx) C/C++Source Files (*.c *.cpp *.cc *.cxx C/C++源代码文件 (*.c *.cpp *.cc *.cxx) - + 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? 你真的想要做那些吗? - + 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 - + Red panda Dev-C++ project file (*.dev) 小熊猫Dev-C++项目文件 (*.dev) - + New project fail 新建项目失败 - + Can't assign project template 无法使用模板创建项目 - + Remove file 删除文件 - + Remove the file from disk? 同时从硬盘上删除文件? - + untitled 无标题 - + New Project File Name 新的项目文件名 - + File Name: 文件名: - + File Already Exists! 文件已存在! - + File '%1' already exists! 文件'%1'已经存在! - + Add to project 添加到项目 - + 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 @@ -4535,15 +4575,15 @@ Are you really want to continue? - - - - - - - - - + + + + + + + + + Error 错误 @@ -4553,75 +4593,75 @@ Are you really want to continue? 项目历史 - + 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个文件) @@ -4869,52 +4909,52 @@ Are you really want to continue? ProjectCompiler - + Building makefile... 正在构建makefile... - + - Filename: %1 - 文件名: %1 - + Can't open '%1' for write! 无法写入文件'%1'! - + - Resource File: %1 - 资源文件: %1 - + Compiling project changes... 正在编译项目修改... - + - Project Filename: %1 - 项目文件名: %1 - + - Compiler Set Name: %1 - 编译器配置: %1 - + Processing makefile: 正在处理makefile... - + - makefile processer: %1 - makefile处理器: %1 - + - Command: %1 %2 - 命令: %1 %2 @@ -6546,7 +6586,7 @@ Are you really want to continue? 自动链接 - + @@ -6622,7 +6662,7 @@ Are you really want to continue? 杂项 - + Program Runner diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index dd964017..bc95b32a 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -1287,7 +1287,7 @@ void MainWindow::debug() if (mProject->modified() && QMessageBox::question( this, - tr("Compile Project"), + tr("Rebuild Project"), tr("Project has been modified, do you want to rebuild it?") ) == QMessageBox::Yes) { mCompileSuccessionTask=std::make_shared(); From 614fc911b10efab3914eda8b6007dd09a47e785c Mon Sep 17 00:00:00 2001 From: "royqh1979@gmail.com" Date: Tue, 23 Nov 2021 12:53:48 +0800 Subject: [PATCH 10/10] - fix: undo "delete word"/"delete to BOL"/"delete to EOL" correct reset caret position --- NEWS.md | 1 + RedPandaIDE/qsynedit/SynEdit.cpp | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/NEWS.md b/NEWS.md index 8cac1ec1..0a9732f6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,7 @@ Version 0.9.3 For Dev-C++ 7 Beta - fix: restore caret position after reformat code - enhancement: ask user to rebuild project, when run/debug the project and it has been modified - fix: correct set the enabled state of "delete line"/"insert line"/"delete word"/"delete to BOL"/"delete to EOL" menu items + - fix: undo "delete word"/"delete to BOL"/"delete to EOL" correct reset caret position Version 0.9.2 For Dev-C++ 7 Beta - fix: gutter of the disassembly code control in the cpu info dialog is grayed diff --git a/RedPandaIDE/qsynedit/SynEdit.cpp b/RedPandaIDE/qsynedit/SynEdit.cpp index 3c1793f3..29f3c88d 100644 --- a/RedPandaIDE/qsynedit/SynEdit.cpp +++ b/RedPandaIDE/qsynedit/SynEdit.cpp @@ -5246,13 +5246,18 @@ void SynEdit::deleteFromTo(const BufferCoord &start, const BufferCoord &end) return; doOnPaintTransient(SynTransientType::ttBefore); if ((start.Char != end.Char) || (start.Line != end.Line)) { + BufferCoord oldCaret = caretXY(); setBlockBegin(start); setBlockEnd(end); setActiveSelectionMode(SynSelectionMode::smNormal); QString helper = selText(); setSelTextPrimitive(""); + mUndoList->BeginBlock(); + mUndoList->AddChange(SynChangeReason::crCaret, oldCaret, start, + "", SynSelectionMode::smNormal); mUndoList->AddChange(SynChangeReason::crSilentDeleteAfterCursor, start, end, helper, SynSelectionMode::smNormal); + mUndoList->EndBlock(); internalSetCaretXY(start); } doOnPaintTransient(SynTransientType::ttAfter);