work save

This commit is contained in:
royqh1979 2021-07-20 15:16:52 +08:00
parent bb5986ea53
commit 953e4d2c17
4 changed files with 274 additions and 2 deletions

View File

@ -874,3 +874,249 @@ void MainWindow::on_actionStop_Execution_triggered()
{ {
mCompilerManager->stopRun(); mCompilerManager->stopRun();
} }
void MainWindow::on_actionDebug_triggered()
{
if (mCompilerManager->compiling())
return;
switch(getCompileTarget()) {
case CompileTarget::Project:
break;
// cttProject: begin
// // Check if we enabled proper options
// DebugEnabled := fProject.GetCompilerOption('-g3') <> '0';
// StripEnabled := fProject.GetCompilerOption('-s') <> '0';
// // Ask the user if he wants to enable debugging...
// if (not DebugEnabled or StripEnabled) then begin
// if (MessageDlg(Lang[ID_MSG_NODEBUGSYMBOLS], mtConfirmation, [mbYes,
// mbNo], 0) = mrYes) then begin
// // Enable debugging, disable stripping
// fProject.SetCompilerOption('-g3', '1');
// fProject.SetCompilerOption('-s', '0');
// fCompSuccessAction := csaDebug;
// actRebuildExecute(nil);
// end;
// Exit;
// end;
// // Did we compile?
// if not FileExists(fProject.Executable) then begin
// if MessageDlg(Lang[ID_ERR_PROJECTNOTCOMPILEDSUGGEST], mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
// fCompSuccessAction := csaDebug;
// actCompileExecute(nil);
// end;
// Exit;
// end;
// // Did we choose a host application for our DLL?
// if fProject.Options.typ = dptDyn then begin
// if fProject.Options.HostApplication = '' then begin
// MessageDlg(Lang[ID_ERR_HOSTMISSING], mtWarning, [mbOK], 0);
// exit;
// end else if not FileExists(fProject.Options.HostApplication) then begin
// MessageDlg(Lang[ID_ERR_HOSTNOTEXIST], mtWarning, [mbOK], 0);
// exit;
// end;
// end;
// // Reset UI, remove invalid breakpoints
// PrepareDebugger;
// filepath := fProject.Executable;
// fDebugger.Start;
// fDebugger.SendCommand('file', '"' + StringReplace(filepath, '\', '/', [rfReplaceAll]) + '"');
// if fProject.Options.typ = dptDyn then
// fDebugger.SendCommand('exec-file', '"' + StringReplace(fProject.Options.HostApplication, '\', '/',
// [rfReplaceAll])
// + '"');
// for i:=0 to fProject.Units.Count-1 do begin
// fDebugger.SendCommand('dir', '"'+StringReplace(
// ExtractFilePath(fProject.Units[i].FileName),'\', '/',[rfReplaceAll])
// + '"');
// end;
// for i:=0 to fProject.Options.Includes.Count-1 do begin
// fDebugger.SendCommand('dir', '"'+StringReplace(
// fProject.Options.Includes[i],'\', '/',[rfReplaceAll])
// + '"');
// end;
// for i:=0 to fProject.Options.Libs.Count-1 do begin
// fDebugger.SendCommand('dir', '"'+StringReplace(
// fProject.Options.Includes[i],'\', '/',[rfReplaceAll])
// + '"');
// end;
// end;
case CompileTarget::File:
// Check if we enabled proper options
Settings::PCompilerSet compilerSet = pSettings->compilerSets().defaultSet();
if (!compilerSet)
return;
bool debugEnabled = compilerSet->getOptionValue("-g3")!='0';
bool stripEnabled = compilerSet->getOptionValue("-s")!=0;
// Ask the user if he wants to enable debugging...
if (((!debugEnabled) || stripEnabled) &&
QMessageBox::information( (MessageDlg(Lang[ID_MSG_NODEBUGSYMBOLS], mtConfirmation, [mbYes,
mbNo], 0) = mrYes) then begin
// Enable debugging, disable stripping
with devCompilerSets.CompilationSet do begin
SetOption('-g3', '1');
SetOption('-s', '0');
end;
// Save changes to compiler set
devCompilerSets.SaveSet(devCompilerSets.CompilationSetIndex);
fCompSuccessAction := csaDebug;
actRebuildExecute(nil);
Exit;
end;
e := fEditorList.GetEditor;
if Assigned(e) then begin
// Did we save?
if e.Text.Modified then begin // if file is modified
if not e.Save(false,false) then // save it first
Exit;
end;
// Did we compile?
if not FileExists(ChangeFileExt(e.FileName, EXE_EXT)) then begin
if MessageDlg(Lang[ID_ERR_SRCNOTCOMPILEDSUGGEST], mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
fCompSuccessAction := csaDebug;
actCompileExecute(nil);
end;
Exit;
end else begin
if CompareFileModifyTime(e.FileName,ChangeFileExt(e.FileName, EXE_EXT))>=0 then
if MessageDlg(Lang[ID_MSG_SOURCEMORERECENT], mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
fCompSuccessAction := csaDebug;
MainForm.actCompileExecute(nil);
Exit;
end;
end;
PrepareDebugger;
fDebugger.UseUTF8 := (e.FileEncoding in [etUTF8,etUTF8Bom]);
filepath := ChangeFileExt(e.FileName, EXE_EXT);
fDebugger.Start;
fDebugger.SendCommand('file', '"' + StringReplace(filepath, '\', '/', [rfReplaceAll]) + '"');
end;
end;
cttNone: Exit;
end;
// Add library folders
with devCompilerSets.CompilationSet do begin
for I := 0 to LibDir.Count - 1 do
fDebugger.SendCommand('dir', '"' + StringReplace(LibDir[i], '\', '/', [rfReplaceAll]) + '"');
// Add include folders
for I := 0 to CDir.Count - 1 do
fDebugger.SendCommand('dir', '"' + StringReplace(CDir[i], '\', '/', [rfReplaceAll]) + '"');
// Add more include folders, duplicates will be added/moved to front of list
for I := 0 to CppDir.Count - 1 do
fDebugger.SendCommand('dir', '"' + StringReplace(CppDir[i], '\', '/', [rfReplaceAll]) + '"');
end;
// Add breakpoints and watch vars
for i := 0 to fDebugger.WatchVarList.Count - 1 do
fDebugger.AddWatchVar(i);
for i := 0 to fDebugger.BreakPointList.Count - 1 do
fDebugger.AddBreakpoint(i);
// Run the debugger
fDebugger.SendCommand('set', 'width 0'); // don't wrap output, very annoying
fDebugger.SendCommand('set', 'new-console on');
fDebugger.SendCommand('set', 'confirm off');
fDebugger.SendCommand('cd', ExcludeTrailingPathDelimiter(ExtractFileDir(filepath))); // restore working directory
if not hasBreakPoint then begin
case GetCompileTarget of
cttNone:
Exit;
cttFile:
begin
params := '';
if fCompiler.UseRunParams then
params := params + ' ' + fCompiler.RunParams;
if fCompiler.UseInputFile then
params := params + ' < "' + fCompiler.InputFile + '"';
fDebugger.SendCommand('start', params);
UpdateDebugInfo;
end;
cttProject: begin
params := '';
if fCompiler.UseRunParams then
params := params + ' ' + fProject.Options.CmdLineArgs;
if fCompiler.UseInputFile then
params := params + ' < "' + fCompiler.InputFile + '"';
fDebugger.SendCommand('start', params);
UpdateDebugInfo;
end;
end;
end else begin
case GetCompileTarget of
cttNone:
Exit;
cttFile: begin
params := '';
if fCompiler.UseRunParams then
params := params + ' ' + fCompiler.RunParams;
if fCompiler.UseInputFile then
params := params + ' < "' + fCompiler.InputFile + '"';
fDebugger.SendCommand('run', params);
UpdateDebugInfo;
end;
cttProject: begin
params := '';
if fCompiler.UseRunParams then
params := params + ' ' + fProject.Options.CmdLineArgs;
if fCompiler.UseInputFile then
params := params + ' < "' + fCompiler.InputFile + '"';
fDebugger.SendCommand('run', params);
UpdateDebugInfo;
end;
end;
end;
}
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
// if ((mProject) and (e.InProject or (fProject.MakeFileName = e.FileName)) then begin
// Result := cttProject;
// end else begin
// Result := cttFile;
// end;
target = CompileTarget::File;
}
// // No editors have been opened. Check if a project is open
// end else if Assigned(fProject) then begin
// Result := cttProject;
// // No project, no editor...
// end else begin
// Result := cttNone;
// end;
return target;
}

View File

@ -8,6 +8,11 @@ QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } namespace Ui { class MainWindow; }
QT_END_NAMESPACE QT_END_NAMESPACE
enum class CompileTarget {
Invalid, None, File, Project, SyntaxCheck
};
class EditorList; class EditorList;
class QLabel; class QLabel;
class QComboBox; class QComboBox;
@ -120,6 +125,10 @@ private slots:
void on_actionStop_Execution_triggered(); void on_actionStop_Execution_triggered();
void on_actionDebug_triggered();
CompileTarget getCompileTarget();
public slots: public slots:
void onCompileLog(const QString& msg); void onCompileLog(const QString& msg);
void onCompileIssue(PCompileIssue issue); void onCompileIssue(PCompileIssue issue);

View File

@ -614,6 +614,7 @@
<attribute name="toolBarBreak"> <attribute name="toolBarBreak">
<bool>false</bool> <bool>false</bool>
</attribute> </attribute>
<addaction name="actionDebug"/>
<addaction name="actionStop_Execution"/> <addaction name="actionStop_Execution"/>
</widget> </widget>
<action name="actionNew"> <action name="actionNew">
@ -899,6 +900,21 @@
<string>Stop Execution</string> <string>Stop Execution</string>
</property> </property>
</action> </action>
<action name="actionDebug">
<property name="icon">
<iconset resource="icons.qrc">
<normaloff>:/icons/images/newlook24/022-debug-new-tm.png</normaloff>:/icons/images/newlook24/022-debug-new-tm.png</iconset>
</property>
<property name="text">
<string>Debug</string>
</property>
<property name="toolTip">
<string>Debug</string>
</property>
<property name="shortcut">
<string>F5</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
@ -913,6 +929,8 @@
<container>1</container> <container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>
<resources/> <resources>
<include location="icons.qrc"/>
</resources>
<connections/> <connections/>
</ui> </ui>

View File

@ -10,7 +10,6 @@ namespace Ui {
class SettingsDialog; class SettingsDialog;
} }
class PCompilerSet;
class CompilerSetOptionWidget; class CompilerSetOptionWidget;
class EditorGeneralWidget; class EditorGeneralWidget;
class EditorFontWidget; class EditorFontWidget;