From 1c9bb4979938b8bfd198f8e2c3919b198be3435c Mon Sep 17 00:00:00 2001 From: royqh1979 Date: Thu, 18 Nov 2021 21:25:28 +0800 Subject: [PATCH] - enhancement: save/load default projects folder - enhancement: add editor general options "highlight current word" and "highlight matching braces" --- NEWS.md | 2 + RedPandaIDE/RedPandaIDE_zh_CN.qm | Bin 105123 -> 105685 bytes RedPandaIDE/RedPandaIDE_zh_CN.ts | 320 ++++++++++-------- RedPandaIDE/editor.cpp | 18 +- RedPandaIDE/main.cpp | 9 +- RedPandaIDE/mainwindow.cpp | 17 +- RedPandaIDE/qsynedit/Types.cpp | 5 + RedPandaIDE/qsynedit/Types.h | 1 + RedPandaIDE/qt_zh_CN.qm | Bin 0 -> 117347 bytes RedPandaIDE/settings.cpp | 51 ++- RedPandaIDE/settings.h | 15 +- .../settingsdialog/editorgeneralwidget.cpp | 7 + .../settingsdialog/editorgeneralwidget.ui | 23 ++ RedPandaIDE/translations.qrc | 1 + RedPandaIDE/widgets/darkfusionstyle.cpp | 5 + RedPandaIDE/widgets/darkfusionstyle.h | 5 + RedPandaIDE/widgets/newprojectdialog.cpp | 19 +- RedPandaIDE/widgets/newprojectdialog.h | 1 + RedPandaIDE/widgets/newprojectdialog.ui | 33 +- 19 files changed, 341 insertions(+), 191 deletions(-) create mode 100644 RedPandaIDE/qt_zh_CN.qm diff --git a/NEWS.md b/NEWS.md index d73b17e5..1b7010cc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,8 @@ Version 0.9.1 For Dev-C++ 7 Beta - fix: ide failed to start, if there are errors in the compiler set settings - fix: numpad's enter key doesn't work - enhancement: code completion suggestion for phrase after long/short/signed/unsigned + - enhancement: save/load default projects folder + - enhancement: add editor general options "highlight current word" and "highlight matching braces" Version 0.9.0 For Dev-C++ 7 Beta - fix: control keys in the numpad doesn't work in the editor diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.qm b/RedPandaIDE/RedPandaIDE_zh_CN.qm index a8bb9e703161aafbdea085697440192573bdadef..5b733830380f63b4033381f00ca0881917a6107c 100644 GIT binary patch delta 6886 zcmYLNcU%-_^PgvLcdzZ;Nju=slhQDc1N5-}l`pz^4I zXoxK~M5D1rz}QfuVDDW(1tazzeaE}so8KRPzTEnh*_rQrXJ*&zy7ime>V*7zZ zyn6z$&w%)y1K`Yo1g0Pc0L++S!VmY2NaFrRjKcqafH(%gdz=x8e#+u%E%Sz5+@NOC zCoH}c?0-oIkWdfsa6Uj{F2FyLhy?)8x&Vy9XY1Yoq#Ob=yaHIa1YFk#*z_4dgg!K$ zc$)rWzbzZKwK8E|wV zz|&UXDvkie4K!gpo`b*1;C5;dsry>&0`4#_e;Eo~b0gv;5c^sIc&-ESSHl1*K7yj{ z0uc8`P>pj2_z1L7ZmV6}2pj>DhT?pM|feAiLW7s7v3KMx?O`$m1t;c1OcCy0HZ^QxJL%S@NiT{UQS%Y(}5lq`ozo?JI)jY45YzVjnP?Ah)2O9t` z>uA2j)ezcBPV~_Otba>R6g2}$I89EIAb`N*Nb zKkNkgkQNIt@JEK+dWf?29m8I?1qhZfT-j%)XE9wctRzCkSnfc_MJgG~o4){2Z)Y@y zQUGT$W9OX)c7%0h+}fG|27w7XH!&V3&jUP4rJhoCbnb2@(()QW>u4r68uwk?$i#1@ zm}vn_LN^Z}iIbV6Tg?EsGnw=ckAV!3FnWiLKmwLB`gEkL*Lf!Er&fS(^O@XlX9F3t zhL%gU=GVJ0vlKzFcd#mtYFEiiB_vOmvw@wGXW=v=Ld~MxTI4q;oL`=(AX)iwi^Ynokh* z5-`>8U!b>SYUZUSeJ%5L)O(A@q{ad1RV5m;GaJY-jc9DrcR zJo~b9BOYFLu5@b*>_Se9H zASY=j+4Y^cpvQW;RZ(gP)3Dpx1_E?>$?ofc=gA(hf5=g#`=^*N)|=g5xd!0tLG1qK ztH^J{){kuh$g?uxyG!iBqTi9g57}c3V$V(N$<(1J!<*RVX-fc(JF%yG;kjlJ?Aej4 z0cxw*3qHljo%`&Cf_R|&m9}Bwo7t9exOdx3wk_EOOSOW1phy1Lcd`#2d;u_ZfDsAz zg9(!|*bY%7fb})D!&3&3>0(6U+>6?)v@#zb_U{U;JLlKa;VOHF?HsoP4LK*`xH=_} z5x;V>+32X4I!?A3<8m&YmZ-c9WE|%@9~03klIt_-AhstpCJf}b{s#mU^l_Y5ML&QG zy*RH!sQ_VnxWM2_)B(bcSdX^+T)`#W@B+yHlS}M|<>J+3F4>|TAUumpQFB179k`6} zj{v8qaN~{mfXm&DM&9_wi2cZ*VB;U;tD)RP1|2l!S0j=hm$-=oC73hm+*H7%Ghe|? z>w!{m&w=K5vCf{vEeOUWFyCat@p;^$6b$ExS^H3JAaLbqV0y3qAtNIbE=A$Ltif-tJiKQldH-cL=?HoS$q@7*VVZI*R z=0(G?x@_TU49UFn8@6 zeVb1Uv;+7pj8CsYRWICPL^Ad)pS}}QI$^0+!Qlxpx zFOS}f?%2aGe;I@w(-XSTLanjw$8TES1F7|ludz)47#GFYB)bC6c#u;q^4%(u46{L#r*-{v9*Kp#&qE7$}ao(u52cDjvCG6H0J| z5s8_(IA!=kWcvtl>d^}T8~TX#-R5FVD4?BqiZY7YTdA36Wz@$?Yk2sZcxf3ndN+57 zm!6)Ab>(OA(g(ePj1LqqlcQH}4=^H$A0=KEiND|U6<3TyW!PgW{-p_X!+M5zRa-nN zc&>Q$brwiytawvE3%=r1@s?cd2<)rH+r}Y1M<~QQ1JI2JR^o?A+W|JUiyw|Fz}z1rZjV4^Iaexfzbm6L zYI9jmlh~Lt_9B|E)@qW=BxE}lJf=e;%0&@-S}2ih*orQxrt8&Oe?-a?cTn=OxK}&t*8hy^$;| zYQ=7&TC$Y%LwrmxS!>fWY9(9B(Ak+`lEd520E`qQjc!K(9!xeO8F5e27=-n^{h{RK zHO$!;qa>$9Xw=OZNz*6~ta~!awQg}JR$|FbKP2p-QIcD|F~`TbOIm~KF*q-1l#LrH zrPFQf6J|@z`eVMfe=D{6pa+YR;eynh>eI8$Q3fQ0kI=1%+^n)GZ_w zySp>e9vY;v*E?yCO!RB4UfS~%uKRm})MGx{eDenFw9ztsfU0c0H6Ol~Mp|J~yeyYS z4d_JauaQOtJK+QnM^kLojQblp-B#=G@>n`;9oDrWze)``JApVnl9p`K0@%e#f4qV2 zk#9F)K#p`l;W>aW6(;Pkp_gp6juZT(i>LPkm{%gDwRxDIhoqHRw%A(ElP>Rtm!B%4 z)*5Z%DO>4AU!-W;W$ES_=$)0rrCU2Obd#f{``WyaSRvB7qUYGPJ4ox6y#_e!Dm`=+ zz1Q7bdSs+EdMa9a^fVrK+E?1R6s^mbn(+NOx=>?n8z8-WcnLt=Lg`J+6B7KFw9UAB z3vJMNXmmeGUoON;2aT1!O|(Qg-!A>MPzl7&iHhx969@bx>$@!y;CZQRaM5fOk$bYi zOG^QoB4k7M)B;K7WI^g7IEcH*!e60{y~|`HvBM#w9c81pr{ScckR``r-bY=KrOqq_ zLVC(F0`ZzYcW8;7hx-@%WcnKXnf6SUy*e5jj1Jj^?I_~YLX1d~N6K=~h|tkb=q)>~ z|EDt9e6|>%rBe3OjP2O*+sYO;*8-?3WJ@<c`3c&aMW%cJWFy$`D4#s2vJo%kAb`3U>~G&np3 z%RU~Yc==^&-%V@&K2>h90AoJ0P;QkqAC=9QMs-s&qqfq_ZUYT6dwH;?2M{Z76WUbC z6Vh4ySnxrfEXG})wnik<40&?US}fZZ^30YNWLS-S+MmuqoU`OJoGVc$yUJ&zX9Edo zk!V&V-}^omapnD z6!o`LzUDd>-A7NTLF{J8EIHj!n|*%HB2liA>(P3$3{}PyXc4S)3meMMV@A2s$rDuJY; zxBTJ-Q6{c;j~3+Y9Gpu_1^HF%O~_M0C_Rj#nL-9tlkmS6EP-k#e&U*-|)GYV7Gh}PJ~Lqt_F#)^pnta$8&&5 z{(^IZ3SWAT;DS>#Jh>;hG7VVsj!~6P?SIu;=pOhpfa5Wt=iD6t{#GVT_(|{(hM^CB z6+8~3PgAZ7o}QSAmy?D5-(wfxwui>+Tp4c>HR!ZVb{AT$Q!|+_=x&`>7Qa{czH~W; zyN%w`sWtx;3uTeWf&rYcG?uNA!&HXYZobWc}!Ti`j-3WaYD z>f_1VilITz@asf_5lQ-c#n6PO0Cbk4Z%%X<#WG&Uv=K>oxFRQ_3A-O(MehFpAUOgQxrZE4Ts4Z^Mhl!g zt{aiKFQN8M>YQi3ido zvVV!9eAasWV5d}6)x~1JbX2k8I4aqkdd1J0wWzNxiZx+7aT07&tg9-;HpE@A^`QfH z&6jDlla`4~pbbu1*|}bdXFD+K^R4JDC$&4TQM?<7%xQY3cwdUPU%sIDv>fTKIIe^< ztvKhbQi^IZTsC@Y@2q7`vviQN);wpt(z-Yj;D-%Lo6p1P$ICR|S#3^sDg&pS!+zUU zIWPhbah*cTojnalmFaaSP`}-jxhL)+DO;6!gYctz&3R?s2t0aBv~tQ7Bx}K1<(%k$ z@ckNH)0DK>r@Nv2F<3a2icSNZK!%ifyNTukSjt*R{(se^ZyKJG& zE^4OdD|+8WD{Hk?MZGU!Xm~3-bsj9l8Wp4%5%4)nzQ%$$Jstx8hR2vRp+W&M@wRiR{>{FDgKYD+I zr#2grM66LYxF1A~ldBH2)nkvfKy_vT#cLc@=LT8g&^k$VDF&tWagyqKN**e4ovPg* zO)pGQb=*SLIb5RpyFC(!{{Yp?r|YnT&QZPn%?_u|i>miyZNUmE_NhLmVMx-JVI7$o zigL->&@nxF?3nGg>!gcPUlRE$=~>K~srE6KW7J4h0CXe>!P&WbT~JnPUZy^SPQGKc z!|%lc+j4sa;nbhE{JT&dt)G}bO|KhIzx!xiende6`>10D{j12PuXCqej+8~~mSue2 z@X7w)Et>z^QkaF?@S5^Ta$>)mD9JE04Igcn{4T!xziXvI1^U!Ny)HYi{IQm3%7g7m zpYj@e@?c<>`Sp?h2LI`#V#c(`Q4xl`fA=`WP0{O8r|3SPpP?V0IyJXYH>n^$N1tA( z%gs+uEzHh0okrW1OfFyOKDC}~J`W>zl#D_=y3)<^xn z1*1Z<#A$=$yHA@F6F2|VzsuGCTVAM3pIT6$&nwhT&o9U*Urb52!Cn8iIa2v~djdP{ tO^n~-h-q`u9>u)=_XyknKVo8PVR}|}UZyUsAT?b-#dyl@q@^U7`!ATzLdpOD delta 6515 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 NoS9XbUqk}9{{x1v(1HK} diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts index 0103efed..a500b37c 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 只读 @@ -2861,7 +2861,7 @@ Are you really want to continue? - + Issues 编译器 @@ -3072,8 +3072,6 @@ Are you really want to continue? - - Compile 编译 @@ -3269,7 +3267,7 @@ Are you really want to continue? - + New Problem Set 新建试题集 @@ -3288,14 +3286,14 @@ Are you really want to continue? - + Save Problem Set 保存试题集 - + Load Problem Set 载入试题集 @@ -3731,7 +3729,7 @@ Are you really want to continue? - + Rename Symbol 重命名符号 @@ -3752,13 +3750,13 @@ Are you really want to continue? - + Export As RTF 导出为RTF - + Export As HTML 导出为HTML @@ -3824,7 +3822,7 @@ Are you really want to continue? - + Open Folder 打开文件夹 @@ -4055,7 +4053,7 @@ Are you really want to continue? - + Problem Set %1 试题集%1 @@ -4122,15 +4120,15 @@ Are you really want to continue? - - + + Bookmark Description 书签描述 - - + + Description: 描述: @@ -4294,10 +4292,16 @@ Are you really want to continue? - + Do you want to save it? 需要保存吗? + + + + File Changed + 文件已发生变化 + New Project File? @@ -4312,7 +4316,7 @@ Are you really want to continue? - + Save Error 保存失败 @@ -4337,160 +4341,160 @@ Are you really want to continue? 您真的要清除该文件的所有断点吗? - + 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 @@ -4615,28 +4619,37 @@ Are you really want to continue? C++语言项目 - + Name: 项目名称: - - Location: - 文件夹: + + Create in + 创建在 - + + Use as the default project location + 设为缺省项目位置 + + + Location: + 文件夹: + + + ... ... - + Project%1 项目%1 - - + + Default 缺省 @@ -5176,24 +5189,24 @@ Are you really want to continue? ProjectModel - + File exists 文件已存在 - + File '%1' already exists. Delete it now? 文件'%1'已存在。是否删除? - - + + Remove failed 删除失败 - - + + Failed to remove file '%1' 无法删除文件'%1' @@ -5412,7 +5425,7 @@ Are you really want to continue? QApplication - + Error 错误 @@ -5482,180 +5495,180 @@ Are you really want to continue? 无法写入配置文件夹"%1" - + Can't load autolink settings 无法载入自动链接设置 - - - - + + + + The following %1 directories don't exist: 下列%1文件夹不存在: - - + + binary 二进制 - + No %1 directories have been specified. 未指定%1文件夹 - + C include C包含 - - + + C++ include C++包含 - - - - + + + + Cannot find the %1 "%2" 无法找到%1程序"%2" - + C options C语言选项 - + Support all ANSI standard C programs (-ansi) 支持所有ANSI标准C程序(-ansi) - + Do not recognize asm,inline or typeof as a keyword (-fno-asm) 不支持将asm、inline和typeof作为关键字(-fno-asm) - + Imitate traditional C preprocessors (-traditional-cpp) 模仿传统C预处理器行为(-traditional-cpp) - + Code Generation 代码生成 - + Optimize for the following machine (-march) 生成特定机器的专用指令(-march) - + Optimize less, while maintaining full compatibility (-tune) 完整兼容特定机器,较少优化(-tune) - + Enable use of specific instructions (-mx) 启用特定指令集(-mx) - + Optimization level (-Ox) 优化级别(-Ox) - + Compile with the following pointer size (-mx) 使用下列指针大小编译(-mx) - + Language standard (-std) 语言标准(-std) - + Profile 性能分析 - + Generate debugging information (-g3) 生成调试信息(-g3) - + Generate profiling info for analysis (-pg) 生成性能分析信息(-pg) - + Warnings 代码警告 - + Inhibit all warning messages (-w) 忽略所有警告信息(-w) - + Show most warnings (-Wall) 启用常见问题警告(-Wall) - + Show some more warnings (-Wextra) 启用更多问题警告(-Wextra) - + Check ISO C/C++/C++0x conformance (-pedantic) 检查ISO C/C++/C++0x语法一致性(-pedantic) - + Only check the code for syntax errors (-fsyntax-only) 只进行语法检查(不编译)(-fsyntax-only) - + Make all warnings into errors (-Werror) 将警告作为错误处理(-Werror) - + Abort compilation on first error (-Wfatal-errors) 遇到第一个错误后立即中止编译(-Wfatal-errors) - + Linker 链接器 - + Link an Objective C program (-lobjc) 链接Objective-C程序 (-lobjc) - + Do not use standard system libraries (-nostdlib) 不使用标准库和系统启动文件(-nostdlib) - + Do not create a console window (-mwindows) 不产生控制台窗口(-mwindows) - + Strip executable (-s) 剥除附加信息(-s) @@ -5664,53 +5677,53 @@ Are you really want to continue? 链接Ojbective C程序(-lobjc) - + Output 输出 - + Put comments in generated assembly code (-fverbose-asm) 在生成的汇编代码中加入注释(-fverbose-asm) - + Use pipes instead of temporary files during compilation (-pipe) 编译时使用管道而不是临时文件(-pipe) - + Do not assemble, compile and generate the assemble code (-S) 只生成汇编代码(-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 @@ -6503,7 +6516,7 @@ Are you really want to continue? 自动链接 - + @@ -6579,7 +6592,7 @@ Are you really want to continue? 杂项 - + Program Runner @@ -7087,51 +7100,66 @@ Are you really want to continue? + Highlight + 高亮显示 + + + + Highlight matching braces + 高亮显示与光标处相匹配的括号 + + + + Highlight current word + 高亮显示光标所在的单词 + + + Scroll 滚动条 - + Auto hide scroll bars 自动隐藏滚动条 - + Can scroll the last char to the left edge of the editor 可以将每行末尾字符滚动到编辑器最左侧 - + Can scroll the last line to the top edge of the editor 可以将最后一行滚动到编辑器最上方 - + Page Up/Down scrolls half a page 翻页键只滚动半页 - + Forces page scroll to be one line less 在滚动页时少滚动一行 - + Mouse Wheel Scroll Speed 鼠标滚轮卷轴速度(行) - + Show right edge line 显示右边缘线 - + Right egde width 右边缘宽度 - + Right edge line color 右边缘颜色 diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 43287c3c..2996326d 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -920,7 +920,8 @@ void Editor::onPreparePaintHighlightToken(int line, int aChar, const QString &to foreground = mCurrentHighlighWordForeground; if (mCurrentHighlighWordBackground.isValid()) background = mCurrentHighlighWordBackground; - } else if (!selAvail() && attr->name() == SYNS_AttrSymbol) { + } else if (!selAvail() && attr->name() == SYNS_AttrSymbol + && pSettings->editor().highlightMathingBraces()) { // qDebug()<=0) { if (mTabStopY==caretY()) { if (mLineAfterTabStop.isEmpty()) { @@ -1437,7 +1434,11 @@ void Editor::onStatusChanged(SynStatusChanges changes) clearUserCodeInTabStops(); } } - } else if (!selAvail() && highlighter()){ + } else if (!selAvail() && highlighter() && pSettings->editor().highlightMathingBraces()){ + invalidateLine(mHighlightCharPos1.Line); + invalidateLine(mHighlightCharPos2.Line); + mHighlightCharPos1 = BufferCoord{0,0}; + mHighlightCharPos2 = BufferCoord{0,0}; // Is there a bracket char before us? int lineLength = lineText().length(); int ch = caretX() - 2; @@ -1471,8 +1472,11 @@ void Editor::onStatusChanged(SynStatusChanges changes) // scSelection includes anything caret related if (changes.testFlag(SynStatusChange::scSelection)) { - if (!selAvail()) { + if (!selAvail() && pSettings->editor().highlightCurrentWord()) { mCurrentHighlightedWord = wordAtCursor(); + } else if (selAvail() && blockBegin() == wordStart() + && blockEnd() == wordEnd()){ + mCurrentHighlightedWord = selText(); } else { mCurrentHighlightedWord = ""; } diff --git a/RedPandaIDE/main.cpp b/RedPandaIDE/main.cpp index c28f41ab..c3709e8a 100644 --- a/RedPandaIDE/main.cpp +++ b/RedPandaIDE/main.cpp @@ -80,7 +80,7 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); //Translation must be loaded first - QTranslator trans; + QTranslator trans,transQt; QString settingFilename = getSettingFilename(); if (!isGreenEdition()) { QDir::setCurrent(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0]); @@ -91,8 +91,13 @@ int main(int argc, char *argv[]) QSettings languageSetting(settingFilename,QSettings::IniFormat); languageSetting.beginGroup(SETTING_ENVIRONMENT); QString language = languageSetting.value("language",QLocale::system().name()).toString(); - if (trans.load("RedPandaIDE_"+language,":/translations")) + + if (trans.load("RedPandaIDE_"+language,":/translations")) { app.installTranslator(&trans); + } + if (transQt.load("qt_"+language,":/translations")) { + app.installTranslator(&transQt); + } } qRegisterMetaType("PCompileIssue"); diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 0133fb38..1afc24fa 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -4567,6 +4567,10 @@ void MainWindow::on_actionNew_Project_triggered() { NewProjectDialog dialog; if (dialog.exec() == QDialog::Accepted) { + if (dialog.useAsDefaultProjectDir()) { + pSettings->dirs().setProjectDir(dialog.getLocation()); + pSettings->dirs().save(); + } // Take care of the currently opened project QString s; if (mProject) { @@ -4587,19 +4591,20 @@ void MainWindow::on_actionNew_Project_triggered() } //Create the project folder - QDir dir(dialog.getLocation()); + QString location = includeTrailingPathDelimiter(dialog.getLocation())+dialog.getProjectName(); + QDir dir(location); if (!dir.exists()) { if (QMessageBox::question(this, tr("Folder not exist"), - tr("Folder '%1' doesn't exist. Create it now?").arg(dialog.getLocation()), + tr("Folder '%1' doesn't exist. Create it now?").arg(location), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) != QMessageBox::Yes) { return; } - if (!dir.mkpath(dialog.getLocation())) { + if (!dir.mkpath(location)) { QMessageBox::critical(this, tr("Can't create folder"), - tr("Failed to create folder '%1'.").arg(dialog.getLocation()), + tr("Failed to create folder '%1'.").arg(location), QMessageBox::Yes); return; } @@ -4608,14 +4613,14 @@ void MainWindow::on_actionNew_Project_triggered() // if cbDefault.Checked then // devData.DefCpp := rbCpp.Checked; - s = includeTrailingPathDelimiter(dialog.getLocation()) + s = includeTrailingPathDelimiter(location) + dialog.getProjectName() + "." + DEV_PROJECT_EXT; if (fileExists(s)) { QString saveName = QFileDialog::getSaveFileName( this, tr("Save new project as"), - dialog.getLocation(), + location, tr("Red panda Dev-C++ project file (*.dev)")); if (!saveName.isEmpty()) { s = saveName; diff --git a/RedPandaIDE/qsynedit/Types.cpp b/RedPandaIDE/qsynedit/Types.cpp index 19d93538..e4e985eb 100644 --- a/RedPandaIDE/qsynedit/Types.cpp +++ b/RedPandaIDE/qsynedit/Types.cpp @@ -234,3 +234,8 @@ void ContentsCoord::setCh(int newChar) { mChar = newChar; } + +bool BufferCoord::operator==(const BufferCoord &coord) +{ + return coord.Char == Char && coord.Line == Line; +} diff --git a/RedPandaIDE/qsynedit/Types.h b/RedPandaIDE/qsynedit/Types.h index 09b11c88..ce7fe313 100644 --- a/RedPandaIDE/qsynedit/Types.h +++ b/RedPandaIDE/qsynedit/Types.h @@ -10,6 +10,7 @@ enum class SynSelectionMode {smNormal, smLine, smColumn}; struct BufferCoord { int Char; int Line; + bool operator==(const BufferCoord& coord); }; class SynEdit; diff --git a/RedPandaIDE/qt_zh_CN.qm b/RedPandaIDE/qt_zh_CN.qm new file mode 100644 index 0000000000000000000000000000000000000000..77ff14416fc8cee0fcea4e0cbfa6c75124f647a4 GIT binary patch literal 117347 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 K0^Ih(asLPSj?`oT literal 0 HcmV?d00001 diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp index e8a2c1c4..ff5522d7 100644 --- a/RedPandaIDE/settings.cpp +++ b/RedPandaIDE/settings.cpp @@ -87,6 +87,7 @@ void Settings::load() mCodeCompletion.load(); mCodeFormatter.load(); mUI.load(); + mDirs.load(); } Settings::Dirs &Settings::dirs() @@ -161,12 +162,7 @@ QString Settings::Dirs::templateDir() const QString Settings::Dirs::projectDir() const { - if (isGreenEdition()) { - return includeTrailingPathDelimiter(app()) + "projects"; - } else { - return includeTrailingPathDelimiter(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0]) - + "projects"; - } + return mProjectDir; } QString Settings::Dirs::data(Settings::Dirs::DataType dataType) const @@ -205,12 +201,24 @@ QString Settings::Dirs::executable() const void Settings::Dirs::doSave() { - + saveValue("projectDir",mProjectDir); } void Settings::Dirs::doLoad() { + QString defaultProjectDir; + if (isGreenEdition()) { + defaultProjectDir = includeTrailingPathDelimiter(app()) + "projects"; + } else { + defaultProjectDir = includeTrailingPathDelimiter(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0]) + + "projects"; + } + mProjectDir = stringValue("projectDir",defaultProjectDir); +} +void Settings::Dirs::setProjectDir(const QString &newProjectDir) +{ + mProjectDir = newProjectDir; } Settings::_Base::_Base(Settings *settings, const QString &groupName): @@ -524,6 +532,26 @@ void Settings::Editor::setUseUTF8ByDefault(bool newUseUTF8ByDefault) mUseUTF8ByDefault = newUseUTF8ByDefault; } +bool Settings::Editor::highlightMathingBraces() const +{ + return mHighlightMathingBraces; +} + +void Settings::Editor::setHighlightMathingBraces(bool newHighlightMathingBraces) +{ + mHighlightMathingBraces = newHighlightMathingBraces; +} + +bool Settings::Editor::highlightCurrentWord() const +{ + return mHighlightCurrentWord; +} + +void Settings::Editor::setHighlightCurrentWord(bool newHighlightCurrentWord) +{ + mHighlightCurrentWord = newHighlightCurrentWord; +} + bool Settings::Editor::enableTooltips() const { return mEnableTooltips; @@ -994,6 +1022,7 @@ void Settings::Editor::doSave() saveValue("show_indent_lines", mShowIndentLines); saveValue("indent_line_color",mIndentLineColor); saveValue("fill_indents",mfillIndents); + // caret saveValue("enhance_home_key",mEnhanceHomeKey); saveValue("enhance_end_key",mEnhanceEndKey); @@ -1003,6 +1032,10 @@ void Settings::Editor::doSave() saveValue("caret_use_text_color",mCaretUseTextColor); saveValue("caret_color",mCaretColor); + //highlight + saveValue("highlight_matching_braces",mHighlightMathingBraces); + saveValue("highlight_current_word",mHighlightCurrentWord); + //scroll saveValue("auto_hide_scroll_bar", mAutoHideScrollbar); saveValue("scroll_past_eof", mScrollPastEof); @@ -1112,6 +1145,10 @@ void Settings::Editor::doLoad() mCaretUseTextColor = boolValue("caret_use_text_color",true); mCaretColor = colorValue("caret_color",QColorConstants::Svg::yellow); + //highlight + mHighlightMathingBraces = boolValue("highlight_matching_braces",true); + mHighlightCurrentWord = boolValue("highlight_current_word",true); + //scroll mAutoHideScrollbar = boolValue("auto_hide_scroll_bar", false); mScrollPastEof = boolValue("scroll_past_eof", true); diff --git a/RedPandaIDE/settings.h b/RedPandaIDE/settings.h index d6d6f0a4..23bfb885 100644 --- a/RedPandaIDE/settings.h +++ b/RedPandaIDE/settings.h @@ -96,10 +96,13 @@ public: QString config(DataType dataType = DataType::None) const; QString executable() const; - // _Base interface + void setProjectDir(const QString &newProjectDir); + protected: void doSave() override; void doLoad() override; + private: + QString mProjectDir; }; class Editor: public _Base { @@ -336,6 +339,12 @@ public: bool useUTF8ByDefault() const; void setUseUTF8ByDefault(bool newUseUTF8ByDefault); + bool highlightCurrentWord() const; + void setHighlightCurrentWord(bool newHighlightCurrentWord); + + bool highlightMathingBraces() const; + void setHighlightMathingBraces(bool newHighlightMathingBraces); + private: //General // indents @@ -354,6 +363,10 @@ public: bool mCaretUseTextColor; QColor mCaretColor; + //highlights + bool mHighlightCurrentWord; + bool mHighlightMathingBraces; + //scroll bool mAutoHideScrollbar; bool mScrollPastEof; diff --git a/RedPandaIDE/settingsdialog/editorgeneralwidget.cpp b/RedPandaIDE/settingsdialog/editorgeneralwidget.cpp index c31c91c8..acd839a3 100644 --- a/RedPandaIDE/settingsdialog/editorgeneralwidget.cpp +++ b/RedPandaIDE/settingsdialog/editorgeneralwidget.cpp @@ -52,6 +52,9 @@ void EditorGeneralWidget::doLoad() setCaretTypeIndex(ui->cbCaretForOverwrite,pSettings->editor().caretForOverwrite()); ui->chkCaretUseTextColor->setChecked(pSettings->editor().caretUseTextColor()); ui->colorCaret->setColor(pSettings->editor().caretColor()); + //highlight + ui->chkHighlightCurrentWord->setChecked(pSettings->editor().highlightCurrentWord()); + ui->chkHighlightMatchingBraces->setChecked(pSettings->editor().highlightMathingBraces()); //scrolls; ui->chkAutoHideScrollBars->setChecked(pSettings->editor().autoHideScrollbar()); ui->chkScrollPastEOF->setChecked(pSettings->editor().scrollPastEof()); @@ -84,6 +87,10 @@ void EditorGeneralWidget::doSave() pSettings->editor().setCaretForOverwrite(getCaretTypeIndex(ui->cbCaretForOverwrite)); pSettings->editor().setCaretUseTextColor(ui->chkCaretUseTextColor->isChecked()); pSettings->editor().setCaretColor(ui->colorCaret->color()); + //highlight + pSettings->editor().setHighlightCurrentWord(ui->chkHighlightCurrentWord->isChecked()); + pSettings->editor().setHighlightMathingBraces(ui->chkHighlightMatchingBraces->isChecked()); + //scrolls; pSettings->editor().setAutoHideScrollbar(ui->chkAutoHideScrollBars->isChecked()); pSettings->editor().setScrollPastEof(ui->chkScrollPastEOF->isChecked()); diff --git a/RedPandaIDE/settingsdialog/editorgeneralwidget.ui b/RedPandaIDE/settingsdialog/editorgeneralwidget.ui index 488070f8..760f4900 100644 --- a/RedPandaIDE/settingsdialog/editorgeneralwidget.ui +++ b/RedPandaIDE/settingsdialog/editorgeneralwidget.ui @@ -228,6 +228,29 @@ + + + + Highlight + + + + + + Highlight matching braces + + + + + + + Highlight current word + + + + + + diff --git a/RedPandaIDE/translations.qrc b/RedPandaIDE/translations.qrc index e8eb9d01..6d8b6359 100644 --- a/RedPandaIDE/translations.qrc +++ b/RedPandaIDE/translations.qrc @@ -1,5 +1,6 @@ RedPandaIDE_zh_CN.qm + qt_zh_CN.qm diff --git a/RedPandaIDE/widgets/darkfusionstyle.cpp b/RedPandaIDE/widgets/darkfusionstyle.cpp index b5cc66c9..ad65c51e 100644 --- a/RedPandaIDE/widgets/darkfusionstyle.cpp +++ b/RedPandaIDE/widgets/darkfusionstyle.cpp @@ -794,6 +794,11 @@ QIcon DarkFusionStyle::standardIcon(StandardPixmap standardIcon, const QStyleOpt return QProxyStyle::standardIcon(standardIcon, option, widget); } +void DarkFusionStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const +{ + QProxyStyle::drawComplexControl(control,option,painter,widget); +} + void DarkFusionStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { diff --git a/RedPandaIDE/widgets/darkfusionstyle.h b/RedPandaIDE/widgets/darkfusionstyle.h index d31c1627..2aa6694d 100644 --- a/RedPandaIDE/widgets/darkfusionstyle.h +++ b/RedPandaIDE/widgets/darkfusionstyle.h @@ -16,6 +16,11 @@ public: const QWidget *widget) const override; QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; + + // QStyle interface +public: + void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, + QPainter *painter, const QWidget *widget) const override; }; #endif // DARKFUSIONSTYLE_H diff --git a/RedPandaIDE/widgets/newprojectdialog.cpp b/RedPandaIDE/widgets/newprojectdialog.cpp index fc212347..076fa4d2 100644 --- a/RedPandaIDE/widgets/newprojectdialog.cpp +++ b/RedPandaIDE/widgets/newprojectdialog.cpp @@ -20,11 +20,12 @@ NewProjectDialog::NewProjectDialog(QWidget *parent) : int i=0; QString projectName; QString location; + location = excludeTrailingPathDelimiter(pSettings->dirs().projectDir()); while (true) { i++; projectName = tr("Project%1").arg(i); - location = includeTrailingPathDelimiter(pSettings->dirs().projectDir()) + projectName; - if (!QDir(location).exists()) + QString tempLocation = includeTrailingPathDelimiter(location)+projectName; + if (!QDir(tempLocation).exists()) break; } ui->txtProjectName->setText(projectName); @@ -65,6 +66,11 @@ QString NewProjectDialog::getProjectName() return ui->txtProjectName->text(); } +bool NewProjectDialog::useAsDefaultProjectDir() +{ + return ui->chkAsDefaultLocation->isChecked(); +} + bool NewProjectDialog::isCProject() { return ui->rdCProject->isChecked(); @@ -159,12 +165,7 @@ void NewProjectDialog::updateView() void NewProjectDialog::updateProjectLocation() { - ui->txtLocation->setText( - includeTrailingPathDelimiter( - extractFilePath( - ui->txtLocation->text())) - + ui->txtProjectName->text() - ); + QString newLocation = ui->txtLocation->text(); QListWidgetItem * current = ui->lstTemplates->currentItem(); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled( @@ -210,7 +211,7 @@ void NewProjectDialog::on_btnBrowse_clicked() } QString dir = QFileDialog::getExistingDirectory( this, - "Project directory", + "Choose directory", dirPath ); if (!dir.isEmpty()) { diff --git a/RedPandaIDE/widgets/newprojectdialog.h b/RedPandaIDE/widgets/newprojectdialog.h index 1c8b20b0..95690fd0 100644 --- a/RedPandaIDE/widgets/newprojectdialog.h +++ b/RedPandaIDE/widgets/newprojectdialog.h @@ -20,6 +20,7 @@ public: PProjectTemplate getTemplate(); QString getLocation(); QString getProjectName(); + bool useAsDefaultProjectDir(); bool isCProject(); bool isCppProject(); bool makeProjectDefault(); diff --git a/RedPandaIDE/widgets/newprojectdialog.ui b/RedPandaIDE/widgets/newprojectdialog.ui index 533bad7e..414d8186 100644 --- a/RedPandaIDE/widgets/newprojectdialog.ui +++ b/RedPandaIDE/widgets/newprojectdialog.ui @@ -7,7 +7,7 @@ 0 0 670 - 528 + 546 @@ -85,6 +85,12 @@ + + + + + + @@ -92,16 +98,6 @@ - - - - Location: - - - - - - @@ -114,8 +110,19 @@ - - + + + + Create in + + + + + + + Use as the default project location + +