2021-09-01 13:58:59 -05:00
# include "SeerDebugDialog.h"
# include "SeerExecutableFilterProxyModel.h"
# include "SeerDirectoryFilterProxyModel.h"
2021-10-16 18:37:11 -05:00
# include "SeerSlashProcDialog.h"
2021-09-01 13:58:59 -05:00
# include <QtWidgets/QFileDialog>
# include <QtCore/QDir>
# include <QtCore/QDebug>
2022-05-02 19:57:17 -05:00
# include <QtGlobal>
2021-09-01 13:58:59 -05:00
SeerDebugDialog : : SeerDebugDialog ( QWidget * parent ) : QDialog ( parent ) {
// Set up the UI.
setupUi ( this ) ;
// Setup the widgets
setExecutableName ( " " ) ;
2022-12-29 19:03:18 -06:00
setExecutableSymbolName ( " " ) ;
2021-09-01 13:58:59 -05:00
setExecutableArguments ( " " ) ;
2022-03-26 10:29:53 -05:00
setBreakpointsFilename ( " " ) ;
2021-09-01 13:58:59 -05:00
setExecutableWorkingDirectory ( QDir : : currentPath ( ) ) ;
2022-07-30 12:02:52 -05:00
setBreakpointMode ( " none " ) ;
setBreakpointFunctionName ( " " ) ;
setShowAssemblyTab ( false ) ;
setRandomizeStartAddress ( false ) ;
2022-10-01 15:41:50 -05:00
setNonStopMode ( false ) ;
2021-09-01 13:58:59 -05:00
setAttachPid ( 0 ) ;
setConnectHostPort ( " " ) ;
setCoreFilename ( " " ) ;
// Connect things.
2023-01-11 17:57:19 -06:00
QObject : : connect ( executableNameToolButton , & QToolButton : : clicked , this , & SeerDebugDialog : : handleExecutableNameToolButton ) ;
QObject : : connect ( executableSymbolNameToolButton , & QToolButton : : clicked , this , & SeerDebugDialog : : handleExecutableSymbolNameToolButton ) ;
QObject : : connect ( executableWorkingDirectoryToolButton , & QToolButton : : clicked , this , & SeerDebugDialog : : handleExecutableWorkingDirectoryToolButton ) ;
QObject : : connect ( loadBreakpointsFilenameToolButton , & QToolButton : : clicked , this , & SeerDebugDialog : : handleLoadBreakpointsFilenameToolButton ) ;
QObject : : connect ( loadCoreFilenameToolButton , & QToolButton : : clicked , this , & SeerDebugDialog : : handleLoadCoreFilenameToolButton ) ;
QObject : : connect ( breakpointInFunctionLineEdit , & QLineEdit : : textChanged , this , & SeerDebugDialog : : handleBreakpointInFunctionLineEdit ) ;
QObject : : connect ( attachProgramPidToolButton , & QToolButton : : clicked , this , & SeerDebugDialog : : handleProgramPidToolButton ) ;
2022-05-02 19:57:17 -05:00
2022-10-02 10:35:30 -05:00
# if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
2023-01-11 17:57:19 -06:00
QObject : : connect ( runModeTabWidget , & QTabWidget : : currentChanged , this , & SeerDebugDialog : : handleRunModeChanged ) ;
2022-05-02 19:57:17 -05:00
# else
2023-01-11 17:57:19 -06:00
QObject : : connect ( runModeTabWidget , & QTabWidget : : currentChanged , this , & SeerDebugDialog : : handleRunModeChanged ) ;
2022-05-02 19:57:17 -05:00
# endif
2021-09-01 13:58:59 -05:00
// Set initial run mode.
handleRunModeChanged ( - 1 ) ;
}
SeerDebugDialog : : ~ SeerDebugDialog ( ) {
}
void SeerDebugDialog : : setExecutableName ( const QString & executableName ) {
executableNameLineEdit - > setText ( executableName ) ;
}
QString SeerDebugDialog : : executableName ( ) const {
2023-01-08 12:35:47 -06:00
if ( executableNameLineEdit - > isEnabled ( ) ) {
return executableNameLineEdit - > text ( ) ;
}
return " " ;
2021-09-01 13:58:59 -05:00
}
2022-12-29 19:03:18 -06:00
void SeerDebugDialog : : setExecutableSymbolName ( const QString & executableSymbolName ) {
executableSymbolNameLineEdit - > setText ( executableSymbolName ) ;
}
QString SeerDebugDialog : : executableSymbolName ( ) const {
2023-01-08 12:35:47 -06:00
if ( executableSymbolNameLineEdit - > isEnabled ( ) ) {
return executableSymbolNameLineEdit - > text ( ) ;
}
return " " ;
2022-12-29 19:03:18 -06:00
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog : : setExecutableWorkingDirectory ( const QString & executableWorkingDirectory ) {
executableWorkingDirectoryLineEdit - > setText ( executableWorkingDirectory ) ;
}
QString SeerDebugDialog : : executableWorkingDirectory ( ) const {
2023-01-08 12:35:47 -06:00
if ( executableWorkingDirectoryLineEdit - > isEnabled ( ) ) {
return executableWorkingDirectoryLineEdit - > text ( ) ;
}
return " " ;
2021-09-01 13:58:59 -05:00
}
void SeerDebugDialog : : setExecutableArguments ( const QString & executableArguments ) {
runProgramArgumentsLineEdit - > setText ( executableArguments ) ;
}
QString SeerDebugDialog : : executableArguments ( ) const {
return runProgramArgumentsLineEdit - > text ( ) ;
}
2022-03-26 10:29:53 -05:00
void SeerDebugDialog : : setBreakpointsFilename ( const QString & breakpointsFilename ) {
loadBreakpointsFilenameLineEdit - > setText ( breakpointsFilename ) ;
}
QString SeerDebugDialog : : breakpointsFilename ( ) const {
return loadBreakpointsFilenameLineEdit - > text ( ) ;
}
2022-07-30 12:02:52 -05:00
void SeerDebugDialog : : setBreakpointMode ( const QString & mode ) {
if ( mode = = " none " ) {
noBreakpointRadioButton - > setChecked ( true ) ;
return ;
} else if ( mode = = " inmain " ) {
breakpointInMainRadioButton - > setChecked ( true ) ;
return ;
} else if ( mode = = " infunction " ) {
breakpointInFunctionRadioButton - > setChecked ( true ) ;
return ;
}
noBreakpointRadioButton - > setChecked ( true ) ;
}
QString SeerDebugDialog : : breakpointMode ( ) const {
if ( noBreakpointRadioButton - > isChecked ( ) ) {
return " none " ;
} else if ( breakpointInMainRadioButton - > isChecked ( ) ) {
return " inmain " ;
} else if ( breakpointInFunctionRadioButton - > isChecked ( ) ) {
return " infunction " ;
}
return " none " ;
2021-09-01 13:58:59 -05:00
}
2022-07-30 12:02:52 -05:00
void SeerDebugDialog : : setBreakpointFunctionName ( const QString & nameoraddress ) {
breakpointInFunctionLineEdit - > setText ( nameoraddress ) ;
}
QString SeerDebugDialog : : breakpointFunctionName ( ) const {
return breakpointInFunctionLineEdit - > text ( ) ;
}
void SeerDebugDialog : : setShowAssemblyTab ( bool flag ) {
showAsseblyTabCheckBox - > setChecked ( flag ) ;
}
bool SeerDebugDialog : : showAssemblyTab ( ) const {
return showAsseblyTabCheckBox - > isChecked ( ) ;
}
void SeerDebugDialog : : setRandomizeStartAddress ( bool flag ) {
randomizeStartAddressCheckBox - > setChecked ( flag ) ;
}
bool SeerDebugDialog : : randomizeStartAddress ( ) const {
return randomizeStartAddressCheckBox - > isChecked ( ) ;
2021-09-01 13:58:59 -05:00
}
2022-10-01 15:41:50 -05:00
void SeerDebugDialog : : setNonStopMode ( bool flag ) {
nonStopModeCheckBox - > setChecked ( flag ) ;
}
bool SeerDebugDialog : : nonStopMode ( ) const {
return nonStopModeCheckBox - > isChecked ( ) ;
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog : : setCoreFilename ( const QString & coreFilename ) {
loadCoreFilenameLineEdit - > setText ( coreFilename ) ;
}
QString SeerDebugDialog : : coreFilename ( ) const {
return loadCoreFilenameLineEdit - > text ( ) ;
}
void SeerDebugDialog : : setAttachPid ( int pid ) {
if ( pid < 1 ) {
attachProgramPidLineEdit - > clear ( ) ;
} else {
attachProgramPidLineEdit - > setText ( QString : : number ( pid ) ) ;
}
}
int SeerDebugDialog : : attachPid ( ) const {
return attachProgramPidLineEdit - > text ( ) . toInt ( ) ;
}
void SeerDebugDialog : : setConnectHostPort ( const QString & connectHostPort ) {
connectProgramHostPortLineEdit - > setText ( connectHostPort ) ;
}
QString SeerDebugDialog : : connectHostPort ( ) const {
return connectProgramHostPortLineEdit - > text ( ) ;
}
void SeerDebugDialog : : setLaunchMode ( const QString & mode ) {
if ( mode = = " start " ) {
2023-01-11 17:57:19 -06:00
runModeTabWidget - > setCurrentIndex ( 0 ) ;
2021-09-01 13:58:59 -05:00
2022-07-30 12:02:52 -05:00
setBreakpointMode ( " inmain " ) ;
2021-09-01 13:58:59 -05:00
} else if ( mode = = " run " ) {
2023-01-11 17:57:19 -06:00
runModeTabWidget - > setCurrentIndex ( 0 ) ;
2021-09-01 13:58:59 -05:00
2022-07-30 12:02:52 -05:00
setBreakpointMode ( " none " ) ;
2021-09-01 13:58:59 -05:00
} else if ( mode = = " attach " ) {
2023-01-11 17:57:19 -06:00
runModeTabWidget - > setCurrentIndex ( 1 ) ;
2021-09-01 13:58:59 -05:00
} else if ( mode = = " connect " ) {
2023-01-11 17:57:19 -06:00
runModeTabWidget - > setCurrentIndex ( 2 ) ;
2021-09-01 13:58:59 -05:00
} else if ( mode = = " corefile " ) {
2023-01-11 17:57:19 -06:00
runModeTabWidget - > setCurrentIndex ( 3 ) ;
2021-09-01 13:58:59 -05:00
} else if ( mode = = " " ) {
2023-01-11 17:57:19 -06:00
runModeTabWidget - > setCurrentIndex ( 0 ) ;
2021-09-01 13:58:59 -05:00
2022-07-30 12:02:52 -05:00
setBreakpointMode ( " none " ) ;
2021-09-01 13:58:59 -05:00
} else {
2023-01-11 17:57:19 -06:00
2022-04-16 10:35:32 -05:00
qWarning ( ) < < " Unknown launch mode of: " < < mode ;
2021-09-01 13:58:59 -05:00
}
}
QString SeerDebugDialog : : launchMode ( ) {
2023-01-11 17:57:19 -06:00
if ( runModeTabWidget - > currentIndex ( ) = = 0 ) {
2022-07-30 12:02:52 -05:00
if ( breakpointMode ( ) = = " inmain " ) {
2021-09-01 13:58:59 -05:00
return " start " ;
2022-07-30 12:02:52 -05:00
} else if ( breakpointMode ( ) = = " infunction " ) {
return " run " ;
} else if ( breakpointMode ( ) = = " none " ) {
return " run " ;
2021-09-01 13:58:59 -05:00
} else {
return " run " ;
}
2023-01-11 17:57:19 -06:00
} else if ( runModeTabWidget - > currentIndex ( ) = = 1 ) {
2021-09-01 13:58:59 -05:00
return " attach " ;
2023-01-11 17:57:19 -06:00
} else if ( runModeTabWidget - > currentIndex ( ) = = 2 ) {
2021-09-01 13:58:59 -05:00
return " connect " ;
2023-01-11 17:57:19 -06:00
} else if ( runModeTabWidget - > currentIndex ( ) = = 3 ) {
2021-09-01 13:58:59 -05:00
return " corefile " ;
}
2023-01-11 17:57:19 -06:00
qWarning ( ) < < " Unknown launch mode of: " < < runModeTabWidget - > currentIndex ( ) ;
2022-04-16 10:35:32 -05:00
2021-09-01 13:58:59 -05:00
return " " ;
}
void SeerDebugDialog : : handleExecutableNameToolButton ( ) {
2022-01-20 09:03:39 -06:00
QString name = QFileDialog : : getOpenFileName ( this , " Select an Executable to debug. " , executableName ( ) , " " , nullptr , QFileDialog : : DontUseNativeDialog ) ;
2021-09-01 13:58:59 -05:00
if ( name ! = " " ) {
setExecutableName ( name ) ;
}
}
2022-12-29 19:03:18 -06:00
void SeerDebugDialog : : handleExecutableSymbolNameToolButton ( ) {
QString name = QFileDialog : : getOpenFileName ( this , " Select a Symbol File for the executable. " , executableSymbolName ( ) , " " , nullptr , QFileDialog : : DontUseNativeDialog ) ;
if ( name ! = " " ) {
setExecutableSymbolName ( name ) ;
}
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog : : handleExecutableWorkingDirectoryToolButton ( ) {
2022-01-20 09:03:39 -06:00
QString name = QFileDialog : : getExistingDirectory ( this , " Select a Working Directory to run in. " , executableWorkingDirectory ( ) , QFileDialog : : ShowDirsOnly | QFileDialog : : DontUseNativeDialog ) ;
2021-09-01 13:58:59 -05:00
if ( name ! = " " ) {
setExecutableWorkingDirectory ( name ) ;
}
}
2022-03-26 10:29:53 -05:00
void SeerDebugDialog : : handleLoadBreakpointsFilenameToolButton ( ) {
QString name = QFileDialog : : getOpenFileName ( this , " Select a breakpoints file to load. " , breakpointsFilename ( ) , " Breakpoints (*.brk);;All files (*.*) " , nullptr , QFileDialog : : DontUseNativeDialog ) ;
if ( name ! = " " ) {
setBreakpointsFilename ( name ) ;
}
}
2022-07-30 17:10:26 -05:00
void SeerDebugDialog : : handleBreakpointInFunctionLineEdit ( ) {
breakpointInFunctionRadioButton - > setChecked ( true ) ;
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog : : handleLoadCoreFilenameToolButton ( ) {
2022-01-20 09:03:39 -06:00
QString name = QFileDialog : : getOpenFileName ( this , " Select a core file to debug. " , coreFilename ( ) , " Core Files (core core.*) " , nullptr , QFileDialog : : DontUseNativeDialog ) ;
2021-09-01 13:58:59 -05:00
if ( name ! = " " ) {
setCoreFilename ( name ) ;
}
}
2021-10-16 18:37:11 -05:00
void SeerDebugDialog : : handleProgramPidToolButton ( ) {
SeerSlashProcDialog dlg ( this ) ;
// Execute the dialog and get the result.
if ( dlg . exec ( ) ) {
setAttachPid ( dlg . selectedPid ( ) ) ;
}
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog : : handleRunModeChanged ( int id ) {
//
// Disable all imprortant widgets.
//
2023-01-08 12:35:47 -06:00
executableNameLineEdit - > setEnabled ( false ) ;
2023-01-20 09:11:34 -06:00
executableNameToolButton - > setEnabled ( false ) ;
2023-01-08 12:35:47 -06:00
executableSymbolNameLineEdit - > setEnabled ( false ) ;
2023-01-20 09:11:34 -06:00
executableSymbolNameToolButton - > setEnabled ( false ) ;
2023-01-08 12:35:47 -06:00
executableWorkingDirectoryLineEdit - > setEnabled ( false ) ;
2023-01-20 09:11:34 -06:00
executableWorkingDirectoryToolButton - > setEnabled ( false ) ;
// ID == 0 RUN/START
2022-07-30 17:10:26 -05:00
runProgramArgumentsLabel - > setEnabled ( false ) ;
2021-09-01 13:58:59 -05:00
runProgramArgumentsLineEdit - > setEnabled ( false ) ;
2022-07-30 17:10:26 -05:00
loadBreakpointsFilenameLabel - > setEnabled ( false ) ;
2022-03-29 18:01:20 -05:00
loadBreakpointsFilenameLineEdit - > setEnabled ( false ) ;
loadBreakpointsFilenameToolButton - > setEnabled ( false ) ;
2022-07-30 17:10:26 -05:00
noBreakpointRadioButton - > setEnabled ( false ) ;
2022-07-30 12:02:52 -05:00
breakpointInMainRadioButton - > setEnabled ( false ) ;
breakpointInFunctionRadioButton - > setEnabled ( false ) ;
breakpointInFunctionLineEdit - > setEnabled ( false ) ;
showAsseblyTabCheckBox - > setEnabled ( false ) ;
randomizeStartAddressCheckBox - > setEnabled ( false ) ;
2022-10-01 15:41:50 -05:00
nonStopModeCheckBox - > setEnabled ( false ) ;
2021-09-01 13:58:59 -05:00
2023-01-11 17:57:19 -06:00
// ID == 1 ATTACH
2022-07-30 17:10:26 -05:00
attachProgramPidLabel - > setEnabled ( false ) ;
2021-09-01 13:58:59 -05:00
attachProgramPidLineEdit - > setEnabled ( false ) ;
2021-10-16 18:37:11 -05:00
attachProgramPidToolButton - > setEnabled ( false ) ;
2021-09-01 13:58:59 -05:00
2023-01-11 17:57:19 -06:00
// ID == 2 CONNECT
2022-07-30 17:10:26 -05:00
connectProgramHostPortLabel - > setEnabled ( false ) ;
2021-09-01 13:58:59 -05:00
connectProgramHostPortLineEdit - > setEnabled ( false ) ;
2023-01-11 17:57:19 -06:00
// ID == 3 CORE
2022-07-30 17:10:26 -05:00
loadCoreFilenameLabel - > setEnabled ( false ) ;
2021-09-01 13:58:59 -05:00
loadCoreFilenameLineEdit - > setEnabled ( false ) ;
2021-10-16 18:37:11 -05:00
loadCoreFilenameToolButton - > setEnabled ( false ) ;
2021-09-01 13:58:59 -05:00
//
// Enable the newly selected one.
//
2023-01-11 17:57:19 -06:00
// ID == 0 RUN/START
if ( id = = 0 ) {
2023-01-08 12:35:47 -06:00
executableNameLineEdit - > setEnabled ( true ) ;
2023-01-20 09:11:34 -06:00
executableNameToolButton - > setEnabled ( true ) ;
2023-01-08 12:35:47 -06:00
executableSymbolNameLineEdit - > setEnabled ( true ) ;
2023-01-20 09:11:34 -06:00
executableSymbolNameToolButton - > setEnabled ( true ) ;
2023-01-08 12:35:47 -06:00
executableWorkingDirectoryLineEdit - > setEnabled ( true ) ;
2023-01-20 09:11:34 -06:00
executableWorkingDirectoryToolButton - > setEnabled ( true ) ;
2022-07-30 17:10:26 -05:00
runProgramArgumentsLabel - > setEnabled ( true ) ;
2021-09-01 13:58:59 -05:00
runProgramArgumentsLineEdit - > setEnabled ( true ) ;
2022-07-30 17:10:26 -05:00
loadBreakpointsFilenameLabel - > setEnabled ( true ) ;
2022-03-29 18:01:20 -05:00
loadBreakpointsFilenameLineEdit - > setEnabled ( true ) ;
loadBreakpointsFilenameToolButton - > setEnabled ( true ) ;
2022-07-30 17:10:26 -05:00
noBreakpointRadioButton - > setEnabled ( true ) ;
2022-07-30 12:02:52 -05:00
breakpointInMainRadioButton - > setEnabled ( true ) ;
breakpointInFunctionRadioButton - > setEnabled ( true ) ;
breakpointInFunctionLineEdit - > setEnabled ( true ) ;
showAsseblyTabCheckBox - > setEnabled ( true ) ;
randomizeStartAddressCheckBox - > setEnabled ( true ) ;
2022-10-01 15:41:50 -05:00
nonStopModeCheckBox - > setEnabled ( true ) ;
2021-09-01 13:58:59 -05:00
}
2023-01-11 17:57:19 -06:00
// ID == 1 ATTACH
if ( id = = 1 ) {
2023-01-08 12:35:47 -06:00
executableNameLineEdit - > setEnabled ( true ) ;
2023-01-20 09:11:34 -06:00
executableNameToolButton - > setEnabled ( true ) ;
2023-01-08 12:35:47 -06:00
executableSymbolNameLineEdit - > setEnabled ( true ) ;
2023-01-20 09:11:34 -06:00
executableSymbolNameToolButton - > setEnabled ( true ) ;
2022-07-30 17:10:26 -05:00
attachProgramPidLabel - > setEnabled ( true ) ;
2021-09-01 13:58:59 -05:00
attachProgramPidLineEdit - > setEnabled ( true ) ;
2021-10-16 18:37:11 -05:00
attachProgramPidToolButton - > setEnabled ( true ) ;
2021-09-01 13:58:59 -05:00
}
2023-01-11 17:57:19 -06:00
// ID == 2 CONNECT
if ( id = = 2 ) {
2023-01-08 12:35:47 -06:00
executableSymbolNameLineEdit - > setEnabled ( true ) ;
2023-01-20 09:11:34 -06:00
executableSymbolNameToolButton - > setEnabled ( true ) ;
2022-07-30 17:10:26 -05:00
connectProgramHostPortLabel - > setEnabled ( true ) ;
2021-09-01 13:58:59 -05:00
connectProgramHostPortLineEdit - > setEnabled ( true ) ;
}
2023-01-11 17:57:19 -06:00
// ID == 3 CORE
if ( id = = 3 ) {
2023-01-08 12:35:47 -06:00
executableSymbolNameLineEdit - > setEnabled ( true ) ;
2023-01-20 09:11:34 -06:00
executableSymbolNameToolButton - > setEnabled ( true ) ;
2022-07-30 17:10:26 -05:00
loadCoreFilenameLabel - > setEnabled ( true ) ;
2021-09-01 13:58:59 -05:00
loadCoreFilenameLineEdit - > setEnabled ( true ) ;
2021-10-16 18:37:11 -05:00
loadCoreFilenameToolButton - > setEnabled ( true ) ;
2021-09-01 13:58:59 -05:00
}
}