2021-09-03 16:39:20 +08:00
# include <windows.h>
2021-04-06 23:10:57 +08:00
# include "mainwindow.h"
# include "ui_mainwindow.h"
2021-04-07 21:13:15 +08:00
# include "editorlist.h"
2021-04-08 10:29:21 +08:00
# include "editor.h"
2021-04-11 21:33:08 +08:00
# include "systemconsts.h"
# include "settings.h"
2021-06-24 20:43:09 +08:00
# include "qsynedit/Constants.h"
2021-07-23 13:22:05 +08:00
# include "debugger.h"
2021-08-01 23:24:37 +08:00
# include "widgets/cpudialog.h"
2021-09-04 00:13:42 +08:00
# include "widgets/filepropertiesdialog.h"
2021-09-11 11:42:20 +08:00
# include "project.h"
2021-09-16 23:51:05 +08:00
# include "projecttemplate.h"
# include "widgets/newprojectdialog.h"
2021-07-26 11:47:54 +08:00
2021-04-09 17:48:25 +08:00
# include <QCloseEvent>
2021-04-18 11:41:41 +08:00
# include <QComboBox>
2021-09-03 16:39:20 +08:00
# include <QDesktopServices>
2021-09-05 21:17:33 +08:00
# include <QDragEnterEvent>
2021-04-11 21:33:08 +08:00
# include <QFileDialog>
2021-08-01 01:06:43 +08:00
# include <QInputDialog>
2021-04-08 10:29:21 +08:00
# include <QLabel>
2021-06-25 12:40:11 +08:00
# include <QMessageBox>
2021-09-05 19:10:54 +08:00
# include <QMimeData>
2021-06-20 09:27:37 +08:00
# include <QTranslator>
2021-04-08 10:29:21 +08:00
2021-04-20 22:24:33 +08:00
# include "settingsdialog/settingsdialog.h"
# include "compiler/compilermanager.h"
2021-06-12 22:36:23 +08:00
# include <QGuiApplication>
# include <QClipboard>
# include <QMessageBox>
# include <QTextCodec>
2021-04-20 22:24:33 +08:00
# include <QDebug>
2021-09-03 16:39:20 +08:00
# include "cpprefacter.h"
2021-04-16 22:04:48 +08:00
2021-08-03 23:55:57 +08:00
# include <widgets/searchdialog.h>
2021-04-08 10:29:21 +08:00
MainWindow * pMainWindow ;
2021-04-06 23:10:57 +08:00
MainWindow : : MainWindow ( QWidget * parent )
2021-06-23 22:38:02 +08:00
: QMainWindow ( parent ) ,
ui ( new Ui : : MainWindow ) ,
2021-08-29 10:14:07 +08:00
mSearchDialog ( nullptr ) ,
mQuitting ( false ) ,
2021-09-02 19:36:16 +08:00
mOpenClosingBottomPanel ( false ) ,
mOpenClosingLeftPanel ( false ) ,
mCheckSyntaxInBack ( false ) ,
2021-09-02 20:12:16 +08:00
mClosing ( false ) ,
mSystemTurnedOff ( false )
2021-04-06 23:10:57 +08:00
{
ui - > setupUi ( this ) ;
2021-04-08 10:29:21 +08:00
// status bar
2021-04-18 11:41:41 +08:00
mFileInfoStatus = new QLabel ( ) ;
mFileEncodingStatus = new QLabel ( ) ;
2021-06-12 22:36:23 +08:00
mFileModeStatus = new QLabel ( ) ;
2021-04-08 10:29:21 +08:00
mFileInfoStatus - > setStyleSheet ( " margin-left:10px; margin-right:10px " ) ;
mFileEncodingStatus - > setStyleSheet ( " margin-left:10px; margin-right:10px " ) ;
2021-06-12 22:36:23 +08:00
mFileModeStatus - > setStyleSheet ( " margin-left:10px; margin-right:10px " ) ;
2021-08-27 23:51:42 +08:00
ui - > statusbar - > insertPermanentWidget ( 0 , mFileModeStatus ) ;
ui - > statusbar - > insertPermanentWidget ( 0 , mFileEncodingStatus ) ;
ui - > statusbar - > insertPermanentWidget ( 0 , mFileInfoStatus ) ;
2021-04-07 21:13:15 +08:00
mEditorList = new EditorList ( ui - > EditorTabsLeft ,
ui - > EditorTabsRight ,
2021-06-24 16:05:19 +08:00
ui - > splitterEditorPanel ,
2021-04-07 21:13:15 +08:00
ui - > EditorPanel ) ;
2021-09-11 11:42:20 +08:00
mProject = nullptr ;
2021-09-05 21:17:33 +08:00
setAcceptDrops ( true ) ;
2021-04-07 21:13:15 +08:00
setupActions ( ) ;
2021-04-07 22:44:08 +08:00
ui - > EditorTabsRight - > setVisible ( false ) ;
2021-04-18 11:41:41 +08:00
mCompilerSet = new QComboBox ( ) ;
2021-06-24 20:43:09 +08:00
mCompilerSet - > setMinimumWidth ( 200 ) ;
2021-04-18 11:41:41 +08:00
ui - > toolbarCompilerSet - > addWidget ( mCompilerSet ) ;
connect ( mCompilerSet , QOverload < int > : : of ( & QComboBox : : currentIndexChanged ) ,
this , & MainWindow : : onCompilerSetChanged ) ;
updateCompilerSet ( ) ;
2021-04-20 22:24:33 +08:00
mCompilerManager = new CompilerManager ( this ) ;
2021-07-23 13:22:05 +08:00
mDebugger = new Debugger ( this ) ;
2021-04-24 15:57:45 +08:00
2021-07-25 00:26:13 +08:00
ui - > tblBreakpoints - > setModel ( mDebugger - > breakpointModel ( ) ) ;
ui - > tblStackTrace - > setModel ( mDebugger - > backtraceModel ( ) ) ;
2021-08-01 01:06:43 +08:00
ui - > watchView - > setModel ( mDebugger - > watchModel ( ) ) ;
2021-07-25 00:26:13 +08:00
2021-04-24 15:57:45 +08:00
ui - > actionIndent - > setShortcut ( Qt : : Key_Tab ) ;
ui - > actionUnIndent - > setShortcut ( Qt : : Key_Tab | Qt : : ShiftModifier ) ;
ui - > tableIssues - > setErrorColor ( QColor ( " Red " ) ) ;
ui - > tableIssues - > setWarningColor ( QColor ( " Orange " ) ) ;
2021-06-12 22:36:23 +08:00
2021-08-01 01:06:43 +08:00
2021-09-16 23:51:05 +08:00
mMenuNew = new QMenu ( ) ;
mMenuNew - > setTitle ( tr ( " New " ) ) ;
mMenuNew - > addAction ( ui - > actionNew ) ;
mMenuNew - > addAction ( ui - > actionNew_Project ) ;
ui - > menuFile - > insertMenu ( ui - > actionOpen , mMenuNew ) ;
2021-06-12 22:36:23 +08:00
mMenuEncoding = new QMenu ( ) ;
mMenuEncoding - > setTitle ( tr ( " File Encoding " ) ) ;
mMenuEncoding - > addAction ( ui - > actionAuto_Detect ) ;
mMenuEncoding - > addAction ( ui - > actionEncode_in_ANSI ) ;
mMenuEncoding - > addAction ( ui - > actionEncode_in_UTF_8 ) ;
mMenuEncoding - > addSeparator ( ) ;
mMenuEncoding - > addAction ( ui - > actionConvert_to_ANSI ) ;
mMenuEncoding - > addAction ( ui - > actionConvert_to_UTF_8 ) ;
ui - > menuEdit - > insertMenu ( ui - > actionFoldAll , mMenuEncoding ) ;
ui - > menuEdit - > insertSeparator ( ui - > actionFoldAll ) ;
ui - > actionAuto_Detect - > setCheckable ( true ) ;
ui - > actionEncode_in_ANSI - > setCheckable ( true ) ;
ui - > actionEncode_in_UTF_8 - > setCheckable ( true ) ;
2021-09-17 21:33:19 +08:00
mMenuRecentProjects = new QMenu ( ) ;
mMenuRecentProjects - > setTitle ( tr ( " Recent Projects " ) ) ;
ui - > menuFile - > insertMenu ( ui - > actionExit , mMenuRecentProjects ) ;
2021-08-02 10:08:25 +08:00
mMenuRecentFiles = new QMenu ( ) ;
mMenuRecentFiles - > setTitle ( tr ( " Recent Files " ) ) ;
ui - > menuFile - > insertMenu ( ui - > actionExit , mMenuRecentFiles ) ;
ui - > menuFile - > insertSeparator ( ui - > actionExit ) ;
rebuildOpenedFileHisotryMenu ( ) ;
2021-08-01 23:24:37 +08:00
mCPUDialog = nullptr ;
2021-07-26 11:47:54 +08:00
2021-09-17 09:56:52 +08:00
updateProjectView ( ) ;
2021-06-12 22:36:23 +08:00
updateEditorActions ( ) ;
2021-09-17 09:56:52 +08:00
updateCaretActions ( ) ;
2021-06-18 21:48:40 +08:00
applySettings ( ) ;
2021-09-02 16:35:28 +08:00
applyUISettings ( ) ;
2021-06-24 16:05:19 +08:00
2021-08-01 23:24:37 +08:00
connect ( ui - > debugConsole , & QConsole : : commandInput , this , & MainWindow : : onDebugCommandInput ) ;
2021-08-02 22:21:50 +08:00
connect ( ui - > cbEvaluate - > lineEdit ( ) , & QLineEdit : : returnPressed ,
this , & MainWindow : : onDebugEvaluateInput ) ;
2021-08-05 12:31:53 +08:00
mSearchResultTreeModel = std : : make_shared < SearchResultTreeModel > ( & mSearchResultModel ) ;
mSearchResultListModel = std : : make_shared < SearchResultListModel > ( & mSearchResultModel ) ;
mSearchViewDelegate = std : : make_shared < SearchResultTreeViewDelegate > ( mSearchResultTreeModel ) ;
2021-08-05 19:58:32 +08:00
ui - > cbSearchHistory - > setModel ( mSearchResultListModel . get ( ) ) ;
2021-08-05 12:31:53 +08:00
ui - > searchView - > setModel ( mSearchResultTreeModel . get ( ) ) ;
ui - > searchView - > setItemDelegate ( mSearchViewDelegate . get ( ) ) ;
2021-08-05 19:58:32 +08:00
connect ( mSearchResultTreeModel . get ( ) , & QAbstractItemModel : : modelReset ,
ui - > searchView , & QTreeView : : expandAll ) ;
ui - > replacePanel - > setVisible ( false ) ;
2021-08-23 17:27:17 +08:00
//class browser
ui - > classBrowser - > setModel ( & mClassBrowserModel ) ;
2021-08-29 00:48:23 +08:00
2021-08-31 14:40:41 +08:00
connect ( & mFileSystemWatcher , & QFileSystemWatcher : : fileChanged ,
this , & MainWindow : : onFileChanged ) ;
2021-09-25 23:12:36 +08:00
mStatementColors = std : : make_shared < QHash < StatementKind , QColor > > ( ) ;
2021-08-29 10:29:56 +08:00
mCompletionPopup = std : : make_shared < CodeCompletionPopup > ( ) ;
2021-09-25 23:12:36 +08:00
mCompletionPopup - > setColors ( mStatementColors ) ;
2021-08-29 10:29:56 +08:00
mHeaderCompletionPopup = std : : make_shared < HeaderCompletionPopup > ( ) ;
2021-09-24 11:41:14 +08:00
mFunctionTip = std : : make_shared < FunctionTooltipWidget > ( ) ;
2021-08-29 10:29:56 +08:00
2021-09-25 23:12:36 +08:00
mClassBrowserModel . setColors ( mStatementColors ) ;
2021-08-29 00:48:23 +08:00
updateAppTitle ( ) ;
2021-08-30 22:05:45 +08:00
connect ( & mAutoSaveTimer , & QTimer : : timeout ,
this , & MainWindow : : onAutoSaveTimeout ) ;
resetAutoSaveTimer ( ) ;
2021-08-31 11:13:12 +08:00
2021-09-03 00:26:49 +08:00
connect ( ui - > menuFile , & QMenu : : aboutToShow ,
this , & MainWindow : : rebuildOpenedFileHisotryMenu ) ;
2021-09-17 21:33:19 +08:00
connect ( ui - > menuProject , & QMenu : : aboutToShow ,
this , & MainWindow : : updateProjectActions ) ;
2021-08-31 11:13:12 +08:00
buildContextMenus ( ) ;
2021-09-25 23:12:36 +08:00
updateEditorColorSchemes ( ) ;
2021-04-06 23:10:57 +08:00
}
MainWindow : : ~ MainWindow ( )
{
delete ui ;
}
2021-06-12 22:36:23 +08:00
void MainWindow : : updateForEncodingInfo ( ) {
2021-04-08 10:29:21 +08:00
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-12 22:36:23 +08:00
mFileEncodingStatus - > setText (
QString ( " %1(%2) " )
2021-08-29 10:14:07 +08:00
. arg ( QString ( editor - > encodingOption ( ) )
, QString ( editor - > fileEncoding ( ) ) ) ) ;
2021-06-12 22:36:23 +08:00
ui - > actionAuto_Detect - > setChecked ( editor - > encodingOption ( ) = = ENCODING_AUTO_DETECT ) ;
ui - > actionEncode_in_ANSI - > setChecked ( editor - > encodingOption ( ) = = ENCODING_SYSTEM_DEFAULT ) ;
ui - > actionEncode_in_UTF_8 - > setChecked ( editor - > encodingOption ( ) = = ENCODING_UTF8 ) ;
} else {
mFileEncodingStatus - > setText ( " " ) ;
ui - > actionAuto_Detect - > setChecked ( false ) ;
ui - > actionEncode_in_ANSI - > setChecked ( false ) ;
ui - > actionEncode_in_UTF_8 - > setChecked ( false ) ;
2021-04-08 10:29:21 +08:00
}
2021-04-11 13:55:31 +08:00
}
2021-06-12 22:36:23 +08:00
void MainWindow : : updateEditorSettings ( )
2021-04-11 13:55:31 +08:00
{
2021-06-12 22:36:23 +08:00
mEditorList - > applySettings ( ) ;
}
void MainWindow : : updateEditorActions ( )
{
Editor * e = mEditorList - > getEditor ( ) ;
if ( e = = nullptr ) {
ui - > actionAuto_Detect - > setEnabled ( false ) ;
ui - > actionEncode_in_ANSI - > setEnabled ( false ) ;
ui - > actionEncode_in_UTF_8 - > setEnabled ( false ) ;
ui - > actionConvert_to_ANSI - > setEnabled ( false ) ;
ui - > actionConvert_to_UTF_8 - > setEnabled ( false ) ;
ui - > actionCopy - > setEnabled ( false ) ;
ui - > actionCut - > setEnabled ( false ) ;
ui - > actionFoldAll - > setEnabled ( false ) ;
ui - > actionIndent - > setEnabled ( false ) ;
ui - > actionPaste - > setEnabled ( false ) ;
ui - > actionRedo - > setEnabled ( false ) ;
ui - > actionSave - > setEnabled ( false ) ;
ui - > actionSaveAs - > setEnabled ( false ) ;
ui - > actionSelectAll - > setEnabled ( false ) ;
ui - > actionToggleComment - > setEnabled ( false ) ;
ui - > actionUnIndent - > setEnabled ( false ) ;
ui - > actionUndo - > setEnabled ( false ) ;
ui - > actionUnfoldAll - > setEnabled ( false ) ;
2021-08-05 19:58:32 +08:00
ui - > actionFind - > setEnabled ( false ) ;
ui - > actionReplace - > setEnabled ( false ) ;
ui - > actionFind_Next - > setEnabled ( false ) ;
ui - > actionFind_Previous - > setEnabled ( false ) ;
2021-09-02 12:14:02 +08:00
//code
ui - > actionReformat_Code - > setEnabled ( false ) ;
2021-09-02 20:12:16 +08:00
ui - > actionClose - > setEnabled ( false ) ;
ui - > actionClose_All - > setEnabled ( false ) ;
2021-06-12 22:36:23 +08:00
} else {
ui - > actionAuto_Detect - > setEnabled ( true ) ;
ui - > actionEncode_in_ANSI - > setEnabled ( true ) ;
ui - > actionEncode_in_UTF_8 - > setEnabled ( true ) ;
ui - > actionConvert_to_ANSI - > setEnabled ( e - > encodingOption ( ) ! = ENCODING_SYSTEM_DEFAULT & & e - > fileEncoding ( ) ! = ENCODING_SYSTEM_DEFAULT ) ;
ui - > actionConvert_to_UTF_8 - > setEnabled ( e - > encodingOption ( ) ! = ENCODING_UTF8 & & e - > fileEncoding ( ) ! = ENCODING_UTF8 ) ;
2021-07-01 19:44:38 +08:00
2021-06-12 22:36:23 +08:00
ui - > actionCopy - > setEnabled ( e - > selAvail ( ) ) ;
ui - > actionCut - > setEnabled ( e - > selAvail ( ) ) ;
ui - > actionFoldAll - > setEnabled ( e - > lines ( ) - > count ( ) > 0 ) ;
ui - > actionIndent - > setEnabled ( ! e - > readOnly ( ) ) ;
ui - > actionPaste - > setEnabled ( ! e - > readOnly ( ) & & ! QGuiApplication : : clipboard ( ) - > text ( ) . isEmpty ( ) ) ;
ui - > actionRedo - > setEnabled ( e - > canRedo ( ) ) ;
ui - > actionUndo - > setEnabled ( e - > canUndo ( ) ) ;
ui - > actionSave - > setEnabled ( e - > modified ( ) ) ;
ui - > actionSaveAs - > setEnabled ( true ) ;
ui - > actionSelectAll - > setEnabled ( e - > lines ( ) - > count ( ) > 0 ) ;
ui - > actionToggleComment - > setEnabled ( ! e - > readOnly ( ) & & e - > lines ( ) - > count ( ) > 0 ) ;
ui - > actionUnIndent - > setEnabled ( ! e - > readOnly ( ) & & e - > lines ( ) - > count ( ) > 0 ) ;
ui - > actionUnfoldAll - > setEnabled ( e - > lines ( ) - > count ( ) > 0 ) ;
2021-07-01 19:44:38 +08:00
2021-08-05 19:58:32 +08:00
ui - > actionFind - > setEnabled ( true ) ;
ui - > actionReplace - > setEnabled ( true ) ;
ui - > actionFind_Next - > setEnabled ( true ) ;
ui - > actionFind_Previous - > setEnabled ( true ) ;
2021-09-02 12:14:02 +08:00
//code
ui - > actionReformat_Code - > setEnabled ( true ) ;
2021-09-02 20:12:16 +08:00
ui - > actionClose - > setEnabled ( true ) ;
ui - > actionClose_All - > setEnabled ( true ) ;
2021-09-17 09:56:52 +08:00
}
2021-09-02 20:12:16 +08:00
2021-09-17 09:56:52 +08:00
updateCompileActions ( ) ;
2021-06-12 22:36:23 +08:00
2021-04-08 10:29:21 +08:00
}
2021-09-17 09:56:52 +08:00
void MainWindow : : updateProjectActions ( )
{
bool hasProject = ( mProject ! = nullptr ) ;
2021-09-17 20:01:11 +08:00
ui - > actionView_Makefile - > setEnabled ( hasProject ) ;
ui - > actionProject_New_File - > setEnabled ( hasProject ) ;
ui - > actionAdd_to_project - > setEnabled ( hasProject ) ;
2021-09-17 21:33:19 +08:00
ui - > actionRemove_from_project - > setEnabled ( hasProject & & ui - > projectView - > selectionModel ( ) - > selectedIndexes ( ) . count ( ) > 0 ) ;
ui - > actionMakeClean - > setEnabled ( hasProject ) ;
2021-09-17 09:56:52 +08:00
ui - > actionProject_options - > setEnabled ( hasProject ) ;
ui - > actionClose_Project - > setEnabled ( hasProject ) ;
2021-09-18 10:47:35 +08:00
ui - > actionProject_Open_Folder_In_Explorer - > setEnabled ( hasProject ) ;
ui - > actionProject_Open_In_Terminal - > setEnabled ( hasProject ) ;
2021-09-17 09:56:52 +08:00
updateCompileActions ( ) ;
}
2021-07-01 19:44:38 +08:00
void MainWindow : : updateCompileActions ( )
{
2021-09-17 09:56:52 +08:00
bool hasProject = ( mProject ! = nullptr ) ;
bool editorCanCompile = false ;
2021-09-04 21:54:58 +08:00
Editor * e = mEditorList - > getEditor ( ) ;
2021-09-17 09:56:52 +08:00
if ( e ) {
FileType fileType = getFileType ( e - > filename ( ) ) ;
if ( fileType = = FileType : : CSource
| | fileType = = FileType : : CppSource )
editorCanCompile = true ;
}
2021-09-04 21:54:58 +08:00
if ( mCompilerManager - > compiling ( ) | | mCompilerManager - > running ( ) | | mDebugger - > executing ( )
2021-09-17 09:56:52 +08:00
| | ( ! hasProject & & ! editorCanCompile ) ) {
2021-07-01 19:44:38 +08:00
ui - > actionCompile - > setEnabled ( false ) ;
ui - > actionCompile_Run - > setEnabled ( false ) ;
ui - > actionRun - > setEnabled ( false ) ;
ui - > actionRebuild - > setEnabled ( false ) ;
2021-08-01 12:02:28 +08:00
ui - > actionDebug - > setEnabled ( false ) ;
2021-07-01 19:44:38 +08:00
} else {
ui - > actionCompile - > setEnabled ( true ) ;
ui - > actionCompile_Run - > setEnabled ( true ) ;
ui - > actionRun - > setEnabled ( true ) ;
ui - > actionRebuild - > setEnabled ( true ) ;
2021-08-01 12:02:28 +08:00
ui - > actionDebug - > setEnabled ( true ) ;
2021-07-01 19:44:38 +08:00
}
2021-09-17 09:56:52 +08:00
2021-08-01 12:02:28 +08:00
ui - > actionStep_Into - > setEnabled ( mDebugger - > executing ( ) ) ;
ui - > actionStep_Out - > setEnabled ( mDebugger - > executing ( ) ) ;
ui - > actionStep_Over - > setEnabled ( mDebugger - > executing ( ) ) ;
ui - > actionContinue - > setEnabled ( mDebugger - > executing ( ) ) ;
ui - > actionRun_To_Cursor - > setEnabled ( mDebugger - > executing ( ) ) ;
ui - > actionStop_Execution - > setEnabled ( mCompilerManager - > running ( ) | | mDebugger - > executing ( ) ) ;
2021-09-17 09:56:52 +08:00
//it's not a compile action, but put here for convinience
ui - > actionSaveAll - > setEnabled ( mProject ! = nullptr
| | mEditorList - > pageCount ( ) > 0 ) ;
2021-07-01 19:44:38 +08:00
}
2021-06-20 14:30:47 +08:00
void MainWindow : : updateEditorColorSchemes ( )
{
mEditorList - > applyColorSchemes ( pSettings - > editor ( ) . colorScheme ( ) ) ;
2021-09-25 23:12:36 +08:00
QString schemeName = pSettings - > editor ( ) . colorScheme ( ) ;
//color for code completion popup
PColorSchemeItem item ;
item = pColorManager - > getItem ( schemeName , SYNS_AttrFunction ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skFunction , item - > foreground ( ) ) ;
mStatementColors - > insert ( StatementKind : : skConstructor , item - > foreground ( ) ) ;
mStatementColors - > insert ( StatementKind : : skDestructor , item - > foreground ( ) ) ;
}
item = pColorManager - > getItem ( schemeName , SYNS_AttrClass ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skClass , item - > foreground ( ) ) ;
mStatementColors - > insert ( StatementKind : : skTypedef , item - > foreground ( ) ) ;
mStatementColors - > insert ( StatementKind : : skAlias , item - > foreground ( ) ) ;
}
item = pColorManager - > getItem ( schemeName , SYNS_AttrIdentifier ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skEnumType , item - > foreground ( ) ) ;
mStatementColors - > insert ( StatementKind : : skEnumClassType , item - > foreground ( ) ) ;
}
item = pColorManager - > getItem ( schemeName , SYNS_AttrVariable ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skVariable , item - > foreground ( ) ) ;
}
item = pColorManager - > getItem ( schemeName , SYNS_AttrLocalVariable ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skLocalVariable , item - > foreground ( ) ) ;
mStatementColors - > insert ( StatementKind : : skParameter , item - > foreground ( ) ) ;
}
item = pColorManager - > getItem ( schemeName , SYNS_AttrGlobalVariable ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skGlobalVariable , item - > foreground ( ) ) ;
}
item = pColorManager - > getItem ( schemeName , SYNS_AttrGlobalVariable ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skGlobalVariable , item - > foreground ( ) ) ;
}
item = pColorManager - > getItem ( schemeName , SYNS_AttrPreprocessor ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skPreprocessor , item - > foreground ( ) ) ;
mStatementColors - > insert ( StatementKind : : skEnum , item - > foreground ( ) ) ;
mHeaderCompletionPopup - > setSuggestionColor ( item - > foreground ( ) ) ;
}
item = pColorManager - > getItem ( schemeName , SYNS_AttrReservedWord ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skKeyword , item - > foreground ( ) ) ;
mStatementColors - > insert ( StatementKind : : skUserCodeIn , item - > foreground ( ) ) ;
}
item = pColorManager - > getItem ( schemeName , SYNS_AttrString ) ;
if ( item ) {
mStatementColors - > insert ( StatementKind : : skNamespace , item - > foreground ( ) ) ;
mStatementColors - > insert ( StatementKind : : skNamespaceAlias , item - > foreground ( ) ) ;
}
2021-06-20 14:30:47 +08:00
}
2021-06-18 21:48:40 +08:00
void MainWindow : : applySettings ( )
{
changeTheme ( pSettings - > environment ( ) . theme ( ) ) ;
QFont font ( pSettings - > environment ( ) . interfaceFont ( ) ,
pSettings - > environment ( ) . interfaceFontSize ( ) ) ;
2021-06-20 09:27:37 +08:00
font . setStyleStrategy ( QFont : : PreferAntialias ) ;
QApplication * app = dynamic_cast < QApplication * > ( QApplication : : instance ( ) ) ;
app - > setFont ( font ) ;
2021-06-20 22:54:16 +08:00
this - > setFont ( font ) ;
2021-08-01 23:24:37 +08:00
updateDebuggerSettings ( ) ;
2021-06-18 21:48:40 +08:00
}
2021-09-02 16:35:28 +08:00
void MainWindow : : applyUISettings ( )
{
const Settings : : UI & settings = pSettings - > ui ( ) ;
restoreGeometry ( settings . mainWindowGeometry ( ) ) ;
restoreState ( settings . mainWindowState ( ) ) ;
2021-09-02 19:36:16 +08:00
//we can show/hide left/bottom panels here, cause mainwindow layout is not calculated
// ui->tabMessages->setCurrentIndex(settings.bottomPanelIndex());
// if (settings.bottomPanelOpenned()) {
// mBottomPanelHeight = settings.bottomPanelHeight();
// openCloseBottomPanel(true);
// } else {
// openCloseBottomPanel(false);
// mBottomPanelHeight = settings.bottomPanelHeight();
// }
// ui->tabInfos->setCurrentIndex(settings.leftPanelIndex());
// if (settings.leftPanelOpenned()) {
// mLeftPanelWidth = settings.leftPanelWidth();
// openCloseLeftPanel(true);
// } else {
// openCloseLeftPanel(false);
// mLeftPanelWidth = settings.leftPanelWidth();
// }
2021-09-02 16:35:28 +08:00
}
2021-08-31 14:40:41 +08:00
QFileSystemWatcher * MainWindow : : fileSystemWatcher ( )
{
return & mFileSystemWatcher ;
}
2021-07-26 00:22:08 +08:00
void MainWindow : : removeActiveBreakpoints ( )
{
for ( int i = 0 ; i < mEditorList - > pageCount ( ) ; i + + ) {
Editor * e = ( * mEditorList ) [ i ] ;
e - > removeBreakpointFocus ( ) ;
}
}
2021-07-26 18:22:09 +08:00
void MainWindow : : setActiveBreakpoint ( QString FileName , int Line , bool setFocus )
{
removeActiveBreakpoints ( ) ;
// Then active the current line in the current file
FileName . replace ( ' / ' , QDir : : separator ( ) ) ;
Editor * e = mEditorList - > getEditorByFilename ( FileName ) ;
if ( e ! = nullptr ) {
e - > setActiveBreakpointFocus ( Line , setFocus ) ;
}
if ( setFocus ) {
this - > activateWindow ( ) ;
}
}
2021-07-26 00:22:08 +08:00
void MainWindow : : updateAppTitle ( )
{
2021-07-26 11:47:54 +08:00
QString appName ( " Red Panda Dev-C++ " ) ;
Editor * e = mEditorList - > getEditor ( ) ;
QCoreApplication * app = QApplication : : instance ( ) ;
if ( e & & ! e - > inProject ( ) ) {
2021-09-11 11:42:20 +08:00
QString str ;
2021-07-26 11:47:54 +08:00
if ( e - > modified ( ) )
str = e - > filename ( ) + " [*] " ;
else
str = e - > filename ( ) ;
if ( mDebugger - > executing ( ) ) {
2021-08-29 10:14:07 +08:00
setWindowTitle ( QString ( " %1 - [%2] - %3 %4 " )
2021-09-11 11:42:20 +08:00
. arg ( str , tr ( " Debugging " ) , appName , DEVCPP_VERSION ) ) ;
2021-08-29 10:14:07 +08:00
app - > setApplicationName ( QString ( " %1 - [%2] - %3 " )
2021-09-11 11:42:20 +08:00
. arg ( str , tr ( " Debugging " ) , appName ) ) ;
2021-07-26 11:47:54 +08:00
} else if ( mCompilerManager - > running ( ) ) {
2021-08-29 10:14:07 +08:00
setWindowTitle ( QString ( " %1 - [%2] - %3 %4 " )
2021-09-11 11:42:20 +08:00
. arg ( str , tr ( " Running " ) , appName , DEVCPP_VERSION ) ) ;
2021-08-29 10:14:07 +08:00
app - > setApplicationName ( QString ( " %1 - [%2] - %3 " )
2021-09-11 11:42:20 +08:00
. arg ( str , tr ( " Running " ) , appName ) ) ;
2021-07-26 11:47:54 +08:00
} else if ( mCompilerManager - > compiling ( ) ) {
2021-08-29 10:14:07 +08:00
setWindowTitle ( QString ( " %1 - [%2] - %3 %4 " )
2021-09-11 11:42:20 +08:00
. arg ( str , tr ( " Compiling " ) , appName , DEVCPP_VERSION ) ) ;
2021-08-29 10:14:07 +08:00
app - > setApplicationName ( QString ( " %1 - [%2] - %3 " )
2021-09-11 11:42:20 +08:00
. arg ( str , tr ( " Compiling " ) , appName ) ) ;
2021-07-26 11:47:54 +08:00
} else {
2021-08-29 10:14:07 +08:00
this - > setWindowTitle ( QString ( " %1 - %2 %3 " )
. arg ( str , appName , DEVCPP_VERSION ) ) ;
app - > setApplicationName ( QString ( " %1 - %2 " )
. arg ( str , appName ) ) ;
2021-07-26 11:47:54 +08:00
}
2021-09-11 11:42:20 +08:00
} else if ( e & & e - > inProject ( ) & & mProject ) {
QString str , str2 ;
if ( mProject - > modified ( ) )
str = mProject - > name ( ) + " [*] " ;
else
str = mProject - > name ( ) ;
if ( e - > modified ( ) )
str2 = extractFileName ( e - > filename ( ) ) + " [*] " ;
else
str2 = extractFileName ( e - > filename ( ) ) ;
if ( mDebugger - > executing ( ) ) {
setWindowTitle ( QString ( " %1 - %2 [%3] - %4 %5 " )
. arg ( str , str2 ,
tr ( " Debugging " ) , appName , DEVCPP_VERSION ) ) ;
app - > setApplicationName ( QString ( " %1 - [%2] - %3 " )
. arg ( str , tr ( " Debugging " ) , appName ) ) ;
} else if ( mCompilerManager - > running ( ) ) {
setWindowTitle ( QString ( " %1 - %2 [%3] - %4 %5 " )
. arg ( str , str2 ,
tr ( " Running " ) , appName , DEVCPP_VERSION ) ) ;
app - > setApplicationName ( QString ( " %1 - [%2] - %3 " )
. arg ( str , tr ( " Running " ) , appName ) ) ;
} else if ( mCompilerManager - > compiling ( ) ) {
setWindowTitle ( QString ( " %1 - %2 [%3] - %4 %5 " )
. arg ( str , str2 ,
tr ( " Compiling " ) , appName , DEVCPP_VERSION ) ) ;
app - > setApplicationName ( QString ( " %1 - [%2] - %3 " )
. arg ( str , tr ( " Compiling " ) , appName ) ) ;
} else {
setWindowTitle ( QString ( " %1 - %2 %3 " )
. arg ( str , appName , DEVCPP_VERSION ) ) ;
app - > setApplicationName ( QString ( " %1 - %2 " )
. arg ( str , appName ) ) ;
}
} else if ( mProject ) {
QString str , str2 ;
if ( mProject - > modified ( ) )
str = mProject - > name ( ) + " [*] " ;
else
str = mProject - > name ( ) ;
if ( mDebugger - > executing ( ) ) {
setWindowTitle ( QString ( " %1 - [%2] - %3 %4 " )
. arg ( str , tr ( " Debugging " ) , appName , DEVCPP_VERSION ) ) ;
app - > setApplicationName ( QString ( " %1 - [%2] - %3 " )
. arg ( str , tr ( " Debugging " ) , appName ) ) ;
} else if ( mCompilerManager - > running ( ) ) {
setWindowTitle ( QString ( " %1 - [%2] - %3 %4 " )
. arg ( str , tr ( " Running " ) , appName , DEVCPP_VERSION ) ) ;
app - > setApplicationName ( QString ( " %1 - [%2] - %3 " )
. arg ( str , tr ( " Running " ) , appName ) ) ;
} else if ( mCompilerManager - > compiling ( ) ) {
setWindowTitle ( QString ( " %1 - [%2] - %3 %4 " )
. arg ( str , tr ( " Compiling " ) , appName , DEVCPP_VERSION ) ) ;
app - > setApplicationName ( QString ( " %1 - [%2] - %3 " )
. arg ( str , tr ( " Compiling " ) , appName ) ) ;
} else {
this - > setWindowTitle ( QString ( " %1 - %2 %3 " )
. arg ( str , appName , DEVCPP_VERSION ) ) ;
app - > setApplicationName ( QString ( " %1 - %2 " )
. arg ( str , appName ) ) ;
}
} else {
2021-08-29 10:14:07 +08:00
setWindowTitle ( QString ( " %1 %2 " ) . arg ( appName , DEVCPP_VERSION ) ) ;
2021-08-29 00:48:23 +08:00
app - > setApplicationName ( QString ( " %1 " ) . arg ( appName ) ) ;
2021-07-26 11:47:54 +08:00
}
}
void MainWindow : : addDebugOutput ( const QString & text )
{
if ( text . isEmpty ( ) ) {
ui - > debugConsole - > addLine ( " " ) ;
} else {
ui - > debugConsole - > addText ( text ) ;
}
2021-07-26 00:22:08 +08:00
}
2021-07-30 23:28:58 +08:00
void MainWindow : : changeDebugOutputLastline ( const QString & test )
{
ui - > debugConsole - > changeLastLine ( test ) ;
}
2021-08-01 23:24:37 +08:00
void MainWindow : : updateDebugEval ( const QString & value )
{
ui - > txtEvalOutput - > clear ( ) ;
ui - > txtEvalOutput - > appendPlainText ( value ) ;
}
2021-08-02 10:08:25 +08:00
void MainWindow : : rebuildOpenedFileHisotryMenu ( )
{
mMenuRecentFiles - > clear ( ) ;
2021-09-17 21:33:19 +08:00
mMenuRecentProjects - > clear ( ) ;
2021-08-29 10:14:07 +08:00
foreach ( QAction * action , mRecentFileActions ) {
2021-08-02 10:08:25 +08:00
action - > setParent ( nullptr ) ;
action - > deleteLater ( ) ;
}
mRecentFileActions . clear ( ) ;
2021-09-17 21:33:19 +08:00
foreach ( QAction * action , mRecentProjectActions ) {
action - > setParent ( nullptr ) ;
action - > deleteLater ( ) ;
}
mRecentProjectActions . clear ( ) ;
2021-08-02 10:08:25 +08:00
if ( pSettings - > history ( ) . openedFiles ( ) . size ( ) = = 0 ) {
mMenuRecentFiles - > setEnabled ( false ) ;
} else {
mMenuRecentFiles - > setEnabled ( true ) ;
2021-08-29 10:14:07 +08:00
for ( const QString & filename : pSettings - > history ( ) . openedFiles ( ) ) {
2021-08-02 10:08:25 +08:00
QAction * action = new QAction ( ) ;
action - > setText ( filename ) ;
2021-08-29 10:14:07 +08:00
connect ( action , & QAction : : triggered , [ & filename , this ] ( bool ) {
2021-08-02 10:08:25 +08:00
this - > openFile ( filename ) ;
} ) ;
mRecentFileActions . append ( action ) ;
}
mMenuRecentFiles - > addActions ( mRecentFileActions ) ;
}
2021-09-17 21:33:19 +08:00
if ( pSettings - > history ( ) . openedProjects ( ) . size ( ) = = 0 ) {
mMenuRecentProjects - > setEnabled ( false ) ;
} else {
mMenuRecentProjects - > setEnabled ( true ) ;
for ( const QString & filename : pSettings - > history ( ) . openedProjects ( ) ) {
QAction * action = new QAction ( ) ;
action - > setText ( filename ) ;
connect ( action , & QAction : : triggered , [ & filename , this ] ( bool ) {
this - > openProject ( filename ) ;
} ) ;
mRecentProjectActions . append ( action ) ;
}
mMenuRecentProjects - > addActions ( mRecentProjectActions ) ;
}
2021-08-02 10:08:25 +08:00
}
2021-08-23 17:27:17 +08:00
void MainWindow : : updateClassBrowserForEditor ( Editor * editor )
{
if ( ! editor ) {
mClassBrowserModel . setParser ( nullptr ) ;
mClassBrowserModel . setCurrentFile ( " " ) ;
2021-08-23 21:50:53 +08:00
mClassBrowserModel . clear ( ) ;
2021-08-23 17:27:17 +08:00
return ;
}
if ( mQuitting )
return ;
// if not devCodeCompletion.Enabled then
// Exit;
if ( ( mClassBrowserModel . currentFile ( ) = = editor - > filename ( ) )
& & ( mClassBrowserModel . parser ( ) = = editor - > parser ( ) ) )
return ;
mClassBrowserModel . beginUpdate ( ) ;
{
auto action = finally ( [ this ] {
mClassBrowserModel . endUpdate ( ) ;
} ) ;
mClassBrowserModel . setParser ( editor - > parser ( ) ) ;
// if e.InProject then begin
// ClassBrowser.StatementsType := devClassBrowsing.StatementsType;
// end else
// ClassBrowser.StatementsType := cbstFile;
mClassBrowserModel . setCurrentFile ( editor - > filename ( ) ) ;
}
}
2021-08-30 22:05:45 +08:00
void MainWindow : : resetAutoSaveTimer ( )
{
if ( pSettings - > editor ( ) . enableAutoSave ( ) ) {
//minute to milliseconds
mAutoSaveTimer . start ( pSettings - > editor ( ) . autoSaveInterval ( ) * 60 * 1000 ) ;
} else {
mAutoSaveTimer . stop ( ) ;
}
}
2021-08-01 10:00:27 +08:00
QPlainTextEdit * MainWindow : : txtLocals ( )
{
return ui - > txtLocals ;
}
2021-06-12 22:36:23 +08:00
void MainWindow : : updateStatusbarForLineCol ( )
2021-06-07 11:02:03 +08:00
{
2021-06-12 22:36:23 +08:00
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ! = nullptr ) {
2021-08-29 22:51:23 +08:00
int col = e - > charToColumn ( e - > caretY ( ) , e - > caretX ( ) ) ;
QString msg = tr ( " Line:%1 Col:%2 Selected:%3 Lines:%4 Length:%5 " )
. arg ( e - > caretY ( ) , 4 )
. arg ( col , 3 )
2021-06-12 22:36:23 +08:00
. arg ( e - > selText ( ) . length ( ) , 6 )
2021-08-29 22:51:23 +08:00
. arg ( e - > lines ( ) - > count ( ) , 4 )
2021-06-12 22:36:23 +08:00
. arg ( e - > lines ( ) - > getTextLength ( ) , 6 ) ;
mFileInfoStatus - > setText ( msg ) ;
} else {
mFileInfoStatus - > setText ( " " ) ;
}
}
void MainWindow : : updateForStatusbarModeInfo ( )
{
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ! = nullptr ) {
QString msg ;
if ( e - > readOnly ( ) ) {
msg = tr ( " Read Only " ) ;
} else if ( e - > insertMode ( ) ) {
msg = tr ( " Insert " ) ;
} else {
msg = tr ( " Overwrite " ) ;
}
mFileModeStatus - > setText ( msg ) ;
} else {
mFileModeStatus - > setText ( " " ) ;
}
2021-06-07 11:02:03 +08:00
}
2021-08-30 22:05:45 +08:00
void MainWindow : : updateStatusbarMessage ( const QString & s )
2021-08-27 16:38:55 +08:00
{
2021-08-27 23:51:42 +08:00
ui - > statusbar - > showMessage ( s ) ;
2021-08-27 16:38:55 +08:00
}
2021-04-11 21:33:08 +08:00
void MainWindow : : openFiles ( const QStringList & files )
{
mEditorList - > beginUpdate ( ) ;
2021-04-12 00:00:29 +08:00
auto end = finally ( [ this ] {
this - > mEditorList - > endUpdate ( ) ;
} ) ;
2021-09-11 09:21:44 +08:00
//Check if there is a project file in the list and open it
for ( const QString & file : files ) {
if ( getFileType ( file ) = = FileType : : Project ) {
openProject ( file ) ;
return ;
}
}
//Didn't find a project? Open all files
2021-08-29 10:14:07 +08:00
for ( const QString & file : files ) {
2021-04-11 21:33:08 +08:00
openFile ( file ) ;
}
mEditorList - > endUpdate ( ) ;
}
void MainWindow : : openFile ( const QString & filename )
{
2021-04-29 20:54:44 +08:00
Editor * editor = mEditorList - > getOpenedEditorByFilename ( filename ) ;
2021-04-11 21:33:08 +08:00
if ( editor ! = nullptr ) {
2021-04-12 00:00:29 +08:00
editor - > activate ( ) ;
2021-04-11 21:33:08 +08:00
return ;
}
2021-08-31 14:40:41 +08:00
try {
2021-09-11 11:42:20 +08:00
pSettings - > history ( ) . removeFile ( filename ) ;
2021-08-31 14:40:41 +08:00
editor = mEditorList - > newEditor ( filename , ENCODING_AUTO_DETECT ,
false , false ) ;
editor - > activate ( ) ;
this - > updateForEncodingInfo ( ) ;
} catch ( FileError e ) {
QMessageBox : : critical ( this , tr ( " Error " ) , e . reason ( ) ) ;
}
2021-04-11 21:33:08 +08:00
}
2021-09-11 11:42:20 +08:00
void MainWindow : : openProject ( const QString & filename )
{
if ( ! fileExists ( filename ) ) {
return ;
}
if ( mProject ) {
QString s ;
if ( mProject - > name ( ) . isEmpty ( ) )
s = mProject - > filename ( ) ;
else
s = mProject - > name ( ) ;
if ( QMessageBox : : question ( this ,
tr ( " Close project " ) ,
tr ( " Are you sure you want to close %1? " )
. arg ( s ) ,
QMessageBox : : Yes | QMessageBox : : No ,
QMessageBox : : Yes ) = = QMessageBox : : Yes ) {
closeProject ( false ) ;
} else {
return ;
}
}
ui - > tabProject - > setVisible ( true ) ;
ui - > tabInfos - > setCurrentWidget ( ui - > tabProject ) ;
openCloseLeftPanel ( true ) ;
// {
// LeftPageControl.ActivePage := LeftProjectSheet;
// fLeftPageControlChanged := False;
// ClassBrowser.TabVisible:= False;
// }
// Only update class browser once
mClassBrowserModel . beginUpdate ( ) ;
{
auto action = finally ( [ this ] {
mClassBrowserModel . endUpdate ( ) ;
} ) ;
2021-09-11 18:42:49 +08:00
mProject = std : : make_shared < Project > ( filename , DEV_INTERNAL_OPEN ) ;
2021-09-17 09:56:52 +08:00
updateProjectView ( ) ;
2021-09-11 18:42:49 +08:00
pSettings - > history ( ) . removeProject ( filename ) ;
2021-09-11 11:42:20 +08:00
// // if project manager isn't open then open it
// if not devData.ShowLeftPages then
// actProjectManager.Execute;
2021-09-11 18:42:49 +08:00
//checkForDllProfiling();
2021-09-17 09:56:52 +08:00
updateAppTitle ( ) ;
updateCompilerSet ( ) ;
2021-09-11 11:42:20 +08:00
2021-09-17 09:56:52 +08:00
//parse the project
// UpdateClassBrowsing;
scanActiveProject ( true ) ;
mProject - > doAutoOpen ( ) ;
2021-09-11 11:42:20 +08:00
2021-09-17 09:56:52 +08:00
//update editor's inproject flag
for ( int i = 0 ; i < mProject - > units ( ) . count ( ) ; i + + ) {
PProjectUnit unit = mProject - > units ( ) [ i ] ;
Editor * e = mEditorList - > getOpenedEditorByFilename ( unit - > fileName ( ) ) ;
2021-09-11 11:42:20 +08:00
if ( e ) {
2021-09-17 09:56:52 +08:00
unit - > setEditor ( e ) ;
unit - > setEncoding ( e - > encodingOption ( ) ) ;
e - > setInProject ( true ) ;
} else {
unit - > setEditor ( nullptr ) ;
2021-09-11 11:42:20 +08:00
}
2021-09-17 09:56:52 +08:00
}
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ) {
checkSyntaxInBack ( e ) ;
}
updateClassBrowserForEditor ( e ) ;
2021-09-11 11:42:20 +08:00
}
updateForEncodingInfo ( ) ;
}
2021-04-07 21:13:15 +08:00
void MainWindow : : setupActions ( ) {
}
2021-04-18 11:41:41 +08:00
void MainWindow : : updateCompilerSet ( )
{
2021-09-19 14:28:30 +08:00
mCompilerSet - > blockSignals ( true ) ;
2021-04-18 11:41:41 +08:00
mCompilerSet - > clear ( ) ;
2021-06-07 11:02:03 +08:00
for ( size_t i = 0 ; i < pSettings - > compilerSets ( ) . list ( ) . size ( ) ; i + + ) {
2021-04-18 11:41:41 +08:00
mCompilerSet - > addItem ( pSettings - > compilerSets ( ) . list ( ) [ i ] - > name ( ) ) ;
}
2021-09-11 11:42:20 +08:00
int index = pSettings - > compilerSets ( ) . defaultIndex ( ) ;
if ( mProject ) {
Editor * e = mEditorList - > getEditor ( ) ;
if ( ! e | | e - > inProject ( ) ) {
index = mProject - > options ( ) . compilerSet ;
}
}
2021-04-18 11:41:41 +08:00
if ( index < 0 | | index > = mCompilerSet - > count ( ) ) {
2021-09-11 11:42:20 +08:00
index = pSettings - > compilerSets ( ) . defaultIndex ( ) ;
2021-04-18 11:41:41 +08:00
}
mCompilerSet - > setCurrentIndex ( index ) ;
2021-09-19 14:28:30 +08:00
mCompilerSet - > blockSignals ( false ) ;
mCompilerSet - > update ( ) ;
2021-04-18 11:41:41 +08:00
}
2021-08-01 23:24:37 +08:00
void MainWindow : : updateDebuggerSettings ( )
{
ui - > debugConsole - > setFont ( QFont (
pSettings - > debugger ( ) . fontName ( ) ,
pSettings - > debugger ( ) . fontSize ( ) ) ) ;
}
2021-06-24 20:43:09 +08:00
void MainWindow : : checkSyntaxInBack ( Editor * e )
{
if ( e = = nullptr )
return ;
2021-09-11 11:42:20 +08:00
if ( ! pSettings - > editor ( ) . syntaxCheck ( ) ) {
return ;
}
2021-06-24 20:43:09 +08:00
// if not devEditor.AutoCheckSyntax then
// Exit;
//not c or cpp file
if ( ! e - > highlighter ( ) | | e - > highlighter ( ) - > getName ( ) ! = SYN_HIGHLIGHTER_CPP )
return ;
if ( mCompilerManager - > backgroundSyntaxChecking ( ) )
return ;
if ( mCompilerManager - > compiling ( ) )
return ;
2021-08-23 21:50:53 +08:00
if ( ! pSettings - > compilerSets ( ) . defaultSet ( ) )
return ;
2021-06-24 20:43:09 +08:00
if ( mCheckSyntaxInBack )
return ;
mCheckSyntaxInBack = true ;
ui - > tableIssues - > clearIssues ( ) ;
2021-09-12 22:45:00 +08:00
CompileTarget target = getCompileTarget ( ) ;
if ( target = = CompileTarget : : Project ) {
mCompilerManager - > checkSyntax ( e - > filename ( ) , e - > lines ( ) - > text ( ) ,
e - > fileEncoding ( ) = = ENCODING_ASCII , mProject ) ;
} else {
mCompilerManager - > checkSyntax ( e - > filename ( ) , e - > lines ( ) - > text ( ) ,
e - > fileEncoding ( ) = = ENCODING_ASCII , nullptr ) ;
}
2021-06-24 20:43:09 +08:00
// if not PrepareForCompile(cttStdin,True) then begin
// fCheckSyntaxInBack:=False;
// Exit;
// end;
// if e.InProject then begin
// if not assigned(MainForm.fProject) then
// Exit;
// fSyntaxChecker.Project := MainForm.fProject;
// end;
2021-06-25 12:40:11 +08:00
// fSyntaxChecker.CheckSyntax(True);
}
bool MainWindow : : compile ( bool rebuild )
{
2021-09-12 22:45:00 +08:00
CompileTarget target = getCompileTarget ( ) ;
if ( target = = CompileTarget : : Project ) {
if ( ! mProject - > saveUnits ( ) )
return false ;
// Check if saves have been succesful
for ( int i = 0 ; i < mEditorList - > pageCount ( ) ; i + + ) {
Editor * e = ( * ( mEditorList ) ) [ i ] ;
if ( e - > inProject ( ) & & e - > modified ( ) )
2021-06-25 12:40:11 +08:00
return false ;
}
2021-09-13 22:45:50 +08:00
ui - > tableIssues - > clearIssues ( ) ;
2021-09-12 22:45:00 +08:00
// Increment build number automagically
if ( mProject - > options ( ) . versionInfo . autoIncBuildNr ) {
mProject - > incrementBuildNumber ( ) ;
}
mProject - > buildPrivateResource ( ) ;
2021-09-13 22:45:50 +08:00
if ( mCompileSuccessionTask ) {
mCompileSuccessionTask - > filename = mProject - > executable ( ) ;
}
updateCompileActions ( ) ;
openCloseBottomPanel ( true ) ;
ui - > tabMessages - > setCurrentWidget ( ui - > tabCompilerOutput ) ;
mCompilerManager - > compileProject ( mProject , rebuild ) ;
updateAppTitle ( ) ;
2021-09-12 22:45:00 +08:00
} else {
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
ui - > tableIssues - > clearIssues ( ) ;
if ( editor - > modified ( ) ) {
if ( ! editor - > save ( false , false ) )
return false ;
}
if ( mCompileSuccessionTask ) {
mCompileSuccessionTask - > filename = getCompiledExecutableName ( editor - > filename ( ) ) ;
}
updateCompileActions ( ) ;
openCloseBottomPanel ( true ) ;
ui - > tabMessages - > setCurrentWidget ( ui - > tabCompilerOutput ) ;
mCompilerManager - > compile ( editor - > filename ( ) , editor - > fileEncoding ( ) , rebuild ) ;
2021-09-13 22:45:50 +08:00
updateAppTitle ( ) ;
2021-09-12 22:45:00 +08:00
return true ;
2021-06-25 12:40:11 +08:00
}
}
return false ;
}
void MainWindow : : runExecutable ( const QString & exeName , const QString & filename )
{
// Check if it exists
2021-09-07 10:28:40 +08:00
if ( ! fileExists ( exeName ) ) {
2021-06-25 12:40:11 +08:00
if ( ui - > actionCompile_Run - > isEnabled ( ) ) {
2021-07-26 22:29:47 +08:00
if ( QMessageBox : : question ( this , tr ( " Confirm " ) ,
2021-06-25 12:40:11 +08:00
tr ( " Source file is not compiled. " )
+ " <br /><br /> " + tr ( " Compile now? " ) ,
QMessageBox : : Yes | QMessageBox : : No ) = = QMessageBox : : Yes ) {
ui - > actionCompile_Run - > trigger ( ) ;
return ;
}
} else {
QMessageBox : : critical ( this , " Error " ,
tr ( " Source file is not compiled. " ) ) ;
return ;
}
} else {
if ( ! filename . isEmpty ( ) & & compareFileModifiedTime ( filename , exeName ) > = 0 ) {
if ( ui - > actionCompile_Run - > isEnabled ( ) ) {
if ( QMessageBox : : warning ( this , tr ( " Confirm " ) ,
tr ( " Source file is more recent than executable. " )
+ " <br /><br /> " + tr ( " Recompile now? " ) ,
QMessageBox : : Yes | QMessageBox : : No ) = = QMessageBox : : Yes ) {
ui - > actionCompile_Run - > trigger ( ) ;
return ;
}
}
}
}
// Pause programs if they contain a console
// if devData.ConsolePause and ProgramHasConsole(FileToRun) then begin
// if fUseRunParams then
// Parameters := '"' + FileToRun + '" ' + fRunParams
// else
// Parameters := '"' + FileToRun + '"';
// FileToRun := devDirs.Exec + 'ConsolePauser.exe';
// end else begin
// if fUseRunParams then
// Parameters := fRunParams
// else
// Parameters := '';
// FileToRun := FileToRun;
// end;
2021-07-01 19:44:38 +08:00
updateCompileActions ( ) ;
if ( pSettings - > executor ( ) . minimizeOnRun ( ) ) {
showMinimized ( ) ;
}
2021-07-26 22:29:47 +08:00
updateAppTitle ( ) ;
2021-09-19 17:59:03 +08:00
if ( pSettings - > executor ( ) . useParams ( ) ) {
mCompilerManager - > run ( exeName , pSettings - > executor ( ) . params ( ) , QFileInfo ( exeName ) . absolutePath ( ) ) ;
} else {
mCompilerManager - > run ( exeName , " " , QFileInfo ( exeName ) . absolutePath ( ) ) ;
}
2021-06-25 12:40:11 +08:00
}
void MainWindow : : runExecutable ( )
{
2021-09-13 22:45:50 +08:00
CompileTarget target = getCompileTarget ( ) ;
if ( target = = CompileTarget : : Project ) {
runExecutable ( mProject - > executable ( ) , mProject - > filename ( ) ) ;
} else {
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
if ( editor - > modified ( ) ) {
if ( ! editor - > save ( false , false ) )
return ;
}
QString exeName = getCompiledExecutableName ( editor - > filename ( ) ) ;
runExecutable ( exeName , editor - > filename ( ) ) ;
2021-06-25 12:40:11 +08:00
}
}
2021-06-24 20:43:09 +08:00
}
2021-07-23 13:22:05 +08:00
void MainWindow : : debug ( )
{
if ( mCompilerManager - > compiling ( ) )
return ;
Settings : : PCompilerSet compilerSet = pSettings - > compilerSets ( ) . defaultSet ( ) ;
2021-07-26 22:29:47 +08:00
if ( ! compilerSet ) {
QMessageBox : : critical ( pMainWindow ,
tr ( " No compiler set " ) ,
tr ( " No compiler set is configured. " ) + " <BR/> " + tr ( " Can't start debugging. " ) ) ;
2021-07-23 13:22:05 +08:00
return ;
2021-07-26 22:29:47 +08:00
}
2021-07-23 13:22:05 +08:00
bool debugEnabled ;
bool stripEnabled ;
2021-07-25 13:03:46 +08:00
QString filePath ;
QFileInfo debugFile ;
2021-07-23 13:22:05 +08:00
switch ( getCompileTarget ( ) ) {
case CompileTarget : : Project :
2021-09-18 11:32:38 +08:00
// Check if we enabled proper options
debugEnabled = mProject - > getCompilerOption ( " -g3 " ) ! = ' 0 ' ;
stripEnabled = mProject - > getCompilerOption ( " -s " ) ! = ' 0 ' ;
// Ask the user if he wants to enable debugging...
if ( ( ( ! debugEnabled ) | | stripEnabled ) & &
( QMessageBox : : question ( this ,
tr ( " Enable debugging " ) ,
tr ( " You have not enabled debugging info (-g3) and/or stripped it from the executable (-s) in Compiler Options.<BR /><BR />Do you want to correct this now? " )
) = = QMessageBox : : Yes ) ) {
// Enable debugging, disable stripping
mProject - > setCompilerOption ( " -g3 " , ' 1 ' ) ;
mProject - > setCompilerOption ( " -s " , ' 0 ' ) ;
// Save changes to compiler set
mProject - > saveOptions ( ) ;
mCompileSuccessionTask = std : : make_shared < CompileSuccessionTask > ( ) ;
mCompileSuccessionTask - > type = CompileSuccessionTaskType : : Debug ;
compile ( ) ;
return ;
}
2021-09-18 19:30:16 +08:00
// Did we compile?
if ( ! fileExists ( mProject - > executable ( ) ) ) {
if ( QMessageBox : : question (
this ,
tr ( " Project not built " ) ,
tr ( " Project hasn't been built. Build it now? " ) ,
QMessageBox : : Yes | QMessageBox : : No ,
QMessageBox : : Yes ) = = QMessageBox : : Yes ) {
mCompileSuccessionTask = std : : make_shared < CompileSuccessionTask > ( ) ;
mCompileSuccessionTask - > type = CompileSuccessionTaskType : : Debug ;
compile ( ) ;
}
return ;
}
// Did we choose a host application for our DLL?
if ( mProject - > options ( ) . type = = ProjectType : : DynamicLib ) {
if ( mProject - > options ( ) . hostApplication . isEmpty ( ) ) {
QMessageBox : : critical ( this ,
tr ( " Host applcation missing " ) ,
tr ( " DLL project needs a host application to run. " )
+ " <br /> "
+ tr ( " But it's missing. " ) ,
QMessageBox : : Ok ) ;
return ;
2021-09-18 22:37:07 +08:00
} else if ( ! fileExists ( mProject - > options ( ) . hostApplication ) ) {
QMessageBox : : critical ( this ,
tr ( " Host application not exists " ) ,
tr ( " Host application file '%1' doesn't exist. " )
. arg ( mProject - > options ( ) . hostApplication ) ,
QMessageBox : : Ok ) ;
return ;
2021-09-18 19:30:16 +08:00
}
}
// Reset UI, remove invalid breakpoints
prepareDebugger ( ) ;
filePath = mProject - > executable ( ) ;
2021-07-23 13:22:05 +08:00
2021-09-18 19:30:16 +08:00
// mDebugger->setUseUTF8(e->fileEncoding() == ENCODING_UTF8 || e->fileEncoding() == ENCODING_UTF8_BOM);
2021-07-23 13:22:05 +08:00
2021-09-18 19:30:16 +08:00
if ( ! mDebugger - > start ( ) )
return ;
filePath . replace ( ' \\ ' , ' / ' ) ;
mDebugger - > sendCommand ( " file " , ' " ' + filePath + ' " ' ) ;
2021-07-23 13:22:05 +08:00
2021-09-18 19:30:16 +08:00
if ( mProject - > options ( ) . type = = ProjectType : : DynamicLib ) {
QString host = mProject - > options ( ) . hostApplication ;
host . replace ( ' \\ ' , ' / ' ) ;
mDebugger - > sendCommand ( " exec-file " , ' " ' + host + ' " ' ) ;
}
for ( int i = 0 ; i < mProject - > units ( ) . count ( ) ; i + + ) {
QString file = mProject - > units ( ) [ i ] - > fileName ( ) ;
file . replace ( ' \\ ' , ' / ' ) ;
mDebugger - > sendCommand ( " dir " , ' " ' + file + ' " ' ) ;
}
for ( int i = 0 ; i < mProject - > options ( ) . includes . count ( ) ; i + + ) {
QString file = mProject - > options ( ) . includes [ i ] ;
file . replace ( ' \\ ' , ' / ' ) ;
mDebugger - > sendCommand ( " dir " , ' " ' + file + ' " ' ) ;
}
for ( int i = 0 ; i < mProject - > options ( ) . libs . count ( ) ; i + + ) {
QString file = mProject - > options ( ) . libs [ i ] ;
file . replace ( ' \\ ' , ' / ' ) ;
mDebugger - > sendCommand ( " dir " , ' " ' + file + ' " ' ) ;
}
break ;
2021-07-23 13:22:05 +08:00
case CompileTarget : : File :
// Check if we enabled proper options
debugEnabled = compilerSet - > getOptionValue ( " -g3 " ) ! = ' 0 ' ;
2021-07-27 00:14:24 +08:00
stripEnabled = compilerSet - > getOptionValue ( " -s " ) ! = ' 0 ' ;
2021-07-23 13:22:05 +08:00
// Ask the user if he wants to enable debugging...
if ( ( ( ! debugEnabled ) | | stripEnabled ) & &
( QMessageBox : : question ( this ,
tr ( " Enable debugging " ) ,
2021-07-27 00:14:24 +08:00
tr ( " You have not enabled debugging info (-g3) and/or stripped it from the executable (-s) in Compiler Options.<BR /><BR />Do you want to correct this now? " )
2021-07-23 13:22:05 +08:00
) = = QMessageBox : : Yes ) ) {
// Enable debugging, disable stripping
compilerSet - > setOption ( " -g3 " , ' 1 ' ) ;
compilerSet - > setOption ( " -s " , ' 0 ' ) ;
// Save changes to compiler set
pSettings - > compilerSets ( ) . saveSet ( pSettings - > compilerSets ( ) . defaultIndex ( ) ) ;
mCompileSuccessionTask = std : : make_shared < CompileSuccessionTask > ( ) ;
mCompileSuccessionTask - > type = CompileSuccessionTaskType : : Debug ;
compile ( ) ;
return ;
}
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ! = nullptr ) {
// Did we saved?
if ( e - > modified ( ) ) {
// if file is modified,save it first
if ( ! e - > save ( false , false ) )
return ;
}
// Did we compiled?
2021-07-25 13:03:46 +08:00
filePath = getCompiledExecutableName ( e - > filename ( ) ) ;
debugFile . setFile ( filePath ) ;
if ( ! debugFile . exists ( ) ) {
2021-07-23 13:22:05 +08:00
if ( QMessageBox : : question ( this , tr ( " Compile " ) ,
tr ( " Source file is not compiled. " ) + " <BR /><BR /> " + tr ( " Compile now? " ) ,
QMessageBox : : Yes | QMessageBox : : No ,
QMessageBox : : Yes ) = = QMessageBox : : Yes ) {
mCompileSuccessionTask = std : : make_shared < CompileSuccessionTask > ( ) ;
mCompileSuccessionTask - > type = CompileSuccessionTaskType : : Debug ;
compile ( ) ;
return ;
}
} else {
2021-07-25 13:03:46 +08:00
if ( compareFileModifiedTime ( e - > filename ( ) , filePath ) > = 0 ) {
2021-07-23 13:22:05 +08:00
if ( QMessageBox : : question ( this , tr ( " Compile " ) ,
tr ( " Source file is more recent than executable. " ) + " <BR /><BR /> " + tr ( " Recompile? " ) ,
QMessageBox : : Yes | QMessageBox : : No ,
QMessageBox : : Yes ) = = QMessageBox : : Yes ) {
mCompileSuccessionTask = std : : make_shared < CompileSuccessionTask > ( ) ;
mCompileSuccessionTask - > type = CompileSuccessionTaskType : : Debug ;
compile ( ) ;
return ;
}
}
}
prepareDebugger ( ) ;
2021-07-25 13:03:46 +08:00
mDebugger - > setUseUTF8 ( e - > fileEncoding ( ) = = ENCODING_UTF8 | | e - > fileEncoding ( ) = = ENCODING_UTF8_BOM ) ;
2021-08-20 12:43:01 +08:00
if ( ! mDebugger - > start ( ) )
return ;
2021-07-25 13:03:46 +08:00
mDebugger - > sendCommand ( " file " , QString ( " \" %1 \" " ) . arg ( debugFile . filePath ( ) . replace ( ' \\ ' , ' / ' ) ) ) ;
2021-07-23 13:22:05 +08:00
}
break ;
}
2021-08-01 12:02:28 +08:00
updateEditorActions ( ) ;
2021-07-23 13:22:05 +08:00
// Add library folders
2021-08-29 10:14:07 +08:00
foreach ( QString dir , compilerSet - > libDirs ( ) ) {
2021-07-23 13:22:05 +08:00
mDebugger - > sendCommand ( " dir " ,
QString ( " \" %1 \" " ) . arg ( dir . replace ( ' \\ ' , ' / ' ) ) ) ;
}
2021-09-04 20:49:44 +08:00
foreach ( QString dir , compilerSet - > defaultLibDirs ( ) ) {
mDebugger - > sendCommand ( " dir " ,
QString ( " \" %1 \" " ) . arg ( dir . replace ( ' \\ ' , ' / ' ) ) ) ;
}
2021-07-25 13:03:46 +08:00
// Add include folders
2021-08-29 10:14:07 +08:00
foreach ( QString dir , compilerSet - > CIncludeDirs ( ) ) {
2021-07-25 13:03:46 +08:00
mDebugger - > sendCommand ( " dir " ,
QString ( " \" %1 \" " ) . arg ( dir . replace ( ' \\ ' , ' / ' ) ) ) ;
}
2021-08-29 10:14:07 +08:00
foreach ( QString dir , compilerSet - > CppIncludeDirs ( ) ) {
2021-07-25 13:03:46 +08:00
mDebugger - > sendCommand ( " dir " ,
QString ( " \" %1 \" " ) . arg ( dir . replace ( ' \\ ' , ' / ' ) ) ) ;
}
2021-09-04 20:49:44 +08:00
foreach ( QString dir , compilerSet - > defaultCIncludeDirs ( ) ) {
mDebugger - > sendCommand ( " dir " ,
QString ( " \" %1 \" " ) . arg ( dir . replace ( ' \\ ' , ' / ' ) ) ) ;
}
foreach ( QString dir , compilerSet - > defaultCppIncludeDirs ( ) ) {
mDebugger - > sendCommand ( " dir " ,
QString ( " \" %1 \" " ) . arg ( dir . replace ( ' \\ ' , ' / ' ) ) ) ;
}
2021-07-23 13:22:05 +08:00
// Add breakpoints and watch vars
2021-07-26 18:22:09 +08:00
// for i := 0 to fDebugger.WatchVarList.Count - 1 do
// fDebugger.AddWatchVar(i);
mDebugger - > sendAllWatchvarsToDebugger ( ) ;
2021-07-25 13:03:46 +08:00
mDebugger - > sendAllBreakpointsToDebugger ( ) ;
2021-07-23 13:22:05 +08:00
// Run the debugger
2021-07-25 13:03:46 +08:00
mDebugger - > sendCommand ( " set " , " width 0 " ) ; // don't wrap output, very annoying
mDebugger - > sendCommand ( " set " , " new-console on " ) ;
mDebugger - > sendCommand ( " set " , " confirm off " ) ;
2021-09-19 14:28:30 +08:00
mDebugger - > sendCommand ( " set " , " print repeats 0 " ) ; // don't repeat elements
mDebugger - > sendCommand ( " set " , " print elements 0 " ) ; // don't limit elements
2021-07-25 13:03:46 +08:00
mDebugger - > sendCommand ( " cd " , excludeTrailingPathDelimiter ( debugFile . path ( ) ) ) ; // restore working directory
if ( ! debugInferiorhasBreakpoint ( ) ) {
QString params ;
switch ( getCompileTarget ( ) ) {
case CompileTarget : : None :
return ;
case CompileTarget : : File :
// if (mCompiler->useRunParams) {
// }
mDebugger - > sendCommand ( " start " , params ) ;
2021-07-26 18:22:09 +08:00
mDebugger - > updateDebugInfo ( ) ;
2021-07-25 13:03:46 +08:00
break ;
case CompileTarget : : Project :
2021-09-18 22:37:07 +08:00
params = " " ;
2021-07-25 13:03:46 +08:00
//if fCompiler.UseRunParams then
// params := params + ' ' + fProject.Options.CmdLineArgs;
//if fCompiler.UseInputFile then
// params := params + ' < "' + fCompiler.InputFile + '"';
2021-09-18 22:37:07 +08:00
mDebugger - > sendCommand ( " start " , params ) ;
mDebugger - > updateDebugInfo ( ) ;
2021-07-25 13:03:46 +08:00
break ;
}
} else {
QString params ;
switch ( getCompileTarget ( ) ) {
case CompileTarget : : None :
return ;
case CompileTarget : : File :
// if (mCompiler->useRunParams) {
// }
mDebugger - > sendCommand ( " run " , params ) ;
2021-07-26 18:22:09 +08:00
mDebugger - > updateDebugInfo ( ) ;
2021-07-25 13:03:46 +08:00
break ;
case CompileTarget : : Project :
//params := '';
//if fCompiler.UseRunParams then
// params := params + ' ' + fProject.Options.CmdLineArgs;
//if fCompiler.UseInputFile then
// params := params + ' < "' + fCompiler.InputFile + '"';
2021-09-18 22:37:07 +08:00
mDebugger - > sendCommand ( " run " , params ) ;
mDebugger - > updateDebugInfo ( ) ;
2021-07-25 13:03:46 +08:00
break ;
}
}
2021-07-23 13:22:05 +08:00
}
2021-08-05 19:58:32 +08:00
void MainWindow : : showSearchPanel ( )
{
2021-09-02 19:36:16 +08:00
openCloseBottomPanel ( true ) ;
2021-08-05 19:58:32 +08:00
ui - > tabMessages - > setCurrentWidget ( ui - > tabSearch ) ;
}
2021-09-02 19:36:16 +08:00
void MainWindow : : openCloseBottomPanel ( bool open )
2021-06-23 22:38:02 +08:00
{
// if Assigned(fReportToolWindow) then
// Exit;
2021-09-02 19:36:16 +08:00
if ( mOpenClosingBottomPanel )
2021-06-24 16:05:19 +08:00
return ;
2021-09-02 19:36:16 +08:00
mOpenClosingBottomPanel = true ;
2021-06-24 16:05:19 +08:00
auto action = finally ( [ this ] {
2021-09-02 19:36:16 +08:00
mOpenClosingBottomPanel = false ;
2021-06-24 16:05:19 +08:00
} ) ;
2021-06-23 22:38:02 +08:00
// Switch between open and close
if ( open ) {
QList < int > sizes = ui - > splitterMessages - > sizes ( ) ;
int tabHeight = ui - > tabMessages - > tabBar ( ) - > height ( ) ;
ui - > tabMessages - > setMinimumHeight ( tabHeight + 5 ) ;
int totalSize = sizes [ 0 ] + sizes [ 1 ] ;
2021-09-02 19:36:16 +08:00
sizes [ 1 ] = mBottomPanelHeight ;
2021-06-23 22:38:02 +08:00
sizes [ 0 ] = std : : max ( 1 , totalSize - sizes [ 1 ] ) ;
ui - > splitterMessages - > setSizes ( sizes ) ;
} else {
QList < int > sizes = ui - > splitterMessages - > sizes ( ) ;
2021-09-02 19:36:16 +08:00
mBottomPanelHeight = sizes [ 1 ] ;
2021-06-23 22:38:02 +08:00
int totalSize = sizes [ 0 ] + sizes [ 1 ] ;
int tabHeight = ui - > tabMessages - > tabBar ( ) - > height ( ) ;
ui - > tabMessages - > setMinimumHeight ( tabHeight ) ;
sizes [ 1 ] = tabHeight ;
sizes [ 0 ] = std : : max ( 1 , totalSize - sizes [ 1 ] ) ;
ui - > splitterMessages - > setSizes ( sizes ) ;
}
2021-09-02 19:36:16 +08:00
mBottomPanelOpenned = open ;
2021-06-23 22:38:02 +08:00
QSplitterHandle * handle = ui - > splitterMessages - > handle ( 1 ) ;
handle - > setEnabled ( open ) ;
2021-09-02 19:36:16 +08:00
}
void MainWindow : : openCloseLeftPanel ( bool open )
{
if ( mOpenClosingLeftPanel )
return ;
mOpenClosingLeftPanel = true ;
auto action = finally ( [ this ] {
mOpenClosingLeftPanel = false ;
} ) ;
// Switch between open and close
if ( open ) {
QList < int > sizes = ui - > splitterInfos - > sizes ( ) ;
int tabWidth = ui - > tabInfos - > tabBar ( ) - > width ( ) ;
ui - > tabInfos - > setMinimumWidth ( tabWidth + 5 ) ;
int totalSize = sizes [ 0 ] + sizes [ 1 ] ;
sizes [ 0 ] = mLeftPanelWidth ;
sizes [ 1 ] = std : : max ( 1 , totalSize - sizes [ 0 ] ) ;
ui - > splitterInfos - > setSizes ( sizes ) ;
} else {
QList < int > sizes = ui - > splitterInfos - > sizes ( ) ;
mLeftPanelWidth = sizes [ 0 ] ;
int totalSize = sizes [ 0 ] + sizes [ 1 ] ;
int tabWidth = ui - > tabInfos - > tabBar ( ) - > width ( ) ;
ui - > tabInfos - > setMinimumWidth ( tabWidth ) ;
sizes [ 0 ] = tabWidth ;
sizes [ 1 ] = std : : max ( 1 , totalSize - sizes [ 0 ] ) ;
ui - > splitterInfos - > setSizes ( sizes ) ;
}
mLeftPanelOpenned = open ;
QSplitterHandle * handle = ui - > splitterInfos - > handle ( 1 ) ;
handle - > setEnabled ( open ) ;
2021-06-23 22:38:02 +08:00
}
2021-07-23 13:22:05 +08:00
void MainWindow : : prepareDebugger ( )
{
mDebugger - > stop ( ) ;
// Clear logs
ui - > debugConsole - > clear ( ) ;
ui - > txtEvalOutput - > clear ( ) ;
// Restore when no watch vars are shown
2021-07-26 18:22:09 +08:00
mDebugger - > setLeftPageIndexBackup ( ui - > tabInfos - > currentIndex ( ) ) ;
2021-07-23 13:22:05 +08:00
// Focus on the debugging buttons
ui - > tabInfos - > setCurrentWidget ( ui - > tabWatch ) ;
ui - > tabMessages - > setCurrentWidget ( ui - > tabDebug ) ;
ui - > debugViews - > setCurrentWidget ( ui - > tabDebugConsole ) ;
2021-09-02 19:36:16 +08:00
openCloseBottomPanel ( true ) ;
openCloseLeftPanel ( true ) ;
2021-07-23 13:22:05 +08:00
// Reset watch vars
2021-08-29 10:29:56 +08:00
// mDebugger->deleteWatchVars(false);
}
2021-08-30 22:05:45 +08:00
void MainWindow : : doAutoSave ( Editor * e )
{
if ( ! e )
return ;
if ( ! e - > modified ( ) )
return ;
QString filename = e - > filename ( ) ;
QFileInfo fileInfo ( filename ) ;
QDir parent = fileInfo . absoluteDir ( ) ;
QString baseName = fileInfo . completeBaseName ( ) ;
QString suffix = fileInfo . suffix ( ) ;
switch ( pSettings - > editor ( ) . autoSaveStrategy ( ) ) {
case assOverwrite :
break ;
case assAppendUnixTimestamp :
filename = parent . filePath (
QString ( " %1.%2.%3 " )
. arg ( baseName )
. arg ( QDateTime : : currentSecsSinceEpoch ( ) )
. arg ( suffix ) ) ;
break ;
case assAppendFormatedTimeStamp : {
QDateTime time = QDateTime : : currentDateTime ( ) ;
filename = parent . filePath (
QString ( " %1.%2.%3 " )
. arg ( baseName )
. arg ( time . toString ( " yyyy.MM.dd.hh.mm.ss " ) )
. arg ( suffix ) ) ;
}
}
e - > saveFile ( filename ) ;
}
2021-09-05 13:51:07 +08:00
//static void limitActionShortCutScope(QAction* action,QWidget* scopeWidget) {
// action->setParent(scopeWidget);
// action->setShortcutContext(Qt::WidgetWithChildrenShortcut);
//}
QAction * MainWindow : : createActionFor (
const QString & text ,
QWidget * parent ,
QKeySequence shortcut ) {
QAction * action = new QAction ( text , parent ) ;
if ( ! shortcut . isEmpty ( ) )
action - > setShortcut ( shortcut ) ;
action - > setPriority ( QAction : : HighPriority ) ;
action - > setShortcutContext ( Qt : : WidgetWithChildrenShortcut ) ;
parent - > addAction ( action ) ;
return action ;
}
2021-09-11 18:42:49 +08:00
void MainWindow : : scanActiveProject ( bool parse )
{
if ( ! mProject )
return ;
//UpdateClassBrowsing;
if ( parse ) {
resetCppParser ( mProject - > cppParser ( ) ) ;
mProject - > resetParserProjectFiles ( ) ;
parseFileList ( mProject - > cppParser ( ) ) ;
} else {
mProject - > resetParserProjectFiles ( ) ;
} ;
}
2021-08-31 11:13:12 +08:00
void MainWindow : : buildContextMenus ( )
{
2021-09-05 13:51:07 +08:00
2021-09-05 19:10:54 +08:00
//context menu signal for the watch view
2021-09-03 00:26:49 +08:00
ui - > watchView - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui - > watchView , & QWidget : : customContextMenuRequested ,
this , & MainWindow : : onWatchViewContextMenu ) ;
2021-09-05 13:51:07 +08:00
2021-09-05 19:10:54 +08:00
//context menu signal for Editor's tabbar
2021-09-05 05:01:31 +08:00
ui - > EditorTabsLeft - > tabBar ( ) - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui - > EditorTabsLeft - > tabBar ( ) , & QWidget : : customContextMenuRequested ,
2021-09-04 22:15:02 +08:00
this , & MainWindow : : onEditorTabContextMenu ) ;
2021-09-05 05:01:31 +08:00
ui - > EditorTabsRight - > tabBar ( ) - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui - > EditorTabsRight - > tabBar ( ) , & QWidget : : customContextMenuRequested ,
2021-09-04 22:15:02 +08:00
this , & MainWindow : : onEditorTabContextMenu ) ;
2021-09-03 00:26:49 +08:00
2021-09-05 19:10:54 +08:00
//context menu signal for Compile Issue view
2021-09-05 13:51:07 +08:00
ui - > tableIssues - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui - > tableIssues , & QWidget : : customContextMenuRequested ,
this , & MainWindow : : onTableIssuesContextMenu ) ;
mTableIssuesCopyAction = createActionFor (
tr ( " Copy " ) ,
ui - > tableIssues ,
QKeySequence ( " Ctrl+C " ) ) ;
connect ( mTableIssuesCopyAction , & QAction : : triggered ,
[ this ] ( ) {
QModelIndex index = ui - > tableIssues - > selectionModel ( ) - > currentIndex ( ) ;
PCompileIssue issue = ui - > tableIssues - > issue ( index ) ;
if ( issue ) {
QClipboard * clipboard = QApplication : : clipboard ( ) ;
clipboard - > setText ( issue - > description ) ;
}
} ) ;
mTableIssuesCopyAllAction = createActionFor (
tr ( " Copy all " ) ,
ui - > tableIssues ,
QKeySequence ( " Ctrl+Shift+C " ) ) ;
connect ( mTableIssuesCopyAllAction , & QAction : : triggered ,
[ this ] ( ) {
2021-09-05 19:10:54 +08:00
QClipboard * clipboard = QGuiApplication : : clipboard ( ) ;
QMimeData * mimeData = new QMimeData ( ) ;
mimeData - > setText ( ui - > tableIssues - > toTxt ( ) ) ;
mimeData - > setHtml ( ui - > tableIssues - > toHtml ( ) ) ;
clipboard - > clear ( ) ;
clipboard - > setMimeData ( mimeData ) ;
2021-09-05 13:51:07 +08:00
} ) ;
mTableIssuesClearAction = createActionFor (
tr ( " Clear " ) ,
ui - > tableIssues ) ;
connect ( mTableIssuesClearAction , & QAction : : triggered ,
[ this ] ( ) {
ui - > tableIssues - > clearIssues ( ) ;
} ) ;
2021-09-05 21:05:38 +08:00
//context menu signal for search view
ui - > searchHistoryPanel - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui - > searchHistoryPanel , & QWidget : : customContextMenuRequested ,
this , & MainWindow : : onSearchViewContextMenu ) ;
mSearchViewClearAction = createActionFor (
tr ( " Remove this search " ) ,
ui - > searchHistoryPanel ) ;
connect ( mSearchViewClearAction , & QAction : : triggered ,
[ this ] ( ) {
int index = ui - > cbSearchHistory - > currentIndex ( ) ;
if ( index > = 0 ) {
mSearchResultModel . removeSearchResults ( index ) ;
}
} ) ;
mSearchViewClearAllAction = createActionFor (
tr ( " Clear all searches " ) ,
ui - > searchHistoryPanel ) ;
connect ( mSearchViewClearAllAction , & QAction : : triggered ,
[ this ] ( ) {
mSearchResultModel . clear ( ) ;
} ) ;
2021-09-05 22:16:54 +08:00
//context menu signal for breakpoints view
ui - > tblBreakpoints - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui - > tblBreakpoints , & QWidget : : customContextMenuRequested ,
this , & MainWindow : : onBreakpointsViewContextMenu ) ;
mBreakpointViewPropertyAction = createActionFor (
tr ( " Breakpoint condition... " ) ,
ui - > tblBreakpoints ) ;
connect ( mBreakpointViewPropertyAction , & QAction : : triggered ,
[ this ] ( ) {
int index = ui - > tblBreakpoints - > selectionModel ( ) - > currentIndex ( ) . row ( ) ;
PBreakpoint breakpoint = debugger ( ) - > breakpointModel ( ) - > breakpoint (
index
) ;
if ( breakpoint ) {
bool isOk ;
QString s = QInputDialog : : getText ( this ,
tr ( " Break point condition " ) ,
tr ( " Enter the condition of the breakpoint: " ) ,
QLineEdit : : Normal ,
breakpoint - > condition , & isOk ) ;
if ( isOk ) {
pMainWindow - > debugger ( ) - > setBreakPointCondition ( index , s ) ;
}
}
} ) ;
mBreakpointViewRemoveAllAction = createActionFor (
tr ( " Remove all breakpoints " ) ,
ui - > tblBreakpoints ) ;
connect ( mBreakpointViewRemoveAllAction , & QAction : : triggered ,
[ this ] ( ) {
pMainWindow - > debugger ( ) - > deleteBreakpoints ( ) ;
} ) ;
2021-09-17 22:58:58 +08:00
//context menu signal for project view
ui - > projectView - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui - > projectView , & QWidget : : customContextMenuRequested ,
this , & MainWindow : : onProjectViewContextMenu ) ;
mProject_Rename_Unit = createActionFor (
tr ( " Rename File " ) ,
ui - > projectView ) ;
connect ( mProject_Rename_Unit , & QAction : : triggered ,
[ this ] ( ) {
2021-09-18 10:47:35 +08:00
if ( ui - > projectView - > currentIndex ( ) . isValid ( ) )
ui - > projectView - > edit ( ui - > projectView - > currentIndex ( ) ) ;
2021-09-17 22:58:58 +08:00
} ) ;
mProject_Add_Folder = createActionFor (
tr ( " Add Folder " ) ,
ui - > projectView ) ;
connect ( mProject_Add_Folder , & QAction : : triggered ,
[ this ] ( ) {
2021-09-18 10:47:35 +08:00
if ( ! mProject )
return ;
QModelIndex current = ui - > projectView - > currentIndex ( ) ;
if ( ! current . isValid ( ) ) {
return ;
}
FolderNode * node = static_cast < FolderNode * > ( current . internalPointer ( ) ) ;
PFolderNode folderNode = mProject - > pointerToNode ( node ) ;
if ( ! folderNode )
folderNode = mProject - > node ( ) ;
if ( folderNode - > unitIndex > = 0 )
return ;
QString s = tr ( " New folder " ) ;
bool ok ;
s = QInputDialog : : getText ( ui - > projectView ,
tr ( " Add Folder " ) ,
tr ( " Folder name: " ) ,
QLineEdit : : Normal , s ,
& ok ) . trimmed ( ) ;
if ( ok & & ! s . isEmpty ( ) ) {
QString path = mProject - > getFolderPath ( folderNode ) ;
if ( path . isEmpty ( ) ) {
mProject - > addFolder ( s ) ;
} else {
mProject - > addFolder ( path + ' / ' + s ) ;
}
mProject - > saveOptions ( ) ;
}
2021-09-17 22:58:58 +08:00
} ) ;
mProject_Rename_Folder = createActionFor (
2021-09-18 10:47:35 +08:00
tr ( " Rename Folder " ) ,
2021-09-17 22:58:58 +08:00
ui - > projectView ) ;
connect ( mProject_Rename_Folder , & QAction : : triggered ,
[ this ] ( ) {
2021-09-18 10:47:35 +08:00
if ( ui - > projectView - > currentIndex ( ) . isValid ( ) )
ui - > projectView - > edit ( ui - > projectView - > currentIndex ( ) ) ;
2021-09-17 22:58:58 +08:00
} ) ;
mProject_Remove_Folder = createActionFor (
2021-09-18 10:47:35 +08:00
tr ( " Remove Folder " ) ,
2021-09-17 22:58:58 +08:00
ui - > projectView ) ;
connect ( mProject_Remove_Folder , & QAction : : triggered ,
[ this ] ( ) {
2021-09-18 10:47:35 +08:00
if ( ! mProject )
return ;
QModelIndex current = ui - > projectView - > currentIndex ( ) ;
if ( ! current . isValid ( ) ) {
return ;
}
FolderNode * node = static_cast < FolderNode * > ( current . internalPointer ( ) ) ;
PFolderNode folderNode = mProject - > pointerToNode ( node ) ;
if ( ! folderNode )
return ;
if ( folderNode - > unitIndex > = 0 )
return ;
mProject - > removeFolder ( folderNode ) ;
mProject - > saveOptions ( ) ;
2021-09-17 22:58:58 +08:00
} ) ;
2021-09-26 12:19:46 +08:00
//context menu signal for class browser
2021-09-26 16:25:17 +08:00
ui - > tabStructure - > setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
connect ( ui - > tabStructure , & QWidget : : customContextMenuRequested ,
2021-09-26 12:19:46 +08:00
this , & MainWindow : : onClassBrowserContextMenu ) ;
mClassBrowser_Sort_By_Type = createActionFor (
tr ( " Sort By Type " ) ,
2021-09-26 16:25:17 +08:00
ui - > tabStructure ) ;
mClassBrowser_Sort_By_Type - > setCheckable ( true ) ;
2021-09-26 12:19:46 +08:00
mClassBrowser_Sort_By_Type - > setIcon ( QIcon ( " :/icons/images/newlook24/077-sort-type.png " ) ) ;
2021-09-26 16:25:17 +08:00
mClassBrowser_Sort_By_Name = createActionFor (
tr ( " Sort alphabetically " ) ,
ui - > tabStructure ) ;
mClassBrowser_Sort_By_Name - > setCheckable ( true ) ;
mClassBrowser_Sort_By_Name - > setIcon ( QIcon ( " :/icons/images/newlook24/076-sort-alpha.png " ) ) ;
mClassBrowser_Show_Inherited = createActionFor (
tr ( " Show inherited members " ) ,
ui - > tabStructure ) ;
mClassBrowser_Show_Inherited - > setCheckable ( true ) ;
mClassBrowser_Show_Inherited - > setIcon ( QIcon ( " :/icons/images/newlook24/075-show-inheritance.png " ) ) ;
mClassBrowser_goto_declaration = createActionFor (
tr ( " Goto declaration " ) ,
ui - > tabStructure ) ;
mClassBrowser_goto_definition = createActionFor (
tr ( " Goto definition " ) ,
ui - > tabStructure ) ;
mClassBrowser_Sort_By_Name - > setChecked ( pSettings - > ui ( ) . classBrowserSortAlpha ( ) ) ;
mClassBrowser_Sort_By_Type - > setChecked ( pSettings - > ui ( ) . classBrowserSortType ( ) ) ;
mClassBrowser_Show_Inherited - > setChecked ( pSettings - > ui ( ) . classBrowserShowInherited ( ) ) ;
connect ( mClassBrowser_Sort_By_Name , & QAction : : toggled ,
[ this ] ( ) {
pSettings - > ui ( ) . setClassBrowserSortAlpha ( mClassBrowser_Sort_By_Name - > isChecked ( ) ) ;
pSettings - > ui ( ) . save ( ) ;
mClassBrowserModel . fillStatements ( ) ;
} ) ;
connect ( mClassBrowser_Sort_By_Type , & QAction : : toggled ,
[ this ] ( ) {
pSettings - > ui ( ) . setClassBrowserSortType ( mClassBrowser_Sort_By_Type - > isChecked ( ) ) ;
pSettings - > ui ( ) . save ( ) ;
mClassBrowserModel . fillStatements ( ) ;
} ) ;
connect ( mClassBrowser_Show_Inherited , & QAction : : toggled ,
[ this ] ( ) {
pSettings - > ui ( ) . setClassBrowserShowInherited ( mClassBrowser_Show_Inherited - > isChecked ( ) ) ;
pSettings - > ui ( ) . save ( ) ;
mClassBrowserModel . fillStatements ( ) ;
} ) ;
connect ( mClassBrowser_goto_definition , & QAction : : triggered ,
[ this ] ( ) {
QModelIndex index = ui - > classBrowser - > currentIndex ( ) ;
if ( ! index . isValid ( ) )
return ;
ClassBrowserNode * node = static_cast < ClassBrowserNode * > ( index . internalPointer ( ) ) ;
if ( ! node )
return ;
PStatement statement = node - > statement ;
if ( ! statement ) {
return ;
}
QString filename ;
int line ;
filename = statement - > definitionFileName ;
line = statement - > definitionLine ;
Editor * e = pMainWindow - > editorList ( ) - > getEditorByFilename ( filename ) ;
if ( e ) {
e - > setCaretPositionAndActivate ( line , 1 ) ;
}
} ) ;
connect ( mClassBrowser_goto_declaration , & QAction : : triggered ,
[ this ] ( ) {
on_classBrowser_doubleClicked ( ui - > classBrowser - > currentIndex ( ) ) ;
} ) ;
//toolbar for class browser
mClassBrowserToolbar = new QWidget ( ) ;
QVBoxLayout * layout = dynamic_cast < QVBoxLayout * > ( ui - > tabStructure - > layout ( ) ) ;
layout - > insertWidget ( 0 , mClassBrowserToolbar ) ;
QHBoxLayout * hlayout = new QHBoxLayout ( ) ;
hlayout - > setContentsMargins ( 2 , 2 , 2 , 2 ) ;
mClassBrowserToolbar - > setLayout ( hlayout ) ;
QToolButton * toolButton ;
toolButton = new QToolButton ;
toolButton - > setDefaultAction ( mClassBrowser_Sort_By_Type ) ;
hlayout - > addWidget ( toolButton ) ;
toolButton = new QToolButton ;
toolButton - > setDefaultAction ( mClassBrowser_Sort_By_Name ) ;
hlayout - > addWidget ( toolButton ) ;
QFrame * vLine = new QFrame ( ) ;
vLine - > setFrameShape ( QFrame : : VLine ) ;
vLine - > setFrameShadow ( QFrame : : Sunken ) ;
hlayout - > addWidget ( vLine ) ;
toolButton = new QToolButton ;
toolButton - > setDefaultAction ( mClassBrowser_Show_Inherited ) ;
hlayout - > addWidget ( toolButton ) ;
hlayout - > addStretch ( ) ;
2021-08-31 11:13:12 +08:00
}
2021-09-02 20:12:16 +08:00
void MainWindow : : maximizeEditor ( )
{
if ( mLeftPanelOpenned | | mBottomPanelOpenned ) {
openCloseBottomPanel ( false ) ;
openCloseLeftPanel ( false ) ;
} else {
openCloseBottomPanel ( true ) ;
openCloseLeftPanel ( true ) ;
}
}
2021-09-03 16:39:20 +08:00
void MainWindow : : openShell ( const QString & folder , const QString & shellCommand )
{
QProcess process ;
process . setWorkingDirectory ( folder ) ;
process . setProgram ( shellCommand ) ;
process . setCreateProcessArgumentsModifier ( [ ] ( QProcess : : CreateProcessArguments * args ) {
args - > flags | = CREATE_NEW_CONSOLE ;
args - > startupInfo - > dwFlags & = ~ STARTF_USESTDHANDLES ; //
} ) ;
QProcessEnvironment env = QProcessEnvironment : : systemEnvironment ( ) ;
QString path = env . value ( " PATH " ) ;
2021-09-14 12:10:43 +08:00
QStringList pathAdded ;
2021-09-03 16:39:20 +08:00
if ( pSettings - > compilerSets ( ) . defaultSet ( ) ) {
foreach ( const QString & dir , pSettings - > compilerSets ( ) . defaultSet ( ) - > binDirs ( ) ) {
2021-09-14 12:10:43 +08:00
pathAdded . append ( dir ) ;
2021-09-03 16:39:20 +08:00
}
}
2021-09-14 12:10:43 +08:00
pathAdded . append ( pSettings - > dirs ( ) . app ( ) ) ;
if ( ! path . isEmpty ( ) ) {
2021-09-17 19:58:37 +08:00
path = pathAdded . join ( PATH_SEPARATOR ) + PATH_SEPARATOR + path ;
2021-09-14 12:10:43 +08:00
} else {
path = pathAdded . join ( PATH_SEPARATOR ) ;
}
2021-09-03 16:39:20 +08:00
env . insert ( " PATH " , path ) ;
process . setProcessEnvironment ( env ) ;
process . startDetached ( ) ;
}
2021-08-30 22:05:45 +08:00
void MainWindow : : onAutoSaveTimeout ( )
{
if ( ! pSettings - > editor ( ) . enableAutoSave ( ) )
return ;
int updateCount = 0 ;
switch ( pSettings - > editor ( ) . autoSaveTarget ( ) ) {
case astCurrentFile : {
Editor * e = mEditorList - > getEditor ( ) ;
doAutoSave ( e ) ;
updateCount + + ;
}
break ;
case astAllOpennedFiles :
for ( int i = 0 ; i < mEditorList - > pageCount ( ) ; i + + ) {
Editor * e = ( * mEditorList ) [ i ] ;
doAutoSave ( e ) ;
updateCount + + ;
}
break ;
case astAllProjectFiles :
//todo: auto save project files
break ;
}
updateStatusbarMessage ( tr ( " %1 files autosaved " ) . arg ( updateCount ) ) ;
}
2021-09-03 00:26:49 +08:00
void MainWindow : : onWatchViewContextMenu ( const QPoint & pos )
{
QMenu menu ( this ) ;
menu . addAction ( ui - > actionAdd_Watch ) ;
menu . addAction ( ui - > actionRemove_Watch ) ;
menu . addAction ( ui - > actionRemove_All_Watches ) ;
menu . addAction ( ui - > actionModify_Watch ) ;
menu . exec ( ui - > watchView - > mapToGlobal ( pos ) ) ;
}
2021-09-05 13:51:07 +08:00
void MainWindow : : onTableIssuesContextMenu ( const QPoint & pos )
{
QMenu menu ( this ) ;
menu . addAction ( mTableIssuesCopyAction ) ;
menu . addAction ( mTableIssuesCopyAllAction ) ;
menu . addSeparator ( ) ;
menu . addAction ( mTableIssuesClearAction ) ;
menu . exec ( ui - > tableIssues - > mapToGlobal ( pos ) ) ;
}
2021-09-05 21:05:38 +08:00
void MainWindow : : onSearchViewContextMenu ( const QPoint & pos )
{
QMenu menu ( this ) ;
menu . addAction ( mSearchViewClearAction ) ;
menu . addAction ( mSearchViewClearAllAction ) ;
menu . exec ( ui - > searchHistoryPanel - > mapToGlobal ( pos ) ) ;
}
2021-09-05 22:16:54 +08:00
void MainWindow : : onBreakpointsViewContextMenu ( const QPoint & pos )
{
QMenu menu ( this ) ;
menu . addAction ( mBreakpointViewPropertyAction ) ;
menu . addAction ( mBreakpointViewRemoveAllAction ) ;
menu . exec ( ui - > tblBreakpoints - > mapToGlobal ( pos ) ) ;
}
2021-09-17 22:58:58 +08:00
void MainWindow : : onProjectViewContextMenu ( const QPoint & pos )
{
if ( ! mProject )
return ;
bool onFolder = false ;
bool onUnit = false ;
bool onRoot = false ;
bool folderEmpty = false ;
int unitIndex = - 1 ;
QModelIndex current = ui - > projectView - > selectionModel ( ) - > currentIndex ( ) ;
if ( current . isValid ( ) & & mProject ) {
FolderNode * node = static_cast < FolderNode * > ( current . internalPointer ( ) ) ;
PFolderNode pNode = mProject - > pointerToNode ( node ) ;
if ( pNode ) {
unitIndex = pNode - > unitIndex ;
onFolder = ( unitIndex < 0 ) ;
onUnit = ( unitIndex > = 0 ) ;
2021-09-18 10:47:35 +08:00
onRoot = false ;
2021-09-17 22:58:58 +08:00
if ( onFolder & & ! onRoot ) {
folderEmpty = pNode - > children . isEmpty ( ) ;
}
2021-09-18 10:47:35 +08:00
} else {
onFolder = true ;
onRoot = true ;
2021-09-17 22:58:58 +08:00
}
}
QMenu menu ( this ) ;
updateProjectActions ( ) ;
menu . addAction ( ui - > actionProject_New_File ) ;
menu . addAction ( ui - > actionAdd_to_project ) ;
2021-09-18 10:47:35 +08:00
if ( ! onFolder ) {
menu . addAction ( ui - > actionRemove_from_project ) ;
}
2021-09-17 22:58:58 +08:00
if ( onUnit ) {
menu . addAction ( mProject_Rename_Unit ) ;
}
menu . addSeparator ( ) ;
if ( onFolder ) {
menu . addAction ( mProject_Add_Folder ) ;
if ( ! onRoot ) {
menu . addAction ( mProject_Rename_Folder ) ;
if ( folderEmpty ) {
menu . addAction ( mProject_Remove_Folder ) ;
}
}
menu . addSeparator ( ) ;
}
2021-09-18 10:47:35 +08:00
menu . addAction ( ui - > actionProject_Open_Folder_In_Explorer ) ;
menu . addAction ( ui - > actionProject_Open_In_Terminal ) ;
menu . addSeparator ( ) ;
2021-09-17 22:58:58 +08:00
menu . addAction ( ui - > actionProject_options ) ;
menu . exec ( ui - > projectView - > mapToGlobal ( pos ) ) ;
}
2021-09-26 16:25:17 +08:00
void MainWindow : : onClassBrowserContextMenu ( const QPoint & pos )
{
QMenu menu ( this ) ;
bool canGoto = false ;
QModelIndex index = ui - > classBrowser - > currentIndex ( ) ;
if ( index . isValid ( ) ) {
ClassBrowserNode * node = static_cast < ClassBrowserNode * > ( index . internalPointer ( ) ) ;
if ( node ) {
PStatement statement = node - > statement ;
if ( statement ) {
canGoto = true ;
}
}
}
mClassBrowser_goto_declaration - > setEnabled ( canGoto ) ;
mClassBrowser_goto_definition - > setEnabled ( canGoto ) ;
menu . addAction ( mClassBrowser_goto_declaration ) ;
menu . addAction ( mClassBrowser_goto_definition ) ;
menu . addSeparator ( ) ;
menu . addAction ( mClassBrowser_Sort_By_Name ) ;
menu . addAction ( mClassBrowser_Sort_By_Type ) ;
menu . addAction ( mClassBrowser_Show_Inherited ) ;
menu . exec ( ui - > projectView - > mapToGlobal ( pos ) ) ;
}
2021-09-03 00:26:49 +08:00
void MainWindow : : onEditorContextMenu ( const QPoint & pos )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( ! editor )
return ;
QMenu menu ( this ) ;
2021-09-03 10:30:08 +08:00
BufferCoord p ;
2021-09-05 05:01:31 +08:00
mEditorContextMenuPos = pos ;
2021-09-20 15:57:48 +08:00
if ( editor - > getPositionOfMouse ( p ) ) {
2021-09-03 10:30:08 +08:00
//mouse on editing area
menu . addAction ( ui - > actionCompile_Run ) ;
menu . addAction ( ui - > actionDebug ) ;
menu . addSeparator ( ) ;
2021-09-03 11:50:04 +08:00
menu . addAction ( ui - > actionGoto_Declaration ) ;
menu . addAction ( ui - > actionGoto_Definition ) ;
menu . addAction ( ui - > actionFind_references ) ;
2021-09-03 16:39:20 +08:00
menu . addSeparator ( ) ;
menu . addAction ( ui - > actionOpen_Containing_Folder ) ;
menu . addAction ( ui - > actionOpen_Terminal ) ;
2021-09-03 20:55:14 +08:00
menu . addSeparator ( ) ;
menu . addAction ( ui - > actionReformat_Code ) ;
menu . addSeparator ( ) ;
menu . addAction ( ui - > actionCut ) ;
menu . addAction ( ui - > actionCopy ) ;
menu . addAction ( ui - > actionPaste ) ;
menu . addAction ( ui - > actionSelectAll ) ;
menu . addSeparator ( ) ;
menu . addAction ( ui - > actionAdd_Watch ) ;
menu . addAction ( ui - > actionToggle_Breakpoint ) ;
menu . addAction ( ui - > actionClear_all_breakpoints ) ;
2021-09-04 00:13:42 +08:00
menu . addSeparator ( ) ;
menu . addAction ( ui - > actionFile_Properties ) ;
2021-09-03 20:55:14 +08:00
2021-09-03 16:39:20 +08:00
//these actions needs parser
ui - > actionGoto_Declaration - > setEnabled ( ! editor - > parser ( ) - > parsing ( ) ) ;
ui - > actionGoto_Definition - > setEnabled ( ! editor - > parser ( ) - > parsing ( ) ) ;
ui - > actionFind_references - > setEnabled ( ! editor - > parser ( ) - > parsing ( ) ) ;
2021-09-03 10:30:08 +08:00
} else {
//mouse on gutter
int line ;
2021-09-20 15:57:48 +08:00
if ( ! editor - > getLineOfMouse ( line ) )
2021-09-03 10:30:08 +08:00
line = - 1 ;
menu . addAction ( ui - > actionToggle_Breakpoint ) ;
menu . addAction ( ui - > actionBreakpoint_property ) ;
menu . addAction ( ui - > actionClear_all_breakpoints ) ;
ui - > actionBreakpoint_property - > setEnabled ( editor - > hasBreakpoint ( line ) ) ;
}
2021-09-03 00:26:49 +08:00
menu . exec ( editor - > viewport ( ) - > mapToGlobal ( pos ) ) ;
}
2021-09-04 22:15:02 +08:00
void MainWindow : : onEditorTabContextMenu ( const QPoint & pos )
{
2021-09-05 05:01:31 +08:00
int index = ui - > EditorTabsLeft - > tabBar ( ) - > tabAt ( pos ) ;
if ( index < 0 )
return ;
ui - > EditorTabsLeft - > setCurrentIndex ( index ) ;
QMenu menu ( this ) ;
QTabBar * tabBar = ui - > EditorTabsLeft - > tabBar ( ) ;
menu . addAction ( ui - > actionClose ) ;
menu . addAction ( ui - > actionClose_All ) ;
menu . addSeparator ( ) ;
menu . addAction ( ui - > actionOpen_Containing_Folder ) ;
menu . addAction ( ui - > actionOpen_Terminal ) ;
menu . addSeparator ( ) ;
menu . addAction ( ui - > actionFile_Properties ) ;
2021-09-04 22:15:02 +08:00
2021-09-05 05:01:31 +08:00
menu . exec ( tabBar - > mapToGlobal ( pos ) ) ;
2021-09-04 22:15:02 +08:00
}
2021-09-19 14:28:30 +08:00
void MainWindow : : disableDebugActions ( )
{
ui - > actionStep_Into - > setEnabled ( false ) ;
ui - > actionStep_Over - > setEnabled ( false ) ;
ui - > actionStep_Out - > setEnabled ( false ) ;
ui - > actionRun_To_Cursor - > setEnabled ( false ) ;
ui - > actionContinue - > setEnabled ( false ) ;
ui - > cbEvaluate - > setEnabled ( false ) ;
}
void MainWindow : : enableDebugActions ( )
{
ui - > actionStep_Into - > setEnabled ( true ) ;
ui - > actionStep_Over - > setEnabled ( true ) ;
ui - > actionStep_Out - > setEnabled ( true ) ;
ui - > actionRun_To_Cursor - > setEnabled ( true ) ;
ui - > actionContinue - > setEnabled ( true ) ;
ui - > cbEvaluate - > setEnabled ( true ) ;
}
2021-09-17 21:33:19 +08:00
void MainWindow : : prepareProjectForCompile ( )
{
if ( ! mProject )
return ;
if ( ! mProject - > saveUnits ( ) )
return ;
// Check if saves have been succesful
for ( int i = 0 ; i < mEditorList - > pageCount ( ) ; i + + ) {
Editor * e = ( * ( mEditorList ) ) [ i ] ;
if ( e - > inProject ( ) & & e - > modified ( ) )
return ;
}
mProject - > buildPrivateResource ( ) ;
}
2021-09-11 18:42:49 +08:00
void MainWindow : : closeProject ( bool refreshEditor )
{
// Stop executing program
on_actionStop_Execution_triggered ( ) ;
// Only update file monitor once (and ignore updates)
bool oldBlock = mFileSystemWatcher . blockSignals ( true ) ;
{
auto action = finally ( [ & , this ] {
mFileSystemWatcher . blockSignals ( oldBlock ) ;
} ) ;
// TODO: should we save watches?
if ( mProject - > modified ( ) ) {
QString s ;
if ( mProject - > name ( ) . isEmpty ( ) ) {
s = mProject - > filename ( ) ;
} else {
s = mProject - > name ( ) ;
}
if ( mSystemTurnedOff ) {
mProject - > saveAll ( ) ;
} else {
int answer = QMessageBox : : question (
this ,
tr ( " Save project " ) ,
tr ( " The project '%1' has modifications. " ) . arg ( s )
+ " <br /> "
+ tr ( " Do you want to save it? " ) ,
QMessageBox : : Yes | QMessageBox : : No | QMessageBox : : Cancel ,
QMessageBox : : Yes ) ;
switch ( answer ) {
case QMessageBox : : Yes :
mProject - > saveAll ( ) ;
break ;
case QMessageBox : : No :
mProject - > setModified ( false ) ;
mProject - > saveLayout ( ) ;
break ;
case QMessageBox : : Cancel :
mProject - > saveLayout ( ) ;
return ;
}
}
} else
mProject - > saveLayout ( ) ; // always save layout, but not when SaveAll has been called
mClassBrowserModel . beginUpdate ( ) ;
{
auto action2 = finally ( [ this ] {
mClassBrowserModel . endUpdate ( ) ;
} ) ;
// Remember it
pSettings - > history ( ) . addToOpenedProjects ( mProject - > filename ( ) ) ;
mEditorList - > beginUpdate ( ) ;
{
auto action3 = finally ( [ this ] {
mEditorList - > endUpdate ( ) ;
} ) ;
mProject . reset ( ) ;
if ( ! mQuitting & & refreshEditor ) {
//reset Class browsing
ui - > tabInfos - > setCurrentWidget ( ui - > tabStructure ) ;
Editor * e = mEditorList - > getEditor ( ) ;
updateClassBrowserForEditor ( e ) ;
} else {
mClassBrowserModel . setParser ( nullptr ) ;
mClassBrowserModel . setCurrentFile ( " " ) ;
}
}
}
if ( ! mQuitting ) {
// Clear error browser
ui - > tableIssues - > clearIssues ( ) ;
2021-09-17 09:56:52 +08:00
updateProjectView ( ) ;
2021-09-11 18:42:49 +08:00
}
}
}
2021-09-17 09:56:52 +08:00
void MainWindow : : updateProjectView ( )
{
if ( mProject ) {
ui - > projectView - > setModel ( mProject - > model ( ) ) ;
2021-09-18 10:47:35 +08:00
connect ( mProject - > model ( ) , & QAbstractItemModel : : modelReset ,
ui - > projectView , & QTreeView : : expandAll ) ;
2021-09-17 13:35:50 +08:00
ui - > projectView - > expandAll ( ) ;
2021-09-17 09:56:52 +08:00
openCloseLeftPanel ( true ) ;
ui - > tabProject - > setVisible ( true ) ;
ui - > tabInfos - > setCurrentWidget ( ui - > tabProject ) ;
} else {
// Clear project browser
ui - > projectView - > setModel ( nullptr ) ;
ui - > tabProject - > setVisible ( false ) ;
}
updateProjectActions ( ) ;
}
2021-08-31 14:40:41 +08:00
void MainWindow : : onFileChanged ( const QString & path )
{
Editor * e = mEditorList - > getOpenedEditorByFilename ( path ) ;
if ( e ) {
2021-09-07 10:28:40 +08:00
if ( fileExists ( path ) ) {
2021-08-31 14:40:41 +08:00
e - > activate ( ) ;
if ( QMessageBox : : question ( this , tr ( " Compile " ) ,
tr ( " File '%1' was changed. " ) . arg ( path ) + " <BR /><BR /> " + tr ( " Reload its content from disk? " ) ,
QMessageBox : : Yes | QMessageBox : : No ,
QMessageBox : : No ) = = QMessageBox : : Yes ) {
try {
e - > loadFile ( ) ;
} catch ( FileError e ) {
QMessageBox : : critical ( this , tr ( " Error " ) , e . reason ( ) ) ;
}
}
} else {
if ( QMessageBox : : question ( this , tr ( " Compile " ) ,
tr ( " File '%1' was removed. " ) . arg ( path ) + " <BR /><BR /> " + tr ( " Keep it open? " ) ,
QMessageBox : : Yes | QMessageBox : : No ,
QMessageBox : : Yes ) = = QMessageBox : : No ) {
mEditorList - > closeEditor ( e ) ;
} else {
e - > setModified ( true ) ;
e - > updateCaption ( ) ;
}
}
}
}
2021-08-29 10:29:56 +08:00
const std : : shared_ptr < HeaderCompletionPopup > & MainWindow : : headerCompletionPopup ( ) const
{
return mHeaderCompletionPopup ;
}
2021-09-24 11:41:14 +08:00
const std : : shared_ptr < FunctionTooltipWidget > & MainWindow : : functionTip ( ) const
{
return mFunctionTip ;
}
2021-08-29 10:29:56 +08:00
const std : : shared_ptr < CodeCompletionPopup > & MainWindow : : completionPopup ( ) const
{
return mCompletionPopup ;
2021-07-23 13:22:05 +08:00
}
2021-08-03 23:55:57 +08:00
SearchDialog * MainWindow : : searchDialog ( ) const
{
return mSearchDialog ;
}
2021-08-05 12:31:53 +08:00
SearchResultModel * MainWindow : : searchResultModel ( )
{
return & mSearchResultModel ;
}
2021-08-03 23:55:57 +08:00
EditorList * MainWindow : : editorList ( ) const
{
return mEditorList ;
}
2021-08-01 09:13:38 +08:00
Debugger * MainWindow : : debugger ( ) const
{
return mDebugger ;
}
2021-07-26 18:22:09 +08:00
CPUDialog * MainWindow : : cpuDialog ( ) const
2021-07-26 11:47:54 +08:00
{
return mCPUDialog ;
}
2021-04-07 21:13:15 +08:00
void MainWindow : : on_actionNew_triggered ( )
{
2021-06-20 09:27:37 +08:00
try {
Editor * editor = mEditorList - > newEditor ( " " , ENCODING_AUTO_DETECT , false , true ) ;
editor - > activate ( ) ;
updateForEncodingInfo ( ) ;
} catch ( FileError e ) {
2021-06-21 11:21:26 +08:00
QMessageBox : : critical ( this , tr ( " Error " ) , e . reason ( ) ) ;
2021-06-20 09:27:37 +08:00
}
2021-04-07 21:13:15 +08:00
}
2021-04-07 22:44:08 +08:00
void MainWindow : : on_EditorTabsLeft_tabCloseRequested ( int index )
{
2021-09-02 19:36:16 +08:00
Editor * editor = mEditorList - > getEditor ( index , ui - > EditorTabsLeft ) ;
2021-04-08 10:29:21 +08:00
mEditorList - > closeEditor ( editor ) ;
}
void MainWindow : : on_actionOpen_triggered ( )
{
2021-06-20 09:27:37 +08:00
try {
2021-08-30 18:36:44 +08:00
QString selectedFileFilter ;
2021-09-11 18:42:49 +08:00
selectedFileFilter = pSystemConsts - > defaultAllFileFilter ( ) ;
2021-06-20 09:27:37 +08:00
QStringList files = QFileDialog : : getOpenFileNames ( pMainWindow ,
tr ( " Open " ) , QString ( ) , pSystemConsts - > defaultFileFilters ( ) . join ( " ;; " ) ,
& selectedFileFilter ) ;
openFiles ( files ) ;
} catch ( FileError e ) {
2021-06-21 11:21:26 +08:00
QMessageBox : : critical ( this , tr ( " Error " ) , e . reason ( ) ) ;
2021-06-20 09:27:37 +08:00
}
2021-04-07 22:44:08 +08:00
}
2021-04-09 17:48:25 +08:00
void MainWindow : : closeEvent ( QCloseEvent * event ) {
2021-09-02 16:35:28 +08:00
Settings : : UI & settings = pSettings - > ui ( ) ;
settings . setMainWindowState ( saveState ( ) ) ;
settings . setMainWindowGeometry ( saveGeometry ( ) ) ;
2021-09-02 19:36:16 +08:00
settings . setBottomPanelHeight ( mBottomPanelHeight ) ;
settings . setBottomPanelIndex ( ui - > tabMessages - > currentIndex ( ) ) ;
settings . setBottomPanelOpenned ( mBottomPanelOpenned ) ;
settings . setLeftPanelWidth ( mLeftPanelWidth ) ;
settings . setLeftPanelIndex ( ui - > tabInfos - > currentIndex ( ) ) ;
settings . setLeftPanelOpenned ( mLeftPanelOpenned ) ;
2021-09-18 10:47:35 +08:00
settings . save ( ) ;
2021-09-02 19:36:16 +08:00
2021-06-10 09:34:59 +08:00
if ( ! mEditorList - > closeAll ( false ) ) {
2021-04-09 17:48:25 +08:00
event - > ignore ( ) ;
return ;
}
2021-09-18 10:47:35 +08:00
if ( mProject ) {
2021-09-18 11:08:30 +08:00
closeProject ( false ) ;
2021-09-18 10:47:35 +08:00
}
2021-04-09 17:48:25 +08:00
delete mEditorList ;
event - > accept ( ) ;
return ;
}
2021-04-11 12:39:22 +08:00
2021-09-02 19:36:16 +08:00
void MainWindow : : showEvent ( QShowEvent * event )
{
const Settings : : UI & settings = pSettings - > ui ( ) ;
ui - > tabMessages - > setCurrentIndex ( settings . bottomPanelIndex ( ) ) ;
if ( settings . bottomPanelOpenned ( ) ) {
mBottomPanelHeight = settings . bottomPanelHeight ( ) ;
openCloseBottomPanel ( true ) ;
} else {
openCloseBottomPanel ( false ) ;
mBottomPanelHeight = settings . bottomPanelHeight ( ) ;
}
ui - > tabInfos - > setCurrentIndex ( settings . leftPanelIndex ( ) ) ;
if ( settings . leftPanelOpenned ( ) ) {
mLeftPanelWidth = settings . leftPanelWidth ( ) ;
openCloseLeftPanel ( true ) ;
} else {
openCloseLeftPanel ( false ) ;
mLeftPanelWidth = settings . leftPanelWidth ( ) ;
}
}
2021-09-05 21:17:33 +08:00
void MainWindow : : dragEnterEvent ( QDragEnterEvent * event )
{
if ( event - > mimeData ( ) - > hasUrls ( ) ) {
event - > acceptProposedAction ( ) ;
}
}
void MainWindow : : dropEvent ( QDropEvent * event )
{
if ( event - > mimeData ( ) - > hasUrls ( ) ) {
foreach ( const QUrl & url , event - > mimeData ( ) - > urls ( ) ) {
if ( ! url . isLocalFile ( ) )
continue ;
2021-09-12 22:45:00 +08:00
QString file = url . toLocalFile ( ) ;
if ( getFileType ( file ) = = FileType : : Project ) {
openProject ( file ) ;
return ;
}
}
foreach ( const QUrl & url , event - > mimeData ( ) - > urls ( ) ) {
if ( ! url . isLocalFile ( ) )
continue ;
QString file = url . toLocalFile ( ) ;
openFile ( file ) ;
2021-09-05 21:17:33 +08:00
}
}
}
2021-04-11 12:39:22 +08:00
void MainWindow : : on_actionSave_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-20 09:27:37 +08:00
try {
editor - > save ( ) ;
2021-09-12 22:45:00 +08:00
if ( editor - > inProject ( ) & & ( mProject ) )
mProject - > saveAll ( ) ;
2021-06-20 09:27:37 +08:00
} catch ( FileError e ) {
2021-06-21 11:21:26 +08:00
QMessageBox : : critical ( this , tr ( " Error " ) , e . reason ( ) ) ;
2021-06-20 09:27:37 +08:00
}
}
2021-04-11 12:39:22 +08:00
}
void MainWindow : : on_actionSaveAs_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-20 09:27:37 +08:00
try {
editor - > saveAs ( ) ;
} catch ( FileError e ) {
2021-06-21 11:21:26 +08:00
QMessageBox : : critical ( this , tr ( " Error " ) , e . reason ( ) ) ;
2021-06-20 09:27:37 +08:00
}
2021-04-11 12:39:22 +08:00
}
}
2021-04-16 22:04:48 +08:00
void MainWindow : : on_actionOptions_triggered ( )
{
2021-09-11 18:42:49 +08:00
bool oldCodeCompletion = pSettings - > codeCompletion ( ) . enabled ( ) ;
2021-09-14 12:10:43 +08:00
PSettingsDialog settingsDialog = SettingsDialog : : optionDialog ( ) ;
settingsDialog - > exec ( ) ;
2021-09-11 18:42:49 +08:00
bool newCodeCompletion = pSettings - > codeCompletion ( ) . enabled ( ) ;
if ( ! oldCodeCompletion & & newCodeCompletion ) {
Editor * e = mEditorList - > getEditor ( ) ;
if ( mProject & & ! e ) {
scanActiveProject ( true ) ;
} else if ( mProject & & e & & e - > inProject ( ) ) {
scanActiveProject ( true ) ;
} else if ( e ) {
e - > reparse ( ) ;
}
}
2021-04-16 22:04:48 +08:00
}
2021-04-18 11:41:41 +08:00
void MainWindow : : onCompilerSetChanged ( int index )
{
if ( index < 0 )
return ;
2021-09-19 14:28:30 +08:00
if ( mProject ) {
Editor * e = mEditorList - > getEditor ( ) ;
if ( ! e | | e - > inProject ( ) ) {
mProject - > options ( ) . compilerSet = index ;
mProject - > saveOptions ( ) ;
return ;
}
}
2021-04-18 11:41:41 +08:00
pSettings - > compilerSets ( ) . setDefaultIndex ( index ) ;
pSettings - > compilerSets ( ) . saveDefaultIndex ( ) ;
}
2021-04-20 22:24:33 +08:00
void MainWindow : : onCompileLog ( const QString & msg )
{
ui - > txtCompilerOutput - > appendPlainText ( msg ) ;
2021-09-17 19:58:37 +08:00
ui - > txtCompilerOutput - > ensureCursorVisible ( ) ;
2021-04-20 22:24:33 +08:00
}
2021-04-24 15:57:45 +08:00
void MainWindow : : onCompileIssue ( PCompileIssue issue )
2021-04-20 22:24:33 +08:00
{
2021-04-24 15:57:45 +08:00
ui - > tableIssues - > addIssue ( issue ) ;
2021-06-23 22:38:02 +08:00
// Update tab caption
// if CompilerOutput.Items.Count = 1 then
// CompSheet.Caption := Lang[ID_SHEET_COMP] + ' (' + IntToStr(CompilerOutput.Items.Count) + ')';
if ( issue - > type = = CompileIssueType : : Error | | issue - > type = =
CompileIssueType : : Warning ) {
Editor * e = mEditorList - > getOpenedEditorByFilename ( issue - > filename ) ;
if ( e ! = nullptr & & ( issue - > line > 0 ) ) {
int line = issue - > line ;
if ( line > e - > lines ( ) - > count ( ) )
return ;
int col = std : : min ( issue - > column , e - > lines ( ) - > getString ( line - 1 ) . length ( ) + 1 ) ;
2021-06-24 16:05:19 +08:00
if ( col < 1 )
col = e - > lines ( ) - > getString ( line - 1 ) . length ( ) + 1 ;
e - > addSyntaxIssues ( line , col , issue - > endColumn , issue - > type , issue - > description ) ;
2021-06-23 22:38:02 +08:00
}
}
}
2021-09-19 14:28:30 +08:00
void MainWindow : : onCompileStarted ( )
{
ui - > txtCompilerOutput - > clear ( ) ;
}
2021-06-23 22:38:02 +08:00
void MainWindow : : onCompileFinished ( )
{
// Update tab caption
int i = ui - > tabMessages - > indexOf ( ui - > tabIssues ) ;
if ( i = = - 1 )
return ;
ui - > tabMessages - > setTabText ( i , tr ( " Issues " ) +
QString ( " (%1) " ) . arg ( ui - > tableIssues - > model ( ) - > rowCount ( ) ) ) ;
// Close it if there's nothing to show
if ( mCheckSyntaxInBack ) {
// check syntax in back, don't change message panel
} else if (
( ui - > tableIssues - > count ( ) = = 0 )
// and (ResourceOutput.Items.Count = 0)
// and devData.AutoCloseProgress
) {
2021-09-02 19:36:16 +08:00
openCloseBottomPanel ( false ) ;
2021-06-23 22:38:02 +08:00
// Or open it if there is anything to show
} else {
if ( ui - > tableIssues - > count ( ) > 0 ) {
if ( ui - > tabMessages - > currentIndex ( ) ! = i ) {
ui - > tabMessages - > setCurrentIndex ( i ) ;
}
// end else if (ResourceOutput.Items.Count > 0) then begin
// if MessageControl.ActivePage <> ResSheet then begin
// MessageControl.ActivePage := ResSheet;
// fMessageControlChanged := False;
// end;
// end;
2021-09-02 19:36:16 +08:00
openCloseBottomPanel ( true ) ;
2021-06-23 22:38:02 +08:00
}
}
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ! = nullptr ) {
2021-06-24 20:43:09 +08:00
e - > invalidate ( ) ;
2021-06-23 22:38:02 +08:00
}
// Jump to problem location, sorted by significance
if ( ( mCompilerManager - > compileErrorCount ( ) > 0 ) & & ( ! mCheckSyntaxInBack ) ) {
// First try to find errors
for ( int i = 0 ; i < ui - > tableIssues - > count ( ) ; i + + ) {
PCompileIssue issue = ui - > tableIssues - > issue ( i ) ;
if ( issue - > type = = CompileIssueType : : Error ) {
2021-09-04 21:33:10 +08:00
if ( e & & e - > filename ( ) ! = issue - > filename )
continue ;
2021-06-23 22:38:02 +08:00
ui - > tableIssues - > selectRow ( i ) ;
QModelIndex index = ui - > tableIssues - > model ( ) - > index ( i , 0 ) ;
2021-08-29 10:14:07 +08:00
emit ui - > tableIssues - > doubleClicked ( index ) ;
2021-09-04 21:33:10 +08:00
break ;
2021-06-23 22:38:02 +08:00
}
}
// Then try to find warnings
for ( int i = 0 ; i < ui - > tableIssues - > count ( ) ; i + + ) {
PCompileIssue issue = ui - > tableIssues - > issue ( i ) ;
if ( issue - > type = = CompileIssueType : : Warning ) {
2021-09-04 21:33:10 +08:00
if ( e & & e - > filename ( ) ! = issue - > filename )
continue ;
2021-06-23 22:38:02 +08:00
ui - > tableIssues - > selectRow ( i ) ;
QModelIndex index = ui - > tableIssues - > model ( ) - > index ( i , 0 ) ;
2021-08-29 10:14:07 +08:00
emit ui - > tableIssues - > doubleClicked ( index ) ;
2021-06-23 22:38:02 +08:00
}
}
// Then try to find anything with a line number...
// for I := 0 to CompilerOutput.Items.Count - 1 do begin
// if not SameStr(CompilerOutput.Items[I].Caption, '') then begin
// CompilerOutput.Selected := CompilerOutput.Items[I];
// CompilerOutput.Selected.MakeVisible(False);
// CompilerOutputDblClick(CompilerOutput);
// Exit;
// end;
// end;
// Then try to find a resource error
// if ResourceOutput.Items.Count > 0 then begin
// ResourceOutput.Selected := ResourceOutput.Items[0];
// ResourceOutput.Selected.MakeVisible(False);
// CompilerOutputDblClick(ResourceOutput);
// end;
2021-06-25 12:40:11 +08:00
} else {
if ( mCompileSuccessionTask ) {
switch ( mCompileSuccessionTask - > type ) {
case MainWindow : : CompileSuccessionTaskType : : Run :
runExecutable ( mCompileSuccessionTask - > filename ) ;
2021-07-23 13:22:05 +08:00
break ;
case MainWindow : : CompileSuccessionTaskType : : Debug :
debug ( ) ;
break ;
2021-06-25 12:40:11 +08:00
}
2021-07-23 13:22:05 +08:00
mCompileSuccessionTask . reset ( ) ;
2021-06-25 12:40:11 +08:00
}
2021-06-23 22:38:02 +08:00
}
mCheckSyntaxInBack = false ;
2021-07-01 19:44:38 +08:00
updateCompileActions ( ) ;
2021-07-26 22:29:47 +08:00
updateAppTitle ( ) ;
2021-04-20 22:24:33 +08:00
}
2021-06-21 11:21:26 +08:00
void MainWindow : : onCompileErrorOccured ( const QString & reason )
{
QMessageBox : : critical ( this , tr ( " Compile Failed " ) , reason ) ;
}
2021-06-25 12:40:11 +08:00
void MainWindow : : onRunErrorOccured ( const QString & reason )
{
QMessageBox : : critical ( this , tr ( " Run Failed " ) , reason ) ;
}
void MainWindow : : onRunFinished ( )
{
2021-07-01 19:44:38 +08:00
updateCompileActions ( ) ;
if ( pSettings - > executor ( ) . minimizeOnRun ( ) ) {
showNormal ( ) ;
}
2021-07-26 22:29:47 +08:00
updateAppTitle ( ) ;
2021-06-25 12:40:11 +08:00
}
2021-08-01 23:24:37 +08:00
void MainWindow : : cleanUpCPUDialog ( )
{
CPUDialog * ptr = mCPUDialog ;
mCPUDialog = nullptr ;
ptr - > deleteLater ( ) ;
}
void MainWindow : : onDebugCommandInput ( const QString & command )
{
if ( mDebugger - > executing ( ) ) {
mDebugger - > sendCommand ( command , " " ) ;
}
}
2021-04-20 22:24:33 +08:00
void MainWindow : : on_actionCompile_triggered ( )
{
2021-06-25 12:40:11 +08:00
mCompileSuccessionTask . reset ( ) ;
compile ( ) ;
2021-04-20 22:24:33 +08:00
}
2021-04-21 18:58:35 +08:00
void MainWindow : : on_actionRun_triggered ( )
{
2021-06-25 12:40:11 +08:00
runExecutable ( ) ;
2021-04-21 18:58:35 +08:00
}
2021-04-21 23:06:55 +08:00
void MainWindow : : on_actionUndo_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-07 11:02:03 +08:00
editor - > undo ( ) ;
2021-04-21 23:06:55 +08:00
}
}
void MainWindow : : on_actionRedo_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-07 11:02:03 +08:00
editor - > redo ( ) ;
2021-04-21 23:06:55 +08:00
}
}
void MainWindow : : on_actionCut_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-07 11:02:03 +08:00
editor - > cutToClipboard ( ) ;
2021-04-21 23:06:55 +08:00
}
}
void MainWindow : : on_actionSelectAll_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-07 11:02:03 +08:00
editor - > selectAll ( ) ;
2021-04-21 23:06:55 +08:00
}
}
void MainWindow : : on_actionCopy_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-07 11:02:03 +08:00
editor - > copyToClipboard ( ) ;
2021-04-21 23:06:55 +08:00
}
}
void MainWindow : : on_actionPaste_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-07 11:02:03 +08:00
editor - > pasteFromClipboard ( ) ;
2021-04-21 23:06:55 +08:00
}
}
void MainWindow : : on_actionIndent_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-07 11:02:03 +08:00
editor - > tab ( ) ;
2021-04-21 23:06:55 +08:00
}
}
void MainWindow : : on_actionUnIndent_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-07 11:02:03 +08:00
editor - > untab ( ) ;
2021-04-21 23:06:55 +08:00
}
}
2021-04-24 15:57:45 +08:00
void MainWindow : : on_actionToggleComment_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-06-21 11:21:26 +08:00
editor - > toggleComment ( ) ;
2021-04-24 15:57:45 +08:00
}
}
void MainWindow : : on_actionUnfoldAll_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-05-24 00:41:00 +08:00
//editor->clearFolds();
2021-04-24 15:57:45 +08:00
}
}
void MainWindow : : on_actionFoldAll_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ! = NULL ) {
2021-05-24 00:41:00 +08:00
//editor->clearFolds();
//editor->foldAll();
2021-04-24 15:57:45 +08:00
}
}
2021-04-29 20:54:44 +08:00
void MainWindow : : on_tableIssues_doubleClicked ( const QModelIndex & index )
{
PCompileIssue issue = ui - > tableIssues - > issue ( index ) ;
if ( ! issue )
return ;
Editor * editor = mEditorList - > getEditorByFilename ( issue - > filename ) ;
if ( editor = = nullptr )
return ;
2021-06-24 16:05:19 +08:00
editor - > setCaretPositionAndActivate ( issue - > line , issue - > column ) ;
2021-04-29 20:54:44 +08:00
}
2021-06-12 22:36:23 +08:00
void MainWindow : : on_actionEncode_in_ANSI_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor = = nullptr )
return ;
2021-06-20 09:27:37 +08:00
try {
editor - > setEncodingOption ( ENCODING_SYSTEM_DEFAULT ) ;
} catch ( FileError e ) {
2021-06-21 11:21:26 +08:00
QMessageBox : : critical ( this , tr ( " Error " ) , e . reason ( ) ) ;
2021-06-20 09:27:37 +08:00
}
2021-06-12 22:36:23 +08:00
}
void MainWindow : : on_actionEncode_in_UTF_8_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor = = nullptr )
return ;
2021-06-20 09:27:37 +08:00
try {
editor - > setEncodingOption ( ENCODING_UTF8 ) ;
} catch ( FileError e ) {
2021-06-21 11:21:26 +08:00
QMessageBox : : critical ( this , tr ( " Error " ) , e . reason ( ) ) ;
2021-06-20 09:27:37 +08:00
}
2021-06-12 22:36:23 +08:00
}
void MainWindow : : on_actionAuto_Detect_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor = = nullptr )
return ;
editor - > setEncodingOption ( ENCODING_AUTO_DETECT ) ;
}
void MainWindow : : on_actionConvert_to_ANSI_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor = = nullptr )
return ;
2021-06-21 11:21:26 +08:00
if ( QMessageBox : : warning ( this , tr ( " Confirm Convertion " ) ,
2021-06-12 22:36:23 +08:00
tr ( " The editing file will be saved using %1 encoding. <br />This operation can't be reverted. <br />Are you sure to continue? " )
. arg ( QString ( QTextCodec : : codecForLocale ( ) - > name ( ) ) ) ,
QMessageBox : : Yes , QMessageBox : : No ) ! = QMessageBox : : Yes )
return ;
editor - > convertToEncoding ( ENCODING_SYSTEM_DEFAULT ) ;
}
void MainWindow : : on_actionConvert_to_UTF_8_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor = = nullptr )
return ;
2021-06-21 11:21:26 +08:00
if ( QMessageBox : : warning ( this , tr ( " Confirm Convertion " ) ,
2021-06-12 22:36:23 +08:00
tr ( " The editing file will be saved using %1 encoding. <br />This operation can't be reverted. <br />Are you sure to continue? " )
. arg ( ENCODING_UTF8 ) ,
QMessageBox : : Yes , QMessageBox : : No ) ! = QMessageBox : : Yes )
return ;
editor - > convertToEncoding ( ENCODING_UTF8 ) ;
}
2021-06-23 22:38:02 +08:00
void MainWindow : : on_tabMessages_tabBarClicked ( int index )
{
2021-06-24 16:05:19 +08:00
if ( index = = ui - > tabMessages - > currentIndex ( ) ) {
2021-09-02 19:36:16 +08:00
openCloseBottomPanel ( ! mBottomPanelOpenned ) ;
2021-06-24 16:05:19 +08:00
}
}
2021-09-18 22:37:07 +08:00
void MainWindow : : on_tabMessages_currentChanged ( int )
2021-06-24 16:05:19 +08:00
{
2021-09-15 14:35:37 +08:00
openCloseBottomPanel ( true ) ;
2021-06-23 22:38:02 +08:00
}
2021-06-24 16:05:19 +08:00
2021-09-18 22:37:07 +08:00
void MainWindow : : on_tabMessages_tabBarDoubleClicked ( int )
2021-06-24 16:05:19 +08:00
{
}
2021-06-25 12:40:11 +08:00
void MainWindow : : on_actionCompile_Run_triggered ( )
{
mCompileSuccessionTask = std : : make_shared < CompileSuccessionTask > ( ) ;
mCompileSuccessionTask - > type = CompileSuccessionTaskType : : Run ;
compile ( ) ;
}
void MainWindow : : on_actionRebuild_triggered ( )
{
mCompileSuccessionTask . reset ( ) ;
compile ( true ) ;
}
void MainWindow : : on_actionStop_Execution_triggered ( )
{
mCompilerManager - > stopRun ( ) ;
2021-08-01 12:02:28 +08:00
mDebugger - > stop ( ) ;
2021-06-25 12:40:11 +08:00
}
2021-07-20 15:16:52 +08:00
void MainWindow : : on_actionDebug_triggered ( )
{
2021-07-23 13:22:05 +08:00
debug ( ) ;
2021-07-20 15:16:52 +08:00
}
CompileTarget MainWindow : : getCompileTarget ( )
{
// Check if the current file belongs to a project
CompileTarget target = CompileTarget : : None ;
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ! = nullptr ) {
// Treat makefiles as InProject files too
2021-09-12 22:45:00 +08:00
if ( mProject
& & ( e - > inProject ( ) | | ( mProject - > makeFileName ( ) = = e - > filename ( ) ) )
) {
target = CompileTarget : : Project ;
} else {
target = CompileTarget : : File ;
}
// No editors have been opened. Check if a project is open
} else if ( mProject ) {
target = CompileTarget : : Project ;
2021-07-20 15:16:52 +08:00
}
return target ;
}
2021-07-25 13:03:46 +08:00
bool MainWindow : : debugInferiorhasBreakpoint ( )
{
Editor * e = mEditorList - > getEditor ( ) ;
if ( e = = nullptr )
return false ;
if ( ! e - > inProject ( ) ) {
2021-08-29 10:14:07 +08:00
for ( const PBreakpoint & breakpoint : mDebugger - > breakpointModel ( ) - > breakpoints ( ) ) {
2021-07-25 13:03:46 +08:00
if ( e - > filename ( ) = = breakpoint - > filename ) {
return true ;
}
}
} else {
2021-08-29 10:14:07 +08:00
for ( const PBreakpoint & breakpoint : mDebugger - > breakpointModel ( ) - > breakpoints ( ) ) {
2021-07-25 13:03:46 +08:00
Editor * e1 = mEditorList - > getOpenedEditorByFilename ( breakpoint - > filename ) ;
if ( e1 - > inProject ( ) ) {
return true ;
}
}
}
return false ;
}
2021-07-31 14:04:43 +08:00
void MainWindow : : on_actionStep_Over_triggered ( )
{
if ( mDebugger - > executing ( ) ) {
//WatchView.Items.BeginUpdate();
mDebugger - > invalidateAllVars ( ) ;
mDebugger - > sendCommand ( " next " , " " ) ;
mDebugger - > updateDebugInfo ( ) ;
2021-08-01 12:02:28 +08:00
mDebugger - > refreshWatchVars ( ) ;
2021-07-31 14:04:43 +08:00
}
}
void MainWindow : : on_actionStep_Into_triggered ( )
{
if ( mDebugger - > executing ( ) ) {
//WatchView.Items.BeginUpdate();
mDebugger - > invalidateAllVars ( ) ;
mDebugger - > sendCommand ( " step " , " " ) ;
mDebugger - > updateDebugInfo ( ) ;
2021-08-01 12:02:28 +08:00
mDebugger - > refreshWatchVars ( ) ;
2021-07-31 14:04:43 +08:00
}
}
void MainWindow : : on_actionStep_Out_triggered ( )
{
if ( mDebugger - > executing ( ) ) {
//WatchView.Items.BeginUpdate();
mDebugger - > invalidateAllVars ( ) ;
mDebugger - > sendCommand ( " finish " , " " ) ;
mDebugger - > updateDebugInfo ( ) ;
2021-08-01 12:02:28 +08:00
mDebugger - > refreshWatchVars ( ) ;
2021-07-31 14:04:43 +08:00
}
}
void MainWindow : : on_actionRun_To_Cursor_triggered ( )
{
if ( mDebugger - > executing ( ) ) {
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ! = nullptr ) {
//WatchView.Items.BeginUpdate();
mDebugger - > invalidateAllVars ( ) ;
mDebugger - > sendCommand ( " tbreak " , QString ( " %1 " ) . arg ( e - > caretY ( ) ) ) ;
mDebugger - > sendCommand ( " continue " , " " ) ;
mDebugger - > updateDebugInfo ( ) ;
2021-08-01 12:02:28 +08:00
mDebugger - > refreshWatchVars ( ) ;
2021-07-31 14:04:43 +08:00
}
}
}
void MainWindow : : on_actionContinue_triggered ( )
{
if ( mDebugger - > executing ( ) ) {
//WatchView.Items.BeginUpdate();
mDebugger - > invalidateAllVars ( ) ;
mDebugger - > sendCommand ( " continue " , " " ) ;
mDebugger - > updateDebugInfo ( ) ;
2021-08-01 12:02:28 +08:00
mDebugger - > refreshWatchVars ( ) ;
2021-07-31 14:04:43 +08:00
}
}
2021-08-01 01:06:43 +08:00
void MainWindow : : on_actionAdd_Watch_triggered ( )
{
QString s = " " ;
Editor * e = mEditorList - > getEditor ( ) ;
2021-09-19 17:59:03 +08:00
if ( e ! = nullptr ) {
if ( e - > selAvail ( ) ) {
s = e - > selText ( ) ;
} else {
2021-09-20 15:57:48 +08:00
s = e - > wordAtCursor ( ) ;
2021-09-19 17:59:03 +08:00
}
2021-08-01 01:06:43 +08:00
}
bool isOk ;
s = QInputDialog : : getText ( this ,
tr ( " New Watch Expression " ) ,
tr ( " Enter Watch Expression (it is recommended to use 'this->' for class members): " ) ,
QLineEdit : : Normal ,
s , & isOk ) ;
if ( ! isOk )
return ;
s = s . trimmed ( ) ;
if ( ! s . isEmpty ( ) ) {
mDebugger - > addWatchVar ( s ) ;
}
}
2021-08-01 23:24:37 +08:00
void MainWindow : : on_actionView_CPU_Window_triggered ( )
{
if ( mCPUDialog = = nullptr ) {
mCPUDialog = new CPUDialog ( this ) ;
connect ( mCPUDialog , & CPUDialog : : closed , this , & MainWindow : : cleanUpCPUDialog ) ;
}
mCPUDialog - > show ( ) ;
}
2021-08-02 21:58:39 +08:00
void MainWindow : : on_actionExit_triggered ( )
2021-08-01 23:24:37 +08:00
{
2021-08-02 21:58:39 +08:00
close ( ) ;
2021-08-01 23:24:37 +08:00
}
2021-08-02 10:08:25 +08:00
2021-08-02 22:21:50 +08:00
void MainWindow : : onDebugEvaluateInput ( )
2021-08-02 10:08:25 +08:00
{
2021-08-02 22:21:50 +08:00
QString s = ui - > cbEvaluate - > currentText ( ) . trimmed ( ) ;
2021-08-02 21:58:39 +08:00
if ( ! s . isEmpty ( ) ) {
2021-08-29 22:08:43 +08:00
connect ( mDebugger , & Debugger : : evalValueReady ,
this , & MainWindow : : onEvalValueReady ) ;
2021-08-02 21:58:39 +08:00
mDebugger - > sendCommand ( " print " , s , false ) ;
}
2021-08-02 10:08:25 +08:00
}
2021-08-03 23:55:57 +08:00
2021-08-27 16:38:55 +08:00
void MainWindow : : onParserProgress ( const QString & fileName , int total , int current )
{
// Mention every 5% progress
int showStep = total / 20 ;
// For Total = 1, avoid division by zero
if ( showStep = = 0 )
showStep = 1 ;
// Only show if needed (it's a very slow operation)
if ( current = = 1 | | current % showStep = = 0 ) {
2021-08-30 22:05:45 +08:00
updateStatusbarMessage ( tr ( " Parsing file %1 of %2: \" %3 \" " )
2021-08-27 16:38:55 +08:00
. arg ( current ) . arg ( total ) . arg ( fileName ) ) ;
}
}
void MainWindow : : onStartParsing ( )
{
mParserTimer . restart ( ) ;
}
void MainWindow : : onEndParsing ( int total , int )
{
2021-08-29 00:48:23 +08:00
double parseTime = mParserTimer . elapsed ( ) / 1000.0 ;
2021-08-27 16:38:55 +08:00
double parsingFrequency ;
if ( total > 1 ) {
if ( parseTime > 0 ) {
parsingFrequency = total / parseTime ;
} else {
parsingFrequency = 999 ;
}
2021-08-30 22:05:45 +08:00
updateStatusbarMessage ( tr ( " Done parsing %1 files in %2 seconds " )
2021-08-27 16:38:55 +08:00
. arg ( total ) . arg ( parseTime )
+ " "
+ tr ( " (%1 files per second) " )
. arg ( parsingFrequency ) ) ;
} else {
2021-08-30 22:05:45 +08:00
updateStatusbarMessage ( tr ( " Done parsing %1 files in %2 seconds " )
2021-08-27 16:38:55 +08:00
. arg ( total ) . arg ( parseTime ) ) ;
}
}
2021-08-29 22:08:43 +08:00
void MainWindow : : onEvalValueReady ( const QString & value )
{
updateDebugEval ( value ) ;
disconnect ( mDebugger , & Debugger : : evalValueReady ,
this , & MainWindow : : onEvalValueReady ) ;
}
2021-08-03 23:55:57 +08:00
void MainWindow : : on_actionFind_triggered ( )
{
Editor * e = mEditorList - > getEditor ( ) ;
if ( ! e )
return ;
if ( mSearchDialog = = nullptr ) {
mSearchDialog = new SearchDialog ( this ) ;
}
2021-09-20 15:57:48 +08:00
QString s = e - > wordAtCursor ( ) ;
2021-08-03 23:55:57 +08:00
mSearchDialog - > find ( s ) ;
}
void MainWindow : : on_actionFind_in_files_triggered ( )
{
2021-08-05 19:58:32 +08:00
if ( mSearchDialog = = nullptr ) {
mSearchDialog = new SearchDialog ( this ) ;
}
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ) {
2021-09-20 15:57:48 +08:00
QString s = e - > wordAtCursor ( ) ;
2021-08-05 19:58:32 +08:00
mSearchDialog - > findInFiles ( s ) ;
} else {
mSearchDialog - > findInFiles ( " " ) ;
}
2021-08-03 23:55:57 +08:00
}
void MainWindow : : on_actionReplace_triggered ( )
{
2021-08-05 19:58:32 +08:00
Editor * e = mEditorList - > getEditor ( ) ;
if ( ! e )
return ;
if ( mSearchDialog = = nullptr ) {
mSearchDialog = new SearchDialog ( this ) ;
}
2021-09-20 15:57:48 +08:00
QString s = e - > wordAtCursor ( ) ;
2021-08-05 19:58:32 +08:00
mSearchDialog - > replace ( s , s ) ;
2021-08-03 23:55:57 +08:00
}
void MainWindow : : on_actionFind_Next_triggered ( )
{
2021-08-04 00:17:38 +08:00
Editor * e = mEditorList - > getEditor ( ) ;
if ( e = = nullptr )
return ;
if ( mSearchDialog = = nullptr )
return ;
2021-08-03 23:55:57 +08:00
2021-08-04 00:17:38 +08:00
mSearchDialog - > findNext ( ) ;
2021-08-03 23:55:57 +08:00
}
void MainWindow : : on_actionFind_Previous_triggered ( )
{
2021-08-04 00:17:38 +08:00
Editor * e = mEditorList - > getEditor ( ) ;
if ( e = = nullptr )
return ;
if ( mSearchDialog = = nullptr )
return ;
2021-08-03 23:55:57 +08:00
2021-08-04 00:17:38 +08:00
mSearchDialog - > findPrevious ( ) ;
2021-08-03 23:55:57 +08:00
}
2021-08-05 19:58:32 +08:00
void MainWindow : : on_cbSearchHistory_currentIndexChanged ( int index )
{
mSearchResultModel . setCurrentIndex ( index ) ;
2021-09-03 16:39:20 +08:00
PSearchResults results = mSearchResultModel . results ( index ) ;
if ( results & & results - > searchType = = SearchType : : Search ) {
ui - > btnSearchAgin - > setEnabled ( true ) ;
} else {
ui - > btnSearchAgin - > setEnabled ( false ) ;
}
2021-08-05 19:58:32 +08:00
}
void MainWindow : : on_btnSearchAgin_clicked ( )
{
if ( mSearchDialog = = nullptr ) {
mSearchDialog = new SearchDialog ( this ) ;
}
PSearchResults results = mSearchResultModel . currentResults ( ) ;
if ( results ) {
mSearchDialog - > findInFiles ( results - > keyword ,
results - > scope ,
results - > options ) ;
}
}
2021-08-31 11:13:12 +08:00
void MainWindow : : on_actionRemove_Watch_triggered ( )
{
QModelIndex index = ui - > watchView - > currentIndex ( ) ;
QModelIndex parent ;
while ( true ) {
parent = ui - > watchView - > model ( ) - > parent ( index ) ;
if ( parent . isValid ( ) ) {
index = parent ;
} else {
break ;
}
}
mDebugger - > removeWatchVar ( index ) ;
}
void MainWindow : : on_actionRemove_All_Watches_triggered ( )
{
mDebugger - > removeWatchVars ( true ) ;
}
void MainWindow : : on_actionModify_Watch_triggered ( )
{
}
2021-09-02 12:14:02 +08:00
void MainWindow : : on_actionReformat_Code_triggered ( )
{
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ) {
e - > reformat ( ) ;
e - > activate ( ) ;
}
}
CaretList & MainWindow : : caretList ( )
{
return mCaretList ;
}
void MainWindow : : updateCaretActions ( )
{
ui - > actionBack - > setEnabled ( mCaretList . hasPrevious ( ) ) ;
ui - > actionForward - > setEnabled ( mCaretList . hasNext ( ) ) ;
}
void MainWindow : : on_actionBack_triggered ( )
{
PEditorCaret caret = mCaretList . gotoAndGetPrevious ( ) ;
mCaretList . pause ( ) ;
if ( caret ) {
caret - > editor - > setCaretPositionAndActivate ( caret - > line , caret - > aChar ) ;
}
mCaretList . unPause ( ) ;
updateCaretActions ( ) ;
}
void MainWindow : : on_actionForward_triggered ( )
{
PEditorCaret caret = mCaretList . gotoAndGetNext ( ) ;
mCaretList . pause ( ) ;
if ( caret ) {
caret - > editor - > setCaretPositionAndActivate ( caret - > line , caret - > aChar ) ;
}
mCaretList . unPause ( ) ;
updateCaretActions ( ) ;
}
2021-09-02 19:36:16 +08:00
void MainWindow : : on_tabInfos_tabBarClicked ( int index )
{
if ( index = = ui - > tabInfos - > currentIndex ( ) ) {
openCloseLeftPanel ( ! mLeftPanelOpenned ) ;
}
}
void MainWindow : : on_splitterInfos_splitterMoved ( int , int )
{
2021-09-14 23:56:08 +08:00
QList < int > sizes = ui - > splitterInfos - > sizes ( ) ;
2021-09-02 19:36:16 +08:00
mLeftPanelWidth = sizes [ 0 ] ;
}
void MainWindow : : on_splitterMessages_splitterMoved ( int , int )
{
QList < int > sizes = ui - > splitterMessages - > sizes ( ) ;
mBottomPanelHeight = sizes [ 1 ] ;
}
void MainWindow : : on_EditorTabsLeft_tabBarDoubleClicked ( int index )
{
2021-09-02 20:12:16 +08:00
maximizeEditor ( ) ;
2021-09-02 19:36:16 +08:00
}
void MainWindow : : on_actionClose_triggered ( )
{
mClosing = true ;
Editor * e = mEditorList - > getEditor ( ) ;
if ( e ) {
mEditorList - > closeEditor ( e ) ;
}
2021-09-02 20:12:16 +08:00
mClosing = false ;
}
void MainWindow : : on_actionClose_All_triggered ( )
{
mClosing = true ;
mEditorList - > closeAll ( mSystemTurnedOff ) ;
mClosing = false ;
}
void MainWindow : : on_actionMaximize_Editor_triggered ( )
{
maximizeEditor ( ) ;
2021-09-02 19:36:16 +08:00
}
2021-09-03 00:26:49 +08:00
void MainWindow : : on_actionNext_Editor_triggered ( )
{
mEditorList - > selectNextPage ( ) ;
}
void MainWindow : : on_actionPrevious_Editor_triggered ( )
{
mEditorList - > selectPreviousPage ( ) ;
}
2021-09-03 10:30:08 +08:00
void MainWindow : : on_actionToggle_Breakpoint_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
int line ;
2021-09-20 15:57:48 +08:00
if ( editor & & editor - > pointToLine ( mEditorContextMenuPos , line ) )
2021-09-03 10:30:08 +08:00
editor - > toggleBreakpoint ( line ) ;
}
void MainWindow : : on_actionClear_all_breakpoints_triggered ( )
{
Editor * e = mEditorList - > getEditor ( ) ;
if ( ! e )
return ;
if ( QMessageBox : : question ( this ,
tr ( " Clear all breakpoints " ) ,
tr ( " Do you really want to clear all breakpoints in this file? " ) ,
QMessageBox : : Yes | QMessageBox : : No ,
QMessageBox : : No ) = = QMessageBox : : Yes ) {
e - > clearBreakpoints ( ) ;
}
}
void MainWindow : : on_actionBreakpoint_property_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
int line ;
2021-09-20 15:57:48 +08:00
if ( editor & & editor - > pointToLine ( mEditorContextMenuPos , line ) ) {
2021-09-03 10:30:08 +08:00
if ( editor - > hasBreakpoint ( line ) )
editor - > modifyBreakpointProperty ( line ) ;
}
}
2021-09-03 11:50:04 +08:00
void MainWindow : : on_actionGoto_Declaration_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
BufferCoord pos ;
2021-09-20 15:57:48 +08:00
if ( editor & & editor - > pointToCharLine ( mEditorContextMenuPos , pos ) ) {
2021-09-03 11:50:04 +08:00
editor - > gotoDeclaration ( pos ) ;
}
}
void MainWindow : : on_actionGoto_Definition_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
BufferCoord pos ;
2021-09-20 15:57:48 +08:00
if ( editor & & editor - > pointToCharLine ( mEditorContextMenuPos , pos ) ) {
2021-09-03 11:50:04 +08:00
editor - > gotoDefinition ( pos ) ;
}
}
2021-09-03 16:39:20 +08:00
void MainWindow : : on_actionFind_references_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
BufferCoord pos ;
2021-09-20 15:57:48 +08:00
if ( editor & & editor - > pointToCharLine ( mEditorContextMenuPos , pos ) ) {
2021-09-03 16:39:20 +08:00
CppRefacter refactor ;
refactor . findOccurence ( editor , pos ) ;
ui - > tabMessages - > setCurrentWidget ( ui - > tabSearch ) ;
openCloseBottomPanel ( true ) ;
}
}
void MainWindow : : on_actionOpen_Containing_Folder_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ) {
QFileInfo info ( editor - > filename ( ) ) ;
if ( ! info . path ( ) . isEmpty ( ) ) {
2021-09-18 11:08:30 +08:00
QDesktopServices : : openUrl (
QUrl ( " file:/// " +
includeTrailingPathDelimiter ( info . path ( ) ) , QUrl : : TolerantMode ) ) ;
2021-09-03 16:39:20 +08:00
}
}
}
void MainWindow : : on_actionOpen_Terminal_triggered ( )
{
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ) {
QFileInfo info ( editor - > filename ( ) ) ;
if ( ! info . path ( ) . isEmpty ( ) ) {
openShell ( info . path ( ) , " cmd.exe " ) ;
}
}
}
2021-09-04 00:13:42 +08:00
void MainWindow : : on_actionFile_Properties_triggered ( )
{
2021-09-05 05:01:31 +08:00
Editor * editor = mEditorList - > getEditor ( ) ;
if ( editor ) {
FilePropertiesDialog dialog ( editor , this ) ;
dialog . exec ( ) ;
dialog . setParent ( nullptr ) ;
}
2021-09-04 00:13:42 +08:00
}
2021-09-05 21:05:38 +08:00
void MainWindow : : on_searchView_doubleClicked ( const QModelIndex & index )
{
QString filename ;
int line ;
int start ;
if ( mSearchResultTreeModel - > getItemFileAndLineChar (
index , filename , line , start ) ) {
Editor * e = mEditorList - > getEditorByFilename ( filename ) ;
if ( e ) {
e - > setCaretPositionAndActivate ( line , start ) ;
}
}
}
void MainWindow : : on_tblStackTrace_doubleClicked ( const QModelIndex & index )
{
PTrace trace = mDebugger - > backtraceModel ( ) - > backtrace ( index . row ( ) ) ;
if ( trace ) {
Editor * e = mEditorList - > getEditorByFilename ( trace - > filename ) ;
if ( e ) {
e - > setCaretPositionAndActivate ( trace - > line , 1 ) ;
}
}
}
void MainWindow : : on_tblBreakpoints_doubleClicked ( const QModelIndex & index )
{
PBreakpoint breakpoint = mDebugger - > breakpointModel ( ) - > breakpoint ( index . row ( ) ) ;
if ( breakpoint ) {
Editor * e = mEditorList - > getEditorByFilename ( breakpoint - > filename ) ;
if ( e ) {
e - > setCaretPositionAndActivate ( breakpoint - > line , 1 ) ;
}
}
}
2021-09-11 18:42:49 +08:00
std : : shared_ptr < Project > MainWindow : : project ( )
{
return mProject ;
}
2021-09-12 00:17:15 +08:00
void MainWindow : : on_projectView_doubleClicked ( const QModelIndex & index )
{
if ( ! index . isValid ( ) )
return ;
FolderNode * node = static_cast < FolderNode * > ( index . internalPointer ( ) ) ;
if ( ! node )
return ;
if ( node - > unitIndex > = 0 ) {
mProject - > openUnit ( node - > unitIndex ) ;
}
}
2021-09-12 01:01:34 +08:00
void MainWindow : : on_actionClose_Project_triggered ( )
{
mClosing = true ;
closeProject ( true ) ;
mClosing = false ;
}
2021-09-14 17:33:47 +08:00
void MainWindow : : on_actionProject_options_triggered ( )
{
if ( ! mProject )
return ;
QString oldName = mProject - > name ( ) ;
PSettingsDialog dialog = SettingsDialog : : projectOptionDialog ( ) ;
dialog - > exec ( ) ;
}
2021-09-16 23:51:05 +08:00
void MainWindow : : on_actionNew_Project_triggered ( )
{
NewProjectDialog dialog ;
if ( dialog . exec ( ) = = QDialog : : Accepted ) {
// Take care of the currently opened project
QString s ;
if ( mProject ) {
if ( mProject - > name ( ) . isEmpty ( ) )
s = mProject - > filename ( ) ;
else
s = mProject - > name ( ) ;
// Ask if the user wants to close the current one. If not, abort
if ( QMessageBox : : question ( this ,
tr ( " New project " ) ,
tr ( " Close %1 and start new project? " ) . arg ( s ) ,
QMessageBox : : Yes | QMessageBox : : No ,
QMessageBox : : Yes ) = = QMessageBox : : Yes ) {
closeProject ( false ) ;
} else
return ;
}
//Create the project folder
QDir dir ( dialog . getLocation ( ) ) ;
if ( ! dir . exists ( ) ) {
if ( QMessageBox : : question ( this ,
tr ( " Folder not exist " ) ,
tr ( " Folder '%1' doesn't exist. Create it now? " ) . arg ( dialog . getLocation ( ) ) ,
QMessageBox : : Yes | QMessageBox : : No ,
QMessageBox : : Yes ) ! = QMessageBox : : Yes ) {
return ;
}
if ( ! dir . mkpath ( dialog . getLocation ( ) ) ) {
QMessageBox : : critical ( this ,
tr ( " Can't create folder " ) ,
tr ( " Failed to create folder '%1'. " ) . arg ( dialog . getLocation ( ) ) ,
QMessageBox : : Yes ) ;
return ;
}
}
// if cbDefault.Checked then
// devData.DefCpp := rbCpp.Checked;
s = includeTrailingPathDelimiter ( dialog . getLocation ( ) )
+ dialog . getProjectName ( ) + " . " + DEV_PROJECT_EXT ;
if ( fileExists ( s ) ) {
QString saveName = QFileDialog : : getSaveFileName (
this ,
tr ( " Save new project as " ) ,
dialog . getLocation ( ) ,
tr ( " Red panda Dev-C++ project file (*.dev) " ) ) ;
if ( ! saveName . isEmpty ( ) ) {
s = saveName ;
}
}
// Create an empty project
mProject = std : : make_shared < Project > ( s , dialog . getProjectName ( ) ) ;
if ( ! mProject - > assignTemplate ( dialog . getTemplate ( ) ) ) {
mProject = nullptr ;
QMessageBox : : critical ( this ,
tr ( " New project fail " ) ,
tr ( " Can't assign project template " ) ,
QMessageBox : : Ok ) ;
}
mProject - > saveAll ( ) ;
2021-09-17 09:56:52 +08:00
updateProjectView ( ) ;
2021-09-16 23:51:05 +08:00
}
}
2021-09-17 09:56:52 +08:00
void MainWindow : : on_actionSaveAll_triggered ( )
{
2021-09-17 13:35:50 +08:00
// Pause the change notifier
bool oldBlock = mFileSystemWatcher . blockSignals ( true ) ;
auto action = finally ( [ oldBlock , this ] {
mFileSystemWatcher . blockSignals ( oldBlock ) ;
} ) ;
if ( mProject ) {
mProject - > saveAll ( ) ;
}
// Make changes to files
for ( int i = 0 ; i < mEditorList - > pageCount ( ) ; i + + ) {
Editor * e = ( * mEditorList ) [ i ] ;
if ( e - > modified ( ) & & ! e - > inProject ( ) ) {
if ( ! e - > save ( ) )
break ;
}
}
updateAppTitle ( ) ;
}
2021-09-17 09:56:52 +08:00
2021-09-17 13:35:50 +08:00
void MainWindow : : on_actionProject_New_File_triggered ( )
{
int idx = - 1 ;
if ( ! mProject )
return ;
QModelIndex current = ui - > projectView - > currentIndex ( ) ;
FolderNode * node = nullptr ;
if ( current . isValid ( ) ) {
node = static_cast < FolderNode * > ( current . internalPointer ( ) ) ;
}
PProjectUnit newUnit = mProject - > newUnit (
mProject - > pointerToNode ( node ) ) ;
idx = mProject - > units ( ) . count ( ) - 1 ;
2021-09-18 10:47:35 +08:00
mProject - > saveUnits ( ) ;
2021-09-17 13:35:50 +08:00
updateProjectView ( ) ;
Editor * editor = mProject - > openUnit ( idx ) ;
editor - > setModified ( true ) ;
editor - > activate ( ) ;
}
void MainWindow : : on_actionAdd_to_project_triggered ( )
{
if ( ! mProject )
return ;
QFileDialog dialog ( this , tr ( " Add to project " ) ,
mProject - > directory ( ) ,
pSystemConsts - > defaultFileFilters ( ) . join ( " ;; " ) ) ;
dialog . setFileMode ( QFileDialog : : ExistingFiles ) ;
dialog . setOption ( QFileDialog : : DontConfirmOverwrite , true ) ;
if ( dialog . exec ( ) ) {
QModelIndex current = ui - > projectView - > currentIndex ( ) ;
FolderNode * node = nullptr ;
if ( current . isValid ( ) ) {
node = static_cast < FolderNode * > ( current . internalPointer ( ) ) ;
}
PFolderNode folderNode = mProject - > pointerToNode ( node ) ;
foreach ( const QString & filename , dialog . selectedFiles ( ) ) {
mProject - > addUnit ( filename , folderNode , false ) ;
mProject - > cppParser ( ) - > addFileToScan ( filename ) ;
}
mProject - > rebuildNodes ( ) ;
2021-09-18 10:47:35 +08:00
mProject - > saveUnits ( ) ;
2021-09-17 13:35:50 +08:00
parseFileList ( mProject - > cppParser ( ) ) ;
updateProjectView ( ) ;
}
2021-09-17 09:56:52 +08:00
}
2021-09-17 17:15:35 +08:00
void MainWindow : : on_actionRemove_from_project_triggered ( )
{
if ( ! mProject )
return ;
if ( ! ui - > projectView - > selectionModel ( ) - > hasSelection ( ) )
return ;
mProject - > model ( ) - > beginUpdate ( ) ;
QSet < int > selected ;
foreach ( const QModelIndex & index , ui - > projectView - > selectionModel ( ) - > selectedIndexes ( ) ) {
if ( ! index . isValid ( ) )
continue ;
FolderNode * node = static_cast < FolderNode * > ( index . internalPointer ( ) ) ;
PFolderNode folderNode = mProject - > pointerToNode ( node ) ;
2021-09-17 19:58:37 +08:00
if ( ! folderNode )
2021-09-17 17:15:35 +08:00
continue ;
selected . insert ( folderNode - > unitIndex ) ;
} ;
for ( int i = mProject - > units ( ) . count ( ) - 1 ; i > = 0 ; i - - ) {
if ( selected . contains ( i ) ) {
mProject - > removeEditor ( i , true ) ;
}
}
2021-09-18 10:47:35 +08:00
mProject - > saveUnits ( ) ;
2021-09-17 17:15:35 +08:00
mProject - > model ( ) - > endUpdate ( ) ;
updateProjectView ( ) ;
}
2021-09-17 19:58:37 +08:00
void MainWindow : : on_actionView_Makefile_triggered ( )
{
if ( ! mProject )
return ;
2021-09-17 21:33:19 +08:00
prepareProjectForCompile ( ) ;
2021-09-17 19:58:37 +08:00
mCompilerManager - > buildProjectMakefile ( mProject ) ;
openFile ( mProject - > makeFileName ( ) ) ;
2021-09-17 21:33:19 +08:00
}
2021-09-17 19:58:37 +08:00
2021-09-17 21:33:19 +08:00
void MainWindow : : on_actionMakeClean_triggered ( )
{
if ( ! mProject )
return ;
prepareProjectForCompile ( ) ;
mCompilerManager - > cleanProject ( mProject ) ;
2021-09-17 19:58:37 +08:00
}
2021-09-18 10:47:35 +08:00
void MainWindow : : on_actionProject_Open_Folder_In_Explorer_triggered ( )
{
if ( ! mProject )
return ;
2021-09-18 11:08:30 +08:00
QDesktopServices : : openUrl (
QUrl ( " file:/// " + includeTrailingPathDelimiter ( mProject - > directory ( ) ) , QUrl : : TolerantMode ) ) ;
2021-09-18 10:47:35 +08:00
}
void MainWindow : : on_actionProject_Open_In_Terminal_triggered ( )
{
if ( ! mProject )
return ;
openShell ( mProject - > directory ( ) , " cmd.exe " ) ;
}
2021-09-25 23:12:36 +08:00
const std : : shared_ptr < QHash < StatementKind , QColor > > & MainWindow : : statementColors ( ) const
{
return mStatementColors ;
}
2021-09-26 12:19:46 +08:00
void MainWindow : : on_classBrowser_doubleClicked ( const QModelIndex & index )
{
2021-09-26 16:25:17 +08:00
if ( ! index . isValid ( ) )
return ;
ClassBrowserNode * node = static_cast < ClassBrowserNode * > ( index . internalPointer ( ) ) ;
if ( ! node )
return ;
PStatement statement = node - > statement ;
if ( ! statement ) {
return ;
}
QString filename ;
int line ;
filename = statement - > fileName ;
line = statement - > line ;
Editor * e = pMainWindow - > editorList ( ) - > getEditorByFilename ( filename ) ;
if ( e ) {
e - > setCaretPositionAndActivate ( line , 1 ) ;
}
2021-09-26 12:19:46 +08:00
}