2023-12-23 12:45:45 -06:00
# include "SeerRegisterProfileDialog.h"
# include "SeerRegisterTreeWidgetItem.h"
# include <QtWidgets/QMessageBox>
2023-12-25 13:51:25 -06:00
# include <QtWidgets/QFileDialog>
2023-12-24 11:09:00 -06:00
# include <QtGui/QRegularExpressionValidator>
# include <QtCore/QRegularExpression>
2023-12-23 12:45:45 -06:00
# include <QtCore/QSettings>
# include <QtCore/QList>
# include <QtCore/QDebug>
SeerRegisterProfileDialog : : SeerRegisterProfileDialog ( QWidget * parent ) : QDialog ( parent ) {
// Set up the UI.
setupUi ( this ) ;
registersTreeWidget - > setSortingEnabled ( true ) ; // We can sort on columns.
registersTreeWidget - > sortByColumn ( 0 , Qt : : AscendingOrder ) ;
registersTreeWidget - > resizeColumnToContents ( 0 ) ; // index
registersTreeWidget - > resizeColumnToContents ( 1 ) ; // name
registersTreeWidget - > resizeColumnToContents ( 2 ) ; // checkbox
registersTreeWidget - > clear ( ) ;
2023-12-24 12:07:58 -06:00
QRegularExpressionValidator * validator = new QRegularExpressionValidator ( QRegularExpression ( " [a-z0-9 \\ . \\ - \\ _]+ " ) ) ;
2023-12-24 11:09:00 -06:00
profileNameLineEdit - > setValidator ( validator ) ;
2023-12-23 12:45:45 -06:00
// Setup the widgets
setRegisters ( QStringList ( ) , QVector < bool > ( ) ) ;
// Connect things.
QObject : : connect ( enablePushButton , & QPushButton : : clicked , this , & SeerRegisterProfileDialog : : handleEnableSelected ) ;
QObject : : connect ( disablePushButton , & QPushButton : : clicked , this , & SeerRegisterProfileDialog : : handleDisableSelected ) ;
2023-12-25 13:51:25 -06:00
QObject : : connect ( importPushButton , & QPushButton : : clicked , this , & SeerRegisterProfileDialog : : handleImportFile ) ;
QObject : : connect ( exportPushButton , & QPushButton : : clicked , this , & SeerRegisterProfileDialog : : handleExportFile ) ;
2023-12-23 12:45:45 -06:00
// Restore window settings.
readSettings ( ) ;
}
SeerRegisterProfileDialog : : ~ SeerRegisterProfileDialog ( ) {
}
void SeerRegisterProfileDialog : : setRegisters ( const QStringList & registerNames , const QVector < bool > & registerEnabled ) {
registersTreeWidget - > clear ( ) ;
for ( int i = 0 ; i < registerNames . count ( ) ; i + + ) {
QTreeWidgetItem * topItem = new SeerRegisterTreeWidgetItem ;
topItem - > setText ( 0 , QString : : number ( i ) ) ;
topItem - > setText ( 1 , registerNames [ i ] ) ;
if ( registerEnabled [ i ] = = true ) {
topItem - > setCheckState ( 2 , Qt : : Checked ) ;
} else {
topItem - > setCheckState ( 2 , Qt : : Unchecked ) ;
}
registersTreeWidget - > addTopLevelItem ( topItem ) ;
}
registersTreeWidget - > resizeColumnToContents ( 0 ) ;
registersTreeWidget - > resizeColumnToContents ( 1 ) ;
registersTreeWidget - > resizeColumnToContents ( 2 ) ;
}
QStringList SeerRegisterProfileDialog : : registerNames ( ) const {
QStringList registerNames ;
for ( int i = 0 ; i < registersTreeWidget - > topLevelItemCount ( ) ; i + + ) {
QTreeWidgetItem * topItem = registersTreeWidget - > topLevelItem ( i ) ;
registerNames . push_back ( topItem - > text ( 1 ) ) ;
}
return registerNames ;
}
QVector < bool > SeerRegisterProfileDialog : : registerEnabled ( ) const {
QVector < bool > registerEnabled ;
for ( int i = 0 ; i < registersTreeWidget - > topLevelItemCount ( ) ; i + + ) {
QTreeWidgetItem * topItem = registersTreeWidget - > topLevelItem ( i ) ;
if ( topItem - > checkState ( 2 ) = = Qt : : Checked ) {
registerEnabled . push_back ( true ) ;
} else {
registerEnabled . push_back ( false ) ;
}
}
return registerEnabled ;
}
2023-12-24 11:09:00 -06:00
void SeerRegisterProfileDialog : : setProfileName ( const QString & profileName ) {
profileNameLineEdit - > setText ( profileName ) ;
}
QString SeerRegisterProfileDialog : : profileName ( ) const {
return profileNameLineEdit - > text ( ) ;
}
2023-12-23 12:45:45 -06:00
void SeerRegisterProfileDialog : : accept ( ) {
if ( profileNameLineEdit - > text ( ) = = " " ) {
QMessageBox : : warning ( this , " Seer " , " The register profile name is blank. " , QMessageBox : : Ok ) ;
return ;
}
2023-12-24 11:09:00 -06:00
if ( profileNameLineEdit - > text ( ) = = " allregisters " ) {
QMessageBox : : warning ( this , " Seer " , " The register profile name of 'allregisters' is reserved. \n \n Choose a different name. " , QMessageBox : : Ok ) ;
return ;
}
2023-12-23 12:45:45 -06:00
QDialog : : accept ( ) ;
}
void SeerRegisterProfileDialog : : handleEnableSelected ( ) {
QList < QTreeWidgetItem * > selected = registersTreeWidget - > selectedItems ( ) ;
foreach ( QTreeWidgetItem * item , selected ) {
item - > setCheckState ( 2 , Qt : : Checked ) ;
}
}
void SeerRegisterProfileDialog : : handleDisableSelected ( ) {
QList < QTreeWidgetItem * > selected = registersTreeWidget - > selectedItems ( ) ;
foreach ( QTreeWidgetItem * item , selected ) {
item - > setCheckState ( 2 , Qt : : Unchecked ) ;
}
}
2023-12-25 13:51:25 -06:00
void SeerRegisterProfileDialog : : handleImportFile ( ) {
//
// Get the name of the file to import.
//
QFileDialog dialog ( this , " Seer Register Profile File " , " ./ " , " Text files (*.txt) ; ; All files ( * . * ) " ) ;
dialog . setAcceptMode ( QFileDialog : : AcceptOpen ) ;
dialog . setFileMode ( QFileDialog : : AnyFile ) ;
dialog . setDefaultSuffix ( " txt " ) ;
dialog . selectFile ( " registerprofile.txt " ) ;
if ( dialog . exec ( ) ! = QDialog : : Accepted ) {
return ;
}
QStringList files = dialog . selectedFiles ( ) ;
if ( files . size ( ) = = 0 ) {
return ;
}
if ( files . size ( ) > 1 ) {
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Select only 1 file. " ) ) ;
return ;
}
//
// Open the file and read from it.
// A simple format of:
// <registername> <enable|disable>
//
QFile file ( files [ 0 ] ) ;
if ( file . open ( QIODevice : : ReadOnly ) ) {
QStringList registerNames ;
QVector < bool > registerEnabled ;
QTextStream stream ( & file ) ;
while ( stream . atEnd ( ) = = false ) {
QString line = stream . readLine ( ) ;
QStringList words = line . split ( QRegularExpression ( " \\ s+ " ) ) ;
// Ignore empty lines.
if ( words . count ( ) = = 0 ) {
continue ;
}
// Ignore null lines.
if ( words . count ( ) = = 1 & & words [ 0 ] = = " " ) {
continue ;
}
// There should be only two words on each line.
if ( words . count ( ) ! = 2 ) {
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Can't load register profile file. \n Encountered a line not the form of: \n \n <registername> <enabled|disabled> " ) ) ;
return ;
}
// The second word must be 'enabled' or 'disabled'.
if ( words [ 1 ] ! = " enabled " & & words [ 1 ] ! = " disabled " ) {
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Can't load register profile file. \n Encountered a line not the form of: \n \n <registername> <enabled|disabled> " ) ) ;
return ;
}
registerNames . push_back ( words [ 0 ] ) ;
registerEnabled . push_back ( words [ 1 ] = = " enabled " ? true : false ) ;
}
// Populate the list with the imported values.
setRegisters ( registerNames , registerEnabled ) ;
QMessageBox : : information ( this , " Seer " , " Loaded. " ) ;
} else {
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Can't open register profile file. " ) ) ;
return ;
}
}
void SeerRegisterProfileDialog : : handleExportFile ( ) {
//
// Get the name of the file to export.
//
QFileDialog dialog ( this , " Seer Register Profile File " , " ./ " , " Text files (*.txt) ; ; All files ( * . * ) " ) ;
dialog . setAcceptMode ( QFileDialog : : AcceptSave ) ;
dialog . setFileMode ( QFileDialog : : AnyFile ) ;
dialog . setDefaultSuffix ( " txt " ) ;
dialog . selectFile ( " registerprofile.txt " ) ;
if ( dialog . exec ( ) ! = QDialog : : Accepted ) {
return ;
}
QStringList files = dialog . selectedFiles ( ) ;
if ( files . size ( ) = = 0 ) {
return ;
}
if ( files . size ( ) > 1 ) {
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Select only 1 file. " ) ) ;
return ;
}
//
// Create the file and write to it.
// A simple format of:
// <registername> <enable|disable>
//
QFile file ( files [ 0 ] ) ;
if ( file . open ( QIODevice : : ReadWrite ) ) {
QTextStream stream ( & file ) ;
QStringList names = registerNames ( ) ;
QVector < bool > enabled = registerEnabled ( ) ;
for ( int i = 0 ; i < names . count ( ) ; i + + ) {
stream < < names [ i ] < < " " < < ( enabled [ i ] = = true ? " enabled " : " disabled " ) < < " \n " ;
}
file . flush ( ) ;
file . close ( ) ;
QMessageBox : : information ( this , " Seer " , " Saved. " ) ;
} else {
QMessageBox : : critical ( this , tr ( " Error " ) , tr ( " Can't create register profile file. " ) ) ;
return ;
}
}
2023-12-23 12:45:45 -06:00
void SeerRegisterProfileDialog : : writeSettings ( ) {
QSettings settings ;
settings . beginGroup ( " registerprofiledialog " ) ; {
settings . setValue ( " size " , size ( ) ) ;
} settings . endGroup ( ) ;
}
void SeerRegisterProfileDialog : : readSettings ( ) {
QSettings settings ;
settings . beginGroup ( " registerprofiledialog " ) ; {
resize ( settings . value ( " size " , QSize ( 600 , 600 ) ) . toSize ( ) ) ;
} settings . endGroup ( ) ;
}
void SeerRegisterProfileDialog : : resizeEvent ( QResizeEvent * event ) {
// Write window settings.
writeSettings ( ) ;
QWidget : : resizeEvent ( event ) ;
}