2023-05-01 20:56:52 +00:00
# include <QDebug>
# include "logcategories.h"
# include "memories.h"
# include "ui_memories.h"
2024-04-29 09:12:31 +00:00
memories : : memories ( bool isAdmin , bool slowLoad , QWidget * parent ) :
2024-02-05 20:06:50 +00:00
QWidget ( parent ) ,
2023-05-09 16:03:03 +00:00
slowLoad ( slowLoad ) ,
2023-05-01 20:56:52 +00:00
ui ( new Ui : : memories )
{
ui - > setupUi ( this ) ;
ui - > table - > setColumnCount ( totalColumns ) ;
2023-09-28 14:44:49 +00:00
ui - > table - > editing ( false ) ;
2024-04-28 23:50:04 +00:00
statusBar = new QStatusBar ( this ) ;
ui - > verticalLayout - > addWidget ( statusBar ) ;
progress = new QProgressBar ( this ) ;
statusBar - > addWidget ( progress , 1 ) ;
this - > setObjectName ( " memories " ) ;
2024-03-25 12:42:08 +00:00
queue = cachingQueue : : getInstance ( this ) ;
rigCaps = queue - > getRigCaps ( ) ;
2024-04-29 09:12:31 +00:00
if ( ! isAdmin )
{
ui - > disableEditing - > setEnabled ( false ) ;
}
2024-03-25 12:47:15 +00:00
if ( rigCaps = = Q_NULLPTR )
{
// We have no rigCaps, so cannot continue
return ;
}
2024-03-25 15:41:07 +00:00
2024-04-28 23:50:04 +00:00
progress - > setRange ( rigCaps - > memStart , rigCaps - > memories ) ;
2023-05-01 20:56:52 +00:00
QStringList headers ;
2023-05-02 20:18:41 +00:00
/*
2023-05-04 20:55:40 +00:00
2023-05-06 11:36:05 +00:00
columnRecall = 0 , columnNum , columnSplit , columnScan , columnFrequency , columnMode , columnFilter , columnData , columnDuplex , columnToneMode , columnDSQL , columnTone , columnTSQL , columnDTCS ,
columnDTCSPolarity , columnDVSquelch , columnOffset , columnUR , columnR1 , columnR2 , columnFrequencyB , columnModeB , columnFilterB , columnDataB , columnDuplexB , columnToneModeB , columnDSQLB
columnToneB , columnTSQLB , columnDTCSB , columnDTCSPolarityB , columnDVSquelchB , columnOffsetB , columnURB , columnR1B , columnR2B , columnName ,
2023-05-02 20:18:41 +00:00
*/
2023-05-08 12:26:45 +00:00
headers < < " " < < " Num " < < " Name " < < " Split " < < " Scan " < < " VFO " < < " Freq " < < " Mode " < < " Filter " < < " Data " < < " Duplex " < < " Tn Mode " < < " DSQL " < < " Tone " < < " TSQL " < <
" DTCS " < < " DTCS Pol " < < " DV Sql " < < " Offset " < < " UR " < < " R1 " < < " R2 " < < " VFO B " < < " Freq B " < < " Mode B " < < " Filter B " < < " Data B " < < " Duplex B " < <
2023-05-06 11:36:05 +00:00
" Tn Mode B " < < " DSQL B " < < " Tone B " < < " TSQL B " < < " DTCS B " < < " DTCSP B " < < " DV Sql B " < < " Offset B " < < " UR B " < < " R1 B " < < " R2 B " ;
2023-05-04 20:55:40 +00:00
2023-05-09 16:03:03 +00:00
scan < < " OFF " < < " *1 " < < " *2 " < < " *3 " ;
split < < " OFF " < < " ON " ;
dataModes < < " OFF " < < " DATA1 " ;
2024-03-25 12:42:08 +00:00
if ( rigCaps - > commands . contains ( funcDATA2Mod ) )
2023-05-09 16:03:03 +00:00
dataModes . append ( " DATA2 " ) ;
2024-03-25 12:42:08 +00:00
if ( rigCaps - > commands . contains ( funcDATA3Mod ) )
2023-05-09 16:03:03 +00:00
dataModes . append ( " DATA3 " ) ;
filters < < " FIL1 " < < " FIL2 " < < " FIL3 " ;
duplexModes < < " OFF " < < " DUP- " < < " DUP+ " < < " RPS " ;
toneModes < < " OFF " < < " TONE " < < " TSQL " ;
2024-03-25 12:42:08 +00:00
if ( rigCaps - > commands . contains ( funcRepeaterDTCS ) )
2023-05-09 16:03:03 +00:00
toneModes . append ( " DTCS " ) ;
tones < < " 67.0 " < < " 69.3 " < < " 71.9 " < < " 74.4 " < < " 77.0 " < < " 79.7 " < < " 82.5 " < < " 85.4 " < < " 88.5 " < < " 91.5 " < < " 94.8 " < < " 97.4 " < < " 100.0 " < < " 103.5 " < < " 107.2 " < < " 110.9 " < < " 114.8 " < <
" 118.8 " < < " 123.0 " < < " 127.3 " < < " 131.8 " < < " 136.5 " < < " 141.3 " < < " 146.2 " < < " 151.4 " < < " 156.7 " < < " 159.8 " < < " 162.2 " < < " 165.5 " < < " 167.9 " < < " 171.3 " < < " 173.8 " < < " 177.3 " < < " 179.9 " < <
" 183.5 " < < " 186.2 " < < " 189.9 " < < " 192.8 " < < " 196.6 " < < " 199.5 " < < " 203.5 " < < " 206.5 " < < " 210.7 " < < " 218.1 " < < " 225.7 " < < " 229.1 " < < " 233.6 " < < " 241.8 " < < " 250.3 " < < " 254.1 " ;
dtcs < < " 023 " < < " 025 " < < " 026 " < < " 031 " < < " 032 " < < " 036 " < < " 043 " < < " 047 " < < " 051 " < < " 053 " < < " 054 " < < " 065 " < < " 071 " < < " 072 " < < " 073 " < < " 074 " < < " 114 " < < " 115 " < < " 116 " < < " 122 " < <
" 125 " < < " 131 " < < " 132 " < < " 134 " < < " 143 " < < " 145 " < < " 152 " < < " 155 " < < " 156 " < < " 162 " < < " 165 " < < " 172 " < < " 174 " < < " 205 " < < " 212 " < < " 223 " < < " 225 " < < " 226 " < < " 243 " < < " 244 " < <
" 245 " < < " 246 " < < " 251 " < < " 252 " < < " 255 " < < " 261 " < < " 263 " < < " 265 " < < " 266 " < < " 271 " < < " 274 " < < " 306 " < < " 311 " < < " 315 " < < " 325 " < < " 331 " < < " 332 " < < " 343 " < < " 346 " < < " 351 " < <
" 356 " < < " 364 " < < " 365 " < < " 371 " < < " 411 " < < " 412 " < < " 413 " < < " 423 " < < " 431 " < < " 432 " < < " 445 " < < " 446 " < < " 452 " < < " 454 " < < " 455 " < < " 462 " < < " 464 " < < " 465 " < < " 466 " < < " 503 " < <
" 506 " < < " 516 " < < " 523 " < < " 526 " < < " 532 " < < " 546 " < < " 565 " < < " 606 " < < " 612 " < < " 624 " < < " 627 " < < " 631 " < < " 632 " < < " 654 " < < " 662 " < < " 664 " < < " 703 " < < " 712 " < < " 723 " < < " 731 " < <
" 732 " < < " 734 " < < " 743 " < < " 754 " ;
dsql < < " OFF " < < " DSQL " < < " CSQL " ;
dtcsp < < " BOTH N " < < " N/R " < < " R/N " < < " BOTH R " ;
2023-05-01 20:56:52 +00:00
ui - > table - > setHorizontalHeaderLabels ( headers ) ;
2023-05-02 20:18:41 +00:00
2023-05-03 12:38:06 +00:00
ui - > group - > hide ( ) ;
ui - > vfoMode - > hide ( ) ;
ui - > memoryMode - > hide ( ) ;
2023-05-06 11:36:05 +00:00
ui - > loadingMemories - > setVisible ( false ) ;
ui - > loadingMemories - > setStyleSheet ( " QLabel {color: #ff0000} " ) ;
2023-05-02 20:18:41 +00:00
ui - > group - > blockSignals ( true ) ;
2023-09-22 18:06:09 +00:00
ui - > group - > addItem ( " Memory Group " , - 1 ) ;
2024-03-25 12:42:08 +00:00
for ( int i = rigCaps - > memStart ; i < = rigCaps - > memGroups ; i + + ) {
2024-04-28 19:06:32 +00:00
if ( i = = rigCaps - > memStart ) {
// Disable title if any groups to stop it being selected.
auto * model = qobject_cast < QStandardItemModel * > ( ui - > group - > model ( ) ) ;
model - > item ( 0 ) - > setEnabled ( false ) ;
}
2023-05-04 20:55:40 +00:00
ui - > group - > addItem ( QString ( " Group %0 " ) . arg ( i , 2 , 10 , QChar ( ' 0 ' ) ) , i ) ;
2023-05-01 20:56:52 +00:00
}
2023-05-09 16:03:03 +00:00
2024-03-25 12:42:08 +00:00
if ( rigCaps - > satMemories & & rigCaps - > commands . contains ( funcSatelliteMode ) ) {
2023-05-09 16:03:03 +00:00
ui - > group - > addItem ( " Satellite " , MEMORY_SATGROUP ) ;
2023-05-03 18:08:20 +00:00
}
2023-05-09 16:03:03 +00:00
2023-05-02 20:18:41 +00:00
ui - > group - > blockSignals ( false ) ;
2023-05-01 20:56:52 +00:00
2023-05-09 11:11:38 +00:00
for ( int i = 0 ; i < 100 ; i + + )
{
dvsql . append ( QString : : number ( i ) . rightJustified ( 2 , ' 0 ' ) ) ;
}
2023-05-06 11:36:05 +00:00
2024-03-25 12:42:08 +00:00
if ( rigCaps - > commands . contains ( funcVFOEqualAB ) ) {
2023-05-09 16:03:03 +00:00
vfos < < " VFOA " < < " VFOB " ;
2024-03-25 12:42:08 +00:00
} else if ( rigCaps - > commands . contains ( funcVFOEqualMS ) ) {
2023-05-09 16:03:03 +00:00
vfos < < " MAIN " < < " SUB " ;
2023-05-01 20:56:52 +00:00
}
2023-05-02 20:18:41 +00:00
2024-03-25 12:42:08 +00:00
for ( auto & mode : rigCaps - > modes ) {
2023-05-01 20:56:52 +00:00
modes . append ( mode . name ) ;
}
connect ( ui - > table , SIGNAL ( rowAdded ( int ) ) , this , SLOT ( rowAdded ( int ) ) ) ;
2023-05-02 20:18:41 +00:00
connect ( ui - > table , SIGNAL ( rowDeleted ( quint32 ) ) , this , SLOT ( rowDeleted ( quint32 ) ) ) ;
2023-05-04 20:55:40 +00:00
connect ( & timeoutTimer , SIGNAL ( timeout ( ) ) , this , SLOT ( timeout ( ) ) ) ;
2023-05-02 20:18:41 +00:00
2023-05-08 12:26:45 +00:00
ui - > table - > sortByColumn ( columnRecall , Qt : : AscendingOrder ) ;
2023-05-01 20:56:52 +00:00
2023-12-18 11:22:16 +00:00
2023-05-01 20:56:52 +00:00
}
2023-05-04 20:55:40 +00:00
2023-05-01 20:56:52 +00:00
void memories : : populate ( )
{
2023-12-18 11:22:16 +00:00
if ( ui - > group - > count ( ) > 1 )
{
qInfo ( ) < < " Memory group items: " < < ui - > group - > count ( ) ;
ui - > group - > setCurrentIndex ( 1 ) ;
}
else
{
ui - > group - > setCurrentIndex ( 0 ) ;
}
2023-05-01 20:56:52 +00:00
}
memories : : ~ memories ( )
{
qInfo ( ) < < " Deleting memories table " ;
ui - > table - > clear ( ) ;
delete ui ;
}
void memories : : rowAdded ( int row )
{
// Find the next available memory number:
2023-05-04 20:55:40 +00:00
2024-03-25 12:42:08 +00:00
quint32 num = rigCaps - > memStart ;
2023-05-04 20:55:40 +00:00
2023-05-06 11:36:05 +00:00
/* This feels unnecessarily complicated, but here we are:
2023-05-04 20:55:40 +00:00
* Set the memory number to 1
* create a vector of all current memory numbers ( ignoring any that are NULL )
* If empty use 1 as the memory number
* if not , sort it into numerical order
2023-05-06 11:36:05 +00:00
* check if there is a gap using adjacent_find iterator ( use that if there is )
2023-05-04 20:55:40 +00:00
* If not , go back to previous , check we haven ' t exceeded the total allowed and if not add 1 to previous
* If no empty memories available , log a warning and quit
*/
2023-05-08 12:36:59 +00:00
std : : vector < quint16 > rows ;
2023-05-01 20:56:52 +00:00
ui - > table - > blockSignals ( true ) ;
for ( int i = 0 ; i < ui - > table - > rowCount ( ) ; i + + )
{
2023-05-04 20:55:40 +00:00
if ( ui - > table - > item ( i , columnNum ) ! = NULL )
{
2023-05-08 12:36:59 +00:00
rows . push_back ( ui - > table - > item ( i , columnNum ) - > text ( ) . toUInt ( ) ) ;
2023-05-04 20:55:40 +00:00
}
}
if ( rows . size ( ) ! = 0 )
{
std : : sort ( rows . begin ( ) , rows . end ( ) ) ;
auto i = std : : adjacent_find ( rows . begin ( ) , rows . end ( ) , [ ] ( int l , int r ) { return l + 1 < r ; } ) ;
if ( i = = rows . end ( ) )
2023-05-01 20:56:52 +00:00
{
2023-05-04 20:55:40 +00:00
// No gaps found so work on highest value found
2024-03-25 12:42:08 +00:00
if ( ( ui - > group - > currentData ( ) . toInt ( ) ! = 200 & & rows . back ( ) < groupMemories - 1 ) | | ( ui - > group - > currentData ( ) . toInt ( ) = = MEMORY_SATGROUP & & rows . back ( ) < rigCaps - > satMemories - 1 ) )
2023-05-08 12:26:45 +00:00
{
num = rows . back ( ) + 1 ;
}
2024-03-25 12:42:08 +00:00
else if ( rows . front ( ) = = rigCaps - > memStart )
2023-05-04 20:55:40 +00:00
{
qWarning ( ) < < " Sorry no free memory slots found, please delete one first " ;
ui - > table - > removeRow ( row ) ;
}
} else {
2023-05-08 12:26:45 +00:00
num = 1 + * i ;
2023-05-04 20:55:40 +00:00
}
2023-05-01 20:56:52 +00:00
}
2023-05-04 20:55:40 +00:00
QPushButton * recall = new QPushButton ( " Recall " ) ;
ui - > table - > setCellWidget ( row , columnRecall , recall ) ;
connect ( recall , & QPushButton : : clicked , this ,
2024-03-25 12:42:08 +00:00
[ = ] ( ) { qInfo ( ) < < " Recalling " < < num ;
queue - > add ( priorityImmediate , queueItem ( funcMemoryMode , QVariant : : fromValue < uint > ( ( quint32 ( ( ui - > group - > currentData ( ) . toUInt ( ) < < 16 ) | num ) ) ) ) ) ;
} ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnNum ) , QString : : number ( num ) . rightJustified ( 3 , ' 0 ' ) ) ;
// Set default values (where possible) for all other values:
2023-05-06 11:36:05 +00:00
if ( ui - > table - > item ( row , columnSplit ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnSplit ) , split [ 0 ] ) ;
2023-05-04 20:55:40 +00:00
if ( ui - > table - > item ( row , columnScan ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnScan ) , scan [ 0 ] ) ;
if ( ui - > table - > item ( row , columnData ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnData ) , dataModes [ 0 ] ) ;
2023-05-06 11:36:05 +00:00
if ( ui - > table - > item ( row , columnFilter ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnFilter ) , filters [ 0 ] ) ;
2023-05-04 20:55:40 +00:00
if ( ui - > table - > item ( row , columnDuplex ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDuplex ) , duplexModes [ 0 ] ) ;
if ( ui - > table - > item ( row , columnToneMode ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnToneMode ) , toneModes [ 0 ] ) ;
if ( ui - > table - > item ( row , columnDSQL ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDSQL ) , dsql [ 0 ] ) ;
if ( ui - > table - > item ( row , columnTone ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnTone ) , tones [ 0 ] ) ;
if ( ui - > table - > item ( row , columnTSQL ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnTSQL ) , tones [ 0 ] ) ;
if ( ui - > table - > item ( row , columnDTCSPolarity ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDTCSPolarity ) , dtcsp [ 0 ] ) ;
if ( ui - > table - > item ( row , columnDTCS ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDTCS ) , dtcs [ 0 ] ) ;
if ( ui - > table - > item ( row , columnDVSquelch ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDVSquelch ) , " 00 " ) ;
2023-05-06 11:36:05 +00:00
if ( ui - > table - > item ( row , columnOffset ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnOffset ) , " 0.000 " ) ;
if ( ui - > table - > item ( row , columnUR ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnUR ) , " CQCQCQ " ) ;
2023-05-04 20:55:40 +00:00
if ( ui - > table - > item ( row , columnR1 ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnR1 ) , " " ) ;
if ( ui - > table - > item ( row , columnR2 ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnR2 ) , " " ) ;
if ( ui - > table - > item ( row , columnDataB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDataB ) , dataModes [ 0 ] ) ;
2023-05-06 11:36:05 +00:00
if ( ui - > table - > item ( row , columnFilterB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnFilterB ) , filters [ 0 ] ) ;
2023-05-04 20:55:40 +00:00
if ( ui - > table - > item ( row , columnToneModeB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnToneModeB ) , toneModes [ 0 ] ) ;
2023-05-06 11:36:05 +00:00
if ( ui - > table - > item ( row , columnDSQLB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDSQLB ) , dsql [ 0 ] ) ;
2023-05-04 20:55:40 +00:00
if ( ui - > table - > item ( row , columnToneB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnToneB ) , tones [ 0 ] ) ;
if ( ui - > table - > item ( row , columnTSQLB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnTSQLB ) , tones [ 0 ] ) ;
if ( ui - > table - > item ( row , columnDTCSPolarityB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDTCSPolarityB ) , dtcsp [ 0 ] ) ;
if ( ui - > table - > item ( row , columnDTCSB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDTCSB ) , dtcs [ 0 ] ) ;
if ( ui - > table - > item ( row , columnDVSquelchB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDVSquelchB ) , " 00 " ) ;
2023-05-06 11:36:05 +00:00
if ( ui - > table - > item ( row , columnOffsetB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnOffsetB ) , " 0.000 " ) ;
if ( ui - > table - > item ( row , columnDuplexB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDuplexB ) , duplexModes [ 0 ] ) ;
if ( ui - > table - > item ( row , columnURB ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnURB ) , " CQCQCQ " ) ;
2023-05-04 20:55:40 +00:00
if ( ui - > table - > item ( row , columnR1B ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnR1B ) , " " ) ;
if ( ui - > table - > item ( row , columnR2B ) = = NULL ) ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnR2B ) , " " ) ;
ui - > table - > item ( row , columnNum ) - > setFlags ( ui - > table - > item ( row , columnNum ) - > flags ( ) | Qt : : ItemIsEditable ) ;
2023-05-01 20:56:52 +00:00
ui - > table - > blockSignals ( false ) ;
2023-05-06 11:36:05 +00:00
on_table_cellChanged ( row , columnNum ) ; // Force an attempt to store this row.
2023-05-01 20:56:52 +00:00
}
2023-05-02 20:18:41 +00:00
void memories : : rowDeleted ( quint32 mem )
2023-05-01 20:56:52 +00:00
{
2024-03-25 12:42:08 +00:00
if ( mem > = rigCaps - > memStart & & mem < = rigCaps - > memories ) {
2023-05-01 20:56:52 +00:00
qInfo ( ) < < " Mem Deleted " < < mem ;
2023-05-09 16:03:03 +00:00
memoryType currentMemory ;
if ( ui - > group - > currentData ( ) . toInt ( ) = = MEMORY_SATGROUP )
{
currentMemory . sat = true ;
}
currentMemory . group = ui - > group - > currentData ( ) . toInt ( ) ;
currentMemory . channel = mem ;
currentMemory . del = true ;
2024-03-25 12:42:08 +00:00
queue - > add ( priorityImmediate , queueItem ( ( currentMemory . sat ? funcSatelliteMemory : funcMemoryContents ) , QVariant : : fromValue < memoryType > ( currentMemory ) ) ) ;
2023-05-01 20:56:52 +00:00
}
}
void memories : : on_table_cellChanged ( int row , int col )
{
2023-05-03 18:08:20 +00:00
// If the import is updating a hidden column, ignore it.
if ( ui - > table - > isColumnHidden ( col ) )
return ;
2023-05-01 20:56:52 +00:00
2023-05-09 16:03:03 +00:00
memoryType currentMemory ;
currentMemory . group = ui - > group - > currentData ( ) . toInt ( ) ;
currentMemory . channel = ( ui - > table - > item ( row , columnNum ) = = NULL ) ? 0 : ui - > table - > item ( row , columnNum ) - > text ( ) . toInt ( ) ;
2023-05-01 20:56:52 +00:00
2023-05-09 16:03:03 +00:00
if ( currentMemory . group = = MEMORY_SATGROUP ) {
currentMemory . sat = true ;
2023-05-04 20:55:40 +00:00
}
2023-05-06 11:36:05 +00:00
ui - > table - > blockSignals ( true ) ;
switch ( col )
2023-05-01 20:56:52 +00:00
{
2023-05-08 12:26:45 +00:00
case columnVFO :
if ( ui - > table - > item ( row , columnVFOB ) = = NULL )
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnVFOB ) , ui - > table - > item ( row , columnVFO ) - > text ( ) ) ;
break ;
case columnVFOB :
if ( ui - > table - > item ( row , columnVFO ) = = NULL )
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnVFO ) , ui - > table - > item ( row , columnVFOB ) - > text ( ) ) ;
break ;
2023-05-06 11:36:05 +00:00
case columnFrequency :
if ( ui - > table - > item ( row , columnFrequencyB ) = = NULL )
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnFrequencyB ) , ui - > table - > item ( row , columnFrequency ) - > text ( ) ) ;
break ;
case columnFrequencyB :
if ( ui - > table - > item ( row , columnFrequency ) = = NULL )
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnFrequency ) , ui - > table - > item ( row , columnFrequencyB ) - > text ( ) ) ;
break ;
case columnMode :
if ( ui - > table - > item ( row , columnModeB ) = = NULL )
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnModeB ) , ui - > table - > item ( row , columnMode ) - > text ( ) ) ;
break ;
case columnModeB :
if ( ui - > table - > item ( row , columnMode ) = = NULL )
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnMode ) , ui - > table - > item ( row , columnModeB ) - > text ( ) ) ;
break ;
case columnDuplex :
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDuplexB ) , ui - > table - > item ( row , columnDuplex ) - > text ( ) ) ;
break ;
case columnDuplexB :
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnDuplex ) , ui - > table - > item ( row , columnDuplexB ) - > text ( ) ) ;
break ;
2023-05-09 11:11:38 +00:00
case columnOffset :
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnOffsetB ) , ui - > table - > item ( row , columnOffset ) - > text ( ) ) ;
break ;
case columnOffsetB :
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnOffset ) , ui - > table - > item ( row , columnOffsetB ) - > text ( ) ) ;
break ;
2023-05-06 11:36:05 +00:00
default :
break ;
}
ui - > table - > blockSignals ( false ) ;
2023-05-09 11:11:38 +00:00
// The table shouldn't be updated below, simply queried for data.
2023-05-06 11:36:05 +00:00
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnSplit ) & & ui - > table - > item ( row , columnSplit ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . split = split . indexOf ( ui - > table - > item ( row , columnSplit ) - > text ( ) . toUpper ( ) ) ;
2023-05-01 20:56:52 +00:00
}
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnScan ) & & ui - > table - > item ( row , columnScan ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . scan = scan . indexOf ( ui - > table - > item ( row , columnScan ) - > text ( ) . toUpper ( ) ) ;
2023-05-01 20:56:52 +00:00
}
2023-05-08 12:26:45 +00:00
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnVFO ) & & ui - > table - > item ( row , columnVFO ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . vfo = vfos . indexOf ( ui - > table - > item ( row , columnVFO ) - > text ( ) . toUpper ( ) ) ;
2023-05-09 11:11:38 +00:00
}
if ( ! ui - > table - > isColumnHidden ( columnVFOB ) & & ui - > table - > item ( row , columnVFOB ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . vfoB = vfos . indexOf ( ui - > table - > item ( row , columnVFOB ) - > text ( ) . toUpper ( ) ) ;
2023-05-08 12:26:45 +00:00
}
2023-05-09 16:03:03 +00:00
currentMemory . frequency . Hz = ( ui - > table - > item ( row , columnFrequency ) = = NULL ) ? 0 : quint64 ( ui - > table - > item ( row , columnFrequency ) - > text ( ) . toDouble ( ) * 1000000.0 ) ;
currentMemory . frequencyB . Hz = ( ui - > table - > item ( row , columnFrequencyB ) = = NULL ) ? 0 : quint64 ( ui - > table - > item ( row , columnFrequencyB ) - > text ( ) . toDouble ( ) * 1000000.0 ) ;
2023-05-01 20:56:52 +00:00
2024-03-25 12:42:08 +00:00
for ( auto & m : rigCaps - > modes ) {
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnMode ) & & ui - > table - > item ( row , columnMode ) ! = NULL & & ui - > table - > item ( row , columnMode ) - > text ( ) = = m . name ) {
2023-05-09 16:03:03 +00:00
currentMemory . mode = m . reg ;
2023-05-04 20:55:40 +00:00
}
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnModeB ) & & ui - > table - > item ( row , columnModeB ) ! = NULL & & ui - > table - > item ( row , columnModeB ) - > text ( ) = = m . name ) {
2023-05-09 16:03:03 +00:00
currentMemory . modeB = m . reg ;
2023-05-01 20:56:52 +00:00
}
}
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnData ) & & ui - > table - > item ( row , columnData ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . datamode = dataModes . indexOf ( ui - > table - > item ( row , columnData ) - > text ( ) . toUpper ( ) ) ;
2023-05-01 20:56:52 +00:00
}
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnDataB ) & & ui - > table - > item ( row , columnDataB ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . datamodeB = dataModes . indexOf ( ui - > table - > item ( row , columnDataB ) - > text ( ) . toUpper ( ) ) ;
2023-05-02 20:18:41 +00:00
}
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnFilter ) & & ui - > table - > item ( row , columnFilter ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . filter = filters . indexOf ( ui - > table - > item ( row , columnFilter ) - > text ( ) . toUpper ( ) ) + 1 ;
2023-05-09 11:11:38 +00:00
}
2023-05-06 11:36:05 +00:00
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnFilterB ) & & ui - > table - > item ( row , columnFilterB ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . filterB = filters . indexOf ( ui - > table - > item ( row , columnFilterB ) - > text ( ) . toUpper ( ) ) + 1 ;
2023-05-01 20:56:52 +00:00
}
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnDuplex ) & & ui - > table - > item ( row , columnDuplex ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . duplex = duplexModes . indexOf ( ui - > table - > item ( row , columnDuplex ) - > text ( ) . toUpper ( ) ) ;
2023-05-01 20:56:52 +00:00
}
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnDuplexB ) & & ui - > table - > item ( row , columnDuplexB ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . duplexB = duplexModes . indexOf ( ui - > table - > item ( row , columnDuplexB ) - > text ( ) . toUpper ( ) ) ;
2023-05-09 11:11:38 +00:00
}
if ( ! ui - > table - > isColumnHidden ( columnToneMode ) & & ui - > table - > item ( row , columnToneMode ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . tonemode = toneModes . indexOf ( ui - > table - > item ( row , columnToneMode ) - > text ( ) . toUpper ( ) ) ;
2023-05-09 11:11:38 +00:00
}
if ( ! ui - > table - > isColumnHidden ( columnToneModeB ) & & ui - > table - > item ( row , columnToneModeB ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . tonemodeB = toneModes . indexOf ( ui - > table - > item ( row , columnToneModeB ) - > text ( ) . toUpper ( ) ) ;
2023-05-09 11:11:38 +00:00
}
if ( ! ui - > table - > isColumnHidden ( columnDSQL ) & & ui - > table - > item ( row , columnDSQL ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . dsql = dsql . indexOf ( ui - > table - > item ( row , columnDSQL ) - > text ( ) . toUpper ( ) ) ;
2023-05-09 11:11:38 +00:00
}
if ( ! ui - > table - > isColumnHidden ( columnDSQLB ) & & ui - > table - > item ( row , columnDSQLB ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . dsqlB = dsql . indexOf ( ui - > table - > item ( row , columnDSQLB ) - > text ( ) . toUpper ( ) ) ;
2023-05-02 20:18:41 +00:00
}
2023-05-09 16:03:03 +00:00
currentMemory . tone = ( ui - > table - > item ( row , columnTone ) = = NULL ) ? 670 : int ( ui - > table - > item ( row , columnTone ) - > text ( ) . toFloat ( ) * 10.0 ) ;
currentMemory . toneB = ( ui - > table - > item ( row , columnToneB ) = = NULL ) ? 670 : int ( ui - > table - > item ( row , columnToneB ) - > text ( ) . toFloat ( ) * 10.0 ) ;
2023-05-01 20:56:52 +00:00
2023-05-09 16:03:03 +00:00
currentMemory . tsql = ( ui - > table - > item ( row , columnTSQL ) = = NULL ) ? 670 : int ( ui - > table - > item ( row , columnTSQL ) - > text ( ) . toFloat ( ) * 10.0 ) ;
currentMemory . tsqlB = ( ui - > table - > item ( row , columnTSQLB ) = = NULL ) ? 670 : int ( ui - > table - > item ( row , columnTSQLB ) - > text ( ) . toFloat ( ) * 10.0 ) ;
2023-05-01 20:56:52 +00:00
2023-05-09 16:03:03 +00:00
currentMemory . dtcs = ( ui - > table - > item ( row , columnDTCS ) = = NULL ) ? 23 : int ( ui - > table - > item ( row , columnDTCS ) - > text ( ) . toUInt ( ) ) ;
currentMemory . dtcsB = ( ui - > table - > item ( row , columnDTCSB ) = = NULL ) ? 23 : int ( ui - > table - > item ( row , columnDTCSB ) - > text ( ) . toUInt ( ) ) ;
2023-05-02 20:18:41 +00:00
2023-05-09 11:11:38 +00:00
if ( ! ui - > table - > isColumnHidden ( columnDTCSPolarity ) & & ui - > table - > item ( row , columnDTCSPolarity ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . dtcsp = dtcsp . indexOf ( ui - > table - > item ( row , columnDTCSPolarity ) - > text ( ) . toUpper ( ) ) ;
2023-05-09 11:11:38 +00:00
}
if ( ! ui - > table - > isColumnHidden ( columnDTCSPolarityB ) & & ui - > table - > item ( row , columnDTCSPolarityB ) ! = NULL ) {
2023-05-09 16:03:03 +00:00
currentMemory . dtcspB = dtcsp . indexOf ( ui - > table - > item ( row , columnDTCSPolarityB ) - > text ( ) . toUpper ( ) ) ;
2023-05-02 20:18:41 +00:00
}
2023-05-09 16:03:03 +00:00
currentMemory . dvsql = ( ui - > table - > item ( row , columnDVSquelch ) = = NULL ) ? 0 : int ( ui - > table - > item ( row , columnDVSquelch ) - > text ( ) . toUInt ( ) ) ;
currentMemory . dvsqlB = ( ui - > table - > item ( row , columnDVSquelchB ) = = NULL ) ? 0 : int ( ui - > table - > item ( row , columnDVSquelchB ) - > text ( ) . toUInt ( ) ) ;
2023-05-04 20:55:40 +00:00
2023-05-09 16:03:03 +00:00
currentMemory . duplexOffset . MHzDouble = ( ui - > table - > item ( row , columnOffset ) = = NULL ) ? 0.0 : ui - > table - > item ( row , columnOffset ) - > text ( ) . toDouble ( ) ;
currentMemory . duplexOffset . Hz = currentMemory . duplexOffset . MHzDouble * 1000000.0 ;
currentMemory . duplexOffset . VFO = selVFO_t : : activeVFO ;
2023-05-02 20:18:41 +00:00
2023-05-09 16:03:03 +00:00
currentMemory . duplexOffsetB . MHzDouble = ( ui - > table - > item ( row , columnOffsetB ) = = NULL ) ? 0.0 : ui - > table - > item ( row , columnOffsetB ) - > text ( ) . toDouble ( ) ;
currentMemory . duplexOffsetB . Hz = currentMemory . duplexOffsetB . MHzDouble * 1000000.0 ;
currentMemory . duplexOffsetB . VFO = selVFO_t : : activeVFO ;
2023-05-06 11:36:05 +00:00
2023-05-09 16:03:03 +00:00
memcpy ( currentMemory . UR , ( ( ui - > table - > item ( row , columnUR ) = = NULL ) ? " " : ui - > table - > item ( row , columnUR ) - > text ( ) ) . toStdString ( ) . c_str ( ) , 8 ) ;
memcpy ( currentMemory . URB , ( ( ui - > table - > item ( row , columnURB ) = = NULL ) ? " " : ui - > table - > item ( row , columnURB ) - > text ( ) ) . toStdString ( ) . c_str ( ) , 8 ) ;
2023-05-04 20:55:40 +00:00
2023-05-09 16:03:03 +00:00
memcpy ( currentMemory . R1 , ( ( ui - > table - > item ( row , columnR1 ) = = NULL ) ? " " : ui - > table - > item ( row , columnR1 ) - > text ( ) ) . toStdString ( ) . c_str ( ) , 8 ) ;
memcpy ( currentMemory . R1B , ( ( ui - > table - > item ( row , columnR1B ) = = NULL ) ? " " : ui - > table - > item ( row , columnR1B ) - > text ( ) ) . toStdString ( ) . c_str ( ) , 8 ) ;
2023-05-02 20:18:41 +00:00
2023-05-09 16:03:03 +00:00
memcpy ( currentMemory . R2 , ( ( ui - > table - > item ( row , columnR2 ) = = NULL ) ? " " : ui - > table - > item ( row , columnR2 ) - > text ( ) ) . toStdString ( ) . c_str ( ) , 8 ) ;
memcpy ( currentMemory . R2B , ( ( ui - > table - > item ( row , columnR2B ) = = NULL ) ? " " : ui - > table - > item ( row , columnR2B ) - > text ( ) ) . toStdString ( ) . c_str ( ) , 8 ) ;
2023-05-04 20:55:40 +00:00
2023-05-09 16:03:03 +00:00
memcpy ( currentMemory . name , ( ( ui - > table - > item ( row , columnName ) = = NULL ) ? " " : ui - > table - > item ( row , columnName ) - > text ( ) ) . toStdString ( ) . c_str ( ) , 16 ) ;
2023-05-02 20:18:41 +00:00
2023-05-01 20:56:52 +00:00
// Only write the memory if ALL values are non-null
bool write = true ;
for ( int f = 1 ; f < ui - > table - > columnCount ( ) ; f + + )
{
2023-05-03 18:08:20 +00:00
if ( ! ui - > table - > isColumnHidden ( f ) & & ui - > table - > item ( row , f ) = = NULL )
2023-05-01 20:56:52 +00:00
write = false ;
}
if ( write ) {
2024-03-25 12:42:08 +00:00
queue - > add ( priorityImmediate , queueItem ( ( currentMemory . sat ? funcSatelliteMemory : funcMemoryContents ) , QVariant : : fromValue < memoryType > ( currentMemory ) ) ) ;
2023-05-09 16:03:03 +00:00
qInfo ( ) < < " Sending memory, group: " < < currentMemory . group < < " channel " < < currentMemory . channel ;
2023-05-01 20:56:52 +00:00
// Set number to not be editable once written. Not sure why but this crashes?
//ui->table->item(row,columnNum)->setFlags(ui->table->item(row,columnNum)->flags() & (~Qt::ItemIsEditable));
}
}
2023-05-09 11:11:38 +00:00
2023-05-02 20:18:41 +00:00
void memories : : on_group_currentIndexChanged ( int index )
{
2023-05-06 11:36:05 +00:00
Q_UNUSED ( index )
2023-05-04 20:55:40 +00:00
timeoutTimer . start ( MEMORY_TIMEOUT ) ;
2023-05-09 11:11:38 +00:00
visibleColumns = 1 ;
2023-05-08 12:26:45 +00:00
// Special case for group 100 on the IC705!
2023-05-09 16:03:03 +00:00
if ( ui - > group - > currentData ( ) . toInt ( ) = = MEMORY_SATGROUP )
2024-03-25 12:42:08 +00:00
groupMemories = rigCaps - > satMemories ;
2023-05-09 16:03:03 +00:00
else if ( ui - > group - > currentData ( ) . toInt ( ) = = MEMORY_SHORTGROUP )
2023-05-08 12:26:45 +00:00
groupMemories = 3 ;
else
2024-03-25 12:42:08 +00:00
groupMemories = rigCaps - > memories ;
2023-05-08 12:26:45 +00:00
2023-05-06 11:36:05 +00:00
ui - > loadingMemories - > setVisible ( true ) ;
2023-05-08 12:26:45 +00:00
ui - > table - > setEditTriggers ( QAbstractItemView : : NoEditTriggers ) ;
2023-05-02 20:18:41 +00:00
ui - > group - > setEnabled ( false ) ;
ui - > table - > blockSignals ( true ) ;
ui - > table - > setRowCount ( 0 ) ;
ui - > table - > blockSignals ( false ) ;
2023-05-03 18:08:20 +00:00
// Hide all columns except recall
for ( int i = 1 ; i < ui - > table - > columnCount ( ) ; i + + )
{
ui - > table - > hideColumn ( i ) ;
}
QVector < memParserFormat > parser ;
2023-05-09 16:03:03 +00:00
if ( ui - > group - > currentData ( ) . toInt ( ) = = MEMORY_SATGROUP ) {
2024-04-28 19:06:32 +00:00
queue - > add ( priorityImmediate , queueItem ( funcSatelliteMode , QVariant : : fromValue < bool > ( ui - > group - > currentData ( ) . toInt ( ) = = MEMORY_SATGROUP ) ) ) ;
2024-03-30 20:40:27 +00:00
queue - > del ( funcMainFreq , false ) ;
queue - > del ( funcMainMode , false ) ;
queue - > del ( funcSubFreq , true ) ;
queue - > del ( funcSubMode , true ) ;
2024-03-25 12:42:08 +00:00
parser = rigCaps - > satParser ;
2023-05-03 18:19:58 +00:00
} else {
2024-04-28 19:06:32 +00:00
// If the rig has memory groups, select it now.
queue - > add ( priorityImmediate , queueItem ( funcMemoryGroup , QVariant : : fromValue < uchar > ( ui - > group - > currentData ( ) . toInt ( ) ) ) ) ;
2024-03-30 20:40:27 +00:00
queue - > addUnique ( priorityMedium , funcMainFreq , true , false ) ;
queue - > addUnique ( priorityMedium , funcMainMode , true , false ) ;
queue - > addUnique ( priorityMedium , funcSubFreq , true , true ) ;
queue - > addUnique ( priorityMedium , funcSubMode , true , true ) ;
2024-03-25 12:42:08 +00:00
parser = rigCaps - > memParser ;
2023-05-03 18:08:20 +00:00
}
2023-12-17 19:41:22 +00:00
for ( auto & parse : parser ) {
2023-05-03 18:08:20 +00:00
switch ( parse . spec )
{
case ' a ' :
ui - > group - > show ( ) ;
ui - > vfoMode - > show ( ) ;
ui - > memoryMode - > show ( ) ;
break ;
case ' b ' :
2023-05-06 11:36:05 +00:00
if ( numEditor ! = Q_NULLPTR )
delete numEditor ;
2023-05-09 11:11:38 +00:00
numEditor = new tableEditor ( " 999 " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnNum , numEditor ) ;
2023-05-03 18:08:20 +00:00
ui - > table - > showColumn ( columnNum ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
case ' c ' :
2023-05-06 11:36:05 +00:00
if ( scanList ! = Q_NULLPTR )
delete scanList ;
scanList = new tableCombobox ( createModel ( scanModel , scan ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnScan , scanList ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnScan ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
case ' d ' :
2023-05-08 12:26:45 +00:00
if ( splitList ! = Q_NULLPTR )
delete splitList ;
splitList = new tableCombobox ( createModel ( splitModel , split ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnSplit , splitList ) ;
if ( scanList ! = Q_NULLPTR )
delete scanList ;
scanList = new tableCombobox ( createModel ( scanModel , scan ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnScan , scanList ) ;
ui - > table - > showColumn ( columnSplit ) ;
ui - > table - > showColumn ( columnScan ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
visibleColumns + + ;
2023-05-08 12:26:45 +00:00
break ;
case ' e ' :
if ( vfoList ! = Q_NULLPTR )
delete vfoList ;
vfoList = new tableCombobox ( createModel ( vfoModel , vfos ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnVFO , vfoList ) ;
ui - > table - > showColumn ( columnVFO ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-08 12:26:45 +00:00
break ;
case ' E ' :
if ( vfoListB ! = Q_NULLPTR )
delete vfoListB ;
vfoListB = new tableCombobox ( createModel ( vfoModelB , vfos ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnVFOB , vfoListB ) ;
ui - > table - > showColumn ( columnVFOB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-08 12:26:45 +00:00
break ;
case ' f ' :
2023-05-06 11:36:05 +00:00
if ( freqEditor ! = Q_NULLPTR )
delete freqEditor ;
2023-05-09 11:11:38 +00:00
freqEditor = new tableEditor ( " 00000.0000000 " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnFrequency , freqEditor ) ;
2023-05-03 18:08:20 +00:00
ui - > table - > showColumn ( columnFrequency ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' F ' :
2023-05-06 11:36:05 +00:00
if ( freqEditorB ! = Q_NULLPTR )
delete freqEditorB ;
2023-05-09 11:11:38 +00:00
freqEditorB = new tableEditor ( " 00000.000000 " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnFrequencyB , freqEditorB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnFrequencyB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' g ' :
2023-05-06 11:36:05 +00:00
if ( modesList ! = Q_NULLPTR )
delete modesList ;
modesList = new tableCombobox ( createModel ( modesModel , modes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnMode , modesList ) ;
2023-05-03 18:08:20 +00:00
ui - > table - > showColumn ( columnMode ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' G ' :
2023-05-06 11:36:05 +00:00
if ( modesListB ! = Q_NULLPTR )
delete modesListB ;
modesListB = new tableCombobox ( createModel ( modesModelB , modes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnModeB , modesListB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnModeB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' h ' :
2023-05-06 11:36:05 +00:00
if ( filterList ! = Q_NULLPTR )
delete filterList ;
filterList = new tableCombobox ( createModel ( filterModel , filters ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnFilter , filterList ) ;
2023-05-03 18:08:20 +00:00
ui - > table - > showColumn ( columnFilter ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' H ' :
2023-05-06 11:36:05 +00:00
if ( filterListB ! = Q_NULLPTR )
delete filterListB ;
filterListB = new tableCombobox ( createModel ( filterModelB , filters ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnFilterB , filterListB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnFilterB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' i ' :
2023-05-06 11:36:05 +00:00
if ( dataList ! = Q_NULLPTR )
delete dataList ;
dataList = new tableCombobox ( createModel ( dataModel , dataModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnData , dataList ) ;
2023-05-03 18:08:20 +00:00
ui - > table - > showColumn ( columnData ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' I ' :
2023-05-06 11:36:05 +00:00
if ( dataListB ! = Q_NULLPTR )
delete dataListB ;
dataListB = new tableCombobox ( createModel ( dataModelB , dataModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDataB , dataListB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnDataB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' j ' :
if ( duplexList ! = Q_NULLPTR )
delete duplexList ;
2023-05-06 11:36:05 +00:00
duplexList = new tableCombobox ( createModel ( duplexModel , duplexModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDuplex , duplexList ) ;
if ( toneModesList ! = Q_NULLPTR )
delete toneModesList ;
toneModesList = new tableCombobox ( createModel ( toneModesModel , toneModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnToneMode , toneModesList ) ;
2023-05-03 18:08:20 +00:00
ui - > table - > showColumn ( columnDuplex ) ;
ui - > table - > showColumn ( columnToneMode ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
visibleColumns + + ;
2023-05-06 11:36:05 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' J ' :
2023-05-06 11:36:05 +00:00
if ( duplexListB ! = Q_NULLPTR )
delete duplexListB ;
duplexListB = new tableCombobox ( createModel ( duplexModelB , duplexModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDuplexB , duplexListB ) ;
if ( toneModesListB ! = Q_NULLPTR )
delete toneModesListB ;
toneModesListB = new tableCombobox ( createModel ( toneModesModelB , toneModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnToneModeB , toneModesListB ) ;
ui - > table - > showColumn ( columnDuplexB ) ;
ui - > table - > showColumn ( columnToneModeB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' k ' :
2023-05-06 11:36:05 +00:00
if ( dataList ! = Q_NULLPTR )
delete dataList ;
dataList = new tableCombobox ( createModel ( dataModel , dataModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnData , dataList ) ;
if ( toneModesList ! = Q_NULLPTR )
delete toneModesList ;
toneModesList = new tableCombobox ( createModel ( toneModesModel , toneModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnToneMode , toneModesList ) ;
2023-05-03 18:08:20 +00:00
ui - > table - > showColumn ( columnData ) ;
ui - > table - > showColumn ( columnToneMode ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
visibleColumns + + ;
2023-05-06 11:36:05 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' K ' :
2023-05-06 11:36:05 +00:00
if ( dataListB ! = Q_NULLPTR )
delete dataListB ;
dataListB = new tableCombobox ( createModel ( dataModelB , dataModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDataB , dataListB ) ;
if ( toneModesListB ! = Q_NULLPTR )
delete toneModesListB ;
toneModesListB = new tableCombobox ( createModel ( toneModesModelB , toneModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnToneModeB , toneModesListB ) ;
ui - > table - > showColumn ( columnDataB ) ;
ui - > table - > showColumn ( columnToneModeB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' l ' :
2023-05-06 11:36:05 +00:00
if ( toneModesList ! = Q_NULLPTR )
delete toneModesList ;
toneModesList = new tableCombobox ( createModel ( toneModesModel , toneModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnToneMode , toneModesList ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnToneMode ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' L ' :
2023-05-06 11:36:05 +00:00
if ( toneModesListB ! = Q_NULLPTR )
delete toneModesListB ;
toneModesListB = new tableCombobox ( createModel ( toneModesModelB , toneModes ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnToneModeB , toneModesListB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnToneModeB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' m ' :
2023-05-06 11:36:05 +00:00
if ( dsqlList ! = Q_NULLPTR )
delete dsqlList ;
dsqlList = new tableCombobox ( createModel ( dsqlModel , dsql ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDSQL , dsqlList ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnDSQL ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' M ' :
2023-05-06 11:36:05 +00:00
if ( dsqlListB ! = Q_NULLPTR )
delete dsqlListB ;
dsqlListB = new tableCombobox ( createModel ( dsqlModelB , dsql ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDSQLB , dsqlListB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnDSQLB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' n ' :
2023-05-06 11:36:05 +00:00
if ( tonesList ! = Q_NULLPTR )
delete tonesList ;
tonesList = new tableCombobox ( createModel ( tonesModel , tones ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnTone , tonesList ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnTone ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' N ' :
2023-05-06 11:36:05 +00:00
if ( tonesListB ! = Q_NULLPTR )
delete tonesListB ;
tonesListB = new tableCombobox ( createModel ( tonesModelB , tones ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnToneB , tonesListB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnToneB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' o ' :
2023-05-06 11:36:05 +00:00
if ( tsqlList ! = Q_NULLPTR )
delete tsqlList ;
tsqlList = new tableCombobox ( createModel ( tsqlModel , tones ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnTSQL , tsqlList ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnTSQL ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' O ' :
2023-05-06 11:36:05 +00:00
if ( tsqlListB ! = Q_NULLPTR )
delete tsqlListB ;
tsqlListB = new tableCombobox ( createModel ( tsqlModelB , tones ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnTSQLB , tsqlListB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnTSQLB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' p ' :
2023-05-06 11:36:05 +00:00
if ( dtcspList ! = Q_NULLPTR )
delete dtcspList ;
dtcspList = new tableCombobox ( createModel ( dtcspModel , dtcsp ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDTCSPolarity , dtcspList ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnDTCSPolarity ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' P ' :
2023-05-06 11:36:05 +00:00
if ( dtcspListB ! = Q_NULLPTR )
delete dtcspListB ;
dtcspListB = new tableCombobox ( createModel ( dtcspModelB , dtcsp ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDTCSPolarityB , dtcspListB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnDTCSPolarityB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' q ' :
2023-05-06 11:36:05 +00:00
if ( dtcsList ! = Q_NULLPTR )
delete dtcsList ;
dtcsList = new tableCombobox ( createModel ( dtcsModel , dtcs ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDTCS , dtcsList ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnDTCS ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' Q ' :
2023-05-06 11:36:05 +00:00
if ( dtcsListB ! = Q_NULLPTR )
delete dtcsListB ;
dtcsListB = new tableCombobox ( createModel ( dtcsModel , dtcs ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDTCSB , dtcsList ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnDTCSB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' r ' :
2023-05-09 11:11:38 +00:00
if ( dvsqlList ! = Q_NULLPTR )
delete dvsqlList ;
dvsqlList = new tableCombobox ( createModel ( dvsqlModel , dvsql ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDVSquelch , dvsqlList ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnDVSquelch ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-04 20:55:40 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' R ' :
2023-05-09 11:11:38 +00:00
if ( dvsqlListB ! = Q_NULLPTR )
delete dvsqlListB ;
dvsqlListB = new tableCombobox ( createModel ( dvsqlModelB , dvsql ) , false , ui - > table ) ;
ui - > table - > setItemDelegateForColumn ( columnDVSquelchB , dvsqlListB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnDVSquelchB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' s ' :
2023-05-06 11:36:05 +00:00
if ( offsetEditor ! = Q_NULLPTR )
delete offsetEditor ;
2023-05-09 11:11:38 +00:00
offsetEditor = new tableEditor ( " 00.000000 " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnOffset , offsetEditor ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnOffset ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-06 11:36:05 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' S ' :
2023-05-06 11:36:05 +00:00
if ( offsetEditorB ! = Q_NULLPTR )
delete offsetEditorB ;
2023-05-09 11:11:38 +00:00
offsetEditorB = new tableEditor ( " 00.000000 " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnOffsetB , offsetEditorB ) ;
ui - > table - > showColumn ( columnOffsetB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' t ' :
2023-05-06 11:36:05 +00:00
if ( urEditor ! = Q_NULLPTR )
delete urEditor ;
2023-05-09 11:11:38 +00:00
urEditor = new tableEditor ( " >xxxxxxxx;_ " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnUR , urEditor ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnUR ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' T ' :
2023-05-06 11:36:05 +00:00
if ( urEditorB ! = Q_NULLPTR )
delete urEditorB ;
2023-05-09 11:11:38 +00:00
urEditorB = new tableEditor ( " >xxxxxxxx;_ " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnURB , urEditorB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnURB ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' u ' :
2023-05-06 11:36:05 +00:00
if ( r1Editor ! = Q_NULLPTR )
delete r1Editor ;
2023-05-09 11:11:38 +00:00
r1Editor = new tableEditor ( " >xxxxxxxx;_ " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnR1 , r1Editor ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnR1 ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' U ' :
2023-05-06 11:36:05 +00:00
if ( r1EditorB ! = Q_NULLPTR )
delete r1EditorB ;
2023-05-09 11:11:38 +00:00
r1EditorB = new tableEditor ( " >xxxxxxxx;_ " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnR1B , r1EditorB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnR1B ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' v ' :
2023-05-06 11:36:05 +00:00
if ( r2Editor ! = Q_NULLPTR )
delete r2Editor ;
2023-05-09 11:11:38 +00:00
r2Editor = new tableEditor ( " >xxxxxxxx;_ " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnR2 , r2Editor ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnR2 ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' V ' :
2023-05-06 11:36:05 +00:00
if ( r2EditorB ! = Q_NULLPTR )
delete r2EditorB ;
2023-05-09 11:11:38 +00:00
r2EditorB = new tableEditor ( " >xxxxxxxx;_ " , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnR2B , r2EditorB ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > showColumn ( columnR2B ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
2023-05-08 12:26:45 +00:00
case ' z ' :
2023-05-06 11:36:05 +00:00
if ( nameEditor ! = Q_NULLPTR )
delete nameEditor ;
2023-05-09 11:11:38 +00:00
nameEditor = new tableEditor ( QString ( " %0;_ " ) . arg ( " " , parse . len , ' x ' ) , ui - > table ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > setItemDelegateForColumn ( columnName , nameEditor ) ;
2023-05-08 12:26:45 +00:00
ui - > table - > showColumn ( columnName ) ;
2023-05-09 11:11:38 +00:00
visibleColumns + + ;
2023-05-03 18:08:20 +00:00
break ;
default :
break ;
}
}
2023-05-09 11:11:38 +00:00
if ( visibleColumns > 15 ) {
2023-05-04 20:55:40 +00:00
ui - > table - > horizontalHeader ( ) - > setSectionResizeMode ( QHeaderView : : ResizeToContents ) ;
2023-05-06 11:36:05 +00:00
}
else
2023-05-02 20:18:41 +00:00
{
2023-05-04 20:55:40 +00:00
ui - > table - > horizontalHeader ( ) - > setSectionResizeMode ( QHeaderView : : Stretch ) ;
}
2023-05-09 16:03:03 +00:00
if ( ui - > group - > currentData ( ) . toInt ( ) = = MEMORY_SATGROUP ) {
2023-05-08 12:26:45 +00:00
2024-03-25 12:42:08 +00:00
lastMemoryRequested = rigCaps - > memStart ;
2023-05-09 16:03:03 +00:00
if ( slowLoad ) {
2024-03-25 12:42:08 +00:00
QTimer : : singleShot ( MEMORY_SLOWLOAD , this , [ this ] {
queue - > add ( priorityImmediate , queueItem ( funcSatelliteMemory , QVariant : : fromValue < ushort > ( lastMemoryRequested & 0xffff ) ) ) ;
} ) ;
2023-05-09 16:03:03 +00:00
} else {
2024-03-25 12:42:08 +00:00
queue - > add ( priorityImmediate , queueItem ( funcSatelliteMemory , QVariant : : fromValue < ushort > ( lastMemoryRequested & 0xffff ) ) ) ;
2023-05-09 16:03:03 +00:00
}
2023-05-04 20:55:40 +00:00
} else {
2024-03-25 12:42:08 +00:00
lastMemoryRequested = quint32 ( ( ui - > group - > currentData ( ) . toInt ( ) ) < < 16 ) | ( rigCaps - > memStart & 0xffff ) ;
2023-05-09 16:03:03 +00:00
if ( slowLoad ) {
2024-03-25 12:42:08 +00:00
QTimer : : singleShot ( MEMORY_SLOWLOAD , this , [ this ] {
queue - > add ( priorityImmediate , queueItem ( funcMemoryContents , QVariant : : fromValue < uint > ( lastMemoryRequested ) ) ) ;
} ) ;
2023-05-09 16:03:03 +00:00
} else {
// Is the current group attached to a particular band?
2024-03-25 12:42:08 +00:00
for ( auto & band : rigCaps - > bands )
2023-05-06 11:36:05 +00:00
{
2023-05-09 16:03:03 +00:00
if ( band . memGroup = = ui - > group - > currentData ( ) . toInt ( ) )
{
2024-03-25 12:42:08 +00:00
queue - > add ( priorityImmediate , queueItem ( funcBandStackReg , QVariant : : fromValue < uchar > ( band . band ) ) ) ;
2023-05-09 16:03:03 +00:00
}
2023-05-06 11:36:05 +00:00
}
2024-03-25 12:42:08 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMemoryContents , QVariant : : fromValue < uint > ( lastMemoryRequested ) ) ) ;
2023-05-06 11:36:05 +00:00
}
2023-05-08 13:48:17 +00:00
}
2024-04-28 19:43:50 +00:00
ui - > loadingMemories - > setText ( QString ( " Loading Memory %0/%1 (this may take a while!) " ) . arg ( lastMemoryRequested & 0xffff , 3 , 10 , QLatin1Char ( ' 0 ' ) ) . arg ( rigCaps - > memories , 3 , 10 , QLatin1Char ( ' 0 ' ) ) ) ;
2023-05-02 20:18:41 +00:00
}
void memories : : on_vfoMode_clicked ( )
{
2024-03-30 20:40:27 +00:00
queue - > addUnique ( priorityMedium , funcMainFreq , true , false ) ;
queue - > addUnique ( priorityMedium , funcMainMode , true , false ) ;
queue - > addUnique ( priorityMedium , funcSubFreq , true , true ) ;
queue - > addUnique ( priorityMedium , funcSubMode , true , true ) ;
2023-05-02 20:18:41 +00:00
}
void memories : : on_memoryMode_clicked ( )
{
2024-03-25 12:42:08 +00:00
queue - > add ( priorityImmediate , funcMemoryMode ) ;
2024-03-30 20:40:27 +00:00
queue - > del ( funcMainFreq , false ) ;
queue - > del ( funcMainMode , false ) ;
queue - > del ( funcSubFreq , true ) ;
queue - > del ( funcSubMode , true ) ;
2023-05-02 20:18:41 +00:00
}
2023-05-01 20:56:52 +00:00
void memories : : receiveMemory ( memoryType mem )
{
2024-04-28 19:43:50 +00:00
ui - > loadingMemories - > setText ( QString ( " Loading Memory %0/%1 (this may take a while!) " ) . arg ( lastMemoryRequested & 0xffff , 3 , 10 , QLatin1Char ( ' 0 ' ) ) . arg ( rigCaps - > memories , 3 , 10 , QLatin1Char ( ' 0 ' ) ) ) ;
2024-04-28 23:50:04 +00:00
progress - > setValue ( lastMemoryRequested & 0xffff ) ;
2023-05-08 12:26:45 +00:00
// First, do we need to request the next memory?
if ( ( lastMemoryRequested & 0xffff ) < groupMemories )
{
lastMemoryRequested + + ;
if ( mem . sat )
2024-03-25 12:42:08 +00:00
queue - > add ( priorityImmediate , queueItem ( funcSatelliteMemory , QVariant : : fromValue < ushort > ( lastMemoryRequested & 0xffff ) ) ) ;
2023-05-08 12:26:45 +00:00
else
2024-03-25 12:42:08 +00:00
queue - > add ( priorityImmediate , queueItem ( funcMemoryContents , QVariant : : fromValue < uint > ( lastMemoryRequested ) ) ) ;
2023-05-06 11:36:05 +00:00
timeoutTimer . start ( MEMORY_TIMEOUT ) ;
}
2023-05-08 12:26:45 +00:00
else if ( mem . channel = = groupMemories )
{
timeoutTimer . stop ( ) ;
ui - > group - > setEnabled ( true ) ;
ui - > loadingMemories - > setVisible ( false ) ;
2023-05-09 16:03:03 +00:00
if ( ! ui - > disableEditing - > isChecked ( ) )
2023-09-28 14:44:49 +00:00
{
2023-05-09 16:03:03 +00:00
ui - > table - > setEditTriggers ( QAbstractItemView : : DoubleClicked ) ;
2023-09-28 14:44:49 +00:00
}
2023-05-08 12:26:45 +00:00
}
timeoutCount = 0 ; // We have received a memory, so set the timeout to zero.
2023-05-09 11:11:38 +00:00
int validData = 1 ; // We have 1 more row than will ever be received.
2023-05-08 12:26:45 +00:00
// Now process the incoming memory
2023-05-06 11:36:05 +00:00
int row = - 1 ;
for ( int n = 0 ; n < ui - > table - > rowCount ( ) ; n + + )
{
2024-03-25 12:42:08 +00:00
if ( ui - > table - > item ( n , columnNum ) ! = NULL & & ui - > table - > item ( n , columnNum ) - > text ( ) . toInt ( ) = = mem . channel & &
( rigCaps - > memGroups < 2 | | mem . sat | | mem . group = = ui - > group - > currentData ( ) . toInt ( ) ) )
2023-05-09 16:03:03 +00:00
{
2023-05-06 11:36:05 +00:00
row = n ;
break ;
}
}
2023-05-04 20:55:40 +00:00
if ( mem . scan < 4 ) {
2023-05-01 20:56:52 +00:00
ui - > table - > blockSignals ( true ) ;
if ( row = = - 1 ) {
ui - > table - > insertRow ( ui - > table - > rowCount ( ) ) ;
row = ui - > table - > rowCount ( ) - 1 ;
2023-05-06 11:36:05 +00:00
QPushButton * recall = new QPushButton ( " Recall " ) ;
ui - > table - > setCellWidget ( row , columnRecall , recall ) ;
2024-03-25 12:42:08 +00:00
connect ( recall , & QPushButton : : clicked , this , [ = ] ( ) {
qInfo ( ) < < " Recalling " < < mem . channel ;
queue - > add ( priorityImmediate , queueItem ( funcMemoryMode , QVariant : : fromValue < uint > ( quint32 ( ( ui - > group - > currentData ( ) . toUInt ( ) < < 16 ) | mem . channel ) ) ) ) ;
2024-04-28 19:06:32 +00:00
// We also should request the current frequency/mode etc so that the UI is updated.
queue - > add ( priorityImmediate , funcSelectedFreq , false , 0 ) ;
queue - > add ( priorityImmediate , funcSelectedMode , false , 0 ) ;
2024-03-25 12:42:08 +00:00
} ) ;
2023-05-01 20:56:52 +00:00
}
2023-05-02 20:18:41 +00:00
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnNum ) , QString : : number ( mem . channel & 0xffff ) . rightJustified ( 3 , ' 0 ' ) ) ;
2023-05-01 20:56:52 +00:00
ui - > table - > item ( row , columnNum ) - > setFlags ( ui - > table - > item ( row , columnNum ) - > flags ( ) & ( ~ Qt : : ItemIsEditable ) ) ;
2023-05-06 11:36:05 +00:00
ui - > table - > item ( row , columnNum ) - > setBackground ( Qt : : transparent ) ;
2023-05-08 13:48:17 +00:00
validData + + ;
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( split , row , columnSplit , mem . split ) ;
2023-05-02 20:18:41 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( scan , row , columnScan , mem . scan ) ;
2023-05-02 20:18:41 +00:00
2023-05-04 20:55:40 +00:00
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnFrequency ) , QString : : number ( double ( mem . frequency . Hz / 1000000.0 ) , ' f ' , 3 ) ) ;
2023-05-08 13:48:17 +00:00
validData + + ;
2023-05-04 20:55:40 +00:00
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnFrequencyB ) , QString : : number ( double ( mem . frequencyB . Hz / 1000000.0 ) , ' f ' , 3 ) ) ;
2023-05-08 13:48:17 +00:00
validData + + ;
2023-05-04 20:55:40 +00:00
2024-03-25 12:42:08 +00:00
for ( uint i = 0 ; i < rigCaps - > modes . size ( ) ; i + + )
2023-05-01 20:56:52 +00:00
{
2024-03-25 12:42:08 +00:00
if ( mem . mode = = rigCaps - > modes [ i ] . reg )
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( modes , row , columnMode , i ) ;
2023-05-01 20:56:52 +00:00
2024-03-25 12:42:08 +00:00
if ( mem . modeB = = rigCaps - > modes [ i ] . reg )
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( modes , row , columnModeB , i ) ;
2023-05-01 20:56:52 +00:00
}
2023-05-02 20:18:41 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( dataModes , row , columnData , mem . datamode ) ;
2023-05-02 20:18:41 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( dataModes , row , columnDataB , mem . datamodeB ) ;
2023-05-01 20:56:52 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( toneModes , row , columnToneMode , mem . tonemode ) ;
2023-05-02 20:18:41 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( toneModes , row , columnToneModeB , mem . tonemodeB ) ;
2023-05-08 13:48:17 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( filters , row , columnFilter , mem . filter - 1 ) ;
2023-05-02 20:18:41 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( filters , row , columnFilterB , mem . filterB - 1 ) ;
2023-05-08 13:48:17 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( duplexModes , row , columnDuplex , mem . duplex ) ;
2023-05-02 20:18:41 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( duplexModes , row , columnDuplexB , mem . duplexB ) ;
2023-05-08 13:48:17 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( dsql , row , columnDSQL , mem . dsql ) ;
2023-05-02 20:18:41 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( dsql , row , columnDSQLB , mem . dsqlB ) ;
2023-05-02 20:18:41 +00:00
2023-05-09 11:11:38 +00:00
validData + = updateCombo ( tones , row , columnTone , QString : : number ( ( float ) mem . tone / 10 , ' f ' , 1 ) ) ;
validData + = updateCombo ( tones , row , columnToneB , QString : : number ( ( float ) mem . toneB / 10 , ' f ' , 1 ) ) ;
validData + = updateCombo ( tones , row , columnTSQL , QString : : number ( ( float ) mem . tsql / 10 , ' f ' , 1 ) ) ;
validData + = updateCombo ( tones , row , columnTSQLB , QString : : number ( ( float ) mem . tsqlB / 10 , ' f ' , 1 ) ) ;
validData + = updateCombo ( dvsql , row , columnDVSquelch , QString : : number ( mem . dvsql ) . rightJustified ( 2 , ' 0 ' ) ) ;
validData + = updateCombo ( dvsql , row , columnDVSquelchB , QString : : number ( mem . dvsqlB ) . rightJustified ( 2 , ' 0 ' ) ) ;
validData + = updateCombo ( dtcsp , row , columnDTCSPolarity , mem . dtcsp ) ;
validData + = updateCombo ( dtcsp , row , columnDTCSPolarityB , mem . dtcspB ) ;
validData + = updateCombo ( dtcs , row , columnDTCS , QString : : number ( mem . dtcs ) . rightJustified ( 3 , ' 0 ' ) ) ;
validData + = updateCombo ( dtcs , row , columnDTCSB , QString : : number ( mem . dtcsB ) . rightJustified ( 3 , ' 0 ' ) ) ;
2023-05-02 20:18:41 +00:00
2023-05-06 11:36:05 +00:00
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnOffset ) , QString : : number ( double ( mem . duplexOffset . Hz / 10000.0 ) , ' f ' , 3 ) ) ;
2023-05-08 13:48:17 +00:00
validData + + ;
2023-05-06 11:36:05 +00:00
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnOffsetB ) , QString : : number ( double ( mem . duplexOffsetB . Hz / 10000.0 ) , ' f ' , 3 ) ) ;
2023-05-08 13:48:17 +00:00
validData + + ;
if ( checkASCII ( mem . UR ) ) {
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnUR ) , QString ( mem . UR ) ) ;
validData + + ;
} else
qInfo ( ) < < " Invalid data in ur " ;
if ( checkASCII ( mem . URB ) ) {
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnURB ) , QString ( mem . URB ) ) ;
validData + + ;
} else
qInfo ( ) < < " Invalid data in urb " ;
if ( checkASCII ( mem . R1 ) ) {
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnR1 ) , QString ( mem . R1 ) ) ;
validData + + ;
} else
qInfo ( ) < < " Invalid data in r1 " ;
if ( checkASCII ( mem . R1B ) ) {
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnR1B ) , QString ( mem . R1B ) ) ;
validData + + ;
} else
qInfo ( ) < < " Invalid data in r1b " ;
2023-05-02 20:18:41 +00:00
2023-05-08 13:48:17 +00:00
if ( checkASCII ( mem . R2 ) ) {
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnR2 ) , QString ( mem . R2 ) ) ;
validData + + ;
} else
qInfo ( ) < < " Invalid data in r2 " ;
2023-05-02 20:18:41 +00:00
2023-05-08 13:48:17 +00:00
if ( checkASCII ( mem . R2B ) ) {
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnR2B ) , QString ( mem . R2B ) ) ;
validData + + ;
} else
qInfo ( ) < < " Invalid data in r2b " ;
if ( checkASCII ( mem . name ) ) {
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , columnName ) , QString ( mem . name ) ) ;
validData + + ;
2023-05-09 11:11:38 +00:00
} else {
2023-05-08 13:48:17 +00:00
qInfo ( ) < < " Invalid data in name " ;
2023-05-09 11:11:38 +00:00
}
2023-05-02 20:18:41 +00:00
2023-05-01 20:56:52 +00:00
ui - > table - > blockSignals ( false ) ;
2023-05-08 13:48:17 +00:00
2023-05-09 11:11:38 +00:00
if ( retries > 10 )
2023-05-08 13:48:17 +00:00
{
2023-05-09 11:11:38 +00:00
retries = 0 ;
return ;
2023-05-08 13:48:17 +00:00
}
2023-05-09 11:11:38 +00:00
if ( validData < visibleColumns ) {
2023-05-08 13:48:17 +00:00
qInfo ( logRig ( ) ) < < " Memory " < < mem . channel < < " Received valid data for " < < validData < < " columns, " < < " expected " < < visibleColumns < < " requesting again " ;
2024-03-25 12:42:08 +00:00
if ( mem . sat ) {
queue - > add ( priorityImmediate , queueItem ( funcSatelliteMemory , QVariant : : fromValue < ushort > ( mem . channel & 0xffff ) ) ) ;
} else {
queue - > add ( priorityImmediate , queueItem ( funcMemoryContents , QVariant : : fromValue < uint > ( mem . channel & 0xffff ) ) ) ;
}
2023-05-09 11:11:38 +00:00
retries + + ;
2023-05-08 13:48:17 +00:00
}
2023-05-01 20:56:52 +00:00
}
2023-05-06 11:36:05 +00:00
else if ( row ! = - 1 )
{
// Check if we already have this memory as it might have failed to write?
ui - > loadingMemories - > setStyleSheet ( " QLabel {color: #ff0000} " ) ;
ui - > table - > item ( row , columnNum ) - > setBackground ( Qt : : red ) ;
}
2023-05-02 20:18:41 +00:00
2023-05-01 20:56:52 +00:00
}
2023-05-09 11:11:38 +00:00
int memories : : updateCombo ( QStringList & combo , int row , columns column , unsigned char data )
{
int ret = 1 ;
if ( ! ui - > table - > isColumnHidden ( column ) & & combo . size ( ) > data )
{
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , column ) , combo [ data ] ) ;
}
else if ( ! ui - > table - > isColumnHidden ( column ) )
{
qInfo ( ) < < " Column " < < column < < " Hidden or invalid: " < < data ;
ret = 0 ;
} else {
ret = 0 ;
}
return ret ;
}
int memories : : updateCombo ( QStringList & combo , int row , columns column , QString data )
{
int ret = 1 ;
if ( ! ui - > table - > isColumnHidden ( column ) & & combo . contains ( data ) )
{
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( row , column ) , data ) ;
}
else if ( ! ui - > table - > isColumnHidden ( column ) )
{
qInfo ( ) < < " Column " < < column < < " Hidden or invalid: " < < data ;
ret = 0 ;
} else {
ret = 0 ;
}
return ret ;
}
2023-05-08 13:48:17 +00:00
bool memories : : checkASCII ( QString str )
{
2023-05-09 11:11:38 +00:00
static QRegularExpression exp = QRegularExpression ( QStringLiteral ( " [^ \\ x{0020}- \\ x{007E}] " ) ) ;
2023-05-08 13:48:17 +00:00
bool containsNonASCII = str . contains ( exp ) ;
return ! containsNonASCII ;
}
2023-05-04 20:55:40 +00:00
void memories : : timeout ( )
2024-03-25 12:42:08 +00:00
{
2023-05-08 12:26:45 +00:00
if ( timeoutCount < 10 )
{
qInfo ( logRig ( ) ) < < " Timeout receiving memory: " < < ( lastMemoryRequested & 0xffff ) < < " in group " < < ( lastMemoryRequested > > 16 & 0xffff ) ;
2024-03-25 12:42:08 +00:00
if ( ui - > group - > currentData ( ) . toInt ( ) = = MEMORY_SATGROUP ) {
queue - > add ( priorityImmediate , queueItem ( funcSatelliteMemory , QVariant : : fromValue < ushort > ( lastMemoryRequested & 0xffff ) ) ) ;
} else {
queue - > add ( priorityImmediate , queueItem ( funcMemoryContents , QVariant : : fromValue < uint > ( lastMemoryRequested ) ) ) ;
}
2023-05-08 12:26:45 +00:00
timeoutTimer . start ( MEMORY_TIMEOUT ) ;
timeoutCount + + ;
} else {
timeoutCount = 0 ;
ui - > loadingMemories - > setVisible ( false ) ;
timeoutTimer . stop ( ) ;
ui - > group - > setEnabled ( true ) ;
2023-05-09 16:03:03 +00:00
if ( ! ui - > disableEditing - > isChecked ( ) )
2023-09-28 14:44:49 +00:00
{
2023-05-09 16:03:03 +00:00
ui - > table - > setEditTriggers ( QAbstractItemView : : DoubleClicked ) ;
2023-09-28 14:44:49 +00:00
}
2023-05-08 12:26:45 +00:00
QMessageBox : : information ( this , " Timeout " , " Timeout receiving memories, check rig connection " , QMessageBox : : Ok ) ;
}
2023-05-04 20:55:40 +00:00
}
2023-05-01 20:56:52 +00:00
QStandardItemModel * memories : : createModel ( QStandardItemModel * model , QStringList strings )
{
model = new QStandardItemModel ( ) ;
for ( int i = 0 ; i < strings . size ( ) ; i + + )
{
QStandardItem * itemName = new QStandardItem ( strings [ i ] ) ;
QStandardItem * itemId = new QStandardItem ( i ) ;
QList < QStandardItem * > row ;
row < < itemName < < itemId ;
model - > appendRow ( row ) ;
}
return model ;
}
2023-05-03 18:08:20 +00:00
void memories : : on_csvImport_clicked ( )
{
QString file = QFileDialog : : getOpenFileName ( this , " Select import filename " , " " , " CSV Files (*.csv) " ) ;
if ( ! file . isEmpty ( ) )
{
ui - > table - > sortByColumn ( 0 , Qt : : AscendingOrder ) ; // Force natural order
QFile data ( file ) ;
if ( ! data . open ( QIODevice : : ReadOnly ) ) {
2023-05-04 20:55:40 +00:00
qInfo ( ) < < " Couldn't open file for .csv import " < < data . errorString ( ) ;
2023-05-03 18:08:20 +00:00
return ;
}
2023-05-06 11:36:05 +00:00
int lastcol = 0 ;
for ( int i = 0 ; i < ui - > table - > columnCount ( ) ; i + + )
{
if ( ! ui - > table - > isColumnHidden ( i ) )
lastcol = i ;
}
2023-05-03 18:08:20 +00:00
QTextStream input ( & data ) ;
QStringList row ;
int rows = 0 ;
while ( readCSVRow ( input , & row ) ) {
qInfo ( ) < < row ;
if ( ! rows + + )
continue ; // Skip the first row
2023-05-04 20:55:40 +00:00
int rownum = - 1 ;
2023-05-03 18:08:20 +00:00
for ( int i = 0 ; i < ui - > table - > rowCount ( ) ; i + + ) {
if ( ui - > table - > item ( i , 1 ) - > text ( ) . toInt ( ) = = row [ 0 ] . toInt ( ) ) {
2023-05-04 20:55:40 +00:00
rownum = i ;
2023-05-03 18:08:20 +00:00
break ;
}
}
2023-05-04 20:55:40 +00:00
if ( rownum = = - 1 )
2023-05-03 18:08:20 +00:00
{
// We need to add a new row
2023-05-04 20:55:40 +00:00
rownum = ui - > table - > rowCount ( ) ;
ui - > table - > insertRow ( rownum ) ;
2023-05-03 18:08:20 +00:00
QPushButton * recall = new QPushButton ( " Recall " ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > setCellWidget ( rownum , columnRecall , recall ) ;
2024-03-25 12:42:08 +00:00
connect ( recall , & QPushButton : : clicked , this , [ = ] ( ) {
qInfo ( ) < < " Recalling " < < row [ 0 ] . toInt ( ) ;
queue - > add ( priorityImmediate , queueItem ( funcMemoryMode , QVariant : : fromValue < uint > ( quint32 ( ( ui - > group - > currentData ( ) . toUInt ( ) < < 16 ) | row [ 0 ] . toInt ( ) ) ) ) ) ;
} ) ;
2023-05-03 18:08:20 +00:00
}
2023-05-04 20:55:40 +00:00
// rownum is now the row we need to work on.
int colnum = 1 ;
ui - > table - > blockSignals ( true ) ;
2023-05-03 18:08:20 +00:00
for ( int i = 0 ; i < row . size ( ) ; i + + )
{
2023-05-04 20:55:40 +00:00
while ( colnum < ui - > table - > columnCount ( ) & & ui - > table - > isColumnHidden ( colnum ) ) {
colnum + + ;
}
// Stop blocking signals for last column (should force it to be sent to rig)
if ( colnum < ui - > table - > columnCount ( ) )
{
2023-05-06 11:36:05 +00:00
QString data = row [ i ] ;
for ( int n = data . size ( ) ; n < = 0 ; - - n )
{
if ( ! data . at ( n ) . isSpace ( ) ) {
data . truncate ( n + 1 ) ;
break ;
}
}
2023-05-04 20:55:40 +00:00
switch ( colnum )
{
// special cases:
case columnFrequency :
case columnFrequencyB :
data = QString : : number ( data . toDouble ( ) , ' f ' , 3 ) ;
break ;
case columnDTCS :
case columnDTCSB :
data = QString : : number ( data . toInt ( ) ) . rightJustified ( 3 , ' 0 ' ) ;
break ;
case columnDVSquelch :
case columnDVSquelchB :
data = QString : : number ( data . toInt ( ) ) . rightJustified ( 2 , ' 0 ' ) ;
break ;
case columnTone :
case columnToneB :
case columnTSQL :
case columnTSQLB :
if ( data . endsWith ( " Hz " ) ) data = data . mid ( 0 , data . length ( ) - 2 ) ;
break ;
2023-05-06 11:36:05 +00:00
case columnFilter :
case columnFilterB :
if ( ! data . startsWith ( " FIL " ) ) data = " FIL " + data ;
break ;
2023-05-04 20:55:40 +00:00
default :
break ;
}
2023-05-06 11:36:05 +00:00
if ( colnum = = lastcol )
ui - > table - > blockSignals ( false ) ;
2023-05-04 20:55:40 +00:00
ui - > table - > model ( ) - > setData ( ui - > table - > model ( ) - > index ( rownum , colnum ) , data ) ;
colnum + + ;
2023-05-03 18:08:20 +00:00
}
}
}
}
}
void memories : : on_csvExport_clicked ( )
{
QString file = QFileDialog : : getSaveFileName ( this , " Select export filename " , " " , " CSV Files (*.csv) " ) ;
if ( ! file . isEmpty ( ) )
{
ui - > table - > sortByColumn ( 0 , Qt : : AscendingOrder ) ; // Force natural order
QFile data ( file ) ;
if ( data . open ( QFile : : WriteOnly | QIODevice : : Truncate ) ) {
QTextStream output ( & data ) ;
2023-05-04 20:55:40 +00:00
for ( int i = 1 ; i < ui - > table - > columnCount ( ) ; i + + ) {
if ( ! ui - > table - > isColumnHidden ( i ) )
{
output < < " \" " < < ui - > table - > horizontalHeaderItem ( i ) - > text ( ) < < " \" " ;
if ( i < ui - > table - > columnCount ( ) - 1 )
output < < " , " ;
else
output < < " \n " ;
2023-07-17 10:09:14 +00:00
} else if ( i = = ui - > table - > columnCount ( ) - 1 ) {
output < < " \n " ;
2023-05-04 20:55:40 +00:00
}
2023-05-03 18:08:20 +00:00
}
for ( int i = 0 ; i < ui - > table - > rowCount ( ) ; i + + ) {
for ( int j = 1 ; j < ui - > table - > columnCount ( ) ; j + + ) {
2023-05-04 20:55:40 +00:00
if ( ! ui - > table - > isColumnHidden ( j ) )
{
2023-05-06 11:36:05 +00:00
output < < " \" " < < ( ( ui - > table - > item ( i , j ) = = NULL ) ? " " : ui - > table - > item ( i , j ) - > text ( ) ) < < " \" " ;
2023-05-04 20:55:40 +00:00
if ( j < ui - > table - > columnCount ( ) - 1 )
output < < " , " ;
else
output < < " \n " ;
2023-07-17 10:09:14 +00:00
} else if ( j = = ui - > table - > columnCount ( ) - 1 ) {
output < < " \n " ;
2023-05-04 20:55:40 +00:00
}
2023-05-03 18:08:20 +00:00
}
}
}
data . close ( ) ;
}
}
// Public Domain CSV parser from user iamantony
// https://www.appsloveworld.com/cplus/100/37/parsing-through-a-csv-file-in-qt
bool memories : : readCSVRow ( QTextStream & in , QStringList * row ) {
static const int delta [ ] [ 5 ] = {
// , " \n ? eof
{ 1 , 2 , - 1 , 0 , - 1 } , // 0: parsing (store char)
{ 1 , 2 , - 1 , 0 , - 1 } , // 1: parsing (store column)
{ 3 , 4 , 3 , 3 , - 2 } , // 2: quote entered (no-op)
{ 3 , 4 , 3 , 3 , - 2 } , // 3: parsing inside quotes (store char)
{ 1 , 3 , - 1 , 0 , - 1 } , // 4: quote exited (no-op)
// -1: end of row, store column, success
// -2: eof inside quotes
} ;
row - > clear ( ) ;
if ( in . atEnd ( ) )
return false ;
int state = 0 , t ;
char ch ;
QString cell ;
while ( state > = 0 ) {
if ( in . atEnd ( ) )
t = 4 ;
else {
in > > ch ;
if ( ch = = ' , ' ) t = 0 ;
else if ( ch = = ' \" ' ) t = 1 ;
else if ( ch = = ' \n ' ) t = 2 ;
else t = 3 ;
}
state = delta [ state ] [ t ] ;
switch ( state ) {
case 0 :
case 3 :
cell + = ch ;
break ;
case - 1 :
case 1 :
row - > append ( cell ) ;
cell = " " ;
break ;
}
}
if ( state = = - 2 ) {
qInfo ( ) < < " End-of-file found while inside quotes. " ;
return false ;
}
return true ;
}
2023-05-09 16:03:03 +00:00
void memories : : on_disableEditing_toggled ( bool dis )
{
2023-09-28 14:44:49 +00:00
if ( dis ) {
2023-05-09 16:03:03 +00:00
ui - > table - > setEditTriggers ( QAbstractItemView : : NoEditTriggers ) ;
2023-09-28 14:44:49 +00:00
ui - > table - > editing ( false ) ;
}
else {
ui - > table - > editing ( true ) ;
2023-05-09 16:03:03 +00:00
ui - > table - > setEditTriggers ( QAbstractItemView : : DoubleClicked ) ;
2023-09-28 14:44:49 +00:00
}
2023-05-09 16:03:03 +00:00
}