Merge branch 'projectview'

This commit is contained in:
Roy Qu 2022-02-09 20:50:10 +08:00
commit 52e9a49b3a
15 changed files with 578 additions and 328 deletions

View File

@ -1,3 +1,7 @@
Red Panda C++ Version 0.14.2
- enhancement: file system view mode for project
- enhancement: remove / rename / create new folder in the files view
Red Panda C++ Version 0.14.1 Red Panda C++ Version 0.14.1
- enhancement: custom theme - enhancement: custom theme
- fix: failed to show function tip, when there are parameters having '[' and ']' - fix: failed to show function tip, when there are parameters having '[' and ']'

View File

@ -10,7 +10,7 @@ isEmpty(APP_NAME) {
} }
isEmpty(APP_VERSION) { isEmpty(APP_VERSION) {
APP_VERSION=0.14.1 APP_VERSION=0.14.2
} }
isEmpty(PREFIX) { isEmpty(PREFIX) {

View File

@ -3272,11 +3272,11 @@ Are you really want to continue?</oldsource>
<message> <message>
<location filename="mainwindow.ui" line="527"/> <location filename="mainwindow.ui" line="527"/>
<location filename="mainwindow.ui" line="2581"/> <location filename="mainwindow.ui" line="2581"/>
<location filename="mainwindow.cpp" line="3938"/> <location filename="mainwindow.cpp" line="3959"/>
<location filename="mainwindow.cpp" line="3941"/> <location filename="mainwindow.cpp" line="3962"/>
<location filename="mainwindow.cpp" line="3945"/> <location filename="mainwindow.cpp" line="3966"/>
<location filename="mainwindow.cpp" line="3948"/> <location filename="mainwindow.cpp" line="3969"/>
<location filename="mainwindow.cpp" line="5512"/> <location filename="mainwindow.cpp" line="5532"/>
<source>Issues</source> <source>Issues</source>
<translation></translation> <translation></translation>
</message> </message>
@ -3688,7 +3688,7 @@ Are you really want to continue?</oldsource>
<message> <message>
<location filename="mainwindow.ui" line="326"/> <location filename="mainwindow.ui" line="326"/>
<location filename="mainwindow.ui" line="329"/> <location filename="mainwindow.ui" line="329"/>
<location filename="mainwindow.cpp" line="5825"/> <location filename="mainwindow.cpp" line="5843"/>
<source>New Problem Set</source> <source>New Problem Set</source>
<translation></translation> <translation></translation>
</message> </message>
@ -3707,14 +3707,14 @@ Are you really want to continue?</oldsource>
<message> <message>
<location filename="mainwindow.ui" line="368"/> <location filename="mainwindow.ui" line="368"/>
<location filename="mainwindow.ui" line="371"/> <location filename="mainwindow.ui" line="371"/>
<location filename="mainwindow.cpp" line="5868"/> <location filename="mainwindow.cpp" line="5886"/>
<source>Save Problem Set</source> <source>Save Problem Set</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="382"/> <location filename="mainwindow.ui" line="382"/>
<location filename="mainwindow.ui" line="385"/> <location filename="mainwindow.ui" line="385"/>
<location filename="mainwindow.cpp" line="5888"/> <location filename="mainwindow.cpp" line="5910"/>
<source>Load Problem Set</source> <source>Load Problem Set</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4053,7 +4053,7 @@ Are you really want to continue?</oldsource>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="2259"/> <location filename="mainwindow.ui" line="2259"/>
<location filename="mainwindow.cpp" line="4806"/> <location filename="mainwindow.cpp" line="4826"/>
<source>Clear all breakpoints</source> <source>Clear all breakpoints</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4154,7 +4154,7 @@ Are you really want to continue?</oldsource>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="2413"/> <location filename="mainwindow.ui" line="2413"/>
<location filename="mainwindow.cpp" line="5463"/> <location filename="mainwindow.cpp" line="5483"/>
<source>Rename Symbol</source> <source>Rename Symbol</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4175,13 +4175,13 @@ Are you really want to continue?</oldsource>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="2433"/> <location filename="mainwindow.ui" line="2433"/>
<location filename="mainwindow.cpp" line="5643"/> <location filename="mainwindow.cpp" line="5661"/>
<source>Export As RTF</source> <source>Export As RTF</source>
<translation>RTF</translation> <translation>RTF</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="2438"/> <location filename="mainwindow.ui" line="2438"/>
<location filename="mainwindow.cpp" line="5665"/> <location filename="mainwindow.cpp" line="5683"/>
<source>Export As HTML</source> <source>Export As HTML</source>
<translation>HTML</translation> <translation>HTML</translation>
</message> </message>
@ -4344,7 +4344,7 @@ Are you really want to continue?</oldsource>
</message> </message>
<message> <message>
<location filename="mainwindow.ui" line="2503"/> <location filename="mainwindow.ui" line="2503"/>
<location filename="mainwindow.cpp" line="5804"/> <location filename="mainwindow.cpp" line="5822"/>
<source>Open Folder</source> <source>Open Folder</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4354,7 +4354,7 @@ Are you really want to continue?</oldsource>
<translation>...</translation> <translation>...</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2758"/> <location filename="mainwindow.cpp" line="2772"/>
<source>File Encoding</source> <source>File Encoding</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4584,7 +4584,7 @@ Are you really want to continue?</oldsource>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="268"/> <location filename="mainwindow.cpp" line="268"/>
<location filename="mainwindow.cpp" line="5834"/> <location filename="mainwindow.cpp" line="5852"/>
<source>Problem Set %1</source> <source>Problem Set %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
@ -4658,15 +4658,15 @@ Are you really want to continue?</oldsource>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2261"/> <location filename="mainwindow.cpp" line="2261"/>
<location filename="mainwindow.cpp" line="5723"/> <location filename="mainwindow.cpp" line="5741"/>
<location filename="mainwindow.cpp" line="5763"/> <location filename="mainwindow.cpp" line="5781"/>
<source>Bookmark Description</source> <source>Bookmark Description</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2262"/> <location filename="mainwindow.cpp" line="2262"/>
<location filename="mainwindow.cpp" line="5724"/> <location filename="mainwindow.cpp" line="5742"/>
<location filename="mainwindow.cpp" line="5764"/> <location filename="mainwindow.cpp" line="5782"/>
<source>Description:</source> <source>Description:</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4742,195 +4742,205 @@ Are you really want to continue?</oldsource>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2529"/> <location filename="mainwindow.cpp" line="2524"/>
<source>Switch to normal view</source>
<translation></translation>
</message>
<message>
<location filename="mainwindow.cpp" line="2531"/>
<source>Switch to custom view</source>
<translation></translation>
</message>
<message>
<location filename="mainwindow.cpp" line="2543"/>
<source>Sort By Type</source> <source>Sort By Type</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2534"/> <location filename="mainwindow.cpp" line="2548"/>
<source>Sort alphabetically</source> <source>Sort alphabetically</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2539"/> <location filename="mainwindow.cpp" line="2553"/>
<source>Show inherited members</source> <source>Show inherited members</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2544"/> <location filename="mainwindow.cpp" line="2558"/>
<source>Goto declaration</source> <source>Goto declaration</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2547"/> <location filename="mainwindow.cpp" line="2561"/>
<source>Goto definition</source> <source>Goto definition</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2639"/> <location filename="mainwindow.cpp" line="2653"/>
<source>Open in Editor</source> <source>Open in Editor</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2651"/> <location filename="mainwindow.cpp" line="2665"/>
<source>Open in External Program</source> <source>Open in External Program</source>
<translation>使</translation> <translation>使</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2661"/> <location filename="mainwindow.cpp" line="2675"/>
<source>Open in Terminal</source> <source>Open in Terminal</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2677"/> <location filename="mainwindow.cpp" line="2691"/>
<source>Open in Windows Explorer</source> <source>Open in Windows Explorer</source>
<translation>Windows浏览器中打开</translation> <translation>Windows浏览器中打开</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2724"/> <location filename="mainwindow.cpp" line="2738"/>
<source>Character sets</source> <source>Character sets</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="2850"/> <location filename="mainwindow.cpp" line="2864"/>
<source>%1 files autosaved</source> <source>%1 files autosaved</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3027"/> <location filename="mainwindow.cpp" line="3046"/>
<source>Set answer to...</source> <source>Set answer to...</source>
<translation>...</translation> <translation>...</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3059"/> <location filename="mainwindow.cpp" line="3078"/>
<source>select other file...</source> <source>select other file...</source>
<translation>...</translation> <translation>...</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3065"/> <location filename="mainwindow.cpp" line="3084"/>
<source>Select Answer Source File</source> <source>Select Answer Source File</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3067"/> <location filename="mainwindow.cpp" line="3086"/>
<source>C/C++Source Files (*.c *.cpp *.cc *.cxx)</source> <source>C/C++Source Files (*.c *.cpp *.cc *.cxx)</source>
<oldsource>C/C++Source Files (*.c *.cpp *.cc *.cxx</oldsource> <oldsource>C/C++Source Files (*.c *.cpp *.cc *.cxx</oldsource>
<translation>C/C++ (*.c *.cpp *.cc *.cxx)</translation> <translation>C/C++ (*.c *.cpp *.cc *.cxx)</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3471"/> <location filename="mainwindow.cpp" line="3492"/>
<source>Save project</source> <source>Save project</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3472"/> <location filename="mainwindow.cpp" line="3493"/>
<source>The project &apos;%1&apos; has modifications.</source> <source>The project &apos;%1&apos; has modifications.</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3474"/> <location filename="mainwindow.cpp" line="3495"/>
<location filename="mainwindow.cpp" line="5828"/> <location filename="mainwindow.cpp" line="5846"/>
<source>Do you want to save it?</source> <source>Do you want to save it?</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3561"/> <location filename="mainwindow.cpp" line="3582"/>
<location filename="mainwindow.cpp" line="3572"/> <location filename="mainwindow.cpp" line="3593"/>
<source>File Changed</source> <source>File Changed</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3631"/> <location filename="mainwindow.cpp" line="3652"/>
<source>New Project File?</source> <source>New Project File?</source>
<translation>?</translation> <translation>?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3632"/> <location filename="mainwindow.cpp" line="3653"/>
<source>Do you want to add the new file to the project?</source> <source>Do you want to add the new file to the project?</source>
<translation>?</translation> <translation>?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3708"/> <location filename="mainwindow.cpp" line="3729"/>
<location filename="mainwindow.cpp" line="3718"/> <location filename="mainwindow.cpp" line="3739"/>
<location filename="mainwindow.cpp" line="3730"/> <location filename="mainwindow.cpp" line="3751"/>
<location filename="mainwindow.cpp" line="5877"/> <location filename="mainwindow.cpp" line="5899"/>
<source>Save Error</source> <source>Save Error</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3871"/> <location filename="mainwindow.cpp" line="3892"/>
<source>Change Project Compiler Set</source> <source>Change Project Compiler Set</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3872"/> <location filename="mainwindow.cpp" line="3893"/>
<source>Change the project&apos;s compiler set will lose all custom compiler set options.</source> <source>Change the project&apos;s compiler set will lose all custom compiler set options.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3874"/> <location filename="mainwindow.cpp" line="3895"/>
<source>Do you really want to do that?</source> <source>Do you really want to do that?</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4807"/> <location filename="mainwindow.cpp" line="4827"/>
<source>Do you really want to clear all breakpoints in this file?</source> <source>Do you really want to clear all breakpoints in this file?</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5005"/> <location filename="mainwindow.cpp" line="5025"/>
<source>New project</source> <source>New project</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5006"/> <location filename="mainwindow.cpp" line="5026"/>
<source>Close %1 and start new project?</source> <source>Close %1 and start new project?</source>
<translation>&apos;%1&apos;?</translation> <translation>&apos;%1&apos;?</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5019"/> <location filename="mainwindow.cpp" line="5039"/>
<source>Folder not exist</source> <source>Folder not exist</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5020"/> <location filename="mainwindow.cpp" line="5040"/>
<source>Folder &apos;%1&apos; doesn&apos;t exist. Create it now?</source> <source>Folder &apos;%1&apos; doesn&apos;t exist. Create it now?</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5027"/> <location filename="mainwindow.cpp" line="5047"/>
<source>Can&apos;t create folder</source> <source>Can&apos;t create folder</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5028"/> <location filename="mainwindow.cpp" line="5048"/>
<source>Failed to create folder &apos;%1&apos;.</source> <source>Failed to create folder &apos;%1&apos;.</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5043"/> <location filename="mainwindow.cpp" line="5063"/>
<source>Save new project as</source> <source>Save new project as</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="6170"/> <location filename="mainwindow.cpp" line="6192"/>
<location filename="mainwindow.cpp" line="6222"/> <location filename="mainwindow.cpp" line="6244"/>
<source>Header Exists</source> <source>Header Exists</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="6171"/> <location filename="mainwindow.cpp" line="6193"/>
<location filename="mainwindow.cpp" line="6223"/> <location filename="mainwindow.cpp" line="6245"/>
<source>Header file &quot;%1&quot; already exists!</source> <source>Header file &quot;%1&quot; already exists!</source>
<translation>&quot;%1&quot;</translation> <translation>&quot;%1&quot;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="6228"/> <location filename="mainwindow.cpp" line="6250"/>
<source>Source Exists</source> <source>Source Exists</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="6229"/> <location filename="mainwindow.cpp" line="6251"/>
<source>Source file &quot;%1&quot; already exists!</source> <source>Source file &quot;%1&quot; already exists!</source>
<translation>&quot;%1&quot;</translation> <translation>&quot;%1&quot;</translation>
</message> </message>
@ -4939,125 +4949,125 @@ Are you really want to continue?</oldsource>
<translation type="vanished">Dev-C++ (*.dev)</translation> <translation type="vanished">Dev-C++ (*.dev)</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5056"/> <location filename="mainwindow.cpp" line="5076"/>
<source>New project fail</source> <source>New project fail</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5057"/> <location filename="mainwindow.cpp" line="5077"/>
<source>Can&apos;t assign project template</source> <source>Can&apos;t assign project template</source>
<translation>使</translation> <translation>使</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5144"/> <location filename="mainwindow.cpp" line="5164"/>
<source>Remove file</source> <source>Remove file</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5145"/> <location filename="mainwindow.cpp" line="5165"/>
<source>Remove the file from disk?</source> <source>Remove the file from disk?</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5334"/> <location filename="mainwindow.cpp" line="5354"/>
<source>untitled</source> <source>untitled</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5344"/> <location filename="mainwindow.cpp" line="5364"/>
<source>New Project File Name</source> <source>New Project File Name</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5345"/> <location filename="mainwindow.cpp" line="5365"/>
<source>File Name:</source> <source>File Name:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5351"/> <location filename="mainwindow.cpp" line="5371"/>
<source>File Already Exists!</source> <source>File Already Exists!</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5352"/> <location filename="mainwindow.cpp" line="5372"/>
<source>File &apos;%1&apos; already exists!</source> <source>File &apos;%1&apos; already exists!</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5101"/> <location filename="mainwindow.cpp" line="5121"/>
<source>Add to project</source> <source>Add to project</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5045"/> <location filename="mainwindow.cpp" line="5065"/>
<source>Red Panda C++ project file (*.dev)</source> <source>Red Panda C++ project file (*.dev)</source>
<translation>C++(*.dev)</translation> <translation>C++(*.dev)</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5449"/> <location filename="mainwindow.cpp" line="5469"/>
<source>Rename Error</source> <source>Rename Error</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5450"/> <location filename="mainwindow.cpp" line="5470"/>
<source>Symbol &apos;%1&apos; is defined in system header.</source> <source>Symbol &apos;%1&apos; is defined in system header.</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5464"/> <location filename="mainwindow.cpp" line="5484"/>
<source>New Name</source> <source>New Name</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5588"/> <location filename="mainwindow.cpp" line="5606"/>
<location filename="mainwindow.cpp" line="5598"/> <location filename="mainwindow.cpp" line="5616"/>
<source>Replace Error</source> <source>Replace Error</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5589"/> <location filename="mainwindow.cpp" line="5607"/>
<source>Can&apos;t open file &apos;%1&apos; for replace!</source> <source>Can&apos;t open file &apos;%1&apos; for replace!</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5599"/> <location filename="mainwindow.cpp" line="5617"/>
<source>Contents has changed since last search!</source> <source>Contents has changed since last search!</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5645"/> <location filename="mainwindow.cpp" line="5663"/>
<source>Rich Text Format Files (*.rtf)</source> <source>Rich Text Format Files (*.rtf)</source>
<translation>RTF格式文件 (*.rtf)</translation> <translation>RTF格式文件 (*.rtf)</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5667"/> <location filename="mainwindow.cpp" line="5685"/>
<source>HTML Files (*.html)</source> <source>HTML Files (*.html)</source>
<translation>HTML文件 (*.html)</translation> <translation>HTML文件 (*.html)</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5826"/> <location filename="mainwindow.cpp" line="5844"/>
<source>The current problem set is not empty.</source> <source>The current problem set is not empty.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5844"/> <location filename="mainwindow.cpp" line="5862"/>
<source>Problem %1</source> <source>Problem %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5870"/> <location filename="mainwindow.cpp" line="5888"/>
<location filename="mainwindow.cpp" line="5890"/> <location filename="mainwindow.cpp" line="5912"/>
<source>Problem Set Files (*.pbs)</source> <source>Problem Set Files (*.pbs)</source>
<translation> (*.pbs)</translation> <translation> (*.pbs)</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5896"/> <location filename="mainwindow.cpp" line="5918"/>
<source>Load Error</source> <source>Load Error</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3207"/> <location filename="mainwindow.cpp" line="3228"/>
<location filename="mainwindow.cpp" line="5910"/> <location filename="mainwindow.cpp" line="5932"/>
<source>Problem Case %1</source> <source>Problem Case %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
@ -5070,13 +5080,13 @@ Are you really want to continue?</oldsource>
<location filename="mainwindow.cpp" line="248"/> <location filename="mainwindow.cpp" line="248"/>
<location filename="mainwindow.cpp" line="1025"/> <location filename="mainwindow.cpp" line="1025"/>
<location filename="mainwindow.cpp" line="2142"/> <location filename="mainwindow.cpp" line="2142"/>
<location filename="mainwindow.cpp" line="2749"/> <location filename="mainwindow.cpp" line="2763"/>
<location filename="mainwindow.cpp" line="3568"/> <location filename="mainwindow.cpp" line="3589"/>
<location filename="mainwindow.cpp" line="3666"/> <location filename="mainwindow.cpp" line="3687"/>
<location filename="mainwindow.cpp" line="3840"/> <location filename="mainwindow.cpp" line="3861"/>
<location filename="mainwindow.cpp" line="3852"/> <location filename="mainwindow.cpp" line="3873"/>
<location filename="mainwindow.cpp" line="4254"/> <location filename="mainwindow.cpp" line="4274"/>
<location filename="mainwindow.cpp" line="4266"/> <location filename="mainwindow.cpp" line="4286"/>
<source>Error</source> <source>Error</source>
<translation></translation> <translation></translation>
</message> </message>
@ -5091,75 +5101,75 @@ Are you really want to continue?</oldsource>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3562"/> <location filename="mainwindow.cpp" line="3583"/>
<source>File &apos;%1&apos; was changed.</source> <source>File &apos;%1&apos; was changed.</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3562"/> <location filename="mainwindow.cpp" line="3583"/>
<source>Reload its content from disk?</source> <source>Reload its content from disk?</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3573"/> <location filename="mainwindow.cpp" line="3594"/>
<source>File &apos;%1&apos; was removed.</source> <source>File &apos;%1&apos; was removed.</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3573"/> <location filename="mainwindow.cpp" line="3594"/>
<source>Keep it open?</source> <source>Keep it open?</source>
<translation>C++</translation> <translation>C++</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="3659"/> <location filename="mainwindow.cpp" line="3680"/>
<source>Open</source> <source>Open</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4031"/> <location filename="mainwindow.cpp" line="4052"/>
<source>Compile Failed</source> <source>Compile Failed</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4037"/> <location filename="mainwindow.cpp" line="4058"/>
<source>Run Failed</source> <source>Run Failed</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4283"/> <location filename="mainwindow.cpp" line="4303"/>
<location filename="mainwindow.cpp" line="4297"/> <location filename="mainwindow.cpp" line="4317"/>
<source>Confirm Convertion</source> <source>Confirm Convertion</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4284"/> <location filename="mainwindow.cpp" line="4304"/>
<location filename="mainwindow.cpp" line="4298"/> <location filename="mainwindow.cpp" line="4318"/>
<source>The editing file will be saved using %1 encoding. &lt;br /&gt;This operation can&apos;t be reverted. &lt;br /&gt;Are you sure to continue?</source> <source>The editing file will be saved using %1 encoding. &lt;br /&gt;This operation can&apos;t be reverted. &lt;br /&gt;Are you sure to continue?</source>
<translation>使%1&lt;br /&gt;&lt;br /&gt;</translation> <translation>使%1&lt;br /&gt;&lt;br /&gt;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4448"/> <location filename="mainwindow.cpp" line="4468"/>
<source>New Watch Expression</source> <source>New Watch Expression</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4449"/> <location filename="mainwindow.cpp" line="4469"/>
<source>Enter Watch Expression (it is recommended to use &apos;this-&gt;&apos; for class members):</source> <source>Enter Watch Expression (it is recommended to use &apos;this-&gt;&apos; for class members):</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4502"/> <location filename="mainwindow.cpp" line="4522"/>
<source>Parsing file %1 of %2: &quot;%3&quot;</source> <source>Parsing file %1 of %2: &quot;%3&quot;</source>
<translation>%1/%2&quot;%3&quot;</translation> <translation>%1/%2&quot;%3&quot;</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4524"/> <location filename="mainwindow.cpp" line="4544"/>
<location filename="mainwindow.cpp" line="4530"/> <location filename="mainwindow.cpp" line="4550"/>
<source>Done parsing %1 files in %2 seconds</source> <source>Done parsing %1 files in %2 seconds</source>
<translation>%1,%2</translation> <translation>%1,%2</translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="4527"/> <location filename="mainwindow.cpp" line="4547"/>
<source>(%1 files per second)</source> <source>(%1 files per second)</source>
<translation>(%1</translation> <translation>(%1</translation>
</message> </message>
@ -5325,22 +5335,22 @@ Are you really want to continue?</oldsource>
<context> <context>
<name>OJProblemCasesRunner</name> <name>OJProblemCasesRunner</name>
<message> <message>
<location filename="compiler/ojproblemcasesrunner.cpp" line="125"/> <location filename="compiler/ojproblemcasesrunner.cpp" line="126"/>
<source>The runner process &apos;%1&apos; failed to start.</source> <source>The runner process &apos;%1&apos; failed to start.</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="compiler/ojproblemcasesrunner.cpp" line="132"/> <location filename="compiler/ojproblemcasesrunner.cpp" line="133"/>
<source>The last waitFor...() function timed out.</source> <source>The last waitFor...() function timed out.</source>
<translation>waitFor()</translation> <translation>waitFor()</translation>
</message> </message>
<message> <message>
<location filename="compiler/ojproblemcasesrunner.cpp" line="135"/> <location filename="compiler/ojproblemcasesrunner.cpp" line="136"/>
<source>An error occurred when attempting to write to the runner process.</source> <source>An error occurred when attempting to write to the runner process.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="compiler/ojproblemcasesrunner.cpp" line="138"/> <location filename="compiler/ojproblemcasesrunner.cpp" line="139"/>
<source>An error occurred when attempting to read from the runner process.</source> <source>An error occurred when attempting to read from the runner process.</source>
<translation></translation> <translation></translation>
</message> </message>
@ -5391,83 +5401,98 @@ Are you really want to continue?</oldsource>
<translation>&apos;%1&apos;!</translation> <translation>&apos;%1&apos;!</translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="252"/> <location filename="project.cpp" line="254"/>
<source>untitled</source> <source>untitled</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="521"/> <location filename="project.cpp" line="548"/>
<source>Can&apos;t save file</source> <source>Can&apos;t save file</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="522"/> <location filename="project.cpp" line="549"/>
<source>Can&apos;t save file &apos;%1&apos;</source> <source>Can&apos;t save file &apos;%1&apos;</source>
<translation>&apos;%1&apos;.</translation> <translation>&apos;%1&apos;.</translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="714"/> <location filename="project.cpp" line="741"/>
<source>Error Load File</source> <source>Error Load File</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="824"/> <location filename="project.cpp" line="853"/>
<source>File Exists</source> <source>File Exists</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="825"/> <location filename="project.cpp" line="854"/>
<source>File &apos;%1&apos; is already in the project</source> <source>File &apos;%1&apos; is already in the project</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1203"/> <location filename="project.cpp" line="1232"/>
<source>Project Updated</source> <source>Project Updated</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1204"/> <location filename="project.cpp" line="1233"/>
<source>Your project was succesfully updated to a newer file format!</source> <source>Your project was succesfully updated to a newer file format!</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1206"/> <location filename="project.cpp" line="1235"/>
<source>If something has gone wrong, we kept a backup-file: &apos;%1&apos;...</source> <source>If something has gone wrong, we kept a backup-file: &apos;%1&apos;...</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1369"/> <location filename="project.cpp" line="1279"/>
<source>Headers</source>
<translation></translation>
</message>
<message>
<location filename="project.cpp" line="1285"/>
<source>Sources</source>
<translation></translation>
</message>
<message>
<location filename="project.cpp" line="1291"/>
<source>Others</source>
<translation></translation>
</message>
<message>
<location filename="project.cpp" line="1451"/>
<source>Settings need update</source> <source>Settings need update</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1370"/> <location filename="project.cpp" line="1452"/>
<source>The compiler settings format of Red Panda C++ has changed.</source> <source>The compiler settings format of Red Panda C++ has changed.</source>
<oldsource>The compiler settings format of Dev-C++ has changed.</oldsource> <oldsource>The compiler settings format of Dev-C++ has changed.</oldsource>
<translation>C++</translation> <translation>C++</translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1372"/> <location filename="project.cpp" line="1454"/>
<source>Please update your settings at Project &gt;&gt; Project Options &gt;&gt; Compiler and save your project.</source> <source>Please update your settings at Project &gt;&gt; Project Options &gt;&gt; Compiler and save your project.</source>
<translation> &gt;&gt; &gt;&gt; </translation> <translation> &gt;&gt; &gt;&gt; </translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1408"/> <location filename="project.cpp" line="1491"/>
<source>Compiler not found</source> <source>Compiler not found</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1409"/> <location filename="project.cpp" line="1492"/>
<source>The compiler set you have selected for this project, no longer exists.</source> <source>The compiler set you have selected for this project, no longer exists.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1411"/> <location filename="project.cpp" line="1494"/>
<source>It will be substituted by the global compiler set.</source> <source>It will be substituted by the global compiler set.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1450"/> <location filename="project.cpp" line="1533"/>
<source>Developed using the Red Panda C++ IDE</source> <source>Developed using the Red Panda C++ IDE</source>
<oldsource>Developed using the Red Panda Dev-C++ IDE</oldsource> <oldsource>Developed using the Red Panda Dev-C++ IDE</oldsource>
<translation>使C++</translation> <translation>使C++</translation>
@ -5696,12 +5721,12 @@ Are you really want to continue?</oldsource>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="settingsdialog/projectfileswidget.cpp" line="251"/> <location filename="settingsdialog/projectfileswidget.cpp" line="250"/>
<source>Auto detect</source> <source>Auto detect</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="settingsdialog/projectfileswidget.cpp" line="252"/> <location filename="settingsdialog/projectfileswidget.cpp" line="251"/>
<source>ANSI</source> <source>ANSI</source>
<translation>ANSI</translation> <translation>ANSI</translation>
</message> </message>
@ -5710,7 +5735,7 @@ Are you really want to continue?</oldsource>
<translation type="vanished">ANSI</translation> <translation type="vanished">ANSI</translation>
</message> </message>
<message> <message>
<location filename="settingsdialog/projectfileswidget.cpp" line="253"/> <location filename="settingsdialog/projectfileswidget.cpp" line="252"/>
<source>UTF-8</source> <source>UTF-8</source>
<translation></translation> <translation></translation>
</message> </message>
@ -5874,24 +5899,24 @@ Are you really want to continue?</oldsource>
<context> <context>
<name>ProjectModel</name> <name>ProjectModel</name>
<message> <message>
<location filename="project.cpp" line="1967"/> <location filename="project.cpp" line="2050"/>
<source>File exists</source> <source>File exists</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1968"/> <location filename="project.cpp" line="2051"/>
<source>File &apos;%1&apos; already exists. Delete it now?</source> <source>File &apos;%1&apos; already exists. Delete it now?</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1986"/> <location filename="project.cpp" line="2069"/>
<location filename="project.cpp" line="2006"/> <location filename="project.cpp" line="2089"/>
<source>Remove failed</source> <source>Remove failed</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="project.cpp" line="1987"/> <location filename="project.cpp" line="2070"/>
<location filename="project.cpp" line="2007"/> <location filename="project.cpp" line="2090"/>
<source>Failed to remove file &apos;%1&apos;</source> <source>Failed to remove file &apos;%1&apos;</source>
<translation>&apos;%1&apos;</translation> <translation>&apos;%1&apos;</translation>
</message> </message>
@ -7273,7 +7298,7 @@ Are you really want to continue?</oldsource>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5815"/> <location filename="mainwindow.cpp" line="5833"/>
<location filename="settingsdialog/settingsdialog.cpp" line="169"/> <location filename="settingsdialog/settingsdialog.cpp" line="169"/>
<location filename="settingsdialog/settingsdialog.cpp" line="202"/> <location filename="settingsdialog/settingsdialog.cpp" line="202"/>
<location filename="settingsdialog/settingsdialog.cpp" line="208"/> <location filename="settingsdialog/settingsdialog.cpp" line="208"/>
@ -7349,15 +7374,15 @@ Are you really want to continue?</oldsource>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="5816"/> <location filename="mainwindow.cpp" line="5834"/>
<location filename="mainwindow.cpp" line="6125"/> <location filename="mainwindow.cpp" line="6147"/>
<location filename="settingsdialog/settingsdialog.cpp" line="202"/> <location filename="settingsdialog/settingsdialog.cpp" line="202"/>
<location filename="settingsdialog/settingsdialog.cpp" line="205"/> <location filename="settingsdialog/settingsdialog.cpp" line="205"/>
<source>Program Runner</source> <source>Program Runner</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="mainwindow.cpp" line="6124"/> <location filename="mainwindow.cpp" line="6146"/>
<location filename="settingsdialog/settingsdialog.cpp" line="205"/> <location filename="settingsdialog/settingsdialog.cpp" line="205"/>
<source>Problem Set</source> <source>Problem Set</source>
<translation></translation> <translation></translation>

View File

@ -314,7 +314,7 @@ QList<PIconSet> IconsManager::listIconSets()
while(dirIter.hasNext()) { while(dirIter.hasNext()) {
dirIter.next(); dirIter.next();
QFileInfo fileInfo = dirIter.fileInfo(); QFileInfo fileInfo = dirIter.fileInfo();
if (!fileInfo.isHidden() && fileInfo.isDir()) { if (!fileInfo.isHidden() && !fileInfo.fileName().startsWith('.') && fileInfo.isDir()) {
PIconSet pSet = std::make_shared<IconSet>(); PIconSet pSet = std::make_shared<IconSet>();
pSet->name = fileInfo.baseName(); pSet->name = fileInfo.baseName();
pSet->displayName = pSet->name; pSet->displayName = pSet->name;

View File

@ -285,7 +285,7 @@ MainWindow::MainWindow(QWidget *parent)
//files view //files view
ui->treeFiles->setModel(&mFileSystemModel); ui->treeFiles->setModel(&mFileSystemModel);
mFileSystemModel.setReadOnly(true); mFileSystemModel.setReadOnly(false);
setFilesViewRoot(pSettings->environment().currentFolder()); setFilesViewRoot(pSettings->environment().currentFolder());
for (int i=1;i<mFileSystemModel.columnCount();i++) { for (int i=1;i<mFileSystemModel.columnCount();i++) {
ui->treeFiles->hideColumn(i); ui->treeFiles->hideColumn(i);
@ -2468,8 +2468,8 @@ void MainWindow::buildContextMenus()
if (!current.isValid()) { if (!current.isValid()) {
return; return;
} }
FolderNode * node = static_cast<FolderNode*>(current.internalPointer()); ProjectModelNode * node = static_cast<ProjectModelNode*>(current.internalPointer());
PFolderNode folderNode = mProject->pointerToNode(node); PProjectModelNode folderNode = mProject->pointerToNode(node);
if (!folderNode) if (!folderNode)
folderNode = mProject->rootNode(); folderNode = mProject->rootNode();
if (folderNode->unitIndex>=0) if (folderNode->unitIndex>=0)
@ -2511,8 +2511,8 @@ void MainWindow::buildContextMenus()
if (!current.isValid()) { if (!current.isValid()) {
return; return;
} }
FolderNode * node = static_cast<FolderNode*>(current.internalPointer()); ProjectModelNode * node = static_cast<ProjectModelNode*>(current.internalPointer());
PFolderNode folderNode = mProject->pointerToNode(node); PProjectModelNode folderNode = mProject->pointerToNode(node);
if (!folderNode) if (!folderNode)
return; return;
if (folderNode->unitIndex>=0) if (folderNode->unitIndex>=0)
@ -2520,6 +2520,20 @@ void MainWindow::buildContextMenus()
mProject->removeFolder(folderNode); mProject->removeFolder(folderNode);
mProject->saveOptions(); mProject->saveOptions();
}); });
mProject_SwitchFileSystemViewMode = createActionFor(
tr("Switch to normal view"),
ui->projectView);
connect(mProject_SwitchFileSystemViewMode, &QAction::triggered,
[this](){
mProject->setModelType(ProjectModelType::FileSystem);
});
mProject_SwitchCustomViewMode = createActionFor(
tr("Switch to custom view"),
ui->projectView);
connect(mProject_SwitchCustomViewMode, &QAction::triggered,
[this](){
mProject->setModelType(ProjectModelType::Custom);
});
//context menu signal for class browser //context menu signal for class browser
ui->tabStructure->setContextMenuPolicy(Qt::CustomContextMenu); ui->tabStructure->setContextMenuPolicy(Qt::CustomContextMenu);
@ -2635,6 +2649,18 @@ void MainWindow::buildContextMenus()
ui->treeFiles->setContextMenuPolicy(Qt::CustomContextMenu); ui->treeFiles->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->treeFiles,&QWidget::customContextMenuRequested, connect(ui->treeFiles,&QWidget::customContextMenuRequested,
this, &MainWindow::onFilesViewContextMenu); this, &MainWindow::onFilesViewContextMenu);
mFilesView_CreateFolder = createActionFor(
tr("New Folder"),
ui->treeFiles);
connect(mFilesView_CreateFolder, &QAction::triggered,
this, &MainWindow::onFilesViewCreateFolder);
mFilesView_RemoveFile = createActionFor(
tr("Delete"),
ui->treeFiles);
mFilesView_RemoveFile->setShortcut(Qt::Key_Delete);
connect(mFilesView_RemoveFile, &QAction::triggered,
this, &MainWindow::onFilesViewRemoveFiles);
mFilesView_Open = createActionFor( mFilesView_Open = createActionFor(
tr("Open in Editor"), tr("Open in Editor"),
ui->treeFiles); ui->treeFiles);
@ -2900,8 +2926,8 @@ void MainWindow::onProjectViewContextMenu(const QPoint &pos)
int unitIndex = -1; int unitIndex = -1;
QModelIndex current = mProjectProxyModel->mapToSource(ui->projectView->selectionModel()->currentIndex()); QModelIndex current = mProjectProxyModel->mapToSource(ui->projectView->selectionModel()->currentIndex());
if (current.isValid() && mProject) { if (current.isValid() && mProject) {
FolderNode * node = static_cast<FolderNode*>(current.internalPointer()); ProjectModelNode * node = static_cast<ProjectModelNode*>(current.internalPointer());
PFolderNode pNode = mProject->pointerToNode(node); PProjectModelNode pNode = mProject->pointerToNode(node);
if (pNode) { if (pNode) {
unitIndex = pNode->unitIndex; unitIndex = pNode->unitIndex;
onFolder = (unitIndex<0); onFolder = (unitIndex<0);
@ -2928,7 +2954,7 @@ void MainWindow::onProjectViewContextMenu(const QPoint &pos)
menu.addAction(mProject_Rename_Unit); menu.addAction(mProject_Rename_Unit);
} }
menu.addSeparator(); menu.addSeparator();
if (onFolder) { if (onFolder && mProject->modelType()==ProjectModelType::Custom) {
menu.addAction(mProject_Add_Folder); menu.addAction(mProject_Add_Folder);
if (!onRoot) { if (!onRoot) {
menu.addAction(mProject_Rename_Folder); menu.addAction(mProject_Rename_Folder);
@ -2941,6 +2967,11 @@ void MainWindow::onProjectViewContextMenu(const QPoint &pos)
menu.addAction(ui->actionProject_Open_Folder_In_Explorer); menu.addAction(ui->actionProject_Open_Folder_In_Explorer);
menu.addAction(ui->actionProject_Open_In_Terminal); menu.addAction(ui->actionProject_Open_In_Terminal);
menu.addSeparator(); menu.addSeparator();
if (mProject->modelType() == ProjectModelType::Custom) {
menu.addAction(mProject_SwitchFileSystemViewMode);
} else {
menu.addAction(mProject_SwitchCustomViewMode);
}
menu.addAction(ui->actionProject_options); menu.addAction(ui->actionProject_options);
menu.exec(ui->projectView->mapToGlobal(pos)); menu.exec(ui->projectView->mapToGlobal(pos));
@ -3000,6 +3031,8 @@ void MainWindow::onFilesViewContextMenu(const QPoint &pos)
QMenu menu(this); QMenu menu(this);
menu.addAction(ui->actionOpen_Folder); menu.addAction(ui->actionOpen_Folder);
menu.addSeparator(); menu.addSeparator();
menu.addAction(mFilesView_CreateFolder);
menu.addSeparator();
menu.addAction(mFilesView_Open); menu.addAction(mFilesView_Open);
menu.addAction(mFilesView_OpenWithExternal); menu.addAction(mFilesView_OpenWithExternal);
menu.addSeparator(); menu.addSeparator();
@ -3276,6 +3309,48 @@ void MainWindow::onShowInsertCodeSnippetMenu()
} }
void MainWindow::onFilesViewCreateFolder()
{
QModelIndex index = ui->treeFiles->currentIndex();
QDir dir;
if (index.isValid()) {
if (mFileSystemModel.isDir(index))
dir = QDir(mFileSystemModel.fileInfo(index).absoluteFilePath());
else
dir = mFileSystemModel.fileInfo(index).absoluteDir();
} else {
dir = mFileSystemModel.rootDirectory();
}
QString folderName = tr("New Folder");
int count = 0;
while (dir.exists(folderName)) {
count++;
folderName = tr("New Folder").arg(count);
}
mFileSystemModel.mkdir(index,folderName);
}
void MainWindow::onFilesViewRemoveFiles()
{
QModelIndexList indexList = ui->treeFiles->selectionModel()->selectedRows();
if (indexList.isEmpty()) {
QModelIndex index = ui->treeFiles->currentIndex();
if (QMessageBox::question(ui->treeFiles,tr("Delete")
,tr("Do you really want to delete %1?").arg(mFileSystemModel.fileName(index)),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No)!=QMessageBox::Yes)
return;
doFilesViewRemoveFile(index);
} else {
if (QMessageBox::question(ui->treeFiles,tr("Delete")
,tr("Do you really want to delete %1 files?").arg(indexList.count()),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No)!=QMessageBox::Yes)
return;
foreach (const QModelIndex& index, indexList) {
doFilesViewRemoveFile(index);
}
}
}
void MainWindow::onEditorContextMenu(const QPoint& pos) void MainWindow::onEditorContextMenu(const QPoint& pos)
{ {
Editor * editor = mEditorList->getEditor(); Editor * editor = mEditorList->getEditor();
@ -4096,7 +4171,7 @@ void MainWindow::onOJProblemCaseFinished(const QString& id, int current, int tot
updateProblemTitle(); updateProblemTitle();
} }
void MainWindow::onOJProblemCaseNewOutputGetted(const QString &id, const QString &line) void MainWindow::onOJProblemCaseNewOutputGetted(const QString &/* id */, const QString &line)
{ {
ui->txtProblemCaseOutput->appendPlainText(line); ui->txtProblemCaseOutput->appendPlainText(line);
} }
@ -4953,7 +5028,7 @@ void MainWindow::on_projectView_doubleClicked(const QModelIndex &index)
QModelIndex sourceIndex = mProjectProxyModel->mapToSource(index); QModelIndex sourceIndex = mProjectProxyModel->mapToSource(index);
if (!sourceIndex.isValid()) if (!sourceIndex.isValid())
return; return;
FolderNode * node = static_cast<FolderNode*>(sourceIndex.internalPointer()); ProjectModelNode * node = static_cast<ProjectModelNode*>(sourceIndex.internalPointer());
if (!node) if (!node)
return; return;
if (node->unitIndex>=0) { if (node->unitIndex>=0) {
@ -5106,11 +5181,11 @@ void MainWindow::on_actionAdd_to_project_triggered()
dialog.setAcceptMode(QFileDialog::AcceptOpen); dialog.setAcceptMode(QFileDialog::AcceptOpen);
if (dialog.exec()) { if (dialog.exec()) {
QModelIndex current = mProjectProxyModel->mapToSource(ui->projectView->currentIndex()); QModelIndex current = mProjectProxyModel->mapToSource(ui->projectView->currentIndex());
FolderNode * node = nullptr; ProjectModelNode * node = nullptr;
if (current.isValid()) { if (current.isValid()) {
node = static_cast<FolderNode*>(current.internalPointer()); node = static_cast<ProjectModelNode*>(current.internalPointer());
} }
PFolderNode folderNode = mProject->pointerToNode(node); PProjectModelNode folderNode = mProject->pointerToNode(node);
foreach (const QString& filename, dialog.selectedFiles()) { foreach (const QString& filename, dialog.selectedFiles()) {
mProject->addUnit(filename,folderNode,false); mProject->addUnit(filename,folderNode,false);
mProject->cppParser()->addFileToScan(filename); mProject->cppParser()->addFileToScan(filename);
@ -5135,8 +5210,8 @@ void MainWindow::on_actionRemove_from_project_triggered()
if (!index.isValid()) if (!index.isValid())
continue; continue;
QModelIndex realIndex = mProjectProxyModel->mapToSource(index); QModelIndex realIndex = mProjectProxyModel->mapToSource(index);
FolderNode * node = static_cast<FolderNode*>(realIndex.internalPointer()); ProjectModelNode * node = static_cast<ProjectModelNode*>(realIndex.internalPointer());
PFolderNode folderNode = mProject->pointerToNode(node); PProjectModelNode folderNode = mProject->pointerToNode(node);
if (!folderNode) if (!folderNode)
continue; continue;
selected.insert(folderNode->unitIndex); selected.insert(folderNode->unitIndex);
@ -5326,9 +5401,9 @@ void MainWindow::newProjectUnitFile()
return; return;
int idx = -1; int idx = -1;
QModelIndex current = mProjectProxyModel->mapToSource(ui->projectView->currentIndex()); QModelIndex current = mProjectProxyModel->mapToSource(ui->projectView->currentIndex());
FolderNode * node = nullptr; ProjectModelNode * node = nullptr;
if (current.isValid()) { if (current.isValid()) {
node = static_cast<FolderNode*>(current.internalPointer()); node = static_cast<ProjectModelNode*>(current.internalPointer());
} }
QString newFileName; QString newFileName;
do { do {
@ -5364,6 +5439,25 @@ void MainWindow::newProjectUnitFile()
editor->activate(); editor->activate();
} }
void MainWindow::doFilesViewRemoveFile(const QModelIndex &index)
{
if (!index.isValid())
return;
if (mFileSystemModel.isDir(index)) {
QDir dir(mFileSystemModel.fileInfo(index).absoluteFilePath());
if (!dir.isEmpty() &&
QMessageBox::question(ui->treeFiles
,tr("Delete")
,tr("Folder %1 is not empty.").arg(mFileSystemModel.fileName(index))
+ tr("Do you really want to delete it?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No)!=QMessageBox::Yes)
return;
dir.removeRecursively();
} else {
QFile::remove(mFileSystemModel.filePath(index));
}
}
void MainWindow::invalidateProjectProxyModel() void MainWindow::invalidateProjectProxyModel()
{ {
mProjectProxyModel->invalidate(); mProjectProxyModel->invalidate();

View File

@ -248,6 +248,8 @@ private:
void prepareTabMessagesData(); void prepareTabMessagesData();
void newProjectUnitFile(); void newProjectUnitFile();
void doFilesViewRemoveFile(const QModelIndex& index);
private slots: private slots:
void invalidateProjectProxyModel(); void invalidateProjectProxyModel();
void onEditorRenamed(const QString& oldFilename, const QString& newFilename, bool firstSave); void onEditorRenamed(const QString& oldFilename, const QString& newFilename, bool firstSave);
@ -274,6 +276,9 @@ private slots:
void onShowInsertCodeSnippetMenu(); void onShowInsertCodeSnippetMenu();
void onFilesViewCreateFolder();
void onFilesViewRemoveFiles();
void on_actionNew_triggered(); void on_actionNew_triggered();
void on_EditorTabsLeft_tabCloseRequested(int index); void on_EditorTabsLeft_tabCloseRequested(int index);
@ -650,6 +655,8 @@ private:
QAction * mProject_Rename_Unit; QAction * mProject_Rename_Unit;
QAction * mProject_Rename_Folder; QAction * mProject_Rename_Folder;
QAction * mProject_Remove_Folder; QAction * mProject_Remove_Folder;
QAction * mProject_SwitchFileSystemViewMode;
QAction * mProject_SwitchCustomViewMode;
//actions for class browser //actions for class browser
QAction * mClassBrowser_Sort_By_Type; QAction * mClassBrowser_Sort_By_Type;
@ -665,6 +672,8 @@ private:
QAction * mFilesView_OpenInTerminal; QAction * mFilesView_OpenInTerminal;
QAction * mFilesView_OpenInExplorer; QAction * mFilesView_OpenInExplorer;
QWidget * mFilesViewToolbar; QWidget * mFilesViewToolbar;
QAction * mFilesView_CreateFolder;
QAction * mFilesView_RemoveFile;
//action for debug console //action for debug console
QAction * mDebugConsole_ShowDetailLog; QAction * mDebugConsole_ShowDetailLog;

View File

@ -85,7 +85,7 @@
<enum>QTabWidget::West</enum> <enum>QTabWidget::West</enum>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>2</number> <number>3</number>
</property> </property>
<property name="usesScrollButtons"> <property name="usesScrollButtons">
<bool>true</bool> <bool>true</bool>
@ -258,8 +258,17 @@
<property name="editTriggers"> <property name="editTriggers">
<set>QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set> <set>QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set>
</property> </property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode"> <property name="dragDropMode">
<enum>QAbstractItemView::DragOnly</enum> <enum>QAbstractItemView::DragDrop</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::CopyAction</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -56,7 +56,7 @@ Project::Project(const QString &filename, const QString &name, QObject *parent)
ini.SetValue("Project","filename", toByteArray(extractRelativePath(directory(),mFilename))); ini.SetValue("Project","filename", toByteArray(extractRelativePath(directory(),mFilename)));
ini.SetValue("Project","name", toByteArray(mName)); ini.SetValue("Project","name", toByteArray(mName));
ini.SaveFile(mFilename.toLocal8Bit()); ini.SaveFile(mFilename.toLocal8Bit());
mNode = makeProjectNode(); mRootNode = makeProjectNode();
} }
resetCppParser(mParser,mOptions.compilerSet); resetCppParser(mParser,mOptions.compilerSet);
} }
@ -141,7 +141,7 @@ void Project::open()
ini.LoadFile(mFilename.toLocal8Bit()); ini.LoadFile(mFilename.toLocal8Bit());
loadOptions(ini); loadOptions(ini);
mNode = makeProjectNode(); mRootNode = makeProjectNode();
checkProjectFileForUpdate(ini); checkProjectFileForUpdate(ini);
int uCount = ini.GetLongValue("Project","UnitCount",0); int uCount = ini.GetLongValue("Project","UnitCount",0);
@ -207,11 +207,11 @@ void Project::setModified(bool value)
} }
} }
PFolderNode Project::makeNewFileNode(const QString &s, bool isFolder, PFolderNode newParent) PProjectModelNode Project::makeNewFileNode(const QString &s, bool isFolder, PProjectModelNode newParent)
{ {
PFolderNode node = std::make_shared<FolderNode>(); PProjectModelNode node = std::make_shared<ProjectModelNode>();
if (!newParent) { if (!newParent) {
newParent = mNode; newParent = mRootNode;
} }
newParent->children.append(node); newParent->children.append(node);
node->parent = newParent; node->parent = newParent;
@ -219,30 +219,32 @@ PFolderNode Project::makeNewFileNode(const QString &s, bool isFolder, PFolderNod
if (newParent) { if (newParent) {
node->level = newParent->level+1; node->level = newParent->level+1;
} }
if (isFolder) if (isFolder) {
node->unitIndex = -1; node->unitIndex = -1;
node->priority = 0;
}
return node; return node;
} }
PFolderNode Project::makeProjectNode() PProjectModelNode Project::makeProjectNode()
{ {
PFolderNode node = std::make_shared<FolderNode>(); PProjectModelNode node = std::make_shared<ProjectModelNode>();
node->text = mName; node->text = mName;
node->level = 0; node->level = 0;
node->unitIndex = -1; node->unitIndex = -1;
return node; return node;
} }
PProjectUnit Project::newUnit(PFolderNode parentNode, const QString& customFileName) PProjectUnit Project::newUnit(PProjectModelNode parentNode, const QString& customFileName)
{ {
PProjectUnit newUnit = std::make_shared<ProjectUnit>(this); PProjectUnit newUnit = std::make_shared<ProjectUnit>(this);
// Select folder to add unit to // Select folder to add unit to
if (!parentNode) if (!parentNode)
parentNode = mNode; // project root node parentNode = mRootNode; // project root node
if (parentNode->unitIndex>=0) { //it's a file if (parentNode->unitIndex>=0) { //it's a file
parentNode = mNode; parentNode = mRootNode;
} }
QString s; QString s;
QDir dir(directory()); QDir dir(directory());
@ -309,25 +311,49 @@ Editor *Project::openUnit(int index)
void Project::rebuildNodes() void Project::rebuildNodes()
{ {
mModel.beginUpdate(); mModel.beginUpdate();
// Delete everything // Delete everything
mNode->children.clear(); mRootNode->children.clear();
mFolderNodes.clear();
mSpecialNodes.clear();
mFileSystemFolderNodes.clear();
// Recreate everything // Recreate everything
switch(mOptions.modelType) {
case ProjectModelType::Custom:
createFolderNodes(); createFolderNodes();
for (int idx=0;idx<mUnits.count();idx++) { for (int idx=0;idx<mUnits.count();idx++) {
QFileInfo fileInfo(mUnits[idx]->fileName());
mUnits[idx]->setNode( mUnits[idx]->setNode(
makeNewFileNode( makeNewFileNode(
extractRelativePath(filename(),mUnits[idx]->fileName()), fileInfo.fileName(),
false, false,
folderNodeFromName(mUnits[idx]->folder()) folderNodeFromName(mUnits[idx]->folder())
) )
); );
mUnits[idx]->node()->unitIndex = idx; mUnits[idx]->node()->unitIndex = idx;
mUnits[idx]->node()->priority = mUnits[idx]->priority();
} }
break;
case ProjectModelType::FileSystem:
createFileSystemFolderNodes();
for (int idx=0;idx<mUnits.count();idx++) {
QFileInfo fileInfo(mUnits[idx]->fileName());
mUnits[idx]->setNode(
makeNewFileNode(
fileInfo.fileName(),
false,
getParentFolderNode(
mUnits[idx]->fileName())
)
);
mUnits[idx]->node()->unitIndex = idx;
mUnits[idx]->node()->priority = mUnits[idx]->priority();
}
break;
}
mModel.endUpdate(); mModel.endUpdate();
emit nodesChanged(); emit nodesChanged();
@ -358,8 +384,8 @@ bool Project::removeUnit(int index, bool doClose , bool removeFile)
} }
//if not fUnits.GetItem(index).fNew then //if not fUnits.GetItem(index).fNew then
PFolderNode node = unit->node(); PProjectModelNode node = unit->node();
PFolderNode parent = node->parent.lock(); PProjectModelNode parent = node->parent.lock();
if (parent) { if (parent) {
parent->children.removeAll(node); parent->children.removeAll(node);
} }
@ -369,7 +395,7 @@ bool Project::removeUnit(int index, bool doClose , bool removeFile)
return true; return true;
} }
bool Project::removeFolder(PFolderNode node) bool Project::removeFolder(PProjectModelNode node)
{ {
mModel.beginUpdate(); mModel.beginUpdate();
auto action = finally([this]{ auto action = finally([this]{
@ -611,7 +637,7 @@ void Project::setCompilerOption(const QString &optionString, char value)
void Project::updateFolders() void Project::updateFolders()
{ {
mFolders.clear(); mFolders.clear();
updateFolderNode(mNode); updateFolderNode(mRootNode);
for (int idx = 0; idx < mUnits.count();idx++) for (int idx = 0; idx < mUnits.count();idx++)
mUnits[idx]->setFolder( mUnits[idx]->setFolder(
getFolderPath( getFolderPath(
@ -627,21 +653,21 @@ void Project::updateNodeIndexes()
mUnits[idx]->node()->unitIndex = idx; mUnits[idx]->node()->unitIndex = idx;
} }
PFolderNode Project::pointerToNode(FolderNode *p, PFolderNode parent) PProjectModelNode Project::pointerToNode(ProjectModelNode *p, PProjectModelNode parent)
{ {
if (!parent) { if (!parent) {
parent = mNode; parent = mRootNode;
} }
if (p==mNode.get()) if (p==mRootNode.get())
return mNode; return mRootNode;
foreach (const PFolderNode& node , parent->children) { foreach (const PProjectModelNode& node , parent->children) {
if (node.get()==p) if (node.get()==p)
return node; return node;
PFolderNode result = pointerToNode(p,node); PProjectModelNode result = pointerToNode(p,node);
if (result) if (result)
return result; return result;
} }
return PFolderNode(); return PProjectModelNode();
} }
void Project::setCompilerSet(int compilerSetIndex) void Project::setCompilerSet(int compilerSetIndex)
@ -687,16 +713,16 @@ bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, b
QFile::copy( QFile::copy(
QDir(pSettings->dirs().templateDir()).absoluteFilePath(templateUnit->Source), QDir(pSettings->dirs().templateDir()).absoluteFilePath(templateUnit->Source),
includeTrailingPathDelimiter(this->directory())+target); includeTrailingPathDelimiter(this->directory())+target);
unit = newUnit(mNode, target); unit = newUnit(mRootNode, target);
} else { } else {
QString s; QString s;
PProjectUnit unit; PProjectUnit unit;
if (mOptions.isCpp) { if (mOptions.isCpp) {
s = templateUnit->CppText; s = templateUnit->CppText;
unit = newUnit(mNode, templateUnit->CppName); unit = newUnit(mRootNode, templateUnit->CppName);
} else { } else {
s = templateUnit->CText; s = templateUnit->CText;
unit = newUnit(mNode,templateUnit->CName); unit = newUnit(mRootNode,templateUnit->CName);
} }
Editor * editor = pMainWindow->editorList()->newEditor( Editor * editor = pMainWindow->editorList()->newEditor(
@ -724,6 +750,7 @@ bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, b
} }
} }
} }
rebuildNodes();
return true; return true;
} }
@ -767,6 +794,7 @@ void Project::saveOptions()
ini.SetLongValue("Project","StaticLink", mOptions.staticLink); ini.SetLongValue("Project","StaticLink", mOptions.staticLink);
ini.SetLongValue("Project","AddCharset", mOptions.addCharset); ini.SetLongValue("Project","AddCharset", mOptions.addCharset);
ini.SetValue("Project","Encoding",toByteArray(mOptions.encoding)); ini.SetValue("Project","Encoding",toByteArray(mOptions.encoding));
ini.SetLongValue("Project","ModelType", (int)mOptions.modelType);
//for Red Panda Dev C++ 6 compatibility //for Red Panda Dev C++ 6 compatibility
ini.SetLongValue("Project","UseUTF8",mOptions.encoding == ENCODING_UTF8); ini.SetLongValue("Project","UseUTF8",mOptions.encoding == ENCODING_UTF8);
@ -815,7 +843,7 @@ void Project::addFolder(const QString &s)
} }
} }
PProjectUnit Project::addUnit(const QString &inFileName, PFolderNode parentNode, bool rebuild) PProjectUnit Project::addUnit(const QString &inFileName, PProjectModelNode parentNode, bool rebuild)
{ {
PProjectUnit newUnit; PProjectUnit newUnit;
// Don't add if it already exists // Don't add if it already exists
@ -1221,13 +1249,12 @@ void Project::closeUnit(int index)
void Project::createFolderNodes() void Project::createFolderNodes()
{ {
mFolderNodes.clear();
for (int idx=0;idx<mFolders.count();idx++) { for (int idx=0;idx<mFolders.count();idx++) {
PFolderNode node = mNode; PProjectModelNode node = mRootNode;
QString s = mFolders[idx]; QString s = mFolders[idx];
int i = s.indexOf('/'); int i = s.indexOf('/');
while (i>=0) { while (i>=0) {
PFolderNode findnode; PProjectModelNode findnode;
for (int c=0;c<node->children.count();c++) { for (int c=0;c<node->children.count();c++) {
if (node->children[c]->text == s.mid(0,i)) if (node->children[c]->text == s.mid(0,i))
findnode = node->children[c]; findnode = node->children[c];
@ -1246,6 +1273,43 @@ void Project::createFolderNodes()
} }
} }
void Project::createFileSystemFolderNodes()
{
PProjectModelNode node = makeNewFileNode(tr("Headers"),true,mRootNode);
createFileSystemFolderNode(ProjectSpecialFolderNode::HEADERS,folder(),node);
node->priority = 1000;
mFolderNodes.append(node);
mSpecialNodes.insert(ProjectSpecialFolderNode::HEADERS,node);
node = makeNewFileNode(tr("Sources"),true,mRootNode);
createFileSystemFolderNode(ProjectSpecialFolderNode::SOURCES,folder(),node);
node->priority = 900;
mFolderNodes.append(node);
mSpecialNodes.insert(ProjectSpecialFolderNode::SOURCES,node);
node = makeNewFileNode(tr("Others"),true,mRootNode);
createFileSystemFolderNode(ProjectSpecialFolderNode::OTHERS,folder(),node);
node->priority = 800;
mFolderNodes.append(node);
mSpecialNodes.insert(ProjectSpecialFolderNode::OTHERS,node);
}
void Project::createFileSystemFolderNode(ProjectSpecialFolderNode folderType, const QString &folderName, PProjectModelNode parent)
{
QDirIterator iter(folderName);
while (iter.hasNext()) {
iter.next();
QFileInfo fileInfo = iter.fileInfo();
if (fileInfo.isHidden() || fileInfo.fileName().startsWith('.'))
continue;
if (fileInfo.isDir()) {
PProjectModelNode node = makeNewFileNode(fileInfo.fileName(),true,parent);
mFileSystemFolderNodes.insert(QString("%1/%2").arg((int)folderType).arg(fileInfo.absolutePath()),node);
createFileSystemFolderNode(folderType,fileInfo.path(), node);
}
}
}
void Project::doAutoOpen() void Project::doAutoOpen()
{ {
loadLayout(); loadLayout();
@ -1260,13 +1324,25 @@ bool Project::fileAlreadyExists(const QString &s)
return false; return false;
} }
PFolderNode Project::folderNodeFromName(const QString &name) PProjectModelNode Project::findFolderNode(const QString &folderPath, ProjectSpecialFolderNode nodeType)
{
PProjectModelNode node = mFileSystemFolderNodes.value(QString("%1/%2").arg((int)nodeType).arg(folderPath),
PProjectModelNode());
if (node)
return node;
PProjectModelNode parentNode = mSpecialNodes.value(nodeType,PProjectModelNode());
if (parentNode)
return parentNode;
return mRootNode;
}
PProjectModelNode Project::folderNodeFromName(const QString &name)
{ {
int index = mFolders.indexOf(name); int index = mFolders.indexOf(name);
if (index>=0) { if (index>=0) {
return mFolderNodes[index]; return mFolderNodes[index];
} }
return mNode; return mRootNode;
} }
char Project::getCompilerOption(const QString &optionString) char Project::getCompilerOption(const QString &optionString)
@ -1282,7 +1358,7 @@ char Project::getCompilerOption(const QString &optionString)
return '0'; return '0';
} }
QString Project::getFolderPath(PFolderNode node) QString Project::getFolderPath(PProjectModelNode node)
{ {
QString result; QString result;
if (!node) if (!node)
@ -1291,8 +1367,8 @@ QString Project::getFolderPath(PFolderNode node)
if (node->unitIndex>=0) // not a folder if (node->unitIndex>=0) // not a folder
return result; return result;
PFolderNode p = node; PProjectModelNode p = node;
while (p && p->unitIndex==-1 && p!=mNode) { while (p && p->unitIndex==-1 && p!=mRootNode) {
if (!result.isEmpty()) if (!result.isEmpty())
result = p->text + "/" + result; result = p->text + "/" + result;
else else
@ -1307,6 +1383,20 @@ int Project::getUnitFromString(const QString &s)
return indexInUnits(s); return indexInUnits(s);
} }
PProjectModelNode Project::getParentFolderNode(const QString &filename)
{
QFileInfo fileInfo(filename);
ProjectSpecialFolderNode folderNodeType;
if (isHfile(fileInfo.fileName())) {
folderNodeType = ProjectSpecialFolderNode::HEADERS;
} else if (isCfile(fileInfo.fileName())) {
folderNodeType = ProjectSpecialFolderNode::SOURCES;
} else {
folderNodeType = ProjectSpecialFolderNode::OTHERS;
}
return findFolderNode(fileInfo.absolutePath(),folderNodeType);
}
void Project::incrementBuildNumber() void Project::incrementBuildNumber()
{ {
mOptions.versionInfo.build++; mOptions.versionInfo.build++;
@ -1320,15 +1410,6 @@ void Project::incrementBuildNumber()
setModified(true); setModified(true);
} }
QString Project::listUnitStr(const QChar &separator)
{
QStringList units;
foreach (const PProjectUnit& unit, mUnits) {
units.append('"'+unit->fileName()+'"');
}
return units.join(separator);
}
void Project::loadLayout() void Project::loadLayout()
{ {
SimpleIni layIni; SimpleIni layIni;
@ -1400,6 +1481,7 @@ void Project::loadOptions(SimpleIni& ini)
mOptions.includeVersionInfo = ini.GetBoolValue("Project", "IncludeVersionInfo", false); mOptions.includeVersionInfo = ini.GetBoolValue("Project", "IncludeVersionInfo", false);
mOptions.supportXPThemes = ini.GetBoolValue("Project", "SupportXPThemes", false); mOptions.supportXPThemes = ini.GetBoolValue("Project", "SupportXPThemes", false);
mOptions.compilerSet = ini.GetLongValue("Project", "CompilerSet", pSettings->compilerSets().defaultIndex()); mOptions.compilerSet = ini.GetLongValue("Project", "CompilerSet", pSettings->compilerSets().defaultIndex());
mOptions.modelType = (ProjectModelType)ini.GetLongValue("Project", "ModelType", (int)ProjectModelType::Custom);
if (mOptions.compilerSet >= pSettings->compilerSets().size() if (mOptions.compilerSet >= pSettings->compilerSets().size()
|| mOptions.compilerSet < 0) { // TODO: change from indices to names || mOptions.compilerSet < 0) { // TODO: change from indices to names
@ -1502,30 +1584,6 @@ PCppParser Project::cppParser()
return mParser; return mParser;
} }
void Project::sortUnitsByPriority()
{
mModel.beginUpdate();
auto action = finally([this]{
mModel.endUpdate();
});
std::sort(mUnits.begin(),mUnits.end(),[](const PProjectUnit& u1, const PProjectUnit& u2)->bool{
return (u1->priority()>u2->priority());
});
rebuildNodes();
}
void Project::sortUnitsByAlpha()
{
mModel.beginUpdate();
auto action = finally([this]{
mModel.endUpdate();
});
std::sort(mUnits.begin(),mUnits.end(),[](const PProjectUnit& u1, const PProjectUnit& u2)->bool{
return (extractFileName(u1->fileName())<extractFileName(u2->fileName()));
});
rebuildNodes();
}
int Project::indexInUnits(const QString &fileName) const int Project::indexInUnits(const QString &fileName) const
{ {
QDir dir(directory()); QDir dir(directory());
@ -1544,13 +1602,13 @@ int Project::indexInUnits(const Editor *editor) const
return indexInUnits(editor->filename()); return indexInUnits(editor->filename());
} }
void Project::removeFolderRecurse(PFolderNode node) void Project::removeFolderRecurse(PProjectModelNode node)
{ {
if (!node) if (!node)
return ; return ;
// Recursively remove folders // Recursively remove folders
for (int i=node->children.count()-1;i>=0;i++) { for (int i=node->children.count()-1;i>=0;i++) {
PFolderNode childNode = node->children[i]; PProjectModelNode childNode = node->children[i];
// Remove folder inside folder // Remove folder inside folder
if (childNode->unitIndex<0 && childNode->level>0) { if (childNode->unitIndex<0 && childNode->level>0) {
removeFolderRecurse(childNode); removeFolderRecurse(childNode);
@ -1563,16 +1621,16 @@ void Project::removeFolderRecurse(PFolderNode node)
} }
} }
PFolderNode parent = node->parent.lock(); PProjectModelNode parent = node->parent.lock();
if (parent) { if (parent) {
parent->children.removeAll(node); parent->children.removeAll(node);
} }
} }
void Project::updateFolderNode(PFolderNode node) void Project::updateFolderNode(PProjectModelNode node)
{ {
for (int i=0;i<node->children.count();i++){ for (int i=0;i<node->children.count();i++){
PFolderNode child = node->children[i]; PProjectModelNode child = node->children[i];
if (child->unitIndex<0) { if (child->unitIndex<0) {
mFolders.append(getFolderPath(child)); mFolders.append(getFolderPath(child));
updateFolderNode(child); updateFolderNode(child);
@ -1598,6 +1656,19 @@ const QList<PProjectUnit> &Project::units() const
return mUnits; return mUnits;
} }
ProjectModelType Project::modelType() const
{
return mOptions.modelType;
}
void Project::setModelType(ProjectModelType type)
{
if (type!=mOptions.modelType) {
mOptions.modelType = type;
rebuildNodes();
}
}
ProjectOptions &Project::options() ProjectOptions &Project::options()
{ {
return mOptions; return mOptions;
@ -1608,9 +1679,9 @@ ProjectModel *Project::model()
return &mModel; return &mModel;
} }
const PFolderNode &Project::rootNode() const const PProjectModelNode &Project::rootNode() const
{ {
return mNode; return mRootNode;
} }
const QString &Project::name() const const QString &Project::name() const
@ -1622,7 +1693,7 @@ void Project::setName(const QString &newName)
{ {
if (newName != mName) { if (newName != mName) {
mName = newName; mName = newName;
mNode->text = newName; mRootNode->text = newName;
setModified(true); setModified(true);
} }
} }
@ -1752,7 +1823,11 @@ int ProjectUnit::priority() const
void ProjectUnit::setPriority(int newPriority) void ProjectUnit::setPriority(int newPriority)
{ {
if (mPriority!=newPriority) {
mPriority = newPriority; mPriority = newPriority;
if (mNode)
mNode->priority = mPriority;
}
} }
const QByteArray &ProjectUnit::encoding() const const QByteArray &ProjectUnit::encoding() const
@ -1812,12 +1887,12 @@ bool ProjectUnit::save()
return result; return result;
} }
PFolderNode &ProjectUnit::node() PProjectModelNode &ProjectUnit::node()
{ {
return mNode; return mNode;
} }
void ProjectUnit::setNode(const PFolderNode &newNode) void ProjectUnit::setNode(const PProjectModelNode &newNode)
{ {
mNode = newNode; mNode = newNode;
} }
@ -1855,7 +1930,7 @@ QModelIndex ProjectModel::index(int row, int column, const QModelIndex &parent)
if (!parent.isValid()) { if (!parent.isValid()) {
return createIndex(row,column,mProject->rootNode().get()); return createIndex(row,column,mProject->rootNode().get());
} }
FolderNode* parentNode = static_cast<FolderNode*>(parent.internalPointer()); ProjectModelNode* parentNode = static_cast<ProjectModelNode*>(parent.internalPointer());
if (!parentNode) { if (!parentNode) {
return QModelIndex(); return QModelIndex();
} }
@ -1868,7 +1943,7 @@ QModelIndex ProjectModel::parent(const QModelIndex &child) const
{ {
if (!child.isValid()) if (!child.isValid())
return QModelIndex(); return QModelIndex();
FolderNode * node = static_cast<FolderNode*>(child.internalPointer()); ProjectModelNode * node = static_cast<ProjectModelNode*>(child.internalPointer());
if (!node) if (!node)
return QModelIndex(); return QModelIndex();
return getParentIndex(node); return getParentIndex(node);
@ -1878,7 +1953,7 @@ int ProjectModel::rowCount(const QModelIndex &parent) const
{ {
if (!parent.isValid()) if (!parent.isValid())
return 1; return 1;
FolderNode* p = static_cast<FolderNode*>(parent.internalPointer()); ProjectModelNode* p = static_cast<ProjectModelNode*>(parent.internalPointer());
if (p) { if (p) {
return p->children.count(); return p->children.count();
} else { } else {
@ -1895,7 +1970,7 @@ QVariant ProjectModel::data(const QModelIndex &index, int role) const
{ {
if (!index.isValid()) if (!index.isValid())
return QVariant(); return QVariant();
FolderNode* p = static_cast<FolderNode*>(index.internalPointer()); ProjectModelNode* p = static_cast<ProjectModelNode*>(index.internalPointer());
if (!p) if (!p)
return QVariant(); return QVariant();
if (role == Qt::DisplayRole || role==Qt::EditRole) { if (role == Qt::DisplayRole || role==Qt::EditRole) {
@ -1918,11 +1993,17 @@ Qt::ItemFlags ProjectModel::flags(const QModelIndex &index) const
{ {
if (!index.isValid()) if (!index.isValid())
return Qt::NoItemFlags; return Qt::NoItemFlags;
FolderNode* p = static_cast<FolderNode*>(index.internalPointer()); ProjectModelNode* p = static_cast<ProjectModelNode*>(index.internalPointer());
if (!p) if (!p)
return Qt::NoItemFlags; return Qt::NoItemFlags;
if (p==mProject->rootNode().get()) if (p==mProject->rootNode().get())
return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsEditable; return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsEditable;
if (mProject && mProject->modelType() == ProjectModelType::FileSystem) {
Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
if (p->unitIndex>=0)
flags.setFlag(Qt::ItemIsEditable);
return flags;
} else {
Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled; Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
if (p->unitIndex<0) { if (p->unitIndex<0) {
flags.setFlag(Qt::ItemIsDropEnabled); flags.setFlag(Qt::ItemIsDropEnabled);
@ -1930,13 +2011,14 @@ Qt::ItemFlags ProjectModel::flags(const QModelIndex &index) const
} }
return flags; return flags;
} }
}
bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int role) bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int role)
{ {
if (!index.isValid()) if (!index.isValid())
return false; return false;
FolderNode* p = static_cast<FolderNode*>(index.internalPointer()); ProjectModelNode* p = static_cast<ProjectModelNode*>(index.internalPointer());
PFolderNode node = mProject->pointerToNode(p); PProjectModelNode node = mProject->pointerToNode(p);
if (!node) if (!node)
return false; return false;
if (role == Qt::EditRole) { if (role == Qt::EditRole) {
@ -2013,6 +2095,11 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int
// Add new filename to file minitor // Add new filename to file minitor
pMainWindow->fileSystemWatcher()->addPath(newName); pMainWindow->fileSystemWatcher()->addPath(newName);
//suffix changed
if (mProject && mProject->modelType() == ProjectModelType::FileSystem
&& QFileInfo(oldName).suffix()!=QFileInfo(newName).suffix()) {
mProject->rebuildNodes();
} else
emit dataChanged(index,index); emit dataChanged(index,index);
return true; return true;
} else { } else {
@ -2033,12 +2120,12 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int
return false; return false;
} }
QModelIndex ProjectModel::getParentIndex(FolderNode * node) const QModelIndex ProjectModel::getParentIndex(ProjectModelNode * node) const
{ {
PFolderNode parent = node->parent.lock(); PProjectModelNode parent = node->parent.lock();
if (!parent) // root node if (!parent) // root node
return QModelIndex(); return QModelIndex();
PFolderNode grand = parent->parent.lock(); PProjectModelNode grand = parent->parent.lock();
if (!grand) { if (!grand) {
return createIndex(0,0,parent.get()); return createIndex(0,0,parent.get());
} }
@ -2070,8 +2157,8 @@ bool ProjectModel::canDropMimeData(const QMimeData * data, Qt::DropAction action
// } else { // } else {
// idx= index(row,column,parent); // idx= index(row,column,parent);
// } // }
FolderNode* p= static_cast<FolderNode*>(idx.internalPointer()); ProjectModelNode* p= static_cast<ProjectModelNode*>(idx.internalPointer());
PFolderNode node = mProject->pointerToNode(p); PProjectModelNode node = mProject->pointerToNode(p);
if (node->unitIndex>=0) if (node->unitIndex>=0)
return false; return false;
QByteArray encoded = data->data(format); QByteArray encoded = data->data(format);
@ -2080,9 +2167,9 @@ bool ProjectModel::canDropMimeData(const QMimeData * data, Qt::DropAction action
qint32 r, c; qint32 r, c;
quintptr v; quintptr v;
stream >> r >> c >> v; stream >> r >> c >> v;
FolderNode* droppedPointer= (FolderNode*)(v); ProjectModelNode* droppedPointer= (ProjectModelNode*)(v);
PFolderNode droppedNode = mProject->pointerToNode(droppedPointer); PProjectModelNode droppedNode = mProject->pointerToNode(droppedPointer);
PFolderNode oldParent = droppedNode->parent.lock(); PProjectModelNode oldParent = droppedNode->parent.lock();
if (oldParent == node) if (oldParent == node)
return false; return false;
} }
@ -2109,8 +2196,8 @@ bool ProjectModel::dropMimeData(const QMimeData *data, Qt::DropAction action, in
if (!parent.isValid()) if (!parent.isValid())
return false; return false;
FolderNode* p= static_cast<FolderNode*>(parent.internalPointer()); ProjectModelNode* p= static_cast<ProjectModelNode*>(parent.internalPointer());
PFolderNode node = mProject->pointerToNode(p); PProjectModelNode node = mProject->pointerToNode(p);
QByteArray encoded = data->data(format); QByteArray encoded = data->data(format);
QDataStream stream(&encoded, QIODevice::ReadOnly); QDataStream stream(&encoded, QIODevice::ReadOnly);
@ -2127,9 +2214,9 @@ bool ProjectModel::dropMimeData(const QMimeData *data, Qt::DropAction action, in
for (int i=pointers.count()-1;i>=0;i--) { for (int i=pointers.count()-1;i>=0;i--) {
int r = rows[i]; int r = rows[i];
intptr_t v = pointers[i]; intptr_t v = pointers[i];
FolderNode* droppedPointer= (FolderNode*)(v); ProjectModelNode* droppedPointer= (ProjectModelNode*)(v);
PFolderNode droppedNode = mProject->pointerToNode(droppedPointer); PProjectModelNode droppedNode = mProject->pointerToNode(droppedPointer);
PFolderNode oldParent = droppedNode->parent.lock(); PProjectModelNode oldParent = droppedNode->parent.lock();
QModelIndex oldParentIndex = getParentIndex(droppedPointer); QModelIndex oldParentIndex = getParentIndex(droppedPointer);
beginRemoveRows(oldParentIndex,r,r); beginRemoveRows(oldParentIndex,r,r);
if (oldParent) if (oldParent)
@ -2166,7 +2253,7 @@ QMimeData *ProjectModel::mimeData(const QModelIndexList &indexes) const
QList<QUrl> urls; QList<QUrl> urls;
for (; it != indexes.end(); ++it) { for (; it != indexes.end(); ++it) {
stream << (qint32)((*it).row()) << (qint32)((*it).column()) << (quintptr)((*it).internalPointer()); stream << (qint32)((*it).row()) << (qint32)((*it).column()) << (quintptr)((*it).internalPointer());
FolderNode* p = static_cast<FolderNode*>((*it).internalPointer()); ProjectModelNode* p = static_cast<ProjectModelNode*>((*it).internalPointer());
if (p && p->unitIndex>=0) { if (p && p->unitIndex>=0) {
urls.append(QUrl::fromLocalFile(mProject->units()[p->unitIndex]->fileName())); urls.append(QUrl::fromLocalFile(mProject->units()[p->unitIndex]->fileName()));
} }
@ -2188,12 +2275,12 @@ bool ProjectModelSortFilterProxy::lessThan(const QModelIndex &source_left, const
if (!sourceModel()) if (!sourceModel())
return false; return false;
ProjectModel* projectModel = dynamic_cast<ProjectModel*>(sourceModel()); ProjectModel* projectModel = dynamic_cast<ProjectModel*>(sourceModel());
FolderNode* pLeft=nullptr; ProjectModelNode* pLeft=nullptr;
if (source_left.isValid()) if (source_left.isValid())
pLeft = static_cast<FolderNode*>(source_left.internalPointer()); pLeft = static_cast<ProjectModelNode*>(source_left.internalPointer());
FolderNode* pRight=nullptr; ProjectModelNode* pRight=nullptr;
if (source_right.isValid()) if (source_right.isValid())
pRight = static_cast<FolderNode*>(source_right.internalPointer()); pRight = static_cast<ProjectModelNode*>(source_right.internalPointer());
if (!pLeft) if (!pLeft)
return true; return true;
if (!pRight) if (!pRight)
@ -2202,5 +2289,7 @@ bool ProjectModelSortFilterProxy::lessThan(const QModelIndex &source_left, const
return true; return true;
if (pLeft->unitIndex>=0 && pRight->unitIndex<0) if (pLeft->unitIndex>=0 && pRight->unitIndex<0)
return false; return false;
if (pLeft->priority!=pRight->priority)
return pLeft->priority>pRight->priority;
return QString::compare(pLeft->text, pRight->text)<0; return QString::compare(pLeft->text, pRight->text)<0;
} }

View File

@ -27,13 +27,14 @@ class Project;
class Editor; class Editor;
class CppParser; class CppParser;
struct FolderNode; struct ProjectModelNode;
using PFolderNode = std::shared_ptr<FolderNode>; using PProjectModelNode = std::shared_ptr<ProjectModelNode>;
struct FolderNode { struct ProjectModelNode {
QString text; QString text;
std::weak_ptr<FolderNode> parent; std::weak_ptr<ProjectModelNode> parent;
int unitIndex; int unitIndex;
QList<PFolderNode> children; int priority;
QList<PProjectModelNode> children;
int level; int level;
}; };
@ -69,8 +70,8 @@ public:
void setModified(bool value); void setModified(bool value);
bool save(); bool save();
PFolderNode &node(); PProjectModelNode &node();
void setNode(const PFolderNode &newNode); void setNode(const PProjectModelNode &newNode);
private: private:
Project* mParent; Project* mParent;
@ -85,13 +86,11 @@ private:
bool mLink; bool mLink;
int mPriority; int mPriority;
QByteArray mEncoding; QByteArray mEncoding;
PFolderNode mNode; PProjectModelNode mNode;
}; };
using PProjectUnit = std::shared_ptr<ProjectUnit>; using PProjectUnit = std::shared_ptr<ProjectUnit>;
class ProjectModel : public QAbstractItemModel { class ProjectModel : public QAbstractItemModel {
Q_OBJECT Q_OBJECT
public: public:
@ -113,7 +112,7 @@ public:
bool setData(const QModelIndex &index, const QVariant &value, int role) override; bool setData(const QModelIndex &index, const QVariant &value, int role) override;
private: private:
QModelIndex getParentIndex(FolderNode * node) const; QModelIndex getParentIndex(ProjectModelNode * node) const;
// QAbstractItemModel interface // QAbstractItemModel interface
public: public:
bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override; bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override;
@ -134,6 +133,13 @@ protected:
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override; bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
}; };
enum ProjectSpecialFolderNode {
HEADERS,
SOURCES,
OTHERS,
NonSpecial
};
class ProjectTemplate; class ProjectTemplate;
class Project : public QObject class Project : public QObject
{ {
@ -150,50 +156,38 @@ public:
void addFolder(const QString& s); void addFolder(const QString& s);
PProjectUnit addUnit(const QString& inFileName, PProjectUnit addUnit(const QString& inFileName,
PFolderNode parentNode, PProjectModelNode parentNode,
bool rebuild); bool rebuild);
QString folder(); QString folder();
void buildPrivateResource(bool forceSave=false); void buildPrivateResource(bool forceSave=false);
void checkProjectFileForUpdate(SimpleIni& ini);
void closeUnit(int index); void closeUnit(int index);
void createFolderNodes();
void doAutoOpen(); void doAutoOpen();
bool fileAlreadyExists(const QString& s); bool fileAlreadyExists(const QString& s);
PFolderNode folderNodeFromName(const QString& name);
char getCompilerOption(const QString& optionString); char getCompilerOption(const QString& optionString);
QString getFolderPath(PFolderNode node); QString getFolderPath(PProjectModelNode node);
int getUnitFromString(const QString& s); int getUnitFromString(const QString& s);
void incrementBuildNumber(); void incrementBuildNumber();
int indexInUnits(const QString& fileName) const; int indexInUnits(const QString& fileName) const;
int indexInUnits(const Editor* editor) const; int indexInUnits(const Editor* editor) const;
QString listUnitStr(const QChar& separator); PProjectUnit newUnit(PProjectModelNode parentNode,
void loadLayout(); // load all [UnitX]
void loadOptions(SimpleIni& ini);
void loadUnitLayout(Editor *e, int index); // load single [UnitX] cursor positions
PFolderNode makeNewFileNode(const QString& s, bool isFolder, PFolderNode newParent);
PFolderNode makeProjectNode();
PProjectUnit newUnit(PFolderNode parentNode,
const QString& customFileName=""); const QString& customFileName="");
Editor* openUnit(int index); Editor* openUnit(int index);
PProjectModelNode pointerToNode(ProjectModelNode * p, PProjectModelNode parent=PProjectModelNode());
void rebuildNodes(); void rebuildNodes();
bool removeUnit(int index, bool doClose, bool removeFile = false); bool removeUnit(int index, bool doClose, bool removeFile = false);
bool removeFolder(PFolderNode node); bool removeFolder(PProjectModelNode node);
void resetParserProjectFiles(); void resetParserProjectFiles();
void saveAll(); // save [Project] and all [UnitX] void saveAll(); // save [Project] and all [UnitX]
void saveLayout(); // save all [UnitX] void saveLayout(); // save all [UnitX]
void saveOptions(); void saveOptions();
void saveUnitAs(int i, const QString& sFileName, bool syncEditor = true); // save single [UnitX] void saveUnitAs(int i, const QString& sFileName, bool syncEditor = true); // save single [UnitX]
void saveUnitLayout(Editor* e, int index); // save single [UnitX] cursor positions
bool saveUnits(); bool saveUnits();
PProjectUnit findUnitByFilename(const QString& filename); PProjectUnit findUnitByFilename(const QString& filename);
void associateEditor(Editor* editor); void associateEditor(Editor* editor);
void associateEditorToUnit(Editor* editor, PProjectUnit unit); void associateEditorToUnit(Editor* editor, PProjectUnit unit);
void setCompilerOption(const QString& optionString, char value); void setCompilerOption(const QString& optionString, char value);
void sortUnitsByPriority();
void sortUnitsByAlpha();
void updateFolders(); void updateFolders();
void updateNodeIndexes(); void updateNodeIndexes();
PFolderNode pointerToNode(FolderNode * p, PFolderNode parent=PFolderNode());
void setCompilerSet(int compilerSetIndex); void setCompilerSet(int compilerSetIndex);
//void showOptions(); //void showOptions();
@ -206,7 +200,7 @@ public:
const QString &name() const; const QString &name() const;
void setName(const QString &newName); void setName(const QString &newName);
const PFolderNode &rootNode() const; const PProjectModelNode &rootNode() const;
ProjectOptions &options(); ProjectOptions &options();
@ -214,13 +208,30 @@ public:
const QList<PProjectUnit> &units() const; const QList<PProjectUnit> &units() const;
ProjectModelType modelType() const;
void setModelType(ProjectModelType type);
signals: signals:
void nodesChanged(); void nodesChanged();
void modifyChanged(bool value); void modifyChanged(bool value);
private: private:
void checkProjectFileForUpdate(SimpleIni& ini);
void createFolderNodes();
void createFileSystemFolderNodes();
void createFileSystemFolderNode(ProjectSpecialFolderNode folderType, const QString& folderName, PProjectModelNode parent);
PProjectModelNode getParentFolderNode(const QString& filename);
PProjectModelNode findFolderNode(const QString& folderPath, ProjectSpecialFolderNode nodeType);
PProjectModelNode folderNodeFromName(const QString& name);
void loadOptions(SimpleIni& ini);
void loadLayout(); // load all [UnitX]
void loadUnitLayout(Editor *e, int index); // load single [UnitX] cursor positions
PProjectModelNode makeNewFileNode(const QString& s, bool isFolder, PProjectModelNode newParent);
PProjectModelNode makeProjectNode();
void open(); void open();
void removeFolderRecurse(PFolderNode node); void removeFolderRecurse(PProjectModelNode node);
void updateFolderNode(PFolderNode node); void saveUnitLayout(Editor* e, int index); // save single [UnitX] cursor positions
void updateFolderNode(PProjectModelNode node);
void updateCompilerSetType(); void updateCompilerSetType();
private: private:
@ -231,8 +242,10 @@ private:
bool mModified; bool mModified;
QStringList mFolders; QStringList mFolders;
std::shared_ptr<CppParser> mParser; std::shared_ptr<CppParser> mParser;
QList<PFolderNode> mFolderNodes; QList<PProjectModelNode> mFolderNodes;
PFolderNode mNode; PProjectModelNode mRootNode;
QHash<ProjectSpecialFolderNode, PProjectModelNode> mSpecialNodes;
QHash<QString, PProjectModelNode> mFileSystemFolderNodes;
ProjectModel mModel; ProjectModel mModel;
}; };

View File

@ -52,4 +52,5 @@ ProjectOptions::ProjectOptions()
compilerSetType = 0; compilerSetType = 0;
staticLink = true; staticLink = true;
addCharset = true; addCharset = true;
modelType = ProjectModelType::FileSystem;
} }

View File

@ -19,6 +19,11 @@
#include <QWidget> #include <QWidget>
enum class ProjectModelType {
FileSystem,
Custom
};
enum class ProjectType { enum class ProjectType {
GUI=0, GUI=0,
Console=1, Console=1,
@ -83,5 +88,6 @@ struct ProjectOptions{
bool staticLink; bool staticLink;
bool addCharset; bool addCharset;
QString encoding; QString encoding;
ProjectModelType modelType;
}; };
#endif // PROJECTOPTIONS_H #endif // PROJECTOPTIONS_H

View File

@ -148,6 +148,7 @@ void ProjectTemplate::readTemplateFile(const QString &fileName)
} else { } else {
mOptions.encoding = fromByteArray(mIni->GetValue("Project","Encoding", ENCODING_AUTO_DETECT)); mOptions.encoding = fromByteArray(mIni->GetValue("Project","Encoding", ENCODING_AUTO_DETECT));
} }
mOptions.modelType = (ProjectModelType)mIni->GetLongValue("Project", "ModelType", (int)ProjectModelType::FileSystem);
} }

View File

@ -56,7 +56,6 @@ void ProjectFilesWidget::doSave()
unit->setBuildCmd(unitCopy->buildCmd()); unit->setBuildCmd(unitCopy->buildCmd());
unit->setEncoding(unitCopy->encoding()); unit->setEncoding(unitCopy->encoding());
} }
pMainWindow->project()->sortUnitsByPriority();
pMainWindow->project()->saveUnits(); pMainWindow->project()->saveUnits();
copyUnits(); copyUnits();
ui->treeProject->expandAll(); ui->treeProject->expandAll();
@ -68,7 +67,7 @@ PProjectUnit ProjectFilesWidget::currentUnit()
QModelIndex index = ui->treeProject->currentIndex(); QModelIndex index = ui->treeProject->currentIndex();
if (!index.isValid()) if (!index.isValid())
return PProjectUnit(); return PProjectUnit();
FolderNode* node = static_cast<FolderNode*>(index.internalPointer()); ProjectModelNode* node = static_cast<ProjectModelNode*>(index.internalPointer());
if (!node) if (!node)
return PProjectUnit(); return PProjectUnit();
int i = node->unitIndex; int i = node->unitIndex;
@ -136,7 +135,7 @@ void ProjectFilesWidget::on_treeProject_doubleClicked(const QModelIndex &index)
disableFileOptions(); disableFileOptions();
return ; return ;
} }
FolderNode* node = static_cast<FolderNode*>(index.internalPointer()); ProjectModelNode* node = static_cast<ProjectModelNode*>(index.internalPointer());
if (!node) { if (!node) {
disableFileOptions(); disableFileOptions();
return; return;

View File

@ -1116,7 +1116,7 @@ void copyFolder(const QString &fromDir, const QString &toDir)
while (it.hasNext()){ while (it.hasNext()){
it.next(); it.next();
const auto fileInfo = it.fileInfo(); const auto fileInfo = it.fileInfo();
if(!fileInfo.isHidden()) { //filters dot and dotdot if(!fileInfo.isHidden() && !fileInfo.fileName().startsWith('.')) { //filters dot and dotdot
const QString subPathStructure = fileInfo.absoluteFilePath().mid(absSourcePathLength); const QString subPathStructure = fileInfo.absoluteFilePath().mid(absSourcePathLength);
const QString constructedAbsolutePath = targetDir.absolutePath() + subPathStructure; const QString constructedAbsolutePath = targetDir.absolutePath() + subPathStructure;
if(fileInfo.isDir()){ if(fileInfo.isDir()){

View File

@ -7,7 +7,7 @@ SUBDIRS += \
APP_NAME = RedPandaCPP APP_NAME = RedPandaCPP
APP_VERSION = 0.14.1 APP_VERSION = 0.14.2
linux: { linux: {