From d0003765c0759ce726c6acbbff580c359a07ea1d Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Mon, 2 Sep 2024 11:39:02 +0200 Subject: [PATCH 01/74] Fixed #447 - WSJT-X does not emit band change if rig is disconnected --- ui/MainWindow.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/MainWindow.cpp b/ui/MainWindow.cpp index acdb2f72..81478e64 100644 --- a/ui/MainWindow.cpp +++ b/ui/MainWindow.cpp @@ -164,6 +164,8 @@ MainWindow::MainWindow(QWidget* parent) : connect(ui->wsjtxWidget, &WsjtxWidget::spotsCleared, ui->onlineMapWidget, &OnlineMapWidget::clearWSJTXSpots); connect(ui->wsjtxWidget, &WsjtxWidget::reply, wsjtx, &Wsjtx::startReply); connect(ui->wsjtxWidget, &WsjtxWidget::frequencyChanged, ui->newContactWidget, &NewContactWidget::changeFrequency); + connect(ui->wsjtxWidget, &WsjtxWidget::frequencyChanged, ui->onlineMapWidget, &OnlineMapWidget::setIBPBand); + connect(ui->wsjtxWidget, &WsjtxWidget::frequencyChanged, ui->bandmapWidget , &BandmapWidget::updateTunedFrequency); connect(ui->wsjtxWidget, &WsjtxWidget::modeChanged, ui->newContactWidget, &NewContactWidget::changeModefromRig); connect(this, &MainWindow::settingsChanged, wsjtx, &Wsjtx::reloadSetting); From 2d784a83e9fa4086a22a77ffad68bf15c723f025 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 4 Sep 2024 14:34:23 +0200 Subject: [PATCH 02/74] Fixing #453 - HamlibDrv: Added multiplatform reliable sleep --- rig/drivers/HamlibRigDrv.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/rig/drivers/HamlibRigDrv.cpp b/rig/drivers/HamlibRigDrv.cpp index 1738ed98..a2dbc3f9 100644 --- a/rig/drivers/HamlibRigDrv.cpp +++ b/rig/drivers/HamlibRigDrv.cpp @@ -1,11 +1,5 @@ #include -#ifdef Q_OS_WIN -#include -#else -#include -#endif - #include #include "HamlibRigDrv.h" #include "core/debug.h" @@ -1031,11 +1025,9 @@ void HamlibRigDrv::__setKeySpeed(qint16 wpm) void HamlibRigDrv::commandSleep() { -#ifdef Q_OS_WIN - Sleep(100); -#else - usleep(100000); -#endif + FCT_IDENTIFICATION; + + QThread::msleep(200); } const QString HamlibRigDrv::getModeNormalizedText(const rmode_t mode, From c72a134e1ada25f2d6d815121e29709c2e19c597 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Thu, 5 Sep 2024 10:55:52 +0200 Subject: [PATCH 03/74] Fixed #454 - Select S in the RST Edit --- ui/EditLine.cpp | 19 +++++++++++++++++++ ui/EditLine.h | 13 +++++++++++++ ui/NewContactWidget.cpp | 5 ++++- ui/NewContactWidget.ui | 15 +++++++-------- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/ui/EditLine.cpp b/ui/EditLine.cpp index ec555d1a..075141fc 100644 --- a/ui/EditLine.cpp +++ b/ui/EditLine.cpp @@ -60,3 +60,22 @@ void NewContactEditLine::spaceForbidden(bool inSpaceForbidden) { spaceForbiddenFlag = inSpaceForbidden; } + +NewContactRSTEditLine::NewContactRSTEditLine(QWidget *parent) : + NewContactEditLine(parent), + focusInSelectionBackwardOffset(1) +{ +} + +void NewContactRSTEditLine::setSelectionBackwardOffset(int offset) +{ + focusInSelectionBackwardOffset = offset; +} + +void NewContactRSTEditLine::focusInEvent(QFocusEvent *event) +{ + NewContactEditLine::focusInEvent(event); + + if ( event->reason() != Qt::PopupFocusReason && !text().isEmpty() && text().length() >= focusInSelectionBackwardOffset ) + setSelection(text().length() - focusInSelectionBackwardOffset, 1); +} diff --git a/ui/EditLine.h b/ui/EditLine.h index 4c432a32..eb9e3f78 100644 --- a/ui/EditLine.h +++ b/ui/EditLine.h @@ -24,4 +24,17 @@ class NewContactEditLine : public QLineEdit bool spaceForbiddenFlag; }; +class NewContactRSTEditLine : public NewContactEditLine +{ + Q_OBJECT + +public: + explicit NewContactRSTEditLine(QWidget *parent = nullptr); + void setSelectionBackwardOffset(int offset); + +protected: + void focusInEvent(QFocusEvent* event) override; + int focusInSelectionBackwardOffset; +}; + #endif // QLOG_UI_EDITLINE_H diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index 64693bdd..4c72d9ad 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -2628,7 +2628,8 @@ void NewContactWidget::showDx(const QString &callsign, const QString &grid) uiDynamic->gridEdit->setText(grid); } -void NewContactWidget::setDefaultReport() { +void NewContactWidget::setDefaultReport() +{ FCT_IDENTIFICATION; if (defaultReport.isEmpty()) { @@ -2636,7 +2637,9 @@ void NewContactWidget::setDefaultReport() { } ui->rstRcvdEdit->setText(defaultReport); + ui->rstRcvdEdit->setSelectionBackwardOffset(defaultReport.size() >= 3 ? 2 : 1 ); ui->rstSentEdit->setText(defaultReport); + ui->rstSentEdit->setSelectionBackwardOffset(defaultReport.size() >= 3 ? 2 : 1 ); } void NewContactWidget::webLookup() diff --git a/ui/NewContactWidget.ui b/ui/NewContactWidget.ui index 565dc8a2..ba05b9f2 100644 --- a/ui/NewContactWidget.ui +++ b/ui/NewContactWidget.ui @@ -69,7 +69,7 @@ 0 - + 0 @@ -284,7 +284,6 @@ - 75 true @@ -297,7 +296,6 @@ - 75 true @@ -345,7 +343,6 @@ 20 - 75 true @@ -355,7 +352,7 @@ - + 0 @@ -795,7 +792,6 @@ 13 - 75 true @@ -865,7 +861,6 @@ 9 - 50 false @@ -894,7 +889,6 @@ 9 - 50 false @@ -1669,6 +1663,11 @@ QDoubleSpinBox
ui/FreqQSpinBox.h
+ + NewContactRSTEditLine + QLineEdit +
ui/EditLine.h
+
callsignEdit From 54f30964e046122a8a922da60a180cfe571e4578 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 6 Sep 2024 09:27:16 +0200 Subject: [PATCH 04/74] Backup: only one backup per day, backup executed every 7 days, max 10 backup files There is an extra backup file when database is migrated. --- core/Migration.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++-- core/Migration.h | 8 ++-- core/main.cpp | 62 +----------------------- 3 files changed, 114 insertions(+), 71 deletions(-) diff --git a/core/Migration.cpp b/core/Migration.cpp index d62590c1..07afe9d6 100644 --- a/core/Migration.cpp +++ b/core/Migration.cpp @@ -9,6 +9,7 @@ #include "LogParam.h" #include "LOVDownloader.h" #include "ClubLog.h" +#include "logformat/AdxFormat.h" MODULE_IDENTIFICATION("qlog.core.migration"); @@ -28,14 +29,17 @@ bool Migration::run() { //refreshUploadStatusTrigger(); return true; } - else if (currentVersion < latestVersion) { - qCDebug(runtime) << "Starting database migration"; - } - else { - qCritical() << "database from the future"; + else if ( currentVersion > latestVersion ) + { + qCritical() << "Database from the future" << currentVersion; return false; } + qCDebug(runtime) << "Backup before migration"; + backupDatabase(true); + + qCDebug(runtime) << "Starting database migration"; + QProgressDialog progress("Migrating the database...", nullptr, currentVersion, latestVersion); progress.show(); @@ -76,6 +80,107 @@ bool Migration::run() { return true; } +bool Migration::backupDatabase(bool force) +{ + FCT_IDENTIFICATION; + + const int backupCount = 10; + const int backupIntervalDays = 7; + const QString lastBackupParamName("last_backup"); + + QDate lastBackupDate = LogParam::getParam(lastBackupParamName).toDate(); + QDate now = QDate::currentDate(); + + qCDebug(runtime) << "The last backup date" << lastBackupDate + << "Force" << force; + + if ( !force + && lastBackupDate.isValid() + && lastBackupDate.addDays(backupIntervalDays) > now ) + { + qCDebug(runtime) << "Backup skipped"; + return true; + } + + const QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)); + const QString todayBackupName = "qlog_backup_" + QDateTime::currentDateTime().toString("yyyyMMdd") + ".adx"; + const QString todayBackupPath = dir.filePath(todayBackupName); + + // old backup file had a timestamp YYYYMMDDHHmmSS + // new backup file has only YYYYMMDD + // to be able to clean new and old backup files, following regexp is needed + const QRegularExpression regex("^qlog_backup_\\d{8}(\\d{6})?\\.adx$"); + + const QFileInfoList &fileList = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot); + QFileInfoList filteredList; + + for ( const QFileInfo &fileInfo : fileList ) + { + if ( regex.match(fileInfo.fileName()).hasMatch() ) // clazy:exclude=use-static-qregularexpression + { + filteredList.append(fileInfo); + } + } + + qCDebug(runtime) << filteredList; + + // does today backup exists ? + if ( !force ) + { + for ( const QFileInfo &fileInfo : filteredList ) + { + if ( fileInfo.fileName() == todayBackupName ) + { + qCDebug(runtime) << "Backup for today already exists: " << todayBackupName; + return true; + } + } + } + + /* Keep the minimum number of backups */ + /* If a number of backups is greater than backupCount, remove oldest files */ + if ( filteredList.size() >= backupCount ) + { + std::sort(filteredList.begin(), filteredList.end(), [](const QFileInfo &a, const QFileInfo &b) { + return a.fileName() < b.fileName(); + }); + + // remove old files + while ( filteredList.size() > backupCount ) + { + QFileInfo oldestFile = filteredList.takeFirst(); + const QString &filepath = oldestFile.absoluteFilePath(); + if ( QFile::remove(filepath) ) + qCDebug(runtime) << "Removing old backup file: " << filepath; + else + qWarning() << "Failed to remove old backup file: " << filepath; + } + } + + /* Make a backup file */ + QFile backupFile(todayBackupPath); + + if ( !backupFile.open(QFile::ReadWrite | QIODevice::Text) ) + { + qWarning() << "Cannot open backup file " << todayBackupPath << " for writing"; + return false; + } + + qCDebug(runtime) << "Exporting a Database backup to " << todayBackupPath; + + QTextStream stream(&backupFile); + AdxFormat adx(stream); + + adx.runExport(); + stream.flush(); + backupFile.close(); + + LogParam::setParam(lastBackupParamName, now); + + qCDebug(runtime) << "Database backup finished"; + return true; +} + /** * Returns the current user_version of the database. */ diff --git a/core/Migration.h b/core/Migration.h index 310b5676..26a49625 100644 --- a/core/Migration.h +++ b/core/Migration.h @@ -16,17 +16,15 @@ class Migration : public QObject Migration(QObject *parent = nullptr) : QObject(parent) {} bool run(); - bool functionMigration(int version); + static bool backupDatabase(bool force = false); + private: + bool functionMigration(int version); bool migrate(int toVersion); int getVersion(); bool setVersion(int version); - bool runSqlFile(QString filename); - - int tableRows(QString name); - bool updateExternalResource(); bool updateExternalResourceProgress(QProgressDialog&, LOVDownloader&, diff --git a/core/main.cpp b/core/main.cpp index e7bb75e3..41f006d4 100644 --- a/core/main.cpp +++ b/core/main.cpp @@ -21,7 +21,6 @@ #include "rotator/Rotator.h" #include "cwkey/CWKeyer.h" #include "AppGuard.h" -#include "logformat/AdxFormat.h" #include "ui/SettingsDialog.h" #include "data/StationProfile.h" #include "core/zonedetect.h" @@ -236,65 +235,6 @@ static bool createSQLFunctions() return true; } -static bool backupDatabase() -{ - FCT_IDENTIFICATION; - /* remove old backups */ - /* retention time is 30 days but a minimum number of backup files is 5 */ - const int retention_time = 30; - const int min_backout_count = 5; - - QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)); - QString path = dir.filePath("qlog_backup_" + QDateTime::currentDateTime().toString("yyyyMMddhhmmss") + ".adx"); - QString filter("qlog_backup_%1%1%1%1%1%1%1%1%1%1%1%1%1%1.adx"); - filter = filter.arg("[0123456789]"); - - QFileInfoList file_list = QDir(dir).entryInfoList(QStringList(filter), QDir::Files, QDir::Name); - - qCDebug(runtime) << file_list; - - /* Keep the minimum number of backups */ - /* If a number of backup is greater than min_backout_count then remove files older 30 days but always - protect a minimum number of backup file files */ - for (int i = 0; i < qMin(min_backout_count, file_list.size()); i++) - { - file_list.takeLast(); // remove last 5 files from sorted list by name to protect them from removing. - } - - /* remove those older than 30 days from the remaining files. */ - Q_FOREACH (auto fileInfo, file_list) - { - if (fileInfo.lastModified().date().daysTo(QDate::currentDate()) > retention_time) - { - QString filepath = fileInfo.absoluteFilePath(); - QDir deletefile; - deletefile.setPath(filepath); - deletefile.remove(filepath); - qCDebug(runtime) << "Removing file: " << filepath; - } - } - - /* make a backup file */ - QFile backup_file(path); - - if ( !backup_file.open(QFile::ReadWrite | QIODevice::Text)) - { - qWarning()<<"Cannot open backup file " << path << "for writing"; - return false; - } - - qCDebug(runtime)<<"Exporting a Database backup to " << path; - - QTextStream stream(&backup_file); - AdxFormat adx(stream); - - adx.runExport(); - stream.flush(); - backup_file.close(); - - qCDebug(runtime)<<"Database backup finished"; - return true; -} static bool migrateDatabase() { FCT_IDENTIFICATION; @@ -529,7 +469,7 @@ int main(int argc, char* argv[]) splash.showMessage(QObject::tr("Backuping Database"), Qt::AlignBottom|Qt::AlignCenter); /* a migration can break a database therefore a backup is call before it */ - if (!backupDatabase()) + if (!Migration::backupDatabase()) { QMessageBox::critical(nullptr, QMessageBox::tr("QLog Error"), QMessageBox::tr("Could not export a QLog database to ADIF as a backup.

Try to export your log to ADIF manually")); From c7d84984035b517ba1a29a24ceefdc004e294f0b Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Tue, 10 Sep 2024 09:18:07 +0200 Subject: [PATCH 05/74] Fixed #458 - WSJTX log record is stored incorrectly if it contains non-ASCII --- core/UpdatableSQLRecord.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/UpdatableSQLRecord.cpp b/core/UpdatableSQLRecord.cpp index 13b1514e..1638f866 100644 --- a/core/UpdatableSQLRecord.cpp +++ b/core/UpdatableSQLRecord.cpp @@ -50,8 +50,8 @@ void UpdatableSQLRecord::updateRecord(const QSqlRecord &record) if ( !internalRecord.contains(fieldName) ) internalRecord.append(record.field(i)); - else if ( internalRecord.value(i).toString().isEmpty() - && !record.value(i).toString().isEmpty() ) + else if ( !record.value(i).toString().isEmpty() + && internalRecord.value(fieldName).toString().isEmpty() ) internalRecord.setValue(fieldName, record.value(i)); } } From 89e5c2fe7c4d84695ce95d1aa6cfc12359c6aca5 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Tue, 10 Sep 2024 11:31:38 +0200 Subject: [PATCH 06/74] Fixing #455 - Force set encoding for ADI formatter to Latin1 In cases when an ADI record contains non-ASCII characters, Qt internally tries to interpret them as UTF-8 and convert them, which can lead to unpredictable behavior. This commit fixes the issue #455 as a side effect. Unfortunately, if the ADIF contains non-ASCII characters, QLog is still unable to handle them correctly - what is not an issue because ADI-format is defined as ASCII format. --- logformat/AdiFormat.cpp | 12 ++++++++++++ logformat/AdiFormat.h | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/logformat/AdiFormat.cpp b/logformat/AdiFormat.cpp index 0de9945d..8fadea5c 100644 --- a/logformat/AdiFormat.cpp +++ b/logformat/AdiFormat.cpp @@ -603,6 +603,18 @@ bool AdiFormat::readContact(QMap& contact) return false; } +AdiFormat::AdiFormat(QTextStream &stream) : + LogFormat(stream) +{ + FCT_IDENTIFICATION; + +#if QT_VERSION >= QT_VERSION_CHECK(6,0,0) + stream.setEncoding(QStringConverter::Latin1); +#else + stream.setCodec("ISO 8859-1"); +#endif +} + bool AdiFormat::importNext(QSqlRecord& record) { FCT_IDENTIFICATION; diff --git a/logformat/AdiFormat.h b/logformat/AdiFormat.h index 3bc25c77..fa443a1f 100644 --- a/logformat/AdiFormat.h +++ b/logformat/AdiFormat.h @@ -8,7 +8,7 @@ class AdiFormat : public LogFormat { public: - explicit AdiFormat(QTextStream& stream) : LogFormat(stream) {} + explicit AdiFormat(QTextStream& stream); virtual bool importNext(QSqlRecord& ) override; From 32b56473410670211b71a132e18d6a1c4047550e Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Tue, 10 Sep 2024 16:20:35 +0200 Subject: [PATCH 07/74] Fixed #459 - ADIF import does not import records with old DXCC Entities Only if the DXCC option is checked, non-existing DXCC entities will cause an error and the record will be skipped. Otherwise, it's just a warning. In the case of incomplete information, DXCC data will be filled in if a DXCC entity is found. --- logformat/LogFormat.cpp | 43 +++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/logformat/LogFormat.cpp b/logformat/LogFormat.cpp index 8f4c9c14..7db32eff 100644 --- a/logformat/LogFormat.cpp +++ b/logformat/LogFormat.cpp @@ -398,43 +398,40 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, } } - const DxccEntity &entity = Data::instance()->lookupDxcc(call.toString()); + int recordDXCCId = record.value(RECORDIDX(LogbookModel::COLUMN_DXCC)).toInt(); // 0 = NAN or not present + // otherwise = DXCC ID - if ( entity.dxcc == 0 ) + const DxccEntity &entity = ( recordDXCCId != 0 ) ? Data::instance()->lookupDxccID(recordDXCCId) + : Data::instance()->lookupDxcc(call.toString()); + + if ( entity.dxcc == 0 ) // DXCC not found { writeImportLog(importLogStream, - ERROR_SEVERITY, + (updateDxcc) ? ERROR_SEVERITY : WARNING_SEVERITY, processedRec, record, tr("Cannot find DXCC Entity Info")); - (*errors)++; - continue; + ( updateDxcc ) ? (*errors)++ + : (*warnings)++; + if ( updateDxcc ) + continue; } - - if ( record.value(RECORDIDX(LogbookModel::COLUMN_DXCC)).toString().isEmpty() - || updateDxcc ) + else { record.setValue(RECORDIDX(LogbookModel::COLUMN_DXCC), entity.dxcc); record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY), Data::removeAccents(entity.country)); record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY_INTL), entity.country); - } - if ( record.value(RECORDIDX(LogbookModel::COLUMN_CONTINENT)).toString().isEmpty() - || updateDxcc ) - { - record.setValue(RECORDIDX(LogbookModel::COLUMN_CONTINENT), entity.cont); - } + // other DXCC related values ​​are not closely related to DXCC value and could have been filled + // therefore check if it is present or not. + if ( record.value(RECORDIDX(LogbookModel::COLUMN_CONTINENT)).toString().isEmpty() ) + record.setValue(RECORDIDX(LogbookModel::COLUMN_CONTINENT), entity.cont); - if ( record.value(RECORDIDX(LogbookModel::COLUMN_ITUZ)).toString().isEmpty() - || updateDxcc ) - { - record.setValue(RECORDIDX(LogbookModel::COLUMN_ITUZ), QString::number(entity.ituz)); - } + if ( record.value(RECORDIDX(LogbookModel::COLUMN_ITUZ)).toString().isEmpty() ) + record.setValue(RECORDIDX(LogbookModel::COLUMN_ITUZ), QString::number(entity.ituz)); - if ( record.value(RECORDIDX(LogbookModel::COLUMN_CQZ)).toString().isEmpty() - || updateDxcc ) - { - record.setValue(RECORDIDX(LogbookModel::COLUMN_CQZ), QString::number(entity.cqz)); + if ( record.value(RECORDIDX(LogbookModel::COLUMN_CQZ)).toString().isEmpty() ) + record.setValue(RECORDIDX(LogbookModel::COLUMN_CQZ), QString::number(entity.cqz)); } if ( record.value(RECORDIDX(LogbookModel::COLUMN_PREFIX)).toString().isEmpty() ) From 455e2a60866d119f3a9c209815e54ba574f5aad9 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 11 Sep 2024 14:10:42 +0200 Subject: [PATCH 08/74] Fixed #459 - QSODetail: added possibility to define an empty country --- ui/QSODetailDialog.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ui/QSODetailDialog.cpp b/ui/QSODetailDialog.cpp index 67657039..847a996c 100644 --- a/ui/QSODetailDialog.cpp +++ b/ui/QSODetailDialog.cpp @@ -265,7 +265,7 @@ QSODetailDialog::QSODetailDialog(const QSqlRecord &qso, /* Country */ SqlListModel* countryModel = new SqlListModel("SELECT id, translate_to_locale(name), name " "FROM dxcc_entities " - "ORDER BY 2 COLLATE LOCALEAWARE ASC;", "", this); + "ORDER BY 2 COLLATE LOCALEAWARE ASC;", " ", this); while ( countryModel->canFetchMore() ) countryModel->fetchMore(); @@ -1685,11 +1685,7 @@ void QSOEditMapperDelegate::setEditorData(QWidget *editor, QModelIndexList countryIndex = combo->model()->match(combo->model()->index(0,0), Qt::DisplayRole, index.data(), 1, Qt::MatchExactly); - if ( countryIndex.size() >= 1 ) - { - combo->setCurrentIndex(countryIndex.at(0).row()); - } - + combo->setCurrentIndex(( countryIndex.size() >= 1 ) ? countryIndex.at(0).row() : -1); } return; } @@ -1824,10 +1820,14 @@ void QSOEditMapperDelegate::setModelData(QWidget *editor, if ( combo ) { int row = combo->currentIndex(); - const QModelIndex &idxDXCC = combo->model()->index(row,0); - const QModelIndex &idxCountryEN = combo->model()->index(row,2); - QVariant dataDXCC = combo->model()->data(idxDXCC); - QVariant dataCountryEN = combo->model()->data(idxCountryEN); + QVariant dataDXCC; + QVariant dataCountryEN; + + if ( row > 0 ) // the first line is an empty line + { + dataDXCC = combo->model()->data(combo->model()->index(row,0)); + dataCountryEN = combo->model()->data(combo->model()->index(row,2)); + } model->setData(index, dataDXCC); model->setData(model->index(index.row(), From 1363873b5421528ce5fee49950229ffb7e472d7f Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 11 Sep 2024 20:41:14 +0200 Subject: [PATCH 09/74] Fixed #459 - ADIF Import: Improved a condition when DXCC is updated --- logformat/LogFormat.cpp | 59 ++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/logformat/LogFormat.cpp b/logformat/LogFormat.cpp index 7db32eff..7c110874 100644 --- a/logformat/LogFormat.cpp +++ b/logformat/LogFormat.cpp @@ -401,37 +401,42 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, int recordDXCCId = record.value(RECORDIDX(LogbookModel::COLUMN_DXCC)).toInt(); // 0 = NAN or not present // otherwise = DXCC ID - const DxccEntity &entity = ( recordDXCCId != 0 ) ? Data::instance()->lookupDxccID(recordDXCCId) - : Data::instance()->lookupDxcc(call.toString()); - - if ( entity.dxcc == 0 ) // DXCC not found + if ( recordDXCCId != 0 || updateDxcc ) { - writeImportLog(importLogStream, - (updateDxcc) ? ERROR_SEVERITY : WARNING_SEVERITY, - processedRec, - record, - tr("Cannot find DXCC Entity Info")); - ( updateDxcc ) ? (*errors)++ - : (*warnings)++; - if ( updateDxcc ) - continue; - } - else - { - record.setValue(RECORDIDX(LogbookModel::COLUMN_DXCC), entity.dxcc); - record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY), Data::removeAccents(entity.country)); - record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY_INTL), entity.country); + const DxccEntity &entity = ( updateDxcc ) ? Data::instance()->lookupDxcc(call.toString()) + : Data::instance()->lookupDxccID(recordDXCCId); - // other DXCC related values ​​are not closely related to DXCC value and could have been filled - // therefore check if it is present or not. - if ( record.value(RECORDIDX(LogbookModel::COLUMN_CONTINENT)).toString().isEmpty() ) - record.setValue(RECORDIDX(LogbookModel::COLUMN_CONTINENT), entity.cont); + if ( entity.dxcc == 0 ) // DXCC not found + { + writeImportLog(importLogStream, + (updateDxcc) ? ERROR_SEVERITY : WARNING_SEVERITY, + processedRec, + record, + tr("Cannot find DXCC Entity Info")); + if ( updateDxcc ) + { + (*errors)++; + continue; + } + (*warnings)++; + } + else + { + record.setValue(RECORDIDX(LogbookModel::COLUMN_DXCC), entity.dxcc); + record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY), Data::removeAccents(entity.country)); + record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY_INTL), entity.country); - if ( record.value(RECORDIDX(LogbookModel::COLUMN_ITUZ)).toString().isEmpty() ) - record.setValue(RECORDIDX(LogbookModel::COLUMN_ITUZ), QString::number(entity.ituz)); + // other DXCC related values ​​are not closely related to DXCC value and could have been filled + // therefore check if it is present or not. + if ( record.value(RECORDIDX(LogbookModel::COLUMN_CONTINENT)).toString().isEmpty() ) + record.setValue(RECORDIDX(LogbookModel::COLUMN_CONTINENT), entity.cont); - if ( record.value(RECORDIDX(LogbookModel::COLUMN_CQZ)).toString().isEmpty() ) - record.setValue(RECORDIDX(LogbookModel::COLUMN_CQZ), QString::number(entity.cqz)); + if ( record.value(RECORDIDX(LogbookModel::COLUMN_ITUZ)).toString().isEmpty() ) + record.setValue(RECORDIDX(LogbookModel::COLUMN_ITUZ), QString::number(entity.ituz)); + + if ( record.value(RECORDIDX(LogbookModel::COLUMN_CQZ)).toString().isEmpty() ) + record.setValue(RECORDIDX(LogbookModel::COLUMN_CQZ), QString::number(entity.cqz)); + } } if ( record.value(RECORDIDX(LogbookModel::COLUMN_PREFIX)).toString().isEmpty() ) From 73db0b1fb1de7210fd1b57db4a02cec7da729d21 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 11 Sep 2024 15:28:11 +0200 Subject: [PATCH 10/74] ADI: code tuning - const ref --- logformat/AdiFormat.cpp | 8 ++++---- logformat/AdiFormat.h | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/logformat/AdiFormat.cpp b/logformat/AdiFormat.cpp index 8fadea5c..d5b4c1d6 100644 --- a/logformat/AdiFormat.cpp +++ b/logformat/AdiFormat.cpp @@ -510,8 +510,8 @@ void AdiFormat::preprocessINTLField(const QString &fieldName, // NOTE: If modify this, modify also function below!!!! - QVariant fld = contact.value(fieldName); - QVariant fldIntl = contact.value(fieldIntlName); + const QVariant &fld = contact.value(fieldName); + const QVariant &fldIntl = contact.value(fieldIntlName); /* In general, it is a hack because ADI must not contain * _INTL fields. But some applications generate _INTL fields in ADI files @@ -547,8 +547,8 @@ void AdiFormat::preprocessINTLField(const QString &fieldName, FCT_IDENTIFICATION; // NOTE: If modify this, modify also function above!!!! - QVariant fld = contact.value(fieldName); - QVariant fldIntl = contact.value(fieldIntlName); + const QVariant &fld = contact.value(fieldName); + const QVariant &fldIntl = contact.value(fieldIntlName); /* In general, it is a hack because ADI must not contain * _INTL fields. But some applications generate _INTL fields in ADI files diff --git a/logformat/AdiFormat.h b/logformat/AdiFormat.h index fa443a1f..71b06205 100644 --- a/logformat/AdiFormat.h +++ b/logformat/AdiFormat.h @@ -22,11 +22,9 @@ class AdiFormat : public LogFormat static void preprocessINTLFields(T &contact) { { - QStringList fieldMappingList = fieldname2INTLNameMapping.keys(); - for ( const QString& fieldName : qAsConst(fieldMappingList) ) - { + const QStringList &fieldMappingList = fieldname2INTLNameMapping.keys(); + for ( const QString& fieldName : fieldMappingList ) preprocessINTLField(fieldName, fieldname2INTLNameMapping.value(fieldName), contact); - } } } From a2df3d281675e61dc7817bee7c692d4b0a370395 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 13:48:36 +0200 Subject: [PATCH 11/74] Fixed #461 - ADIF import incorrectly uses Station Profile --- logformat/LogFormat.cpp | 291 +++++++++++++++++++++++++++++++--------- logformat/LogFormat.h | 4 + ui/ImportDialog.cpp | 74 +--------- 3 files changed, 240 insertions(+), 129 deletions(-) diff --git a/logformat/LogFormat.cpp b/logformat/LogFormat.cpp index 7c110874..0693b53b 100644 --- a/logformat/LogFormat.cpp +++ b/logformat/LogFormat.cpp @@ -239,6 +239,7 @@ void LogFormat::setDuplicateQSOCallback(duplicateQSOBehaviour (*func)(QSqlRecord #define RECORDIDX(a) ( (a) - 1 ) unsigned long LogFormat::runImport(QTextStream& importLogStream, + const StationProfile *defaultStationProfile, unsigned long *warnings, unsigned long *errors) { @@ -265,6 +266,7 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, return 0; } + QSqlDatabase::database().transaction(); QSqlTableModel model; @@ -272,7 +274,68 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, model.removeColumn(model.fieldIndex("id")); QSqlRecord record = model.record(); duplicateQSOBehaviour dupSetting = LogFormat::ASK_NEXT; -; + + auto setIfEmpty = [&](int column, const QString &value) + { + if ( record.value(RECORDIDX(column)).toString().isEmpty() && !value.isEmpty() ) + record.setValue(RECORDIDX(column), value); + }; + + auto setMyDefaultProfile = [&]() + { + setIfEmpty(LogbookModel::COLUMN_MY_DXCC, QString::number(defaultStationProfile->dxcc)); + setIfEmpty(LogbookModel::COLUMN_STATION_CALLSIGN, defaultStationProfile->callsign); + setIfEmpty(LogbookModel::COLUMN_MY_GRIDSQUARE, defaultStationProfile->locator); + setIfEmpty(LogbookModel::COLUMN_MY_NAME, defaultStationProfile->operatorName); + setIfEmpty(LogbookModel::COLUMN_MY_CITY_INTL, defaultStationProfile->qthName); + setIfEmpty(LogbookModel::COLUMN_MY_CITY, Data::removeAccents(defaultStationProfile->qthName)); + setIfEmpty(LogbookModel::COLUMN_MY_IOTA, defaultStationProfile->iota); + setIfEmpty(LogbookModel::COLUMN_MY_POTA_REF, defaultStationProfile->pota); + setIfEmpty(LogbookModel::COLUMN_MY_SOTA_REF, defaultStationProfile->sota); + setIfEmpty(LogbookModel::COLUMN_MY_SIG_INTL, defaultStationProfile->sig); + setIfEmpty(LogbookModel::COLUMN_MY_SIG, Data::removeAccents(defaultStationProfile->sig)); + setIfEmpty(LogbookModel::COLUMN_MY_SIG_INFO_INTL, defaultStationProfile->sigInfo); + setIfEmpty(LogbookModel::COLUMN_MY_SIG_INFO, Data::removeAccents(defaultStationProfile->sigInfo)); + setIfEmpty(LogbookModel::COLUMN_MY_VUCC_GRIDS, defaultStationProfile->vucc); + setIfEmpty(LogbookModel::COLUMN_MY_ITU_ZONE, QString::number(defaultStationProfile->ituz)); + setIfEmpty(LogbookModel::COLUMN_MY_CQ_ZONE, QString::number(defaultStationProfile->cqz)); + setIfEmpty(LogbookModel::COLUMN_MY_COUNTRY_INTL, defaultStationProfile->country); + setIfEmpty(LogbookModel::COLUMN_MY_COUNTRY, Data::removeAccents(defaultStationProfile->country)); + }; + + auto setMyEntity = [&](const DxccEntity &myEntity) + { + // force overwrite + record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_DXCC), myEntity.dxcc); + record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_COUNTRY), Data::removeAccents(myEntity.country)); + record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_COUNTRY_INTL), myEntity.country); + + // other DXCC related values ​​are not closely related to DXCC value and could have been filled + // therefore check if it is present or not. + setIfEmpty(LogbookModel::COLUMN_MY_ITU_ZONE, QString::number(myEntity.ituz)); + setIfEmpty(LogbookModel::COLUMN_MY_CQ_ZONE, QString::number(myEntity.cqz)); + }; + + auto lookupAndSetMyEntityByCallsign = [&] (const QString& recordMyDXCC) + { + const DxccEntity &myEntity = Data::instance()->lookupDxcc(recordMyDXCC); + + if ( myEntity.dxcc == 0 ) // My DXCC not found + { + writeImportLog(importLogStream, + WARNING_SEVERITY, + errors, + warnings, + processedRec, + record, + tr("Cannot find My DXCC Entity Info")); + } + else + { + setMyEntity(myEntity); + } + }; + if ( !insertQuery.prepare( QSqlDatabase::database().driver()->sqlStatement(QSqlDriver::InsertStatement, "contacts", record, @@ -290,6 +353,10 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, processedRec++; + /* Compute the Band if missing + * Band is one of the mandatory fields + */ + if ( record.value(RECORDIDX(LogbookModel::COLUMN_BAND)).toString().isEmpty() && !record.value(RECORDIDX(LogbookModel::COLUMN_FREQUENCY)).toString().isEmpty() ) { @@ -311,17 +378,17 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, if ( !start_time.isValid() || call.toString().isEmpty() || band.toString().isEmpty() - || mode.toString().isEmpty() - || mycall.toString().isEmpty() ) + || mode.toString().isEmpty()) { writeImportLog(importLogStream, ERROR_SEVERITY, + errors, + warnings, processedRec, record, tr("A minimal set of fields not present (start_time, call, band, mode, station_callsign)")); qWarning() << "Import does not contain minimal set of fields (start_time, call, band, mode, station_callsign)"; qCDebug(runtime) << record; - (*errors)++; continue; } @@ -336,10 +403,11 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, { writeImportLog(importLogStream, WARNING_SEVERITY, + errors, + warnings, processedRec, record, tr("Outside the selected Date Range")); - (*warnings)++; continue; } } @@ -362,10 +430,11 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, { writeImportLog(importLogStream, WARNING_SEVERITY, + errors, + warnings, processedRec, record, tr("Duplicate")); - (*warnings)++; continue; } @@ -388,16 +457,22 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, case SKIP_ALL: writeImportLog(importLogStream, WARNING_SEVERITY, + errors, + warnings, processedRec, record, tr("Duplicate")); - (*warnings)++; continue; break; } } } + /* Adding information which are important for QLog or QLog knows/compute them */ + /************************/ + /* Add DXCC Entity Info */ + /************************/ + int recordDXCCId = record.value(RECORDIDX(LogbookModel::COLUMN_DXCC)).toInt(); // 0 = NAN or not present // otherwise = DXCC ID @@ -410,35 +485,145 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, { writeImportLog(importLogStream, (updateDxcc) ? ERROR_SEVERITY : WARNING_SEVERITY, + errors, + warnings, processedRec, record, tr("Cannot find DXCC Entity Info")); if ( updateDxcc ) - { - (*errors)++; continue; - } - (*warnings)++; } else { + // force overwrite record.setValue(RECORDIDX(LogbookModel::COLUMN_DXCC), entity.dxcc); record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY), Data::removeAccents(entity.country)); record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY_INTL), entity.country); // other DXCC related values ​​are not closely related to DXCC value and could have been filled // therefore check if it is present or not. - if ( record.value(RECORDIDX(LogbookModel::COLUMN_CONTINENT)).toString().isEmpty() ) - record.setValue(RECORDIDX(LogbookModel::COLUMN_CONTINENT), entity.cont); + setIfEmpty(LogbookModel::COLUMN_CONTINENT, entity.cont); + setIfEmpty(LogbookModel::COLUMN_ITUZ, QString::number(entity.ituz)); + setIfEmpty(LogbookModel::COLUMN_CQZ, QString::number(entity.cqz)); + } + } + else + { + writeImportLog(importLogStream, + WARNING_SEVERITY, + errors, + warnings, + processedRec, + record, + tr("DXCC Info is missing")); + } + + /************************/ + /* Add My Station Info */ + /************************/ + + int recordMyDXCCId = record.value(RECORDIDX(LogbookModel::COLUMN_MY_DXCC)).toInt(); // 0 = NAN or not present + // otherwise = DXCC ID + const QString &myCallString = mycall.toString(); - if ( record.value(RECORDIDX(LogbookModel::COLUMN_ITUZ)).toString().isEmpty() ) - record.setValue(RECORDIDX(LogbookModel::COLUMN_ITUZ), QString::number(entity.ituz)); + if ( defaultStationProfile ) + { + // default is enabled + + // Case 1: Both recordMyDXCCId and myCallString are empty + if ( recordMyDXCCId == 0 && myCallString.isEmpty() ) + { + setMyDefaultProfile(); + } + // Case 2: recordMyDXCCId is empty, myCallString is not + else if ( recordMyDXCCId == 0 ) + { + if ( defaultStationProfile->callsign == myCallString ) + setMyDefaultProfile(); + else + lookupAndSetMyEntityByCallsign(myCallString); + } + // Case 3: myCallString is empty, recordMyDXCCId is not + else if ( myCallString.isEmpty() ) + { + if ( defaultStationProfile->dxcc == recordMyDXCCId ) + setMyDefaultProfile(); + else + { + // no Station Callsign = ERROR + writeImportLog(importLogStream, + ERROR_SEVERITY, + errors, + warnings, + processedRec, + record, + tr("no Station Callsign present")); + continue; + } + } + // Case 4: Both recordMyDXCCId and myCallString are not empty + else + { + if ( defaultStationProfile->callsign == myCallString ) + { + if ( defaultStationProfile->dxcc == recordMyDXCCId ) + setMyDefaultProfile(); + else + { + // no Station Callsign = ERROR + writeImportLog(importLogStream, + ERROR_SEVERITY, + errors, + warnings, + processedRec, + record, + tr("no Station Callsign present")); + continue; + } + } + else + lookupAndSetMyEntityByCallsign(myCallString); + } + } + else + { + // default is disabled + if ( myCallString.isEmpty() ) + { + // no Station Callsign = ERROR + writeImportLog(importLogStream, + ERROR_SEVERITY, + errors, + warnings, + processedRec, + record, + tr("no Station Callsign present")); + continue; + } + else + { + const DxccEntity &myEntity = ( recordMyDXCCId != 0 ) ? Data::instance()->lookupDxccID(recordDXCCId) + : Data::instance()->lookupDxcc(myCallString); - if ( record.value(RECORDIDX(LogbookModel::COLUMN_CQZ)).toString().isEmpty() ) - record.setValue(RECORDIDX(LogbookModel::COLUMN_CQZ), QString::number(entity.cqz)); + if ( myEntity.dxcc == 0 ) // My DXCC not found + { + writeImportLog(importLogStream, + WARNING_SEVERITY, + errors, + warnings, + processedRec, + record, + tr("Cannot find My DXCC Entity Info")); + } + else + setMyEntity(myEntity); } } + /***********/ + /* Add PFX */ + /***********/ + if ( record.value(RECORDIDX(LogbookModel::COLUMN_PREFIX)).toString().isEmpty() ) { const QString &pfxRef = Callsign(call.toString()).getWPXPrefix(); @@ -449,6 +634,9 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, } } + /********************/ + /* Compute Distance */ + /********************/ const QString &gridsquare = record.value(RECORDIDX(LogbookModel::COLUMN_GRID)).toString(); const QString &my_gridsquare = record.value(RECORDIDX(LogbookModel::COLUMN_MY_GRIDSQUARE)).toString(); @@ -456,8 +644,8 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, && !my_gridsquare.isEmpty() && record.value(RECORDIDX(LogbookModel::COLUMN_DISTANCE)).toString().isEmpty() ) { - Gridsquare grid(gridsquare); - Gridsquare my_grid(my_gridsquare); + const Gridsquare grid(gridsquare); + const Gridsquare my_grid(my_gridsquare); double distance; if ( my_grid.distanceTo(grid, distance) ) @@ -466,7 +654,9 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, } } - + /*************************/ + /* Compute Alt from SOTA */ + /*************************/ if ( record.value(RECORDIDX(LogbookModel::COLUMN_ALTITUDE)).toString().isEmpty() && !sota.toString().isEmpty() ) { @@ -478,6 +668,9 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, } } + /*******************************/ + /* Compute My Alt from My SOTA */ + /*******************************/ if ( record.value(RECORDIDX(LogbookModel::COLUMN_MY_ALTITUDE)).toString().isEmpty() && !mysota.toString().isEmpty() ) { @@ -489,44 +682,9 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, } } - const DxccEntity &dxccEntity = Data::instance()->lookupDxcc(mycall.toString()); - - if ( dxccEntity.dxcc == 0 ) - { - writeImportLog(importLogStream, - ERROR_SEVERITY, - processedRec, - record, - tr("Cannot find own DXCC Entity Info")); - (*errors)++; - continue; - } - - if ( record.value(RECORDIDX(LogbookModel::COLUMN_MY_DXCC)).toString().isEmpty() ) - { - record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_DXCC), dxccEntity.dxcc); - } - - if ( record.value(RECORDIDX(LogbookModel::COLUMN_MY_ITU_ZONE)).toString().isEmpty() ) - { - record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_ITU_ZONE), dxccEntity.ituz); - } - - if ( record.value(RECORDIDX(LogbookModel::COLUMN_MY_CQ_ZONE)).toString().isEmpty() ) - { - record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_CQ_ZONE), dxccEntity.cqz); - } - - if ( record.value(RECORDIDX(LogbookModel::COLUMN_MY_COUNTRY_INTL)).toString().isEmpty() ) - { - record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_COUNTRY_INTL), dxccEntity.country); - } - - if ( record.value(RECORDIDX(LogbookModel::COLUMN_MY_COUNTRY)).toString().isEmpty() ) - { - record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_COUNTRY), Data::removeAccents(dxccEntity.country)); - } - + /******************/ + /* PREPARE INSERT */ + /******************/ // Bind all values for ( int i = 0; i < record.count(); i++ ) { @@ -537,17 +695,20 @@ unsigned long LogFormat::runImport(QTextStream& importLogStream, { writeImportLog(importLogStream, ERROR_SEVERITY, + errors, + warnings, processedRec, record, tr("Cannot insert to database") + " - " + insertQuery.lastError().text()); qWarning() << "Cannot insert a record to Contact Table - " << insertQuery.lastError(); qCDebug(runtime) << record; - (*errors)++; } else { writeImportLog(importLogStream, INFO_SEVERITY, + errors, + warnings, processedRec, record, tr("Imported")); @@ -932,7 +1093,10 @@ void LogFormat::writeImportLog(QTextStream &errorLogStream, ImportLogSeverity se errorLogStream << importLogSeverityToString(severity) << msg << "\n"; } -void LogFormat::writeImportLog(QTextStream& errorLogStream, ImportLogSeverity severity, +void LogFormat::writeImportLog(QTextStream& errorLogStream, + ImportLogSeverity severity, + unsigned long *error, + unsigned long *warning, const unsigned long recordNo, const QSqlRecord &record, const QString &msg) @@ -946,5 +1110,10 @@ void LogFormat::writeImportLog(QTextStream& errorLogStream, ImportLogSeverity se record.value("callsign").toString(), record.value("mode").toString()) << "\n"; + switch (severity) + { + case WARNING_SEVERITY: (*warning)++; break; + case ERROR_SEVERITY: (*error)++; break; + case INFO_SEVERITY: break; + } } - diff --git a/logformat/LogFormat.h b/logformat/LogFormat.h index 8daf4e8d..37263511 100644 --- a/logformat/LogFormat.h +++ b/logformat/LogFormat.h @@ -6,6 +6,7 @@ #include #include "core/LogLocale.h" +#include "data/StationProfile.h" class QSqlRecord; @@ -52,6 +53,7 @@ class LogFormat : public QObject { static LogFormat* open(Type type, QTextStream& stream); unsigned long runImport(QTextStream& errorLogStream, + const StationProfile *defaultStationProfile, unsigned long *warnings, unsigned long *errors); void runQSLImport(QSLFrom fromService); @@ -105,6 +107,8 @@ class LogFormat : public QObject { const QString &msg); void writeImportLog(QTextStream& errorLogStream, ImportLogSeverity severity, + unsigned long *error, + unsigned long *warning, const unsigned long recordNo, const QSqlRecord &record, const QString &msg); diff --git a/ui/ImportDialog.cpp b/ui/ImportDialog.cpp index 1716fffc..52272376 100644 --- a/ui/ImportDialog.cpp +++ b/ui/ImportDialog.cpp @@ -5,9 +5,7 @@ #include "logformat/LogFormat.h" #include "core/debug.h" #include "data/StationProfile.h" -#include "core/Gridsquare.h" #include "data/RigProfile.h" -#include "data/Data.h" MODULE_IDENTIFICATION("qlog.ui.importdialog"); @@ -232,7 +230,8 @@ void ImportDialog::saveImportDetails(const QString &importDetail, const QString } } -void ImportDialog::runImport() { +void ImportDialog::runImport() +{ FCT_IDENTIFICATION; if ( ui->fileEdit->text().isEmpty() ) @@ -260,70 +259,6 @@ void ImportDialog::runImport() { defaults["comment_intl"] = ui->commentEdit->text(); } - if ( ui->profileCheckBox->isChecked() - && selectedStationProfile != StationProfile() ) - { - if ( !selectedStationProfile.callsign.isEmpty() ) - { - defaults["station_callsign"] = selectedStationProfile.callsign.toUpper(); - } - - if ( !selectedStationProfile.locator.isEmpty() ) - { - defaults["my_gridsquare"] = selectedStationProfile.locator.toUpper(); - } - - if ( !selectedStationProfile.operatorName.isEmpty() ) - { - defaults["my_name_intl"] = selectedStationProfile.operatorName; - } - - if ( !selectedStationProfile.qthName.isEmpty() ) - { - defaults["my_city_intl"] = selectedStationProfile.qthName; - } - - if ( !selectedStationProfile.iota.isEmpty() ) - { - defaults["my_iota"] = Data::removeAccents(selectedStationProfile.iota.toUpper()); - } - - if ( !selectedStationProfile.sota.isEmpty() ) - { - defaults["my_sota_ref"] = Data::removeAccents(selectedStationProfile.sota.toUpper()); - } - - if ( !selectedStationProfile.sig.isEmpty() ) - { - defaults["my_sig_intl"] = Data::removeAccents(selectedStationProfile.sig); - } - - if ( !selectedStationProfile.sigInfo.isEmpty() ) - { - defaults["my_sig_info_intl"] = selectedStationProfile.sigInfo; - } - - if ( !selectedStationProfile.vucc.isEmpty() ) - { - defaults["my_vucc_grids"] = selectedStationProfile.vucc.toUpper(); - } - - if ( !selectedStationProfile.vucc.isEmpty() ) - { - defaults["my_wwff_ref"] = Data::removeAccents(selectedStationProfile.vucc.toUpper()); - } - - if ( !selectedStationProfile.pota.isEmpty() ) - { - defaults["my_pota_ref"] = Data::removeAccents(selectedStationProfile.pota.toUpper()); - } - - defaults["my_dxcc"] = QString::number(selectedStationProfile.dxcc); - defaults["my_itu_zone"] = QString::number(selectedStationProfile.ituz); - defaults["my_cq_zone"] = QString::number(selectedStationProfile.cqz); - defaults["my_country_intl"] = selectedStationProfile.country; - } - LogFormat* format = LogFormat::open(ui->typeSelect->currentText(), in); if (!format) { @@ -362,7 +297,10 @@ void ImportDialog::runImport() { unsigned long errors = 0L; unsigned long warnings = 0L; - int count = format->runImport(out, &warnings, &errors); + int count = format->runImport(out, + ( ui->profileCheckBox->isChecked() && selectedStationProfile != StationProfile() ) ?&selectedStationProfile: nullptr, + &warnings, + &errors); QString report = QObject::tr("Imported: %n contact(s)", "", count) + "
" + QObject::tr("Warning(s): %n", "", warnings) + "
" + From aea4d70e10193db0bb89f8fc855a7ba1986d0f00 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 14:31:43 +0200 Subject: [PATCH 12/74] Fixed #459 - NewContact: Improved a condition when DXCC is updated --- ui/NewContactWidget.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index 64693bdd..d979d08f 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -1050,7 +1050,6 @@ void NewContactWidget::addAddlFields(QSqlRecord &record, const StationProfile &p { FCT_IDENTIFICATION; - if ( record.value("pfx").toString().isEmpty() ) { const QString &pfxRef = Callsign(record.value("callsign").toString()).getWPXPrefix(); @@ -1712,13 +1711,17 @@ void NewContactWidget::saveExternalContact(QSqlRecord record) QSqlField idField = model.record().field(model.fieldIndex("id")); model.removeColumn(model.fieldIndex("id")); - const DxccEntity &dxcc = Data::instance()->lookupDxcc(savedCallsign); + // if DXCC field is present then it must be used as DXCC Entity + int recordDXCCId = record.value("dxcc").toInt(); // 0 = NAN or not present + // otherwise = DXCC ID + const DxccEntity &dxcc = ( recordDXCCId ) ? Data::instance()->lookupDxccID(recordDXCCId) + : Data::instance()->lookupDxcc(savedCallsign); if ( dxcc.dxcc != 0 ) { - if ( record.value("country_intl").toString().isEmpty() - && record.value("country").toString().isEmpty() ) - record.setValue("country_intl", dxcc.country); + // force overwrite + record.setValue("dxcc", dxcc.dxcc); + record.setValue("country_intl", dxcc.country); if ( record.value("cqz").toString().isEmpty() ) record.setValue("cqz", dxcc.cqz); @@ -1728,9 +1731,6 @@ void NewContactWidget::saveExternalContact(QSqlRecord record) if ( record.value("cont").toString().isEmpty() ) record.setValue("cont", dxcc.cont); - - if ( record.value("dxcc").toString().isEmpty() ) - record.setValue("dxcc", dxcc.dxcc); } // add information from callbook if it is a known callsign From ffb455160e4a0ed4a5b633c3a3e8cac0df987460 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 15:24:28 +0200 Subject: [PATCH 13/74] Started a new release --- Changelog | 2 ++ QLog.pro | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 6da4463c..4275259d 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,5 @@ +TBC - 0.39.0 + 2024/08/29 - 0.38.0 - [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu - [NEW] - DX Filter - Added Dedup Time/Freq difference setting (@aa5sh) diff --git a/QLog.pro b/QLog.pro index 96883365..26d816d7 100644 --- a/QLog.pro +++ b/QLog.pro @@ -10,7 +10,7 @@ greaterThan(QT_MAJOR_VERSION, 5): QT += widgets TARGET = qlog TEMPLATE = app -VERSION = 0.38.0 +VERSION = 0.39.0dev DEFINES += VERSION=\\\"$$VERSION\\\" From a899113b5bdfb834dd20a084bd36acabe9b7d323 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 15:25:32 +0200 Subject: [PATCH 14/74] Updated Changelog --- Changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog b/Changelog index 4275259d..bd64feca 100644 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ TBC - 0.39.0 +Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) 2024/08/29 - 0.38.0 - [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu From 437be504a3f78d0a0809295546f475519df75c55 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 15:26:30 +0200 Subject: [PATCH 15/74] Updated Changelog --- Changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog b/Changelog index bd64feca..ddfc6993 100644 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ TBC - 0.39.0 +- [CHANGED] - HamlibDrv - Added multiplatform reliable sleep Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) 2024/08/29 - 0.38.0 From 8da74b22efb55bb1c012e6409ed656746c4c39db Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 4 Sep 2024 15:05:01 +0200 Subject: [PATCH 16/74] Fixed crash when an unknown field is present (2) --- ui/NewContactWidget.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index 64693bdd..97afeeee 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -3397,6 +3397,9 @@ QWidget *NewContactDynamicWidgets::getEditor(int index) { FCT_IDENTIFICATION; + if ( !widgetMapping.contains(index) ) + return nullptr; + widgetMapping.value(index).editor->setHidden(false); widgetMapping.value(index).editor->setFocusPolicy(Qt::ClickFocus); return widgetMapping.value(index).editor; @@ -3434,6 +3437,9 @@ QString NewContactDynamicWidgets::getFieldLabelName4Index(int i) const { FCT_IDENTIFICATION; + if ( !widgetMapping.contains(i) ) + return QString(); + return widgetMapping.value(i).fieldLabelName; } From 60b5d42d784444b47a08fd9a1351cc9f1e7d044d Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 4 Sep 2024 16:16:30 +0200 Subject: [PATCH 17/74] Removed unused #include --- QLog.pro | 1 - core/AlertEvaluator.cpp | 1 - core/ClubLog.cpp | 1 - core/Fldigi.cpp | 1 - core/NetworkNotification.h | 1 - core/main.cpp | 3 +-- cwkey/CWKeyer.cpp | 1 - cwkey/drivers/CWDummyKey.cpp | 1 - cwkey/drivers/CWWinKey.cpp | 1 - data/Data.h | 1 - data/Dxcc.cpp | 1 - data/WsjtxEntry.h | 2 +- logformat/AdxFormat.cpp | 1 - models/AlertTableModel.cpp | 1 - models/ShortcutEditorModel.cpp | 1 - models/WsjtxTableModel.cpp | 4 +--- rotator/Rotator.h | 1 - ui/AwardsDialog.cpp | 1 - ui/DxWidget.cpp | 2 +- ui/DxWidget.h | 2 -- ui/DxccTableWidget.cpp | 1 - ui/HRDLogDialog.cpp | 1 - ui/ImportDialog.cpp | 1 - ui/LogbookWidget.cpp | 1 - ui/MainLayoutEditor.h | 2 -- ui/MainWindow.cpp | 3 --- ui/MainWindow.h | 1 - ui/NewContactWidget.cpp | 2 -- ui/NewContactWidget.h | 5 +++-- ui/OnlineMapWidget.cpp | 1 + ui/OnlineMapWidget.h | 1 - ui/QSOFilterDialog.cpp | 1 - ui/QrzDialog.cpp | 1 - ui/RigWidget.cpp | 1 - ui/SettingsDialog.cpp | 4 +--- ui/SettingsDialog.h | 2 +- 36 files changed, 10 insertions(+), 46 deletions(-) delete mode 100644 data/Dxcc.cpp diff --git a/QLog.pro b/QLog.pro index 26d816d7..8729b4ea 100644 --- a/QLog.pro +++ b/QLog.pro @@ -90,7 +90,6 @@ SOURCES += \ data/CWKeyProfile.cpp \ data/CWShortcutProfile.cpp \ data/Data.cpp \ - data/Dxcc.cpp \ data/MainLayoutProfile.cpp \ data/RigProfile.cpp \ data/RotProfile.cpp \ diff --git a/core/AlertEvaluator.cpp b/core/AlertEvaluator.cpp index 1298a8a6..237d112c 100644 --- a/core/AlertEvaluator.cpp +++ b/core/AlertEvaluator.cpp @@ -6,7 +6,6 @@ #include "debug.h" #include "data/DxSpot.h" #include "data/WsjtxEntry.h" -#include "data/StationProfile.h" #include "data/SpotAlert.h" #include "data/BandPlan.h" diff --git a/core/ClubLog.cpp b/core/ClubLog.cpp index e353a96f..fc417a3a 100644 --- a/core/ClubLog.cpp +++ b/core/ClubLog.cpp @@ -11,7 +11,6 @@ #include "ClubLog.h" #include "debug.h" #include "core/CredentialStore.h" -#include "core/Callsign.h" #define API_KEY "21507885dece41ca049fec7fe02a813f2105aff2" #define API_LIVE_UPLOAD_URL "https://clublog.org/realtime.php" diff --git a/core/Fldigi.cpp b/core/Fldigi.cpp index b46245a9..48b4a432 100644 --- a/core/Fldigi.cpp +++ b/core/Fldigi.cpp @@ -7,7 +7,6 @@ #include "Fldigi.h" #include "logformat/AdiFormat.h" #include "debug.h" -#include "data/StationProfile.h" MODULE_IDENTIFICATION("qlog.core.fldigi"); diff --git a/core/NetworkNotification.h b/core/NetworkNotification.h index 59583388..7ecc200f 100644 --- a/core/NetworkNotification.h +++ b/core/NetworkNotification.h @@ -8,7 +8,6 @@ #include "core/HostsPortString.h" #include "logformat/LogFormat.h" #include "data/DxSpot.h" -#include "Wsjtx.h" #include "data/WsjtxEntry.h" #include "data/SpotAlert.h" #include "data/WCYSpot.h" diff --git a/core/main.cpp b/core/main.cpp index e7bb75e3..836a7e17 100644 --- a/core/main.cpp +++ b/core/main.cpp @@ -22,12 +22,11 @@ #include "cwkey/CWKeyer.h" #include "AppGuard.h" #include "logformat/AdxFormat.h" -#include "ui/SettingsDialog.h" -#include "data/StationProfile.h" #include "core/zonedetect.h" #include "ui/SplashScreen.h" #include "core/MembershipQE.h" #include "core/KSTChat.h" +#include "data/Data.h" MODULE_IDENTIFICATION("qlog.core.main"); diff --git a/cwkey/CWKeyer.cpp b/cwkey/CWKeyer.cpp index bab41589..3b945ee9 100644 --- a/cwkey/CWKeyer.cpp +++ b/cwkey/CWKeyer.cpp @@ -7,7 +7,6 @@ #include "cwkey/drivers/CWFldigiKey.h" #include "core/debug.h" #include "data/CWKeyProfile.h" -#include "rig/Rig.h" MODULE_IDENTIFICATION("qlog.cwkey.cwkeyer"); diff --git a/cwkey/drivers/CWDummyKey.cpp b/cwkey/drivers/CWDummyKey.cpp index 1cf5d1a6..389dea6e 100644 --- a/cwkey/drivers/CWDummyKey.cpp +++ b/cwkey/drivers/CWDummyKey.cpp @@ -1,6 +1,5 @@ #include "CWDummyKey.h" #include "core/debug.h" -#include "rig/Rig.h" MODULE_IDENTIFICATION("qlog.cwkey.driver.cwdummykey"); diff --git a/cwkey/drivers/CWWinKey.cpp b/cwkey/drivers/CWWinKey.cpp index 399e62ad..0899bc00 100644 --- a/cwkey/drivers/CWWinKey.cpp +++ b/cwkey/drivers/CWWinKey.cpp @@ -2,7 +2,6 @@ #include "CWWinKey.h" #include "core/debug.h" -#include "rig/Rig.h" /* Based on WinKey v2 Spec: https://k1el.tripod.com/WinkeyUSBman.pdf */ diff --git a/data/Data.h b/data/Data.h index c169d59d..a6e31014 100644 --- a/data/Data.h +++ b/data/Data.h @@ -7,7 +7,6 @@ #include "SOTAEntity.h" #include "WWFFEntity.h" #include "POTAEntity.h" -#include "Band.h" #include "core/zonedetect.h" class Data : public QObject diff --git a/data/Dxcc.cpp b/data/Dxcc.cpp deleted file mode 100644 index 78c86736..00000000 --- a/data/Dxcc.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "Dxcc.h" diff --git a/data/WsjtxEntry.h b/data/WsjtxEntry.h index 056fbbdd..c3c13d3f 100644 --- a/data/WsjtxEntry.h +++ b/data/WsjtxEntry.h @@ -2,8 +2,8 @@ #define QLOG_DATA_WSJTXENTRY_H #include "core/Wsjtx.h" -#include "data/Data.h" #include "core/MembershipQE.h" +#include "data/Dxcc.h" struct WsjtxEntry { WsjtxDecode decode; diff --git a/logformat/AdxFormat.cpp b/logformat/AdxFormat.cpp index 08f93fda..cfe95ac0 100644 --- a/logformat/AdxFormat.cpp +++ b/logformat/AdxFormat.cpp @@ -3,7 +3,6 @@ #include "logformat/AdxFormat.h" #include "logformat/AdiFormat.h" #include "core/debug.h" -#include "data/Data.h" MODULE_IDENTIFICATION("qlog.logformat.adxformat"); diff --git a/models/AlertTableModel.cpp b/models/AlertTableModel.cpp index 40d51d4d..40b68939 100644 --- a/models/AlertTableModel.cpp +++ b/models/AlertTableModel.cpp @@ -1,6 +1,5 @@ #include #include "AlertTableModel.h" -#include "core/debug.h" #include "data/Data.h" #include "rig/macros.h" diff --git a/models/ShortcutEditorModel.cpp b/models/ShortcutEditorModel.cpp index 69c66a58..51b69310 100644 --- a/models/ShortcutEditorModel.cpp +++ b/models/ShortcutEditorModel.cpp @@ -1,5 +1,4 @@ #include "ShortcutEditorModel.h" -#include "core/debug.h" ShortcutEditorModel::ShortcutEditorModel(const QList &actions, const QStringList &builtInStaticActions, diff --git a/models/WsjtxTableModel.cpp b/models/WsjtxTableModel.cpp index 4f23402e..62baff8a 100644 --- a/models/WsjtxTableModel.cpp +++ b/models/WsjtxTableModel.cpp @@ -1,8 +1,6 @@ #include #include "WsjtxTableModel.h" -#include "core/debug.h" -#include "data/StationProfile.h" -#include "core/Gridsquare.h" +#include "data/Data.h" bool operator==(const WsjtxEntry& a, const WsjtxEntry& b) { diff --git a/rotator/Rotator.h b/rotator/Rotator.h index fe97ef92..355c2666 100644 --- a/rotator/Rotator.h +++ b/rotator/Rotator.h @@ -3,7 +3,6 @@ #include #include "data/RotProfile.h" -#include "core/SerialPort.h" #include "rotator/drivers/GenericRotDrv.h" #include "RotCaps.h" diff --git a/ui/AwardsDialog.cpp b/ui/AwardsDialog.cpp index 29e02164..f642b2a9 100644 --- a/ui/AwardsDialog.cpp +++ b/ui/AwardsDialog.cpp @@ -5,7 +5,6 @@ #include "models/SqlListModel.h" #include "core/debug.h" #include "data/Band.h" -#include "data/Data.h" #include "data/BandPlan.h" #include MODULE_IDENTIFICATION("qlog.ui.awardsdialog"); diff --git a/ui/DxWidget.cpp b/ui/DxWidget.cpp index 2710ad90..225695a5 100644 --- a/ui/DxWidget.cpp +++ b/ui/DxWidget.cpp @@ -12,13 +12,13 @@ #include #include #endif +#include #include "DxWidget.h" #include "ui_DxWidget.h" #include "data/Data.h" #include "DxFilterDialog.h" #include "models/SqlListModel.h" -#include "ui/StyleItemDelegate.h" #include "core/debug.h" #include "data/StationProfile.h" #include "data/WCYSpot.h" diff --git a/ui/DxWidget.h b/ui/DxWidget.h index 8208ecdf..575d52ed 100644 --- a/ui/DxWidget.h +++ b/ui/DxWidget.h @@ -7,12 +7,10 @@ #include #include -#include "data/Data.h" #include "data/DxSpot.h" #include "data/WCYSpot.h" #include "data/WWVSpot.h" #include "data/ToAllSpot.h" -#include "ui/SwitchButton.h" #include "core/LogLocale.h" #include "core/DxServerString.h" diff --git a/ui/DxccTableWidget.cpp b/ui/DxccTableWidget.cpp index db8b0fbb..15633887 100644 --- a/ui/DxccTableWidget.cpp +++ b/ui/DxccTableWidget.cpp @@ -9,7 +9,6 @@ #include "DxccTableWidget.h" #include "core/debug.h" #include "data/StationProfile.h" -#include "data/Data.h" #include "data/BandPlan.h" MODULE_IDENTIFICATION("qlog.ui.dxcctablewidget"); diff --git a/ui/HRDLogDialog.cpp b/ui/HRDLogDialog.cpp index ac84de94..eadcc2c8 100644 --- a/ui/HRDLogDialog.cpp +++ b/ui/HRDLogDialog.cpp @@ -7,7 +7,6 @@ #include "HRDLogDialog.h" #include "ui_HRDLogDialog.h" #include "models/SqlListModel.h" -#include "logformat/AdiFormat.h" #include "core/debug.h" #include "ui/ShowUploadDialog.h" #include "core/HRDLog.h" diff --git a/ui/ImportDialog.cpp b/ui/ImportDialog.cpp index 1716fffc..aed42588 100644 --- a/ui/ImportDialog.cpp +++ b/ui/ImportDialog.cpp @@ -5,7 +5,6 @@ #include "logformat/LogFormat.h" #include "core/debug.h" #include "data/StationProfile.h" -#include "core/Gridsquare.h" #include "data/RigProfile.h" #include "data/Data.h" diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index 1372088b..44dd083f 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -21,7 +21,6 @@ #include "ui/ExportDialog.h" #include "core/Eqsl.h" #include "ui/PaperQSLDialog.h" -#include "core/NetworkNotification.h" #include "ui/QSODetailDialog.h" #include "core/MembershipQE.h" #include "core/GenericCallbook.h" diff --git a/ui/MainLayoutEditor.h b/ui/MainLayoutEditor.h index aec73f8f..496daa94 100644 --- a/ui/MainLayoutEditor.h +++ b/ui/MainLayoutEditor.h @@ -4,8 +4,6 @@ #include #include #include -#include "models/LogbookModel.h" -#include "core/debug.h" #include "ui/NewContactWidget.h" #include "data/MainLayoutProfile.h" diff --git a/ui/MainWindow.cpp b/ui/MainWindow.cpp index 81478e64..debb83c5 100644 --- a/ui/MainWindow.cpp +++ b/ui/MainWindow.cpp @@ -13,7 +13,6 @@ #include "rotator/Rotator.h" #include "cwkey/CWKeyer.h" #include "core/Wsjtx.h" -#include "data/Data.h" #include "core/debug.h" #include "ui/NewContactWidget.h" #include "ui/QSOFilterDialog.h" @@ -24,8 +23,6 @@ #include "core/Lotw.h" #include "core/Eqsl.h" #include "core/QRZ.h" -#include "core/CredentialStore.h" -#include "AlertSettingDialog.h" #include "core/PropConditions.h" #include "data/MainLayoutProfile.h" #include "ui/EditLayoutDialog.h" diff --git a/ui/MainWindow.h b/ui/MainWindow.h index 7a84fc67..e05668ce 100644 --- a/ui/MainWindow.h +++ b/ui/MainWindow.h @@ -7,7 +7,6 @@ #include "core/NetworkNotification.h" #include "core/AlertEvaluator.h" #include "core/PropConditions.h" -#include "core/MembershipQE.h" #include "core/ClubLog.h" namespace Ui { diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index 97afeeee..dbb12d5c 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -16,8 +16,6 @@ #include "core/debug.h" #include "core/Gridsquare.h" #include "data/StationProfile.h" -#include "core/HamQTH.h" -#include "core/QRZ.h" #include "data/RigProfile.h" #include "data/AntProfile.h" #include "data/CWKeyProfile.h" diff --git a/ui/NewContactWidget.h b/ui/NewContactWidget.h index aa62337a..0717111e 100644 --- a/ui/NewContactWidget.h +++ b/ui/NewContactWidget.h @@ -11,8 +11,6 @@ #include #include -#include "data/Data.h" -#include "core/Gridsquare.h" #include "data/DxSpot.h" #include "rig/Rig.h" #include "core/CallbookManager.h" @@ -23,6 +21,9 @@ #include "ui/EditLine.h" #include "data/BandPlan.h" #include "core/MultiselectCompleter.h" +#include "data/POTAEntity.h" +#include "data/SOTAEntity.h" +#include "data/WWFFEntity.h" namespace Ui { class NewContactWidget; diff --git a/ui/OnlineMapWidget.cpp b/ui/OnlineMapWidget.cpp index 86cc245d..2a7597dc 100644 --- a/ui/OnlineMapWidget.cpp +++ b/ui/OnlineMapWidget.cpp @@ -19,6 +19,7 @@ #include "rotator/Rotator.h" #include "rig/Rig.h" #include "data/BandPlan.h" +#include "rig/macros.h" MODULE_IDENTIFICATION("qlog.ui.onlinemapwidget"); diff --git a/ui/OnlineMapWidget.h b/ui/OnlineMapWidget.h index e1dde292..cd7594bc 100644 --- a/ui/OnlineMapWidget.h +++ b/ui/OnlineMapWidget.h @@ -11,7 +11,6 @@ #include "ui/NewContactWidget.h" #include "core/KSTChat.h" #include "data/WsjtxEntry.h" -#include "core/Wsjtx.h" namespace Ui { class OnlineMapWidget; diff --git a/ui/QSOFilterDialog.cpp b/ui/QSOFilterDialog.cpp index 74e6b766..4734eb37 100644 --- a/ui/QSOFilterDialog.cpp +++ b/ui/QSOFilterDialog.cpp @@ -2,7 +2,6 @@ #include #include #include -#include "models/SqlListModel.h" #include "QSOFilterDialog.h" #include "ui_QSOFilterDialog.h" #include "core/debug.h" diff --git a/ui/QrzDialog.cpp b/ui/QrzDialog.cpp index 5f240718..7d13283f 100644 --- a/ui/QrzDialog.cpp +++ b/ui/QrzDialog.cpp @@ -11,7 +11,6 @@ #include "core/QRZ.h" #include "models/SqlListModel.h" #include "ui/ShowUploadDialog.h" -#include "logformat/AdiFormat.h" #include "data/StationProfile.h" MODULE_IDENTIFICATION("qlog.ui.qrzdialog"); diff --git a/ui/RigWidget.cpp b/ui/RigWidget.cpp index aede933b..5ccb98b5 100644 --- a/ui/RigWidget.cpp +++ b/ui/RigWidget.cpp @@ -8,7 +8,6 @@ #include "ui_RigWidget.h" #include "rig/macros.h" #include "core/debug.h" -#include "models/SqlListModel.h" #include "data/Data.h" #include "core/HRDLog.h" #include "data/BandPlan.h" diff --git a/ui/SettingsDialog.cpp b/ui/SettingsDialog.cpp index 1bfaadb8..ba3e31f1 100644 --- a/ui/SettingsDialog.cpp +++ b/ui/SettingsDialog.cpp @@ -18,14 +18,12 @@ #include "../core/HRDLog.h" #include "../ui/StyleItemDelegate.h" #include "core/debug.h" -#include "core/CredentialStore.h" #include "data/StationProfile.h" #include "data/RigProfile.h" #include "data/AntProfile.h" #include "data/Data.h" #include "core/Gridsquare.h" #include "core/Wsjtx.h" -#include "core/QSLStorage.h" #include "core/NetworkNotification.h" #include "rig/Rig.h" #include "rig/RigCaps.h" @@ -33,7 +31,6 @@ #include "rotator/RotCaps.h" #include "core/LogParam.h" #include "core/Callsign.h" -#include "cwkey/CWKeyer.h" #include "core/MembershipQE.h" #include "models/SqlListModel.h" #include "core/GenericCallbook.h" @@ -41,6 +38,7 @@ #include "core/HostsPortString.h" #include "models/ShortcutEditorModel.h" #include "ui/StyleItemDelegate.h" +#include "core/SerialPort.h" #define STACKED_WIDGET_SERIAL_SETTING 0 #define STACKED_WIDGET_NETWORK_SETTING 1 diff --git a/ui/SettingsDialog.h b/ui/SettingsDialog.h index 1a5e2b97..8c5dce4e 100644 --- a/ui/SettingsDialog.h +++ b/ui/SettingsDialog.h @@ -18,9 +18,9 @@ #include "data/CWShortcutProfile.h" #include "data/RotUsrButtonsProfile.h" #include "core/LogLocale.h" -#include "rig/Rig.h" #include "ui/MainWindow.h" #include "core/MultiselectCompleter.h" +#include "rig/RigCaps.h" namespace Ui { class SettingsDialog; From 77bf9e10a93278f9ddd16a8426d07586a137b191 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 4 Sep 2024 16:56:47 +0200 Subject: [PATCH 18/74] Moved global connects from widgets to MainWindow --- ui/CWConsoleWidget.cpp | 5 ----- ui/CWConsoleWidget.h | 8 ++++---- ui/MainWindow.cpp | 21 +++++++++++++++++++++ ui/NewContactWidget.cpp | 15 --------------- ui/RigWidget.cpp | 11 ----------- ui/RotatorWidget.cpp | 4 ---- 6 files changed, 25 insertions(+), 39 deletions(-) diff --git a/ui/CWConsoleWidget.cpp b/ui/CWConsoleWidget.cpp index 0ecb3199..c61821b7 100644 --- a/ui/CWConsoleWidget.cpp +++ b/ui/CWConsoleWidget.cpp @@ -31,11 +31,6 @@ CWConsoleWidget::CWConsoleWidget(QWidget *parent) : refreshKeyProfileCombo(); refreshShortcutProfileCombo(); - connect(CWKeyer::instance(), &CWKeyer::cwKeyConnected, this, &CWConsoleWidget::cwKeyConnected); - connect(CWKeyer::instance(), &CWKeyer::cwKeyDisconnected, this, &CWConsoleWidget::cwKeyDisconnected); - connect(Rig::instance(), &Rig::rigConnected, this, &CWConsoleWidget::rigConnectHandler); - connect(Rig::instance(), &Rig::rigDisconnected, this, &CWConsoleWidget::rigDisconnectHandler); - connect(ui->modeSwitch, &SwitchButton::stateChanged, this, &CWConsoleWidget::sendWordSwitched); sendWord = getSendWordConfig(); diff --git a/ui/CWConsoleWidget.h b/ui/CWConsoleWidget.h index a206b3ef..40d0141e 100644 --- a/ui/CWConsoleWidget.h +++ b/ui/CWConsoleWidget.h @@ -30,18 +30,18 @@ public slots: void cwKeySpeedDecrease(); void cwShortcutProfileIncrease(); void cwShortcutProfileDecrease(); + void rigDisconnectHandler(); + void rigConnectHandler(); + void cwKeyConnected(QString); + void cwKeyDisconnected(); private slots: void cwKeyProfileComboChanged(QString); void cwShortcutProfileComboChanged(QString); void refreshKeyProfileCombo(); void refreshShortcutProfileCombo(); - void cwKeyConnected(QString); - void cwKeyDisconnected(); void cwKeySpeedChanged(int); void cwSendButtonPressed(bool insertNewLine = true); - void rigDisconnectHandler(); - void rigConnectHandler(); void cwKeyMacroF1(); void cwKeyMacroF2(); void cwKeyMacroF3(); diff --git a/ui/MainWindow.cpp b/ui/MainWindow.cpp index debb83c5..08120a4b 100644 --- a/ui/MainWindow.cpp +++ b/ui/MainWindow.cpp @@ -137,16 +137,37 @@ MainWindow::MainWindow(QWidget* parent) : connect(Rig::instance(), &Rig::rigCWKeyCloseRequest, this, &MainWindow::cwKeyerDisconnectProfile); connect(Rig::instance(), &Rig::frequencyChanged, ui->onlineMapWidget, &OnlineMapWidget::setIBPBand); connect(Rig::instance(), &Rig::frequencyChanged, ui->bandmapWidget , &BandmapWidget::updateTunedFrequency); + connect(Rig::instance(), &Rig::frequencyChanged, ui->newContactWidget, &NewContactWidget::changeFrequency); + connect(Rig::instance(), &Rig::frequencyChanged, ui->rigWidget, &RigWidget::updateFrequency); connect(Rig::instance(), &Rig::modeChanged, ui->bandmapWidget, &BandmapWidget::updateMode); + connect(Rig::instance(), &Rig::modeChanged, ui->newContactWidget, &NewContactWidget::changeModefromRig); + connect(Rig::instance(), &Rig::modeChanged, ui->rigWidget, &RigWidget::updateMode); + connect(Rig::instance(), &Rig::powerChanged, ui->newContactWidget, &NewContactWidget::changePower); + connect(Rig::instance(), &Rig::powerChanged, ui->rigWidget, &RigWidget::updatePWR); + connect(Rig::instance(), &Rig::rigConnected, ui->newContactWidget, &NewContactWidget::rigConnected); + connect(Rig::instance(), &Rig::rigConnected, ui->rigWidget, &RigWidget::rigConnected); + connect(Rig::instance(), &Rig::rigConnected, ui->cwconsoleWidget, &CWConsoleWidget::rigConnectHandler); + connect(Rig::instance(), &Rig::rigDisconnected, ui->cwconsoleWidget, &CWConsoleWidget::rigDisconnectHandler); + connect(Rig::instance(), &Rig::rigDisconnected, ui->newContactWidget, &NewContactWidget::rigDisconnected); + connect(Rig::instance(), &Rig::rigDisconnected, ui->rigWidget, &RigWidget::rigDisconnected); + connect(Rig::instance(), &Rig::vfoChanged, ui->rigWidget, &RigWidget::updateVFO); + connect(Rig::instance(), &Rig::xitChanged, ui->rigWidget, &RigWidget::updateXIT); + connect(Rig::instance(), &Rig::ritChanged, ui->rigWidget, &RigWidget::updateRIT); + connect(Rig::instance(), &Rig::pttChanged, ui->rigWidget, &RigWidget::updatePTT); connect(Rotator::instance(), &Rotator::rotErrorPresent, this, &MainWindow::rotErrorHandler); connect(Rotator::instance(), &Rotator::positionChanged, ui->onlineMapWidget, &OnlineMapWidget::antPositionChanged); connect(Rotator::instance(), &Rotator::rotConnected, ui->onlineMapWidget, &OnlineMapWidget::rotConnected); connect(Rotator::instance(), &Rotator::rotDisconnected, ui->onlineMapWidget, &OnlineMapWidget::rotDisconnected); + connect(Rotator::instance(), &Rotator::positionChanged, ui->rotatorWidget, &RotatorWidget::positionChanged); + connect(Rotator::instance(), &Rotator::rotConnected, ui->rotatorWidget, &RotatorWidget::rotConnected); + connect(Rotator::instance(), &Rotator::rotDisconnected, ui->rotatorWidget, &RotatorWidget::rotDisconnected); connect(CWKeyer::instance(), &CWKeyer::cwKeyerError, this, &MainWindow::cwKeyerErrorHandler); connect(CWKeyer::instance(), &CWKeyer::cwKeyWPMChanged, ui->cwconsoleWidget, &CWConsoleWidget::setWPM); connect(CWKeyer::instance(), &CWKeyer::cwKeyEchoText, ui->cwconsoleWidget, &CWConsoleWidget::appendCWEchoText); + connect(CWKeyer::instance(), &CWKeyer::cwKeyConnected, ui->cwconsoleWidget, &CWConsoleWidget::cwKeyConnected); + connect(CWKeyer::instance(), &CWKeyer::cwKeyDisconnected, ui->cwconsoleWidget, &CWConsoleWidget::cwKeyDisconnected); Fldigi* fldigi = new Fldigi(this); connect(fldigi, &Fldigi::addContact, ui->newContactWidget, &NewContactWidget::saveExternalContact); diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index dbb12d5c..d56a270d 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -184,21 +184,6 @@ NewContactWidget::NewContactWidget(QWidget *parent) : /**************/ /* CONNECTs */ /**************/ - connect(rig, &Rig::frequencyChanged, - this, &NewContactWidget::changeFrequency); - - connect(rig, &Rig::modeChanged, - this, &NewContactWidget::changeModefromRig); - - connect(rig, &Rig::powerChanged, - this, &NewContactWidget::changePower); - - connect(rig, &Rig::rigConnected, - this, &NewContactWidget::rigConnected); - - connect(rig, &Rig::rigDisconnected, - this, &NewContactWidget::rigDisconnected); - connect(&callbookManager, &CallbookManager::callsignResult, this, &NewContactWidget::callsignResult); diff --git a/ui/RigWidget.cpp b/ui/RigWidget.cpp index 5ccb98b5..5e754fdc 100644 --- a/ui/RigWidget.cpp +++ b/ui/RigWidget.cpp @@ -47,17 +47,6 @@ RigWidget::RigWidget(QWidget *parent) : refreshBandCombo(); refreshModeCombo(); - Rig* rig = Rig::instance(); - connect(rig, &Rig::frequencyChanged, this, &RigWidget::updateFrequency); - connect(rig, &Rig::modeChanged, this, &RigWidget::updateMode); - connect(rig, &Rig::vfoChanged, this, &RigWidget::updateVFO); - connect(rig, &Rig::powerChanged, this, &RigWidget::updatePWR); - connect(rig, &Rig::rigConnected, this, &RigWidget::rigConnected); - connect(rig, &Rig::rigDisconnected, this, &RigWidget::rigDisconnected); - connect(rig, &Rig::xitChanged, this, &RigWidget::updateXIT); - connect(rig, &Rig::ritChanged, this, &RigWidget::updateRIT); - connect(rig, &Rig::pttChanged, this, &RigWidget::updatePTT); - QTimer *onAirTimer = new QTimer(this); connect(onAirTimer, &QTimer::timeout, this, &RigWidget::sendOnAirState); onAirTimer->start(ONAIR_INTERVAL * 1000); diff --git a/ui/RotatorWidget.cpp b/ui/RotatorWidget.cpp index 0a18e792..fa7e78d3 100644 --- a/ui/RotatorWidget.cpp +++ b/ui/RotatorWidget.cpp @@ -40,10 +40,6 @@ RotatorWidget::RotatorWidget(QWidget *parent) : ui->userButtonsProfileCombo->setModel(userButtonModel); refreshRotUserButtonProfileCombo(); - connect(Rotator::instance(), &Rotator::positionChanged, this, &RotatorWidget::positionChanged); - connect(Rotator::instance(), &Rotator::rotConnected, this, &RotatorWidget::rotConnected); - connect(Rotator::instance(), &Rotator::rotDisconnected, this, &RotatorWidget::rotDisconnected); - QMenu *qsoBearingMenu = new QMenu(this); qsoBearingMenu->addAction(ui->actionQSO_SP); qsoBearingMenu->addAction(ui->actionQSO_LP); From 2997cfe94e5593b927e88a6593786cdfa41cf275 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 4 Sep 2024 16:57:35 +0200 Subject: [PATCH 19/74] Changed instance methods to inline method --- core/CredentialStore.cpp | 8 -------- core/CredentialStore.h | 6 +++++- core/MembershipQE.cpp | 8 -------- core/MembershipQE.h | 6 +++++- cwkey/CWKeyer.cpp | 8 -------- cwkey/CWKeyer.h | 6 +++++- data/AntProfile.cpp | 9 --------- data/AntProfile.h | 6 +++++- data/CWKeyProfile.cpp | 8 -------- data/CWKeyProfile.h | 6 +++++- data/CWShortcutProfile.cpp | 8 -------- data/CWShortcutProfile.h | 6 +++++- data/Data.cpp | 7 ------- data/Data.h | 6 +++++- data/MainLayoutProfile.cpp | 8 -------- data/MainLayoutProfile.h | 6 +++++- data/RigProfile.cpp | 8 -------- data/RigProfile.h | 6 +++++- data/RotUsrButtonsProfile.cpp | 8 -------- data/RotUsrButtonsProfile.h | 6 +++++- data/StationProfile.cpp | 8 -------- data/StationProfile.h | 6 +++++- rig/Rig.cpp | 8 -------- rig/Rig.h | 7 ++++++- rotator/Rotator.cpp | 7 ------- rotator/Rotator.h | 6 +++++- 26 files changed, 66 insertions(+), 116 deletions(-) diff --git a/core/CredentialStore.cpp b/core/CredentialStore.cpp index ad2657da..2102d565 100644 --- a/core/CredentialStore.cpp +++ b/core/CredentialStore.cpp @@ -16,14 +16,6 @@ CredentialStore::CredentialStore(QObject *parent) : QObject(parent) FCT_IDENTIFICATION; } -CredentialStore* CredentialStore::instance() -{ - FCT_IDENTIFICATION; - - static CredentialStore instance; - return &instance; -} - int CredentialStore::savePassword(const QString &storage_key, const QString &user, const QString &pass) { FCT_IDENTIFICATION; diff --git a/core/CredentialStore.h b/core/CredentialStore.h index d6b57dd3..a763e955 100644 --- a/core/CredentialStore.h +++ b/core/CredentialStore.h @@ -9,7 +9,11 @@ class CredentialStore : public QObject Q_OBJECT public: explicit CredentialStore(QObject *parent = nullptr); - static CredentialStore* instance(); + static CredentialStore* instance() + { + static CredentialStore instance; + return &instance; + }; int savePassword(const QString &storage_key, const QString &user, const QString &pass); QString getPassword(const QString &storage_key, const QString &user); diff --git a/core/MembershipQE.cpp b/core/MembershipQE.cpp index cc7857ec..01a58d05 100644 --- a/core/MembershipQE.cpp +++ b/core/MembershipQE.cpp @@ -93,14 +93,6 @@ void MembershipQE::statusQueryFinished(const QString &callsign, emit clubStatusResult(callsign, statuses); } -MembershipQE *MembershipQE::instance() -{ - FCT_IDENTIFICATION; - - static MembershipQE instance; - return &instance; -} - void MembershipQE::saveEnabledClubLists(const QStringList &enabledLists) { QSettings settings; diff --git a/core/MembershipQE.h b/core/MembershipQE.h index 2fe25f3f..57da3b49 100644 --- a/core/MembershipQE.h +++ b/core/MembershipQE.h @@ -75,7 +75,11 @@ class MembershipQE : public QObject Q_OBJECT public: - static MembershipQE *instance(); + static MembershipQE *instance() + { + static MembershipQE instance; + return &instance; + }; static void saveEnabledClubLists(const QStringList &enabledLists); static QStringList getEnabledClubLists(); diff --git a/cwkey/CWKeyer.cpp b/cwkey/CWKeyer.cpp index 3b945ee9..4fa73992 100644 --- a/cwkey/CWKeyer.cpp +++ b/cwkey/CWKeyer.cpp @@ -12,14 +12,6 @@ MODULE_IDENTIFICATION("qlog.cwkey.cwkeyer"); #define TIME_PERIOD 1000 -CWKeyer *CWKeyer::instance() -{ - FCT_IDENTIFICATION; - - static CWKeyer instance; - return &instance; -} - void CWKeyer::start() { FCT_IDENTIFICATION; diff --git a/cwkey/CWKeyer.h b/cwkey/CWKeyer.h index 8f484b0e..72496c22 100644 --- a/cwkey/CWKeyer.h +++ b/cwkey/CWKeyer.h @@ -11,7 +11,11 @@ class CWKeyer : public QObject Q_OBJECT public: - static CWKeyer* instance(); + static CWKeyer* instance() + { + static CWKeyer instance; + return &instance; + }; void stopTimer(); signals: diff --git a/data/AntProfile.cpp b/data/AntProfile.cpp index 434419bf..668b2e99 100644 --- a/data/AntProfile.cpp +++ b/data/AntProfile.cpp @@ -57,15 +57,6 @@ AntProfilesManager::AntProfilesManager(QObject *parent) : } } -AntProfilesManager *AntProfilesManager::instance() -{ - FCT_IDENTIFICATION; - - static AntProfilesManager instance; - return &instance; - -} - void AntProfilesManager::save() { FCT_IDENTIFICATION; diff --git a/data/AntProfile.h b/data/AntProfile.h index 686cd6dd..9d3c4c9b 100644 --- a/data/AntProfile.h +++ b/data/AntProfile.h @@ -38,7 +38,11 @@ class AntProfilesManager : QObject, public ProfileManagerSQL explicit AntProfilesManager(QObject *parent = nullptr); ~AntProfilesManager() { }; - static AntProfilesManager *instance(); + static AntProfilesManager *instance() + { + static AntProfilesManager instance; + return &instance; + }; void save(); }; diff --git a/data/CWKeyProfile.cpp b/data/CWKeyProfile.cpp index 9b3f89f1..906f3a95 100644 --- a/data/CWKeyProfile.cpp +++ b/data/CWKeyProfile.cpp @@ -71,14 +71,6 @@ CWKeyProfilesManager::CWKeyProfilesManager(QObject *parent) : } } -CWKeyProfilesManager *CWKeyProfilesManager::instance() -{ - FCT_IDENTIFICATION; - - static CWKeyProfilesManager instance; - return &instance; -} - void CWKeyProfilesManager::save() { FCT_IDENTIFICATION; diff --git a/data/CWKeyProfile.h b/data/CWKeyProfile.h index 7bc8136e..a20bd775 100644 --- a/data/CWKeyProfile.h +++ b/data/CWKeyProfile.h @@ -54,7 +54,11 @@ class CWKeyProfilesManager : QObject, public ProfileManagerSQL explicit CWKeyProfilesManager(QObject *parent = nullptr); ~CWKeyProfilesManager() { }; - static CWKeyProfilesManager* instance(); + static CWKeyProfilesManager* instance() + { + static CWKeyProfilesManager instance; + return &instance; + }; void save(); }; diff --git a/data/CWShortcutProfile.cpp b/data/CWShortcutProfile.cpp index 786e1ad9..1959e5c5 100644 --- a/data/CWShortcutProfile.cpp +++ b/data/CWShortcutProfile.cpp @@ -80,14 +80,6 @@ CWShortcutProfilesManager::CWShortcutProfilesManager(QObject *parent) : } } -CWShortcutProfilesManager *CWShortcutProfilesManager::instance() -{ - FCT_IDENTIFICATION; - - static CWShortcutProfilesManager instance; - return &instance; -} - void CWShortcutProfilesManager::save() { FCT_IDENTIFICATION; diff --git a/data/CWShortcutProfile.h b/data/CWShortcutProfile.h index bc939158..6842454d 100644 --- a/data/CWShortcutProfile.h +++ b/data/CWShortcutProfile.h @@ -41,7 +41,11 @@ class CWShortcutProfilesManager : QObject, public ProfileManagerSQL &list) const; diff --git a/data/RigProfile.cpp b/data/RigProfile.cpp index 48275e17..a0e0751f 100644 --- a/data/RigProfile.cpp +++ b/data/RigProfile.cpp @@ -129,14 +129,6 @@ RigProfilesManager::RigProfilesManager(QObject *parent) : } } -RigProfilesManager *RigProfilesManager::instance() -{ - FCT_IDENTIFICATION; - - static RigProfilesManager instance; - return &instance; -} - void RigProfilesManager::save() { FCT_IDENTIFICATION; diff --git a/data/RigProfile.h b/data/RigProfile.h index b74cbc2f..3c110734 100644 --- a/data/RigProfile.h +++ b/data/RigProfile.h @@ -86,7 +86,11 @@ class RigProfilesManager : QObject, public ProfileManagerSQL explicit RigProfilesManager(QObject *parent = nullptr); ~RigProfilesManager() { }; - static RigProfilesManager* instance(); + static RigProfilesManager* instance() + { + static RigProfilesManager instance; + return &instance; + }; void save(); }; diff --git a/data/RotUsrButtonsProfile.cpp b/data/RotUsrButtonsProfile.cpp index 7a822cca..0e6f9e1c 100644 --- a/data/RotUsrButtonsProfile.cpp +++ b/data/RotUsrButtonsProfile.cpp @@ -81,14 +81,6 @@ RotUsrButtonsProfilesManager::RotUsrButtonsProfilesManager(QObject *parent) : } -RotUsrButtonsProfilesManager *RotUsrButtonsProfilesManager::instance() -{ - FCT_IDENTIFICATION; - - static RotUsrButtonsProfilesManager instance; - return &instance; -} - void RotUsrButtonsProfilesManager::save() { FCT_IDENTIFICATION; diff --git a/data/RotUsrButtonsProfile.h b/data/RotUsrButtonsProfile.h index 8ba1bdd2..8929d3bb 100644 --- a/data/RotUsrButtonsProfile.h +++ b/data/RotUsrButtonsProfile.h @@ -42,7 +42,11 @@ class RotUsrButtonsProfilesManager : QObject, public ProfileManagerSQL explicit StationProfilesManager(QObject *parent = nullptr); ~StationProfilesManager() {}; - static StationProfilesManager* instance(); + static StationProfilesManager* instance() + { + static StationProfilesManager instance; + return &instance; + }; void save(); }; diff --git a/rig/Rig.cpp b/rig/Rig.cpp index f276b916..50f30800 100644 --- a/rig/Rig.cpp +++ b/rig/Rig.cpp @@ -49,14 +49,6 @@ Rig::Rig(QObject *parent) } -Rig* Rig::instance() -{ - FCT_IDENTIFICATION; - - static Rig instance; - return &instance; -} - qint32 Rig::getNormalBandwidth(const QString &mode, const QString &) { FCT_IDENTIFICATION; diff --git a/rig/Rig.h b/rig/Rig.h index 6a73bd64..87abd3e5 100644 --- a/rig/Rig.h +++ b/rig/Rig.h @@ -30,7 +30,12 @@ class Rig : public QObject TCI_DRIVER = 4 }; - static Rig* instance(); + static Rig* instance() + { + static Rig instance; + return &instance; + }; + static qint32 getNormalBandwidth(const QString &mode, const QString &subMode); diff --git a/rotator/Rotator.cpp b/rotator/Rotator.cpp index ecde6e52..710a0662 100644 --- a/rotator/Rotator.cpp +++ b/rotator/Rotator.cpp @@ -42,13 +42,6 @@ Rotator::~Rotator() __closeRot(); } -Rotator* Rotator::instance() { - FCT_IDENTIFICATION; - - static Rotator instance; - return &instance; -} - double Rotator::getAzimuth() { FCT_IDENTIFICATION; diff --git a/rotator/Rotator.h b/rotator/Rotator.h index 355c2666..74cb2753 100644 --- a/rotator/Rotator.h +++ b/rotator/Rotator.h @@ -19,7 +19,11 @@ class Rotator : public QObject PSTROTATOR_DRIVER = 2 }; - static Rotator* instance(); + static Rotator* instance() + { + static Rotator instance; + return &instance; + }; double getAzimuth(); double getElevation(); bool isRotConnected(); From 47b6c653cce84faa7880227698aaa8f70188a928 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 4 Sep 2024 17:10:58 +0200 Subject: [PATCH 20/74] Added virtual for all CWKeys destructors --- cwkey/drivers/CWCatKey.h | 2 +- cwkey/drivers/CWDaemonKey.h | 2 +- cwkey/drivers/CWFldigiKey.h | 2 +- cwkey/drivers/CWWinKey.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cwkey/drivers/CWCatKey.h b/cwkey/drivers/CWCatKey.h index 32a2c936..6aa17875 100644 --- a/cwkey/drivers/CWCatKey.h +++ b/cwkey/drivers/CWCatKey.h @@ -15,7 +15,7 @@ class CWCatKey : public CWKey explicit CWCatKey(const CWKey::CWKeyModeID mode, const qint32 defaultSpeed, QObject *parent = nullptr); - ~CWCatKey(); + virtual ~CWCatKey(); virtual bool open() override; virtual bool close() override; diff --git a/cwkey/drivers/CWDaemonKey.h b/cwkey/drivers/CWDaemonKey.h index 5736e925..ab0e380c 100644 --- a/cwkey/drivers/CWDaemonKey.h +++ b/cwkey/drivers/CWDaemonKey.h @@ -15,7 +15,7 @@ class CWDaemonKey : public CWKey, const CWKey::CWKeyModeID mode, const qint32 defaultSpeed, QObject *parent = nullptr); - ~CWDaemonKey(){}; + virtual ~CWDaemonKey(){}; virtual bool open() override; virtual bool close() override; diff --git a/cwkey/drivers/CWFldigiKey.h b/cwkey/drivers/CWFldigiKey.h index 3f060cfc..24701f2f 100644 --- a/cwkey/drivers/CWFldigiKey.h +++ b/cwkey/drivers/CWFldigiKey.h @@ -14,7 +14,7 @@ class CWFldigiKey : public CWKey const CWKey::CWKeyModeID mode, const qint32 defaultSpeed, QObject *parent = nullptr); - ~CWFldigiKey(){ nam->deleteLater();}; + virtual ~CWFldigiKey(){ nam->deleteLater();}; virtual bool open() override; virtual bool close() override; diff --git a/cwkey/drivers/CWWinKey.h b/cwkey/drivers/CWWinKey.h index 51387e9c..36b0d9cb 100644 --- a/cwkey/drivers/CWWinKey.h +++ b/cwkey/drivers/CWWinKey.h @@ -15,7 +15,7 @@ class CWWinKey2 : public CWKey, const CWKey::CWKeyModeID mode, const qint32 defaultSpeed, QObject *parent = nullptr); - ~CWWinKey2(); + virtual ~CWWinKey2(); virtual bool open() override; virtual bool close() override; From deb7629340dffea46078eb20c1c8054e4d4aa8f4 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 15:30:43 +0200 Subject: [PATCH 21/74] Updated Changelog --- Changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog b/Changelog index ddfc6993..a9524bba 100644 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ TBC - 0.39.0 +- [NEW] - Select S in RST Edit when focused (issue #454) - [CHANGED] - HamlibDrv - Added multiplatform reliable sleep Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) From 803e2e7cfd163bbd0a567cdede337df90e342f19 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 15:34:35 +0200 Subject: [PATCH 22/74] Updated Changelog --- Changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog b/Changelog index a9524bba..99dbb879 100644 --- a/Changelog +++ b/Changelog @@ -1,6 +1,7 @@ TBC - 0.39.0 - [NEW] - Select S in RST Edit when focused (issue #454) - [CHANGED] - HamlibDrv - Added multiplatform reliable sleep +- [CHANGED] - Backup policy Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) 2024/08/29 - 0.38.0 From 46b0aec23d1df2661524d8fdbd2d41a8e3edde5a Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 15:39:47 +0200 Subject: [PATCH 23/74] Updated Changelog --- Changelog | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 99dbb879..44922d63 100644 --- a/Changelog +++ b/Changelog @@ -2,7 +2,11 @@ TBC - 0.39.0 - [NEW] - Select S in RST Edit when focused (issue #454) - [CHANGED] - HamlibDrv - Added multiplatform reliable sleep - [CHANGED] - Backup policy -Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) +- Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) +- Fixed Wrong import of adif file of another log program (issue #455) +- Fixed WSJTX log record is stored incorrectly if it contains non-ASCII (issue #458) +- Fixed ADIF import does not import records with old DXCC Entities (issue #459) +- FIxed ADIF import incorrectly uses Station Profile (issue #461) 2024/08/29 - 0.38.0 - [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu From 222c4cab022b7c3a7ebb5941ac1cbda3ae5221af Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 16:02:04 +0200 Subject: [PATCH 24/74] Revert "Logbook: Fetching all rows" This reverts commit 313f3eadc07555088731f749ada87fb7e327ab39. It causes a performance issue with a large number of QSOs. CTRL+A will have to be solved differently. --- ui/LogbookWidget.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index 44dd083f..dacfab98 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -746,10 +746,7 @@ void LogbookWidget::updateTable() qCDebug(runtime) << "SQL filter summary: " << filterString.join(" AND "); model->setFilter(filterString.join(" AND ")); qCDebug(runtime) << model->query().lastQuery(); - model->select(); - while (model->canFetchMore()) - model->fetchMore(); ui->contactTable->resizeColumnsToContents(); ui->filteredQSOsLabel->setText(tr("Count: %n", "", model->rowCount())); From debc009cfcade2d6e7788adf30fd8a2f74803552 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 13 Sep 2024 16:23:37 +0200 Subject: [PATCH 25/74] Logbook: Blocked Select All shortcut --- ui/LogbookWidget.cpp | 18 ++++++++++++++++++ ui/LogbookWidget.h | 1 + 2 files changed, 19 insertions(+) diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index dacfab98..74e30904 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include "logformat/AdiFormat.h" #include "models/LogbookModel.h" @@ -163,6 +165,7 @@ LogbookWidget::LogbookWidget(QWidget *parent) : ui->contactTable->horizontalHeader()->setSectionsMovable(true); ui->contactTable->setStyle(new ProxyStyle(ui->contactTable->style())); + ui->contactTable->installEventFilter(this); ui->bandFilter->blockSignals(true); ui->bandFilter->setModel(new SqlListModel("SELECT name FROM bands ORDER BY start_freq", tr("Band"), this)); @@ -897,6 +900,21 @@ void LogbookWidget::sendDXCSpot() emit sendDXSpotContactReq(model->record(selectedIndexes.at(0).row())); } +bool LogbookWidget::eventFilter(QObject *obj, QEvent *event) +{ + FCT_IDENTIFICATION; + + if ( event->type() == QEvent::KeyPress && obj == ui->contactTable ) + { + QKeyEvent *keyEvent = static_cast(event); + // Block SelectAll + if ( QKeySequence(keyEvent->modifiers() | keyEvent->key()) == QKeySequence::SelectAll ) + return true; + } + + return QObject::eventFilter(obj, event); +} + void LogbookWidget::colorsFilterWidget(QComboBox *widget) { FCT_IDENTIFICATION; diff --git a/ui/LogbookWidget.h b/ui/LogbookWidget.h index 0fc61556..4456d2d3 100644 --- a/ui/LogbookWidget.h +++ b/ui/LogbookWidget.h @@ -81,6 +81,7 @@ public slots: SqlListModel* userFilterModel; QString externalFilter; bool blockClublogSignals; + bool eventFilter(QObject *obj, QEvent *event); void colorsFilterWidget(QComboBox *widget); }; From cc3fc224b174270f9ce1e3974c1a2d383bf1bb7e Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 15 Sep 2024 14:32:00 +0200 Subject: [PATCH 26/74] Logbook: Performance tunning - logbook shows only the first 256 record - qtableview paging is enabled again - reworked refresh Qtableview --- ui/LogbookWidget.cpp | 242 +++++++++++++++++++++++-------------------- ui/LogbookWidget.h | 1 + 2 files changed, 130 insertions(+), 113 deletions(-) diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index 74e30904..9dac4822 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -61,12 +61,9 @@ LogbookWidget::LogbookWidget(QWidget *parent) : ui->contactTable->addAction(separator1); ui->contactTable->addAction(ui->actionDeleteContact); - //ui->contactTable->sortByColumn(1, Qt::DescendingOrder); - ui->contactTable->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->contactTable->horizontalHeader(), &QHeaderView::customContextMenuRequested, this, &LogbookWidget::showTableHeaderContextMenu); - connect(ui->contactTable, &QTableQSOView::dataCommitted, this, &LogbookWidget::updateTable); ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_TIME_ON, new TimestampFormatDelegate(ui->contactTable)); ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_TIME_OFF, new TimestampFormatDelegate(ui->contactTable)); @@ -259,7 +256,7 @@ void LogbookWidget::filterCountryBand(const QString &countryName, ui->countryFilter->blockSignals(false); ui->bandFilter->blockSignals(false); - updateTable(); + filterTable(); } void LogbookWidget::lookupSelectedCallsign() @@ -288,7 +285,7 @@ void LogbookWidget::callsignFilterChanged() { FCT_IDENTIFICATION; - updateTable(); + filterTable(); } void LogbookWidget::bandFilterChanged() @@ -297,7 +294,7 @@ void LogbookWidget::bandFilterChanged() colorsFilterWidget(ui->bandFilter); saveBandFilter(); - updateTable(); + filterTable();; } void LogbookWidget::saveBandFilter() @@ -334,7 +331,7 @@ void LogbookWidget::modeFilterChanged() colorsFilterWidget(ui->modeFilter); saveModeFilter(); - updateTable(); + filterTable(); } void LogbookWidget::saveModeFilter() @@ -370,7 +367,7 @@ void LogbookWidget::countryFilterChanged() colorsFilterWidget(ui->countryFilter); saveCountryFilter(); - updateTable(); + filterTable(); } void LogbookWidget::saveCountryFilter() @@ -407,7 +404,7 @@ void LogbookWidget::userFilterChanged() colorsFilterWidget(ui->userFilter); saveUserFilter(); - updateTable(); + filterTable(); } void LogbookWidget::saveUserFilter() @@ -443,7 +440,7 @@ void LogbookWidget::clubFilterChanged() colorsFilterWidget(ui->clubFilter); saveClubFilter(); - updateTable(); + filterTable(); } void LogbookWidget::refreshClubFilter() @@ -491,7 +488,7 @@ void LogbookWidget::restoreFilters() restoreclubFilter(); restoreUserFilter(); externalFilter = QString(); - updateTable(); + filterTable(); } void LogbookWidget::uploadClublog() @@ -648,111 +645,22 @@ void LogbookWidget::updateTable() { FCT_IDENTIFICATION; - QStringList filterString; - - const QString &callsignFilterValue = ui->callsignFilter->text(); - - if ( !callsignFilterValue.isEmpty() ) - { - filterString.append(QString("callsign LIKE '%%1%'").arg(callsignFilterValue.toUpper())); - } - - const QString &bandFilterValue = ui->bandFilter->currentText(); - - if ( ui->bandFilter->currentIndex() != 0 && !bandFilterValue.isEmpty()) - { - filterString.append(QString("band = '%1'").arg(bandFilterValue)); - } - - const QString &modeFilterValue = ui->modeFilter->currentText(); - - if ( ui->modeFilter->currentIndex() != 0 && !modeFilterValue.isEmpty() ) - { - filterString.append(QString("mode = '%1'").arg(modeFilterValue)); - } - - /* Refresh dynamic Country selection combobox */ - /* It is important to block its signals */ - ui->countryFilter->blockSignals(true); - const QString &country = ui->countryFilter->currentText(); - countryModel->refresh(); - ui->countryFilter->setCurrentText(country); - ui->countryFilter->blockSignals(false); - - int row = ui->countryFilter->currentIndex(); - const QModelIndex &idx = ui->countryFilter->model()->index(row,0); - QVariant data = ui->countryFilter->model()->data(idx); - - if ( ui->countryFilter->currentIndex() != 0 ) - { - filterString.append(QString("dxcc = '%1'").arg(data.toInt())); - } - - if ( ui->clubFilter->currentIndex() != 0 ) - { - filterString.append(QString("id in (SELECT contactid FROM contact_clubs_view WHERE clubid = '%1')").arg(ui->clubFilter->currentText())); - } - - /* Refresh dynamic User Filter selection combobox */ - /* block the signals !!! */ - ui->userFilter->blockSignals(true); - const QString &userFilterString = ui->userFilter->currentText(); - userFilterModel->refresh(); - ui->userFilter->setCurrentText(userFilterString); - ui->userFilter->blockSignals(false); - - if ( ui->userFilter->currentIndex() != 0 ) - { - QSqlQuery userFilterQuery; - if ( ! userFilterQuery.prepare("SELECT " - "'(' || GROUP_CONCAT( ' ' || c.name || ' ' || CASE WHEN r.value IS NULL AND o.sql_operator IN ('=', 'like') THEN 'IS' " - " WHEN r.value IS NULL and r.operator_id NOT IN ('=', 'like') THEN 'IS NOT' " - " WHEN o.sql_operator = ('starts with') THEN 'like' " - " ELSE o.sql_operator END || " - "' (' || quote(CASE o.sql_operator WHEN 'like' THEN '%' || r.value || '%' " - " WHEN 'not like' THEN '%' || r.value || '%' " - " WHEN 'starts with' THEN r.value || '%' " - " ELSE r.value END) || ') ', m.sql_operator) || ')' " - "FROM qso_filters f, qso_filter_rules r, " - "qso_filter_operators o, qso_filter_matching_types m, " - "PRAGMA_TABLE_INFO('contacts') c " - "WHERE f.filter_name = :filterName " - " AND f.filter_name = r.filter_name " - " AND o.operator_id = r.operator_id " - " AND m.matching_id = f.matching_type " - " AND c.cid = r.table_field_index") ) - { - qWarning() << "Cannot prepare select statement"; - return; - } + model->select(); + ui->contactTable->resizeColumnsToContents(); - userFilterQuery.bindValue(":filterName", ui->userFilter->currentText()); + // it is not possible to use mode->rowCount here because model contains only + // the first 256 records and rowCount has a value 256 here. Therefore, it is needed + // to run a QSL stateme with Count + QString countRecordsStmt(QLatin1String("SELECT COUNT(1) FROM contacts")); - qCDebug(runtime) << "User filter SQL: " << userFilterQuery.lastQuery(); + if ( !model->filter().isEmpty() ) + countRecordsStmt.append(QString(" WHERE %1").arg(model->filter())); - if ( userFilterQuery.exec() ) - { - userFilterQuery.next(); - filterString.append(QString("( ") + userFilterQuery.value(0).toString() + ")"); - } - else - { - qCDebug(runtime) << "User filter error - " << userFilterQuery.lastError().text(); - } - } - - if ( !externalFilter.isEmpty() ) - { - filterString.append(QString("( ") + externalFilter + ")"); - } - - qCDebug(runtime) << "SQL filter summary: " << filterString.join(" AND "); - model->setFilter(filterString.join(" AND ")); - qCDebug(runtime) << model->query().lastQuery(); - model->select(); + QSqlQuery query(countRecordsStmt); - ui->contactTable->resizeColumnsToContents(); - ui->filteredQSOsLabel->setText(tr("Count: %n", "", model->rowCount())); + ui->filteredQSOsLabel->setText(tr("Count: %n", "", query.first() ? query.value(0).toInt() + : 0)); + ui->contactTable->scrollToTop(); emit logbookUpdated(); } @@ -902,7 +810,7 @@ void LogbookWidget::sendDXCSpot() bool LogbookWidget::eventFilter(QObject *obj, QEvent *event) { - FCT_IDENTIFICATION; + //FCT_IDENTIFICATION; if ( event->type() == QEvent::KeyPress && obj == ui->contactTable ) { @@ -923,6 +831,114 @@ void LogbookWidget::colorsFilterWidget(QComboBox *widget) : ""); } +void LogbookWidget::filterTable() +{ + FCT_IDENTIFICATION; + + QStringList filterString; + + const QString &callsignFilterValue = ui->callsignFilter->text(); + + if ( !callsignFilterValue.isEmpty() ) + { + filterString.append(QString("callsign LIKE '%%1%'").arg(callsignFilterValue.toUpper())); + } + + const QString &bandFilterValue = ui->bandFilter->currentText(); + + if ( ui->bandFilter->currentIndex() != 0 && !bandFilterValue.isEmpty()) + { + filterString.append(QString("band = '%1'").arg(bandFilterValue)); + } + + const QString &modeFilterValue = ui->modeFilter->currentText(); + + if ( ui->modeFilter->currentIndex() != 0 && !modeFilterValue.isEmpty() ) + { + filterString.append(QString("mode = '%1'").arg(modeFilterValue)); + } + + /* Refresh dynamic Country selection combobox */ + /* It is important to block its signals */ + ui->countryFilter->blockSignals(true); + const QString &country = ui->countryFilter->currentText(); + countryModel->refresh(); + ui->countryFilter->setCurrentText(country); + ui->countryFilter->blockSignals(false); + + int row = ui->countryFilter->currentIndex(); + const QModelIndex &idx = ui->countryFilter->model()->index(row,0); + QVariant data = ui->countryFilter->model()->data(idx); + + if ( ui->countryFilter->currentIndex() != 0 ) + { + filterString.append(QString("dxcc = '%1'").arg(data.toInt())); + } + + if ( ui->clubFilter->currentIndex() != 0 ) + { + filterString.append(QString("id in (SELECT contactid FROM contact_clubs_view WHERE clubid = '%1')").arg(ui->clubFilter->currentText())); + } + + /* Refresh dynamic User Filter selection combobox */ + /* block the signals !!! */ + ui->userFilter->blockSignals(true); + const QString &userFilterString = ui->userFilter->currentText(); + userFilterModel->refresh(); + ui->userFilter->setCurrentText(userFilterString); + ui->userFilter->blockSignals(false); + + if ( ui->userFilter->currentIndex() != 0 ) + { + QSqlQuery userFilterQuery; + if ( ! userFilterQuery.prepare("SELECT " + "'(' || GROUP_CONCAT( ' ' || c.name || ' ' || CASE WHEN r.value IS NULL AND o.sql_operator IN ('=', 'like') THEN 'IS' " + " WHEN r.value IS NULL and r.operator_id NOT IN ('=', 'like') THEN 'IS NOT' " + " WHEN o.sql_operator = ('starts with') THEN 'like' " + " ELSE o.sql_operator END || " + "' (' || quote(CASE o.sql_operator WHEN 'like' THEN '%' || r.value || '%' " + " WHEN 'not like' THEN '%' || r.value || '%' " + " WHEN 'starts with' THEN r.value || '%' " + " ELSE r.value END) || ') ', m.sql_operator) || ')' " + "FROM qso_filters f, qso_filter_rules r, " + "qso_filter_operators o, qso_filter_matching_types m, " + "PRAGMA_TABLE_INFO('contacts') c " + "WHERE f.filter_name = :filterName " + " AND f.filter_name = r.filter_name " + " AND o.operator_id = r.operator_id " + " AND m.matching_id = f.matching_type " + " AND c.cid = r.table_field_index") ) + { + qWarning() << "Cannot prepare select statement"; + return; + } + + userFilterQuery.bindValue(":filterName", ui->userFilter->currentText()); + + qCDebug(runtime) << "User filter SQL: " << userFilterQuery.lastQuery(); + + if ( userFilterQuery.exec() ) + { + userFilterQuery.next(); + filterString.append(QString("( ") + userFilterQuery.value(0).toString() + ")"); + } + else + { + qCDebug(runtime) << "User filter error - " << userFilterQuery.lastError().text(); + } + } + + if ( !externalFilter.isEmpty() ) + { + filterString.append(QString("( ") + externalFilter + ")"); + } + + model->setFilter(filterString.join(" AND ")); + qCDebug(runtime) << model->query().lastQuery(); + + updateTable(); +} + LogbookWidget::~LogbookWidget() { FCT_IDENTIFICATION; diff --git a/ui/LogbookWidget.h b/ui/LogbookWidget.h index 4456d2d3..f5b6508d 100644 --- a/ui/LogbookWidget.h +++ b/ui/LogbookWidget.h @@ -84,6 +84,7 @@ public slots: bool eventFilter(QObject *obj, QEvent *event); void colorsFilterWidget(QComboBox *widget); + void filterTable(); }; /* https://forum.qt.io/topic/90403/show-tooltip-immediatly/7/ */ From 5d5d16b69fe45e39b043c550e8970da446a336ec Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Mon, 16 Sep 2024 16:22:04 +0200 Subject: [PATCH 27/74] Logbook: Performance tunning - logbook shows the first 5000 QSOs - added focusing after Edit QSO and Delete QSO --- models/LogbookModel.h | 1 - ui/LogbookWidget.cpp | 64 +++++++++++++++++++++++++++++++++++++------ ui/LogbookWidget.h | 1 + 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/models/LogbookModel.h b/models/LogbookModel.h index 7762a662..3bc45352 100644 --- a/models/LogbookModel.h +++ b/models/LogbookModel.h @@ -15,7 +15,6 @@ class LogbookModel : public QSqlTableModel bool setData(const QModelIndex &index, const QVariant &value, int role) override; void updateExternalServicesUploadStatus( const QModelIndex &index, int role, bool &updateResult ); void updateUploadToModified( const QModelIndex &index, int role, int column, bool &updateResult ); - enum column_id { COLUMN_ID = 0, diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index 9dac4822..47715232 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -522,6 +522,13 @@ void LogbookWidget::deleteContact() QModelIndexList deletedRowIndexes = ui->contactTable->selectionModel()->selectedRows(); + // Since deletedRowIndexes contains indexes for columns that might be invisible, + // and scrollToIndex needs an index with a visible column, + // we obtain the column index from the first record in the table." + + int firstVisibleColumnIndex = ui->contactTable->indexAt(QPoint(0, 0)).column(); + QModelIndex previousIndex = model->index(deletedRowIndexes.first().row()-1, firstVisibleColumnIndex); + // Clublog does not accept batch DELETE operation // ask if an operator wants to continue if ( ClubLog::isUploadImmediatelyEnabled() @@ -592,6 +599,7 @@ void LogbookWidget::deleteContact() ui->contactTable->setUpdatesEnabled(true); ui->contactTable->horizontalHeader()->restoreState(state); updateTable(); + scrollToIndex(previousIndex); blockClublogSignals = false; } @@ -646,21 +654,34 @@ void LogbookWidget::updateTable() FCT_IDENTIFICATION; model->select(); + + // under normal conditions, only 256 records are loaded. + // This will increase the value of the loaded records. + while ( model->canFetchMore() && model->rowCount() < 5000 ) + model->fetchMore(); + ui->contactTable->resizeColumnsToContents(); // it is not possible to use mode->rowCount here because model contains only - // the first 256 records and rowCount has a value 256 here. Therefore, it is needed - // to run a QSL stateme with Count - QString countRecordsStmt(QLatin1String("SELECT COUNT(1) FROM contacts")); + // the first 5000 records (or more) and rowCount has a value 5000 here. Therefore, it is needed + // to run a QSL stateme with Count. Run it only in case when QTableview does not contain all + // records from model + int qsoCount = 0; + if ( model->canFetchMore() ) + { + QString countRecordsStmt(QLatin1String("SELECT COUNT(1) FROM contacts")); - if ( !model->filter().isEmpty() ) - countRecordsStmt.append(QString(" WHERE %1").arg(model->filter())); + if ( !model->filter().isEmpty() ) + countRecordsStmt.append(QString(" WHERE %1").arg(model->filter())); - QSqlQuery query(countRecordsStmt); + QSqlQuery query(countRecordsStmt); - ui->filteredQSOsLabel->setText(tr("Count: %n", "", query.first() ? query.value(0).toInt() - : 0)); - ui->contactTable->scrollToTop(); + qsoCount = query.first() ? query.value(0).toInt() : 0; + } + else + qsoCount = model->rowCount(); + + ui->filteredQSOsLabel->setText(tr("Count: %n", "", qsoCount)); emit logbookUpdated(); } @@ -761,6 +782,7 @@ void LogbookWidget::doubleClickColumn(QModelIndex modelIndex) }); dialog.exec(); updateTable(); + scrollToIndex(modelIndex); } } @@ -808,6 +830,30 @@ void LogbookWidget::sendDXCSpot() emit sendDXSpotContactReq(model->record(selectedIndexes.at(0).row())); } +void LogbookWidget::scrollToIndex(const QModelIndex &index, bool selectItem) +{ + FCT_IDENTIFICATION; + + if ( index == QModelIndex() ) + return; + + // is index visible ? + if ( ui->contactTable->visualRect(index).isEmpty() ) + { + while ( model->canFetchMore() && ui->contactTable->visualRect(index).isEmpty() ) + { + model->fetchMore(); + } + + if ( model->canFetchMore() ) + model->fetchMore(); // one more fetch + } + + ui->contactTable->scrollTo(index, QAbstractItemView::PositionAtCenter); + if ( selectItem ) + ui->contactTable->selectRow(index.row()); +} + bool LogbookWidget::eventFilter(QObject *obj, QEvent *event) { //FCT_IDENTIFICATION; diff --git a/ui/LogbookWidget.h b/ui/LogbookWidget.h index f5b6508d..b7130f51 100644 --- a/ui/LogbookWidget.h +++ b/ui/LogbookWidget.h @@ -72,6 +72,7 @@ public slots: void focusSearchCallsign(); void reloadSetting(); void sendDXCSpot(); + void scrollToIndex(const QModelIndex& index, bool select = true); private: ClubLog* clublog; From 76046c5344bc76eaaaa470d1f7a2b75cafbaa400 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Mon, 16 Sep 2024 16:56:46 +0200 Subject: [PATCH 28/74] Fixed #464 - Logbook: QSO Table Column Width Does Not Stick --- ui/LogbookWidget.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index 47715232..ef160a2a 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -660,8 +660,6 @@ void LogbookWidget::updateTable() while ( model->canFetchMore() && model->rowCount() < 5000 ) model->fetchMore(); - ui->contactTable->resizeColumnsToContents(); - // it is not possible to use mode->rowCount here because model contains only // the first 5000 records (or more) and rowCount has a value 5000 here. Therefore, it is needed // to run a QSL stateme with Count. Run it only in case when QTableview does not contain all From f2099b40ef4d62267fa8c1553a7b0845897ca8a1 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Tue, 17 Sep 2024 13:40:13 +0200 Subject: [PATCH 29/74] Updated Changelog --- Changelog | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 44922d63..e50c82ce 100644 --- a/Changelog +++ b/Changelog @@ -2,11 +2,14 @@ TBC - 0.39.0 - [NEW] - Select S in RST Edit when focused (issue #454) - [CHANGED] - HamlibDrv - Added multiplatform reliable sleep - [CHANGED] - Backup policy +- [CHANGED] - Logbook page size - improved performance +- [CHANGED] - Logbook - CTRL-A is disabled - Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) - Fixed Wrong import of adif file of another log program (issue #455) - Fixed WSJTX log record is stored incorrectly if it contains non-ASCII (issue #458) - Fixed ADIF import does not import records with old DXCC Entities (issue #459) -- FIxed ADIF import incorrectly uses Station Profile (issue #461) +- Fixed ADIF import incorrectly uses Station Profile (issue #461) +- Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464) 2024/08/29 - 0.38.0 - [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu From 567bdd1f8fc5e85a4433347d09d09a0400c0f7df Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Thu, 19 Sep 2024 16:17:03 +0200 Subject: [PATCH 30/74] DXC: Added Full-text Search --- Changelog | 1 + QLog.pro | 2 + models/SearchFilterProxyModel.cpp | 25 +++++++ models/SearchFilterProxyModel.h | 21 ++++++ ui/DxWidget.cpp | 49 ++++++++++++-- ui/DxWidget.h | 7 +- ui/DxWidget.ui | 105 ++++++++++++++++++++++++++++++ ui/MainWindow.ui | 2 +- 8 files changed, 205 insertions(+), 7 deletions(-) create mode 100644 models/SearchFilterProxyModel.cpp create mode 100644 models/SearchFilterProxyModel.h diff --git a/Changelog b/Changelog index e50c82ce..062f8062 100644 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ TBC - 0.39.0 +- [NEW] - DXC - Added Full-text search - [NEW] - Select S in RST Edit when focused (issue #454) - [CHANGED] - HamlibDrv - Added multiplatform reliable sleep - [CHANGED] - Backup policy diff --git a/QLog.pro b/QLog.pro index 8729b4ea..aba89815 100644 --- a/QLog.pro +++ b/QLog.pro @@ -106,6 +106,7 @@ SOURCES += \ models/LogbookModel.cpp \ models/RigTypeModel.cpp \ models/RotTypeModel.cpp \ + models/SearchFilterProxyModel.cpp \ models/ShortcutEditorModel.cpp \ models/SqlListModel.cpp \ models/WsjtxTableModel.cpp \ @@ -241,6 +242,7 @@ HEADERS += \ models/LogbookModel.h \ models/RigTypeModel.h \ models/RotTypeModel.h \ + models/SearchFilterProxyModel.h \ models/ShortcutEditorModel.h \ models/SqlListModel.h \ models/WsjtxTableModel.h \ diff --git a/models/SearchFilterProxyModel.cpp b/models/SearchFilterProxyModel.cpp new file mode 100644 index 00000000..a549780a --- /dev/null +++ b/models/SearchFilterProxyModel.cpp @@ -0,0 +1,25 @@ +#include "SearchFilterProxyModel.h" + +SearchFilterProxyModel::SearchFilterProxyModel(QObject *parent) + : QSortFilterProxyModel{parent} +{} + +void SearchFilterProxyModel::setSearchString(const QString &searchString) +{ + this->searchString = searchString; + invalidateFilter(); +} + +bool SearchFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const +{ + // full-text search + for ( int col = 0; col < sourceModel()->columnCount(); ++col ) + { + QModelIndex index = sourceModel()->index(source_row, col, source_parent); + QString data = index.data(Qt::DisplayRole).toString(); + + if ( data.contains(searchString, Qt::CaseInsensitive) ) + return true; + } + return false; +} diff --git a/models/SearchFilterProxyModel.h b/models/SearchFilterProxyModel.h new file mode 100644 index 00000000..4047afe0 --- /dev/null +++ b/models/SearchFilterProxyModel.h @@ -0,0 +1,21 @@ +#ifndef SEARCHFILTERPROXYMODEL_H +#define SEARCHFILTERPROXYMODEL_H + +#include + +class SearchFilterProxyModel : public QSortFilterProxyModel +{ + Q_OBJECT + +public: + SearchFilterProxyModel(QObject* parent = nullptr); + void setSearchString(const QString& searchString); + +protected: + bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; + +private: + QString searchString; +}; + +#endif // SEARCHFILTERPROXYMODEL_H diff --git a/ui/DxWidget.cpp b/ui/DxWidget.cpp index 225695a5..29594fb7 100644 --- a/ui/DxWidget.cpp +++ b/ui/DxWidget.cpp @@ -403,18 +403,24 @@ DxWidget::DxWidget(QWidget *parent) : ui->setupUi(this); + setSearchClosed(); + ui->serverSelect->setStyleSheet(QStringLiteral("QComboBox {color: red}")); - dxTableModel = new DxTableModel(this); wcyTableModel = new WCYTableModel(this); wwvTableModel = new WWVTableModel(this); toAllTableModel = new ToAllTableModel(this); + dxTableProxyModel = new SearchFilterProxyModel(ui->dxTable); + dxTableModel = new DxTableModel(dxTableProxyModel); + dxTableProxyModel->setSourceModel(dxTableModel); + QAction *separator = new QAction(this); separator->setSeparator(true); - ui->dxTable->setModel(dxTableModel); + ui->dxTable->setModel(dxTableProxyModel); ui->dxTable->addAction(ui->actionFilter); + ui->dxTable->addAction(ui->actionSearch); ui->dxTable->addAction(ui->actionDisplayedColumns); ui->dxTable->addAction(ui->actionClear); ui->dxTable->addAction(separator); @@ -1198,9 +1204,11 @@ void DxWidget::entryDoubleClicked(QModelIndex index) { FCT_IDENTIFICATION; - emit tuneDx(dxTableModel->getCallsign(index), - dxTableModel->getFrequency(index), - dxTableModel->getBandPlanode(index)); + const QModelIndex &source_index = dxTableProxyModel->mapToSource(index); + + emit tuneDx(dxTableModel->getCallsign(source_index), + dxTableModel->getFrequency(source_index), + dxTableModel->getBandPlanode(source_index)); } void DxWidget::actionFilter() @@ -1300,6 +1308,37 @@ void DxWidget::prepareQSOSpot(QSqlRecord qso) } } +void DxWidget::setSearch(const QString &text) +{ + FCT_IDENTIFICATION; + + dxTableProxyModel->setSearchString(text); +} + +void DxWidget::setSearchStatus(bool visible) +{ + FCT_IDENTIFICATION; + + ui->searchEdit->setVisible(visible); + ui->searchEdit->setFocus(); + ui->searchCloseButton->setVisible(visible); + + if (!visible) + ui->searchEdit->clear(); +} + +void DxWidget::setSearchVisible() +{ + FCT_IDENTIFICATION; + setSearchStatus(!ui->searchEdit->isVisible()); +} + +void DxWidget::setSearchClosed() +{ + FCT_IDENTIFICATION; + setSearchStatus(false); +} + void DxWidget::actionCommandSpotQSO() { FCT_IDENTIFICATION; diff --git a/ui/DxWidget.h b/ui/DxWidget.h index 575d52ed..2d58649d 100644 --- a/ui/DxWidget.h +++ b/ui/DxWidget.h @@ -13,6 +13,7 @@ #include "data/ToAllSpot.h" #include "core/LogLocale.h" #include "core/DxServerString.h" +#include "models/SearchFilterProxyModel.h" // in sec #define DEDUPLICATION_TIME 3 @@ -112,7 +113,6 @@ class DeleteHighlightedDXServerWhenDelPressedEventFilter : public QObject bool eventFilter(QObject *obj, QEvent *event); }; - class DxWidget : public QWidget { Q_OBJECT @@ -134,6 +134,10 @@ public slots: void setLastQSO(QSqlRecord); void reloadSetting(); void prepareQSOSpot(QSqlRecord); + void setSearch(const QString &); + void setSearchStatus(bool); + void setSearchVisible(); + void setSearchClosed(); private slots: void actionCommandSpotQSO(); @@ -172,6 +176,7 @@ private slots: WCYTableModel* wcyTableModel; WWVTableModel* wwvTableModel; ToAllTableModel* toAllTableModel; + SearchFilterProxyModel* dxTableProxyModel; QTcpSocket* socket; Ui::DxWidget *ui; QRegularExpression moderegexp; diff --git a/ui/DxWidget.ui b/ui/DxWidget.ui index 1486199b..4b6bf55b 100644 --- a/ui/DxWidget.ui +++ b/ui/DxWidget.ui @@ -225,6 +225,43 @@ + + + + 0 + + + + + Qt::ClickFocus + + + Full-text search + + + Search + + + true + + + + + + + Close Search + + + + + + + .. + + + + + @@ -587,6 +624,23 @@ Clear all data + + + Search... + + + DXC - Search + + + Ctrl+D + + + Qt::ApplicationShortcut + + + true + + @@ -880,6 +934,54 @@ + + actionSearch + triggered() + DxWidget + setSearchVisible() + + + -1 + -1 + + + 170 + 255 + + + + + searchCloseButton + clicked() + DxWidget + setSearchClosed() + + + 325 + 462 + + + 170 + 255 + + + + + searchEdit + textChanged(QString) + DxWidget + setSearch(QString) + + + 170 + 463 + + + 170 + 255 + + + send() @@ -903,5 +1005,8 @@ actionForgetPassword() actionKeepSpots() actionClear() + setSearch(QString) + setSearchVisible() + setSearchClosed() diff --git a/ui/MainWindow.ui b/ui/MainWindow.ui index b0d614ff..54343bb8 100644 --- a/ui/MainWindow.ui +++ b/ui/MainWindow.ui @@ -52,7 +52,7 @@ 0 0 913 - 22 + 23 From ab9e962a4a7656e7891669e856af5e24f1c34b48 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Thu, 19 Sep 2024 16:37:31 +0200 Subject: [PATCH 31/74] Fixed #452 - Bands are displayed based on the Settings --- Changelog | 1 + ui/AwardsDialog.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 062f8062..44b4db4f 100644 --- a/Changelog +++ b/Changelog @@ -5,6 +5,7 @@ TBC - 0.39.0 - [CHANGED] - Backup policy - [CHANGED] - Logbook page size - improved performance - [CHANGED] - Logbook - CTRL-A is disabled +- [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452) - Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) - Fixed Wrong import of adif file of another log program (issue #455) - Fixed WSJTX log record is stored incorrectly if it contains non-ASCII (issue #458) diff --git a/ui/AwardsDialog.cpp b/ui/AwardsDialog.cpp index f642b2a9..f8a7ed66 100644 --- a/ui/AwardsDialog.cpp +++ b/ui/AwardsDialog.cpp @@ -62,7 +62,7 @@ void AwardsDialog::refreshTable(int) { FCT_IDENTIFICATION; - const QList& dxccBands = BandPlan::bandsList(true, true); + const QList& dxccBands = BandPlan::bandsList(false, true); if ( dxccBands.size() == 0 ) return; From 4e3457050d909009f466c8705478ff3dd1cff254 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 20 Sep 2024 16:07:34 +0200 Subject: [PATCH 32/74] DXC: Full-text Search Close button - changed to flat --- ui/DxWidget.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/DxWidget.ui b/ui/DxWidget.ui index 4b6bf55b..3f22b6e8 100644 --- a/ui/DxWidget.ui +++ b/ui/DxWidget.ui @@ -258,6 +258,9 @@ .. + + true + From 4586ee8edf93c161fbcef498217a9f09b7ddaf14 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 20 Sep 2024 20:15:11 +0200 Subject: [PATCH 33/74] Fixed Header Include Guards --- core/MultiselectCompleter.h | 6 +++--- core/UpdatableSQLRecord.h | 4 ++-- models/SearchFilterProxyModel.h | 6 +++--- models/ShortcutEditorModel.h | 6 +++--- rotator/RotCaps.h | 6 +++--- rotator/drivers/HamlibRotDrv.h | 6 +++--- rotator/drivers/PSTRotDrv.h | 6 +++--- ui/FreqQSpinBox.h | 6 +++--- ui/ProfileImageWidget.h | 6 +++--- ui/QSODetailDialog.h | 4 ++-- 10 files changed, 28 insertions(+), 28 deletions(-) diff --git a/core/MultiselectCompleter.h b/core/MultiselectCompleter.h index 15319639..8bb0c9fe 100644 --- a/core/MultiselectCompleter.h +++ b/core/MultiselectCompleter.h @@ -1,5 +1,5 @@ -#ifndef MULTISELECTCOMPLETER_H -#define MULTISELECTCOMPLETER_H +#ifndef QLOG_CORE_MULTISELECTCOMPLETER_H +#define QLOG_CORE_MULTISELECTCOMPLETER_H #include @@ -17,4 +17,4 @@ class MultiselectCompleter : public QCompleter QStringList splitPath( const QString& path ) const; }; -#endif // MULTISELECTCOMPLETER_H +#endif // QLOG_CORE_MULTISELECTCOMPLETER_H diff --git a/core/UpdatableSQLRecord.h b/core/UpdatableSQLRecord.h index 6cb9edaa..51586218 100644 --- a/core/UpdatableSQLRecord.h +++ b/core/UpdatableSQLRecord.h @@ -1,5 +1,5 @@ -#ifndef UPDATABLESQLRECORD_H -#define UPDATABLESQLRECORD_H +#ifndef QLOG_CORE_UPDATABLESQLRECORD_H +#define QLOG_CORE_UPDATABLESQLRECORD_H #include #include diff --git a/models/SearchFilterProxyModel.h b/models/SearchFilterProxyModel.h index 4047afe0..a211c2f4 100644 --- a/models/SearchFilterProxyModel.h +++ b/models/SearchFilterProxyModel.h @@ -1,5 +1,5 @@ -#ifndef SEARCHFILTERPROXYMODEL_H -#define SEARCHFILTERPROXYMODEL_H +#ifndef QLOG_MODELS_SEARCHFILTERPROXYMODEL_H +#define QLOG_MODELS_SEARCHFILTERPROXYMODEL_H #include @@ -18,4 +18,4 @@ class SearchFilterProxyModel : public QSortFilterProxyModel QString searchString; }; -#endif // SEARCHFILTERPROXYMODEL_H +#endif // QLOG_MODELS_SEARCHFILTERPROXYMODEL_H diff --git a/models/ShortcutEditorModel.h b/models/ShortcutEditorModel.h index ed1d67c5..36457ac4 100644 --- a/models/ShortcutEditorModel.h +++ b/models/ShortcutEditorModel.h @@ -1,5 +1,5 @@ -#ifndef SHORTCUTEDITORMODEL_H -#define SHORTCUTEDITORMODEL_H +#ifndef QLOG_MODELS_SHORTCUTEDITORMODEL_H +#define QLOG_MODELS_SHORTCUTEDITORMODEL_H #include #include @@ -36,4 +36,4 @@ class ShortcutEditorModel : public QAbstractTableModel const QString&) const; }; -#endif // SHORTCUTEDITORMODEL_H +#endif // QLOG_MODELS_SHORTCUTEDITORMODEL_H diff --git a/rotator/RotCaps.h b/rotator/RotCaps.h index 27fc8753..b6a4ca20 100644 --- a/rotator/RotCaps.h +++ b/rotator/RotCaps.h @@ -1,5 +1,5 @@ -#ifndef ROTATOR_ROTCAPS_H -#define ROTATOR_ROTCAPS_H +#ifndef QLOG_ROTATOR_ROTCAPS_H +#define QLOG_ROTATOR_ROTCAPS_H class RotCaps @@ -14,4 +14,4 @@ class RotCaps int serialStopBits; }; -#endif // ROTATOR_ROTCAPS_H +#endif // QLOG_ROTATOR_ROTCAPS_H diff --git a/rotator/drivers/HamlibRotDrv.h b/rotator/drivers/HamlibRotDrv.h index 0eb4e6c3..bf702ea0 100644 --- a/rotator/drivers/HamlibRotDrv.h +++ b/rotator/drivers/HamlibRotDrv.h @@ -1,5 +1,5 @@ -#ifndef ROTATOR_DRIVERS_HAMLIBROTDRV_H -#define ROTATOR_DRIVERS_HAMLIBROTDRV_H +#ifndef QLOG_ROTATOR_DRIVERS_HAMLIBROTDRV_H +#define QLOG_ROTATOR_DRIVERS_HAMLIBROTDRV_H #include #include @@ -43,4 +43,4 @@ private slots: bool forceSendState; }; -#endif // ROTATOR_DRIVERS_HAMLIBROTDRV_H +#endif // QLOG_ROTATOR_DRIVERS_HAMLIBROTDRV_H diff --git a/rotator/drivers/PSTRotDrv.h b/rotator/drivers/PSTRotDrv.h index 1ed83533..55f43fea 100644 --- a/rotator/drivers/PSTRotDrv.h +++ b/rotator/drivers/PSTRotDrv.h @@ -1,5 +1,5 @@ -#ifndef ROTATOR_DRIVERS_PSTROTDRV_H -#define ROTATOR_DRIVERS_PSTROTDRV_H +#ifndef QLOG_ROTATOR_DRIVERS_PSTROTDRV_H +#define QLOG_ROTATOR_DRIVERS_PSTROTDRV_H #include #include @@ -41,4 +41,4 @@ private slots: QHostAddress rotatorAddress; }; -#endif // ROTATOR_DRIVERS_PSTROTDRV_H +#endif // QLOG_ROTATOR_DRIVERS_PSTROTDRV_H diff --git a/ui/FreqQSpinBox.h b/ui/FreqQSpinBox.h index 220bcdd0..53828ef7 100644 --- a/ui/FreqQSpinBox.h +++ b/ui/FreqQSpinBox.h @@ -1,5 +1,5 @@ -#ifndef FREQQSPINBOX_H -#define FREQQSPINBOX_H +#ifndef QLOG_UI_FREQQSPINBOX_H +#define QLOG_UI_FREQQSPINBOX_H #include #include @@ -23,4 +23,4 @@ public slots: QList enabledBands; }; -#endif // FREQQSPINBOX_H +#endif // QLOG_UI_FREQQSPINBOX_H diff --git a/ui/ProfileImageWidget.h b/ui/ProfileImageWidget.h index b750dfdb..2fe458d9 100644 --- a/ui/ProfileImageWidget.h +++ b/ui/ProfileImageWidget.h @@ -1,5 +1,5 @@ -#ifndef PROFILEIMAGEWIDGET_H -#define PROFILEIMAGEWIDGET_H +#ifndef QLOG_UI_PROFILEIMAGEWIDGET_H +#define QLOG_UI_PROFILEIMAGEWIDGET_H #include #include @@ -56,4 +56,4 @@ private slots: QMimeType mimeType; }; -#endif // PROFILEIMAGEWIDGET_H +#endif // QLOG_UI_PROFILEIMAGEWIDGET_H diff --git a/ui/QSODetailDialog.h b/ui/QSODetailDialog.h index 2b63ae7a..216e6003 100644 --- a/ui/QSODetailDialog.h +++ b/ui/QSODetailDialog.h @@ -1,5 +1,5 @@ -#ifndef QSODETAILDIALOG_H -#define QSODETAILDIALOG_H +#ifndef QLOG_UI_QSODETAILDIALOG_H +#define QLOG_UI_QSODETAILDIALOG_H #include #include From 62c68e0575340093e31ef7a6bfd40237d811d18d Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 20 Sep 2024 20:18:44 +0200 Subject: [PATCH 34/74] Fixed Header Include Guards (2) --- core/UpdatableSQLRecord.h | 2 +- rotator/drivers/GenericRotDrv.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/UpdatableSQLRecord.h b/core/UpdatableSQLRecord.h index 51586218..9f9b5599 100644 --- a/core/UpdatableSQLRecord.h +++ b/core/UpdatableSQLRecord.h @@ -42,4 +42,4 @@ private slots: int interval; }; -#endif // UPDATABLESQLRECORD_H +#endif // QLOG_CORE_UPDATABLESQLRECORD_H diff --git a/rotator/drivers/GenericRotDrv.h b/rotator/drivers/GenericRotDrv.h index 87f550a1..71b31c21 100644 --- a/rotator/drivers/GenericRotDrv.h +++ b/rotator/drivers/GenericRotDrv.h @@ -1,5 +1,5 @@ -#ifndef GENERICROTDRV_H -#define GENERICROTDRV_H +#ifndef QLOG_ROTATOR_DRIVERS_GENERICROTDRV_H +#define QLOG_ROTATOR_DRIVERS_GENERICROTDRV_H #include #include "data/RotProfile.h" @@ -36,4 +36,4 @@ class GenericRotDrv : public QObject double elevation; }; -#endif // GENERICROTDRV_H +#endif // QLOG_ROTATOR_DRIVERS_GENERICROTDRV_H From 38efa6332b215198f5ecaa97d0c6c2312e9ff8ff Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 20 Sep 2024 20:43:46 +0200 Subject: [PATCH 35/74] Updated Changelog --- Changelog | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Changelog b/Changelog index 44b4db4f..d91cec04 100644 --- a/Changelog +++ b/Changelog @@ -2,15 +2,15 @@ TBC - 0.39.0 - [NEW] - DXC - Added Full-text search - [NEW] - Select S in RST Edit when focused (issue #454) - [CHANGED] - HamlibDrv - Added multiplatform reliable sleep -- [CHANGED] - Backup policy +- [CHANGED] - Changed Backup policy - [CHANGED] - Logbook page size - improved performance -- [CHANGED] - Logbook - CTRL-A is disabled +- [CHANGED] - Logbook - CTRL-A (Select All) is disabled - [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452) - Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) -- Fixed Wrong import of adif file of another log program (issue #455) -- Fixed WSJTX log record is stored incorrectly if it contains non-ASCII (issue #458) +- Fixed Wrong import of ADIF file of another log program (issue #455) +- Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458) - Fixed ADIF import does not import records with old DXCC Entities (issue #459) -- Fixed ADIF import incorrectly uses Station Profile (issue #461) +- Fixed ADIF import incorrectly uses Station Profile parameters (issue #461) - Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464) 2024/08/29 - 0.38.0 From bec02512f90518b9e3952ef037833e3db97e247b Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Mon, 23 Sep 2024 11:06:03 +0200 Subject: [PATCH 36/74] Updated CZ/DE translations --- i18n/qlog_cs.qm | Bin 182597 -> 183189 bytes i18n/qlog_cs.ts | 1226 +++++++++++++++++++++++--------------------- i18n/qlog_de.qm | Bin 191628 -> 192198 bytes i18n/qlog_de.ts | 1226 +++++++++++++++++++++++--------------------- i18n/qlog_es.qm | Bin 195421 -> 195227 bytes i18n/qlog_es.ts | 1226 +++++++++++++++++++++++--------------------- i18n/qlog_it.qm | Bin 195899 -> 195707 bytes i18n/qlog_it.ts | 1226 +++++++++++++++++++++++--------------------- i18n/qlog_zh_CN.qm | Bin 145828 -> 145724 bytes i18n/qlog_zh_CN.ts | 1226 +++++++++++++++++++++++--------------------- ui/DxWidget.ui | 2 +- 11 files changed, 3161 insertions(+), 2971 deletions(-) diff --git a/i18n/qlog_cs.qm b/i18n/qlog_cs.qm index 06da5d8c64f37a7cbecc0c963f64a846a51f27f1..2abb38057d31498798022a133bf5fa82b1bcc8d4 100644 GIT binary patch delta 13546 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 A3jhEB delta 13062 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 zPPravidla - + Add Přidat - + Edit Upravit - + Remove Vymazat @@ -217,37 +217,37 @@ AlertTableModel - + Rule Name Pravidlo - + Callsign Značka - + Frequency Frekvence - + Mode Druh provozu - + Updated Aktualizací - + Last Update Poslední - + Last Comment Zpráva @@ -363,117 +363,117 @@ Zobrazit - + DXCC DXCC - + ITU ITU - + WAC WAC - + WAZ WAZ - + WAS WAS - + WPX WPX - + IOTA IOTA - + POTA Hunter POTA Lovec - + POTA Activator POTA Aktivátor - + SOTA SOTA - + WWFF WWFF - + Done Dokončit - + North America Severní Amerika - + South America Jižní Amerika - + Europe Evropa - + Africa Afrika - + Asia Asie - + Antarctica Antarktida - + Oceania Oceánie - + TOTAL Worked Celkem Pracováno - + TOTAL Confirmed Celkem Potvrzeno - + Confirmed Potvrzeno - + Worked Pracováno @@ -706,17 +706,17 @@ Zastavi&t - + Rig must be connected Rig musí být připojen - + Word Slovo - + Whole Celek @@ -814,27 +814,27 @@ CWKeyer - + No CW Keyer Profile selected Není vybrán žádný profil klíče - + Initialization Error Chyba inicializace - + Internal Error Interní Chyba - + Connection Error Chyba připojení - + Cannot open the Keyer connection Nelze přijipoji klíč @@ -842,39 +842,39 @@ CWWinKey2 - + Connected device is not WinKey Připojené zařízení není WinKey - + Connected device is not WinKey v2 or newer Připojené zařízení není WinKey v2 nebo novější - - - + + + Keyer is not connected Klíč není připojen - + Cannot send Text to Rig Nelze odeslat Text do rádia - + Cannot set Keyer Speed Nelze nastavit rychlost klíče - + Cannot stop Text Sending Nelze zastavit odesílání textu - + Communication Error Chyba připojení @@ -962,7 +962,7 @@ ClubLog - + Clublog Operation for Callsign %1 failed.<br>%2 Clublog operace pro značku %1 se nezdrařila.<br>%2 @@ -2840,151 +2840,151 @@ Data - + New Entity Nová země - + New Band Nové pásmo - + New Mode Nový druh provozu - + New Band&Mode Nové pásmo&druh - + New Slot Nový slot - + Confirmed Potvrzeno - + Worked Pracováno - + Hz Hz - + kHz kHz - + GHz GHz - + MHz MHz + + + + + + + Yes + Ano + - Yes - Ano - - - - - - - No Ne - - + + Requested Vyžádáno - + Queued Ve frontě - - + + Invalid Chybné - + Bureau Bureau - + Direct Direct - + Electronic Elektronicky - - - - - + + + + + Blank Nevyplněno - + Modified Upraveno - + Grayline - + Other Jiné - + Short Path - + Long Path - + Not Heard Neslyšeno - + Uncertain Nejistý @@ -3276,57 +3276,57 @@ DxTableModel - + Time Čas - + Callsign Značka - + Frequency Frekvence - + Mode Mode - + Spotter Spotter - + Comment Poznámka - + Continent Kontinent - + Spotter Continent Kontinent Spottera - + Band Pásmo - + Member Člen - + Country Země @@ -3334,13 +3334,13 @@ DxWidget - + Send DX Cluster Command Odeslat příkaz do DX Clusteru - + Connect Připojit @@ -3375,147 +3375,172 @@ Konzole - + + Full-text search + Fulltextové vyhledávání + + + + Search + Hledat + + + + Close Search + Zavřít vyhledávání + + + Filter... Filtr... - + Spot Last QSO Spotni poslední QSO - + Send last QSO spot Odeslat poslední QSO spot - + Show HF Stats Zobrazit KV Stats - + Show VHF Stats Zobrazit VKV Stats - + Show WCY Zobrazit WCY - + Show WWV Zobrazit WWV - + Column Visibility... Zobrazení sloupců... - + Connect on startup Připojit při spuštění - + Automatic connection after start Automatické připojení po startu aplikace - + Delete Server Vymazat server - + DXC - Delete Server DXC - Vymazat server - + Clear Password Vymazat heslo - + Keep Spots Zachovat Spoty - + Spots are not cleared when connecting to a new DX Cluster. Při přepojení serverů nejsou spoty smazány. - + Clear Vymazat - + Clear all data Vše vymazat - + + Search... + Hledat... + + + + DXC - Search + DXC- Hledat + + + Which columns should be displayed Který sloupec by měl být zobrazen - + Filter DXC Filtr DXC - + Connecting... Připojování... - + DX Cluster is temporarily unavailable DX Cluster je dočasně nedostupný - + DXC Server Error Chyba DXC Serveru - + An invalid callsign Nesprávná značka - + DX Cluster Password DX Cluster Heslo - + Security Notice Bezpečnostní upozornění - + The password can be sent via an unsecured channel Heslo může být posláno přes nezabezpečený kanál - + Server Server - + Username Uživatelské jméno - + Disconnect Odpojit @@ -3546,7 +3571,7 @@ DxccTableWidget - + Mode Druh provozu @@ -4036,23 +4061,23 @@ Neodesílat - + Uploading to HRDLOG Nahrávání do HRDLog - + Cancel Zrušit - - + + QLog Information Informace QLog - + %n QSO(s) uploaded. %n QSO bylo nahráno. @@ -4061,17 +4086,17 @@ - + QLog Warning Upozornění QLog - + Cannot upload the QSO(s): Není možné nahrát QSO: - + No QSOs found to upload. Nenalezeny žádné QSO pro nahrání. @@ -4087,63 +4112,63 @@ HamlibRigDrv - + None Žádné - + CAT CAT - + DTR DTR - + RTS RTS - - + + Initialization Error Chyba inicializace - + Cannot set PTT Type Nelze nastavit PTT Typ - + Cannot set PTT Share Nelze nastavit PTT Sdílení - + Unsupported Rig Driver Nepodporovaný ovladač - + Set Frequency Error Chyba v nastavení frekvence - + Set PTT Error Chyba v získaní stavu PTT - + Get Frequency Error Chyba v získání frekvence - + Get Mode Error Chyba v získání druhu provozu @@ -4201,7 +4226,7 @@ - + Comment Komentář @@ -4246,69 +4271,69 @@ Přepočítat DXCC Informace (DXCC, jméno země, kontinent atd.) - + &Import &Import - + Select File Vybrat soubor - + The value is used when an input record does not contain the ADIF value Hodnota je použita v případě, když importovaný záznam má příslušné ADIF pole prázdné - - + + The values below will be used when an input record does not contain the ADIF values Hodnoty jsou použity v případě, když importovaný záznam má příslušné ADIF pole prázdné - + <p><b>In-Log QSO:</b></p><p> <p><b>QSO v logu:</b></p><p> - + <p><b>Importing:</b></p><p> <p><b>Importováno:</b></p><p> - + Duplicate QSO Duplicitní QSO - + <p>Do you want to import duplicate QSO?</p>%1 %2 <p>Přejete si importovat toto duplicitní QSO?</p>%1 %2 - + Save to File Uložit do souboru - + QLog Import Summary QLog Shrnutí Importu - + Import date Datum Importu - + Imported file Soubor importu - + Imported: %n contact(s) Importovano: %n kontaktů @@ -4317,7 +4342,7 @@ - + Warning(s): %n Upozornění: %n @@ -4326,7 +4351,7 @@ - + Error(s): %n Chyb: %n @@ -4335,17 +4360,17 @@ - + Details Detaily - + Import Result Výsledek Importu - + Save Details... Uložit detaily... @@ -4612,48 +4637,61 @@ LogFormat - + + + Cannot find My DXCC Entity Info + Nelze dohledat Mé DXCC Informace + + + A minimal set of fields not present (start_time, call, band, mode, station_callsign) Zaznam neobsahuje minimální počet polí (start_time, call, band, mode, station_callsign) - + Outside the selected Date Range Mimo vybraný rozsah datumů - - + + Duplicate Duplicitní - + Cannot find DXCC Entity Info Nelze dohledat DXCC Informace - - Cannot find own DXCC Entity Info - Nelze dohledat vlastní DXCC Informace + + DXCC Info is missing + Chybí informace o DXCC + + + + + + no Station Callsign present + Značka stanice není k dispozici - + Cannot insert to database Nelze vložit do databáze - + Imported Importováno - + Error Chyba - + Warning Upozornění @@ -5535,38 +5573,38 @@ - + Band Pásmo - + Mode Druh provozu - + Country Země - + Club Klub - + User Filter Uživatelský filtr - - + + Delete Vymazat @@ -5632,32 +5670,32 @@ Logbook - Odeslat DX Spot - + Delete the selected contacts? Vymazat vybraný kontakt? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? Clublog <b>Okamžité odeslání</b> podporuje pouze mazání po jednom záznamu<br><br>Chcete pokračovat navzdory skutečnosti,<br>že operace DELETE nebude odeslána do Clublogu? - + Deleting QSOs Mazání QSO - + Update Aktualizace - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? Aktualizací budou ovlivněny všechny vybrané řádky<br>Aktuálněupravená hodnota ve sloupci se použije na všechny vybrané řádky.<br>Chcete je upravit? - + Count: %n Anzahl: %n @@ -5667,23 +5705,23 @@ - + Downloading eQSL Image Stahování eQSL obrázku - - + + Cancel Zrušit - + QLog Error Chyba QLog - + eQSL Download Image failed: Stažení eQSL obrázku selhalo: @@ -6058,7 +6096,7 @@ Nesmí být prázdné - + Unsaved Neuloženo @@ -6396,7 +6434,7 @@ Zobrazit upozornění - + About O aplikaci @@ -6406,73 +6444,73 @@ Wsjtx - + Not enabled for non-Fusion style Není povoleno pro jiný styl než Fusion - + Press to tune the alert Stiskni pro naladění alertu - + Clublog Immediately Upload Error Chyba Okamžitého nahrávání do Clublog - - + + <b>Error Detail:</b> <b>Detail chyby:</b> - + Classic Klasické - - - - - + + + + + QLog Warning Upozornění QLog - + LoTW is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> LoTW není správně nastaven.<p> Prosím, použijte dialog <b>Nastavení</b> pro konfiguraci služby.</p> - + eQSL is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> eQSL není správně nastaven.<p> Prosím, použijte dialog <b>Nastavení</b> pro konfiguraci služby.</p> - + Clublog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> Clublog není správně nastaven.<p> Prosím, použijte dialog <b>Nastavení</b> pro konfiguraci služby.</p> - + HRDLog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> HRDLog není správně nastaven.<p> Prosím, použijte dialog <b>Nastavení</b> pro konfiguraci služby.</p> - + QRZ.com is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> QRZ.com není správně nastaven.<p> Prosím, použijte dialog <b>Nastavení</b> pro konfiguraci služby.</p> - + <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copy; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Based on Qt %2<br/>%3<br/>%4<br/>%5</p><p>Icon by <a href='http://www.iconshock.com'>Icon Shock</a><br />Satellite images by <a href='http://www.nasa.gov'>NASA</a><br />ZoneDetect by <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />TimeZone Database by <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a> <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copy; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Záloženo na Qt %2<br/>%3<br/>%4<br/>%5</p><p>Ikony <a href='http://www.iconshock.com'>Icon Shock</a><br />Satelitní snímky <a href='http://www.nasa.gov'>NASA</a><br />ZoneDetect <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />TimeZone <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a> - + N/A - @@ -6539,52 +6577,52 @@ Migration - + DXCC Entities DXCC Země - + Sats Info Sat Info - + SOTA Summits SOTA Summit - + WWFF Records WWFF záznamy - + IOTA Records IOTA záznamy - + POTA Records POTA záznamy - + Membership Directory Records Klubové informace - + List of Values Seznam hodnot - + Updating Aktualizuji - + Update Failed Aktualizace selhala @@ -6592,12 +6630,12 @@ NewContactWidget - + 59 59 - + Mode Mode @@ -6622,165 +6660,165 @@ - + 80m 80m - + Date Datum - + Reset Vymazat - + Save Uložit - + RSTr RSTr - + RSTs RSTs - + Lookup the call on the web. The query URL can be changed in Settings -> Callbook Vyhledet informace o značce na webu. URL dotazu lze změnit v Nastavení -> Callbook - + Web Web - + Time On Čas od - + Info Info - + Member: Člen: - + World Wide Flora & Fauna World Wide Flora & Fauna - + QSL Send Status QSL Send Status - - + + Paper QSL - - - + + + <b>Yes</b> - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service<br/><b>No</b> - do not send an outgoing QSL card; do not upload the QSO to the online service<br/><b>Requested</b> - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service<br/><b>Queued</b> - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service<br/> <b>Odesláno</b> -QSL byl odeslán; QSO bylo nahráno a akceptováno online službou<br/><b>Neodesílat</b> -QSL nemá být odesláno; neodesílat do online služby<br/><b>Vyžádano</b> -protistanice vyžádala QSL; protistanice vyžádala opětovné nahrání do online služby<br/><b>Ve frontě</b> -QSL bylo zařazeno do fronty k vyřízení; QSO je ve frontě k nahrání do online služby<br/> - + LoTW LoTW - + eQSL eQSL - + QSL Send via QSL odeslat přes - + Blank Nevyplněno - + My &Notes Mé &poznámky - + &Details &Detaily - + D&XCC D&XCC - + M&y Station Mo&je Stanice - + Station Stanice - + the contacted station's DARC DOK (District Location Code) (ex. A01) DARC DOK (kód uzemí) (např A01) - + Duration Délka - + QSL via QSL Via - + Propagation Mode Podmínky šíření - + Rig Rig - + Power Výkon - + W W - + Antenna Anténa @@ -6790,147 +6828,147 @@ MHz - - - + + + No Neodesílat - - - + + + Yes Odesláno - - - + + + Requested Vyžádáno - - - + + + Queued Ve frontě - - - + + + Ignored Ignorovat - + Bureau Bureau - + Direct Direct - + Electronic Elektronicky - + QLog Error Chyba QLog - + Callbook login failed Selhalo přihlášení do Callbooku - + LP LP - + New Entity! Nová země! - + New Band! Nové pásmo! - + New Mode! Nový druh provozu! - + New Band & Mode! Nové pásmo & druh! - + New Slot! Nový slot! - + Worked Pracováno - + Confirmed Potvrzeno - + GE GE - + GM GM - + GA GA - + m m - + Callbook search is active Hledání v Callbooku je aktivní - + Callbook search is inactive Hledání v Callbooku není aktivní - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) dva nebo čtyři sousední lokátory, každý o délce čtyř znaků (např. EN98,FM08,EM97,FM07) - + Special Activity Group - + Special Activity Group Information @@ -7109,7 +7147,7 @@ QCoreApplication - + QLog Help QLog Help @@ -7117,153 +7155,153 @@ QMessageBox - - - - - + + + + + - - - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + QLog Warning Upozornění QLog - + Club List Update failed. Cannot remove old records Nepovedlo se aktualizovat Club List. Není možné odstranit staré záznamy - + Club List Update failed. Cannot plan new downloads Nepovedlo se aktualizovat Club List. Není možné naplánovat stažení listů - - - + + + QLog Critical Chyba QLog - + Cannot save a password for %1 to the Credential Store Do uložiště hesel nelze uložit heslo pro %1 - + Cannot get a password for %1 from the Credential Store Z uložiště hesel nelze získat heslo pro %1 - + Unexpected Club List download. Canceling next downloads Neočekávaná odpověď Club Listu. Ruším aktualizaci - + Unexpected Club List content for Neočekávaný obsah Club List pro - + Network error. Cannot download Club List for Síťová chyba. Nepovedlo se stáhnout Club List pro - - - - - + + + + + - + - - + + QLog Error Chyba QLog - + QLog is already running QLog již běží - + Could not connect to database. Nelze se připojit k databázi. - + Could not export a QLog database to ADIF as a backup.<p>Try to export your log to ADIF manually Nelze exportovat QLog databázi do ADIF jako backup.<p>Pokuste se ručně exportovat log do ADIF - + Database migration failed. Migrace databaze selhala. - + Could not connect to database (2). Nelze se připojit k databázi (2). - + DXC Server Name Error Chyba jména DXC Serveru - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> Adresa DXC Serveru musí být ve formátu <p><b>[uživatel@]hostname:port</b> (např. hamqth.com:7300)</p> - + DX Cluster Password DX Cluster heslo - + Invalid Password Nesprávné heslo - + DXC Server Connection Error Chyba připojení k DXC serveru - + Your callsign is empty. Please, set your Station Profile Vaše značka není vyplněna. Prosím, nastavte Profil Stanice @@ -7319,89 +7357,89 @@ Nepovedlo se aktualizovat QSO Filtr - - - + + Please, define at least one Station Locations Profile Prosím, definujte alespoň jeden Profil Stanice - + WSJTX Multicast is enabled but the Address is not a multicast address. WSJTX Multicast je aktivní ale adresa není multicast IP adresa. - + Rig port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device Port musí být platný COM port.<br>Použijte COMxx pro Windows, pro ostatní cestu k souboru zařízení - + Rig PTT port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device PTT Port musí být platný COM port.<br>Použijte COMxx pro Windows, pro ostatní cestu k souboru zařízení - + <b>TX Range</b>: Max Frequency must not be 0. <b>Rozsah TX</b>: Koncová frekvence nesmí být 0. - + <b>TX Range</b>: Max Frequency must not be under Min Frequency. <b>Rozsah TX</b>: Koncová frekvence nesmí být menší než počáteční. - + Rotator port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device Port musí být platný COM port.<br>Použijte COMxx pro Windows, pro ostatní cestu k souboru zařízení - + CW Keyer port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device Port musí být platný COM port.<br>Použijte COMxx pro Windows, pro ostatní cestu k souboru zařízení - + Cannot change the CW Keyer Model to <b>Morse over CAT</b><br>No Morse over CAT support for Rig(s) <b>%1</b> Nelze změnit Model klíče na <b>Morse over CAT</b><br>Nasledující zařízení nepodporuji Morse over CAT support <b>%1</b> - + Cannot delete the CW Keyer Profile<br>The CW Key Profile is used by Rig(s): <b>%1</b> Nelze vymazat Profil Klíče<br>Profil je pouzívám temito zařízeními:<b>%1</b> - + Gridsquare has an invalid format Lokátor má chybný formát - + VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by ',') VUCC lokátor má neplatný formát (musí být 2 nebo 4 lokátory oddělené ',') - + Country must not be empty Zěme nesmí být prázdná - + CQZ must not be empty CQZ nesmí být prázdné - + ITU must not be empty ITU nesmí být prázdné - + Callsign has an invalid format Značka má chybný formát - + Filename is empty Jméno souboru je zprázdné @@ -7425,17 +7463,17 @@ - + <b>Rig Error:</b> <b>Chyba Rig:</b> - + <b>Rotator Error:</b> <b>Chyba Rotátoru:</b> - + <b>CW Keyer Error:</b> <b>Chyba CW Klíče:</b> @@ -7453,149 +7491,149 @@ QObject - + Cannot connect to DXC Server <p>Reason <b>: Nelse se připojit k DXC serveru <p>Důvod <b>: - + Connection Refused Spojení odmítnuto - + Host closed the connection Server uzavřel spojení - + Host not found Server nenalezen - + Timeout Timeout - + Network Error Chyba sítě - + Internal Error Interní Chyba - + Opening Database Načítání Databáze - + Backuping Database Záloha Databáze - + Migrating Database Migrace Databáze - + Starting Application Start aplikace - + My Rig Můj Rig - + Logging Station Callsign Značka logující stanice - + My Gridsquare Můj lokátor - + My Name Mé jméno - + My City Mé město - + My IOTA Moje IOTA - + My SOTA Má SOTA - + My Special Interest Activity Má SIG - + My Spec. Interes Activity Info Mé SIG Info - + My VUCC Grids Mé VUCC lokátory - + My WWFF Můj WWFF - + My POTA Ref Má POTA - + My ITU Moje ITU - + My CQZ Moje CQZ - + My DXCC Moje DXCC - + <b>Imported</b>: %n contact(s) <b>Importován</b>: %n kontakt @@ -7604,7 +7642,7 @@ - + <b>Warning(s)</b>: %n <b>Upozornění</b>: %n @@ -7613,7 +7651,7 @@ - + <b>Error(s)</b>: %n <b>Chyb</b>: %n @@ -7688,23 +7726,23 @@ Neodesílat - + Uploading to QRZ.com Nahrávání do QRZ.com - + Cancel Zrušit - - + + QLog Information Informace QLog - + %n QSO(s) uploaded. %n QSO bylo nahráno. @@ -7713,17 +7751,17 @@ - + QLog Warning Upozornění QLog - + Cannot upload the QSO(s): Není možné nahrát QSO: - + No QSOs found to upload. Nenalezeny žádné QSO pro nahrání. @@ -8620,22 +8658,22 @@ Rig - + No Rig Profile selected Není vybrán žádný Rig profil - + Initialization Error Chyba inicializace - + Internal Error Interní Chyba - + Cannot open Rig Rig nelze připojit @@ -8668,7 +8706,7 @@ XIT: 0.00000 MHz - + PWR: %1W PWR: %1W @@ -8676,22 +8714,22 @@ Rotator - + No Rotator Profile selected Není vybrán žádný Rot profil - + Initialization Error Chyba inicializace - + Internal Error Interní Chyba - + Cannot open Rotator Rotátor nelze připojit @@ -8786,20 +8824,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + Add Přidat @@ -9225,20 +9263,20 @@ Flow Control - - + + None None - - + + Hardware Hardware - - + + Software Software @@ -9249,32 +9287,32 @@ Parity - - + + No No - - + + Even Even - - + + Odd Odd - - + + Space Space - - + + Mark Mark @@ -9436,7 +9474,7 @@ - + Serial Serial @@ -9604,102 +9642,102 @@ <b>Oznámení o zabezpečení:</b> QLog ukládá všechna hesla do zabezpečeného úložiště. ON4KST bohužel používá protokol, kde je toto heslo odesíláno přes nezabezpečený kanál jako prostý text.</p><p>Při výběru hesla pro tuto službu buďte opatrní, protože vaše heslo je odesíláno přes nezabezpečený kanál v podobě prostého textu.< /p> - + Raw UDP Forward UDP Forward - + <p>List of IP addresses to which QLog forwards raw UDP WSJT-X packets.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Seznam IP adres, na které QLog přeposílá nezměněné UDP WSJTX pakety. </p>Adresy jsou odděleny mezerou a mají formát IP:PORT - + Join Multicast Použít Multicast - + Enable/Disable Multicast option for WSJTX Povolit/zakázat možnost Multicast pro WSJTX - + Multicast Address Multicast Adresa - + Specify Multicast Address. <br>On some Linux systems it may be necessary to enable multicast on the loop-back network interface. Zadejte Multicast adresu. <br>Na některých Linux systémech může být nutné povolit Multicast pro Loopback interface. - + TTL TTL - + Time-To-Live determines the range<br> over which a multicast packet is propagated in your intranet. Time-To-Live určuje vzdálenost<br>, do které se paket Multicastu v síti šíří. - + Notifications Notifikace - + DX Spots DX Spoty - + <p> List of IP addresses to which QLog sends UDP notification packets with DX Cluster Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Seznam IP adres, na které QLog přeposílá UDP notificate z DX Clusteru. </p>Adresy jsou odděleny mezerou a mají formát IP:PORT - + QSO Changes Změny QSO - + <p> List of IP addresses to which QLog sends UDP notification packets about a new/updated/deleted QSO in the log.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Seznam IP adres, na které QLog přeposílá UDP notificate o novém/aktualizovaném/vymazaném QSO. </p>Adresy jsou odděleny mezerou a mají formát IP:PORT - + Wsjtx CQ Spots Wsjtx CQ Spoty - + <p> List of IP addresses to which QLog sends UDP notification packets with WSJTX CQ Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Seznam IP adres, na které QLog přeposílá UDP notificate s WSJTX CQ Spoty. </p>Adresy jsou odděleny mezerou a mají formát IP:PORT - + Shortcuts Zkratky - + Spot Alerts Upozornění na Spoty - + <p> List of IP addresses to which QLog sends UDP notification packets about user Spot Alerts.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Seznam IP adres, na které QLog přeposílá UDP notifikace Upozornění na Spoty. </p>Adresy jsou odděleny mezerou a mají formát IP:PORT - + LogID LogID - + <p>Assigned LogID to the current log.</p>The LogID is sent in the Network Nofitication messages as a unique instance identified.<p> The ID is generated automatically and cannot be changed</> <p>LogID pro aktuální log</p>LogID se posílá ve všech UDP notifikacích jako unikátní identifikátor.<p> ID je generováno automaticky a nemůže být změněno.</> @@ -9725,8 +9763,8 @@ - - + + HamQTH HamQTH @@ -9752,22 +9790,22 @@ - - + + QRZ.com QRZ.com - + Port where QLog listens an incoming traffic from WSJT-X Port, kde QLog poslouchá příchozí zprávy z WSJT-X - - - - - + + + + + ex. 192.168.1.1:1234 192.168.2.1:1234 např. 192.168.1.1:1234 192.168.2.1:1234 @@ -9798,18 +9836,18 @@ - - + + Network Síť - + Wsjtx Wsjtx - + Port @@ -9887,161 +9925,161 @@ Pásma - + Modes Druhy provozu - + DXCC DXCC - - + + Name Jméno - + Report Report - - + + State Stav - - - + + + Disabled Vypnuto - + Press <b>Modify</b> to confirm the profile changes or <b>Cancel</b>. Stiskněte <b>Upravit</b> pro potvrzení změny profilu nebo <b>Zrušit</b>. - - - - - - - - - - + + + + + + + + + + Must not be empty Nesmí být prázdné - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + Modify Upravit - - + + Special - Omnirig Special - Omnirig - + Start (MHz) Pořátek (MHz) - + End (MHz) Konec (MHz) - + SAT Mode SAT Mode - + Dummy Dummy - + Morse Over CAT Morse Over CAT - + WinKey v2 WinKey v2 - + CWDaemon CWDaemon - + FLDigi FLDigi - + Single Paddle Single Paddle - + IAMBIC A IAMBIC A - + IAMBIC B IAMBIC B - + Ultimate Ultimate - + Select File Vybrat soubor - + members členů - + Required internet connection during application start Je vyžadováno připojení do internetu během startu aplikace @@ -10049,22 +10087,22 @@ ShortcutEditorModel - + Description Popis - + Shortcut Zkratky - + Conflict with a built-in shortcut Konflikt s vestavěnou klávesovou zkratkou - + Conflict with a user-defined shortcut Konflikt s klávesovou zkratkou @@ -10365,17 +10403,17 @@ ToAllTableModel - + Time Čas - + Spotter Spotter - + Message Zpráva @@ -10411,47 +10449,47 @@ WCYTableModel - + Time Čas - + K K - + expK expK - + A A - + R R - + SFI SFI - + SA SA - + GMF GMF - + Au Au @@ -10459,27 +10497,27 @@ WWVTableModel - + Time Čas - + SFI SFI - + A A - + K K - + Info Info @@ -10605,37 +10643,37 @@ WsjtxTableModel - + Callsign Značka - + Gridsquare Lokátor - + Distance Vzdálenost - + SNR SNR - + Last Activity Aktivita - + Last Message Zpráva - + Member Člen @@ -10676,32 +10714,32 @@ main - + Run with the specific namespace. Spustit ve specifickém jmeném prostoru. - + namespace namespace - + Translation file - absolute or relative path and QM file name. Soubor s překladem - absolutní nebo relativní cesta a jméno QM souboru. - + path/QM-filename path/QM-filename - + Set language. <code> example: 'en' or 'en_US'. Ignore environment setting. Nastavit jazyk. Příklad <code>: 'en' nebo 'en_US'. Ignoruje OS nastavení. - + code kód diff --git a/i18n/qlog_de.qm b/i18n/qlog_de.qm index 06691686932fa790665f2d84cdb0db398f5cb915..033f4c4592844e8ed40a2fbae2b9cff5b9bef55d 100644 GIT binary patch delta 13571 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 XGIV%sQf$JA>DuOOm$o^dw&DK(?|71z delta 13254 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 VVfUmKtS6fl+KTNCZNRegeln - + Add Hinzufügen - + Edit Bearbeiten - + Remove Entfernen @@ -217,37 +217,37 @@ AlertTableModel - + Rule Name Regelname - + Callsign Rufzeichen - + Frequency Frequenz - + Mode Betriebsart - + Updated Aktualisiert - + Last Update Letzte Aktualisierung - + Last Comment Letzter Kommentar @@ -363,117 +363,117 @@ Anzeigen - + DXCC - + ITU - + WAC - + WAZ - + WAS - + WPX - + IOTA - + POTA Hunter - + POTA Activator - + SOTA SOTA - + WWFF - + Done erledigt - + North America Nordamerika - + South America Südamerika - + Europe Europa - + Africa Afrika - + Asia Asien - + Antarctica Antarktis - + Oceania Ozeanien - + TOTAL Worked Summe Gearbeitet - + TOTAL Confirmed Summe Bestätigt - + Confirmed Bestätigt - + Worked Gearbeitet @@ -706,17 +706,17 @@ Hal&t - + Rig must be connected Rig muss verbunden sein - + Word Wort - + Whole Ganze @@ -814,27 +814,27 @@ CWKeyer - + No CW Keyer Profile selected Kein CW-Keyer Profil ausgewählt - + Initialization Error Initialisierungsfehler - + Internal Error Interner Fehler - + Connection Error Verbindungsfehler - + Cannot open the Keyer connection Kann die Keyer-Verbindung nicht herstellen @@ -842,39 +842,39 @@ CWWinKey2 - + Connected device is not WinKey Angeschlossenes Gerät ist kein WinKey - + Connected device is not WinKey v2 or newer Angeschlossenes Gerät ist kein WinKey v2 oder neuer - - - + + + Keyer is not connected Kein Keyer verbunden - + Cannot send Text to Rig Kann Text nicht an Rig senden - + Cannot set Keyer Speed Kann Keyer-WPM nicht einstellen - + Cannot stop Text Sending Kann Textübertragung nicht beenden - + Communication Error Kommunikationsfehler @@ -962,7 +962,7 @@ ClubLog - + Clublog Operation for Callsign %1 failed.<br>%2 Clublog-Anfrage für Rufzeichen %1 fehlgeschlagen.<br>%2 @@ -2839,151 +2839,151 @@ Data - + New Entity Neuer Eintrag - + New Band Neues Band - + New Mode Neuer Mode - + New Band&Mode Neues Band&Mode - + New Slot Neuer Slot - + Confirmed Bestätigt - + Worked Gearbeitet - + Hz Hz - + kHz kHz - + GHz GHz - + MHz MHz + + + + + + + Yes + Ja + - Yes - Ja - - - - - - - No Nein - - + + Requested Angefordert - + Queued Wartend - - + + Invalid Ungültig - + Bureau Büro - + Direct Direkt - + Electronic Elektronisch - - - - - + + + + + Blank Leer - + Modified Geändert - + Grayline - + Other Andere - + Short Path - + Long Path - + Not Heard Nicht gehört - + Uncertain Unsicher @@ -3275,57 +3275,57 @@ DxTableModel - + Time Zeit - + Callsign Rufzeichen - + Frequency Frequenz - + Mode Betriebsart - + Spotter - + Comment Kommentar - + Continent Kontinent - + Spotter Continent Spotter Kontinent - + Band Band - + Member Mitglied - + Country Land @@ -3333,7 +3333,7 @@ DxWidget - + Send DX Cluster Command Sende DX-Cluster Kommando @@ -3363,97 +3363,122 @@ Konsole - + + Full-text search + Volltextsuche + + + + Search + Suchen + + + + Close Search + Suche schließen + + + Filter... Filter... - + Filter DXC Filter DXC - + Spot Last QSO Spot letztes QSO - + Send last QSO spot Letzten QSO-Spot senden - + Show HF Stats HF Statistik anzeigen - + Show VHF Stats VHF Statistik anzeigen - + Show WCY WCY anzeigen - + Show WWV WWV anzeigen - + Column Visibility... Spaltensichtbarkeit... - + Connect on startup Beim Start verbinden - + Automatic connection after start Automatische Verbindung nach dem Start - + Delete Server Löschen Server - + DXC - Delete Server DXC - Löschen Server - + Clear Password Passwort löschen - + Keep Spots Spots merken - + Spots are not cleared when connecting to a new DX Cluster. Spots werden nicht gelöscht, wenn eine Verbindung zu einem neuen DX-Cluster hergestellt wird. - + Clear Löschen - + Clear all data Alle Löschen - + + Search... + Suchen... + + + + DXC - Search + DXC- Suchen + + + Which columns should be displayed Welche Spalten sollen angezeigt werden @@ -3464,57 +3489,57 @@ - + Connect Verbinden - + Connecting... Verbinden... - + DX Cluster is temporarily unavailable DX-Cluster vorübergehend nicht erreichbar - + DXC Server Error DXC-Serverfehler - + An invalid callsign Ungültiges Rufzeichen - + DX Cluster Password DX Cluster Passwort - + Security Notice Sicherheitshinweis - + The password can be sent via an unsecured channel Das Passwort kann über einen ungesicherten Kanal gesendet werden - + Server Server - + Username Benutzername - + Disconnect Trennen @@ -3545,7 +3570,7 @@ DxccTableWidget - + Mode Betriebsart @@ -4034,23 +4059,23 @@ "Nein" - + Uploading to HRDLOG Nach HRDLog hochladen - + Cancel Abbrechen - - + + QLog Information QLog Information - + %n QSO(s) uploaded. %n QSO(s) hochgeladen. @@ -4058,17 +4083,17 @@ - + QLog Warning QLog Warnung - + Cannot upload the QSO(s): Kann QSO(s) nicht hochladen: - + No QSOs found to upload. Keine QSOs zum Hochladen gefunden. @@ -4084,63 +4109,63 @@ HamlibRigDrv - + None - + CAT CAT - + DTR DTR - + RTS RTS - - + + Initialization Error Initialisierungsfehler - + Cannot set PTT Type PTT-Typ kann nicht eingestellt werden - + Cannot set PTT Share PTT-Share kann nicht eingestellt werden - + Unsupported Rig Driver Nicht unterstützter Rig-Treiber - + Set Frequency Error Fehler bei der Frequenzeinstellung - + Set PTT Error Fehler beim Auslösen der PTT - + Get Frequency Error Fehler bei der Frequenzabfrage - + Get Mode Error Fehler bei der Mode-Abfrage @@ -4183,7 +4208,7 @@ - + Comment Kommentar @@ -4243,69 +4268,69 @@ Aktualisierung der DXCC-Einträge - + &Import &Importieren - + Select File Datei auswählen - + The value is used when an input record does not contain the ADIF value Der Wert wird verwendet, wenn ein importierter Datensatz den ADIF-Wert nicht enthält - - + + The values below will be used when an input record does not contain the ADIF values Die folgenden Werte werden verwendet, wenn ein importierter Datensatz die ADIF-Werte nicht enthält - + <p><b>In-Log QSO:</b></p><p> <p><b>Logbuch QSO:</b></p><p> - + <p><b>Importing:</b></p><p> <p><b>Importieren:</b></p><p> - + Duplicate QSO Doppeltes QSO - + <p>Do you want to import duplicate QSO?</p>%1 %2 <p>Doppelte QSOs importieren?</p>%1 %2 - + Save to File In Datei speichern - + QLog Import Summary Zusammenfassung QLog Import - + Import date Datum importieren - + Imported file Datei importieren - + Imported: %n contact(s) Importiert: %n Kontakt(e) @@ -4313,7 +4338,7 @@ - + Warning(s): %n Warnungen: %n @@ -4321,7 +4346,7 @@ - + Error(s): %n Fehler: %n @@ -4329,17 +4354,17 @@ - + Details Details - + Import Result Ergebnis des Imports - + Save Details... Details speichern... @@ -4606,48 +4631,61 @@ LogFormat - + + + Cannot find My DXCC Entity Info + Meine DXCC-Informationen fehlen + + + A minimal set of fields not present (start_time, call, band, mode, station_callsign) Ein minimaler Satz von Datenfeldern, die nicht vorhanden sind (start_time, call, band, mode, station_callsign) - + Outside the selected Date Range Außerhalb des gewählten Datumsbereichs - - + + Duplicate Duplikate - + Cannot find DXCC Entity Info DXCC Entity Info nicht gefunden - - Cannot find own DXCC Entity Info - Eigene DXCC-Entity-Infos nicht gefunden + + DXCC Info is missing + DXCC-Informationen fehlen + + + + + + no Station Callsign present + Kein Stationsrufzeichen vorhanden - + Cannot insert to database Einfügen in die Datenbank nicht möglich - + Imported Importiert - + Error Fehler - + Warning Warnung @@ -5529,20 +5567,20 @@ - + Club - + User Filter Benutzer-Filter - - + + Delete Löschen @@ -5609,50 +5647,50 @@ - + Country Land - + Band Band - + Mode Betriebsart - + Delete the selected contacts? Die ausgewählten Kontakte löschen? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? Clublog <b>Sofort Upload</b> unterstützt nur das Löschen eines Datensatzes nach dem anderen.<br><br>Möchten Sie fortfahren, obwohl<br>der DELETE-Vorgang nicht an Clublog gesendet wird? - + Deleting QSOs QSOs Löschen - + Update Aktualisieren - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? Durch die Aktualisierung werden alle ausgewählten Zeilen beeinflusst.<br>Der aktuell bearbeitete Wert in der Spalte wird auf alle ausgewählten Zeilen angewendet.<br>Möchten Sie fortfahren? - + Count: %n Anzahl: %n @@ -5660,23 +5698,23 @@ - + Downloading eQSL Image eQSL-Bild herunterladen - - + + Cancel Abbrechen - + QLog Error QLog Fehler - + eQSL Download Image failed: eQSL-Bild download fehlgeschlagen: @@ -6050,7 +6088,7 @@ Darf nicht leer sein - + Unsaved Ungespeichert @@ -6387,7 +6425,7 @@ Alerts anzeigen - + About Über @@ -6398,73 +6436,73 @@ - + Not enabled for non-Fusion style Für keinen anderen Stil als Fusion zulässig - + Press to tune the alert Drücken zum Einstellen des Alarms - + Clublog Immediately Upload Error Clublog-Sofort-Upload-Fehler - - + + <b>Error Detail:</b> <b>Fehler-Detail:</b> - + Classic Klassisch - - - - - + + + + + QLog Warning QLog Warnung - + LoTW is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> LoTW ist nicht richtig eingerichtet.<p> Bitte verwende den <b>Einstellungen</b> Dialog, um es einzurichten.</p> - + eQSL is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> eQSL ist nicht richtig eingerichtet.<p> Bitte verwende den <b>Einstellungen</b> Dialog, um es einzurichten.</p> - + Clublog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> Clublog ist nicht richtig eingerichtet.<p> Bitte verwende den <b>Einstellungen</b> Dialog, um es einzurichten.</p> - + HRDLog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> HRDLog ist nicht richtig eingerichtet.<p> Bitte verwende den <b>Einstellungen</b> Dialog, um es einzurichten.</p> - + QRZ.com is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> QRZ.com ist nicht richtig eingerichtet.<p> Bitte verwende den <b>Einstellungen</b> Dialog, um es einzurichten.</p> - + <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copy; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Based on Qt %2<br/>%3<br/>%4<br/>%5</p><p>Icon by <a href='http://www.iconshock.com'>Icon Shock</a><br />Satellite images by <a href='http://www.nasa.gov'>NASA</a><br />ZoneDetect by <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />TimeZone Database by <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a> <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copy; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Qt %2<br/>%3<br/>%4<br/>%5</p><p>Icon by <a href='http://www.iconshock.com'>Icon Shock</a><br />Satellite images by <a href='http://www.nasa.gov'>NASA</a><br />ZoneDetect by <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />TimeZone Database by <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a> - + N/A @@ -6531,52 +6569,52 @@ Migration - + DXCC Entities DXCC Einträge - + Sats Info SAT Info - + SOTA Summits SOTA Gipfel - + WWFF Records WWFF Datensätze - + IOTA Records IOTA Datensätze - + POTA Records POTA Datensätze - + Membership Directory Records Mitgliedschaftsverzeichnis - + List of Values Werteliste - + Updating Aktualisieren - + Update Failed Aktualisierung fehlgeschlagen @@ -6589,32 +6627,32 @@ Rufzeichen - + Date Datum - + Time On Startzeit - + Power Leistung - + W - + Rig - + RSTr RSTe @@ -6629,153 +6667,153 @@ - + RSTs RSTa - + 80m - + &Details &Details - + the contacted station's DARC DOK (District Location Code) (ex. A01) DARC-DOK (Ortsverbandkenner) der kontaktierten Station (z.B. A01) - + Station Station - + Info - + Lookup the call on the web. The query URL can be changed in Settings -> Callbook Suchen Sie das Rufzeichen im Internet. Die Abfrage-URL kann unter Einstellungen -> Callbook geändert werden - + Web - + Duration Dauer - + World Wide Flora & Fauna - + QSL Send Status QSL Ausgangsstatus - - + + Paper Papier - - - + + + <b>Yes</b> - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service<br/><b>No</b> - do not send an outgoing QSL card; do not upload the QSO to the online service<br/><b>Requested</b> - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service<br/><b>Queued</b> - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service<br/> <b>Ja</b> - eine ausgehende QSL-Karte wurde gesendet; das QSO wurde in den Online-Dienst hochgeladen und von diesem akzeptiert.<br/><b>Nein</b> - keine ausgehende QSL-Karte senden; das QSO nicht in den Online-Dienst hochladen.<br/><b>Angefordert</b> - die kontaktierte Station hat eine QSL-Karte angefordert; die kontaktierte Station hat angefordert, dass das QSO in den Online-Dienst hochgeladen wird.<br/><b>Wartend</b> - eine ausgehende QSL-Karte wurde zum Senden ausgewählt; ein QSO wurde zum Hochladen in den Online-Dienst ausgewählt.<br/> - + LoTW - + eQSL - + QSL Send via QSL Ausgang via - + Blank Leer - + My &Notes Eigene &Anmerkungen - + Member: Mitglied: - - - + + + No Nein - - - + + + Yes Ja - - - + + + Requested Angefordert - - - + + + Queued Wartend - + QSL via QSL via - + Propagation Mode Ausbreitungsmodus - + Bureau Büro - + Direct Direkt - + Antenna Antenne @@ -6785,22 +6823,22 @@ - + D&XCC - + M&y Station &Eigene Station - + Reset Zurücksetzen - + Save Speichern @@ -6810,119 +6848,119 @@ Frequenz - + 59 - + Mode Betriebsart - - - + + + Ignored Ignoriert - + Electronic Elektronisch - + QLog Error QLog Fehler - + Callbook login failed Callbook-Anmeldung fehlgeschlagen - + LP LP - + New Entity! Neuer Eintrag! - + New Band! Neues Band! - + New Mode! Neue Betriebsart! - + New Band & Mode! Neues Band & Betriebsart! - + New Slot! Neuer Slot! - + Worked Gearbeitet - + Confirmed Bestätigt - + GE GA - + GM GM - + GA GT - + m - + Callbook search is active Callbook-Suche ist aktiv - + Callbook search is inactive Callbook-Suche ist inaktiv - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) zwei oder vier nebeneinander liegende, jeweils vier Zeichen lange Gitterfelder (z. B. EN98,FM08,EM97,FM07) - + Special Activity Group Spezielle Aktivitätsgruppe - + Special Activity Group Information @@ -7101,7 +7139,7 @@ QCoreApplication - + QLog Help QLog Hilfe @@ -7109,153 +7147,153 @@ QMessageBox - - - - - + + + + + - + - - + + QLog Error QLog Fehler - + QLog is already running QLog wird bereits ausgeführt - + Could not connect to database. Keine Verbindung zur Datenbank möglich. - + Could not export a QLog database to ADIF as a backup.<p>Try to export your log to ADIF manually Kann QLog-Datenbank nicht als Backup nach ADIF exportieren.<p>Versuchen Sie, Ihr Log manuell nach ADIF zu exportieren - + Database migration failed. Migration der Datenbank fehlgeschlagen. - + Could not connect to database (2). Keine Verbindung zur Datenbank möglich (2). - - - - - + + + + + - - - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + QLog Warning QLog Warnung - + Club List Update failed. Cannot remove old records Aktualisierung der Clubliste fehlgeschlagen. Alte Datensätze können nicht entfernt werden - + Club List Update failed. Cannot plan new downloads Aktualisierung der Clubliste fehlgeschlagen. Kann keine neuen Downloads durchführen - - - + + + QLog Critical QLog kritischer Fehler - + Cannot save a password for %1 to the Credential Store Das Passwort für %1 kann nicht im Passwort Speicher gespeichert werden - + Cannot get a password for %1 from the Credential Store Es kann kein Passwort für %1 aus dem Passwort Speicher abgerufen werden - + Unexpected Club List download. Canceling next downloads Unerwartete Clubliste herunterladen. Nächste Downloads beenden - + Unexpected Club List content for Unerwarteter Inhalt der Clubliste für - + Network error. Cannot download Club List for Netzwerkfehler. Clubliste kann nicht heruntergeladen werden für - + DXC Server Name Error DXC Server Namensfehler - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> Format der DXC-Server-Adresse <p><b>[benutzername@]hostname:Port</b> (z. B. hamqth.com:7300)</p> - + DX Cluster Password DX Cluster Passwort - + Invalid Password Falsches Passwort - + DXC Server Connection Error DXC Server Verbindungsfehler - + Your callsign is empty. Please, set your Station Profile Ihr Rufzeichen ist nicht angegeben. Bitte richten Sie Ihr Stationsprofil ein @@ -7311,89 +7349,89 @@ Kann QSO-Filterbedingungen nicht passend zum Typ aktualisieren - - - + + Please, define at least one Station Locations Profile Bitte definieren Sie mindestens ein Stationsstandortprofil - + WSJTX Multicast is enabled but the Address is not a multicast address. WSJTX Multicast ist aktiviert, aber die Adresse ist keine Multicast-Adresse. - + Rig port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device Rig port muss ein gültiger COM-Port sein.<br>Für Windows verwende COMxx, für Unix-ähnliche Betriebssysteme verwende einen Pfad zum Gerät - + Rig PTT port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device Rig-PTT-Port muss ein gültiger COM-Port sein. Für Windows verwenden Sie COMxx, für Unix-ähnliche Betriebssysteme verwenden Sie einen Pfad zum Gerät - + <b>TX Range</b>: Max Frequency must not be 0. <b>TX-Bereich</b>: Max Frequenz darf nicht 0 sein. - + <b>TX Range</b>: Max Frequency must not be under Min Frequency. <b>TX-Bereich</b>: Die Maximalfrequenz darf nicht niedriger als die Minimalfrequenz sein. - + Rotator port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device Rotor-Port muss ein gültiger COM-Port sein.<br>Für Windows verwenden Sie COMxx, für Unix-ähnliche Betriebssysteme verwenden Sie einen Pfad zum Gerät - + CW Keyer port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device CW Keyer Port muss ein gültiger COM-Port sein.<br>Für Windows verwenden Sie COMxx, für unix-ähnliche Betriebssysteme verwenden Sie einen Pfad zum Gerät - + Cannot change the CW Keyer Model to <b>Morse over CAT</b><br>No Morse over CAT support for Rig(s) <b>%1</b> Kann das CW-Keyer Modell nicht zu <b>CW-über-CAT</b> ändern.<br>Keine CW-über-CAT Unterstützung für Rig(s) <b>%1</b> - + Cannot delete the CW Keyer Profile<br>The CW Key Profile is used by Rig(s): <b>%1</b> Kann das CW-Keyer Profil nicht löschen.<br>Das Profil wird verwendet von Rig(s): <b>%1</b> - + Gridsquare has an invalid format Gitterfeld hat ein falsches Format - + VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by ',') VUCC Gitterfeld hat ein falsches Format (es müssen 2 oder 4 Gitterfelder sein, getrennt durch ',') - + Country must not be empty Das Land darf nicht leer sein - + CQZ must not be empty CQZ darf nicht leer sein - + ITU must not be empty ITU darf nicht leer sein - + Callsign has an invalid format Rufzeichen hat ein falsches Format - + Filename is empty Dateiname ist leer @@ -7416,17 +7454,17 @@ - + <b>Rig Error:</b> <b>Rig Fehler:</b> - + <b>Rotator Error:</b> <b>Rotor Fehler:</b> - + <b>CW Keyer Error:</b> <b>CW-Keyer Fehler:</b> @@ -7444,149 +7482,149 @@ QObject - + Cannot connect to DXC Server <p>Reason <b>: Kann keine Verbindung zum DXC Server herstellen <p>Ursache <b>: - + Connection Refused Verbindung abgelehnt - + Host closed the connection Der Host hat die Verbindung beendet - + Host not found Host nicht gefunden - + Timeout Zeitüberschreitung - + Network Error Netzwerkfehler - + Internal Error Interner Fehler - + Opening Database Datenbank öffnen - + Backuping Database Datenbank sichern - + Migrating Database Datenbank migrieren - + Starting Application Anwendung starten - + My Rig Eigener Rig - + Logging Station Callsign Logging-Station Rufzeichen - + My Gridsquare Eigenes Gitterfeld - + My Name Eigener Name - + My City Eigene Stadt - + My IOTA Eigene IOTA Nummer - + My SOTA Eigene SOTA Nummer - + My Special Interest Activity Eigene spezielle Interessenaktivität - + My Spec. Interes Activity Info Eigene spezielle Interessenaktivität Info - + My VUCC Grids Eigenes VUCC Gitterfeld - + My WWFF Eigener WWFF - + My POTA Ref Eigene POTA Ref - + My ITU Eigene ITU Zone - + My CQZ Eigene CQZ - + My DXCC Eigenes DXCC Land - + <b>Imported</b>: %n contact(s) <b>Importiert</b>: %n Kontakt(e) @@ -7594,7 +7632,7 @@ - + <b>Warning(s)</b>: %n <b>Warnungen</b>: %n @@ -7602,7 +7640,7 @@ - + <b>Error(s)</b>: %n <b>Fehler</b>: %n @@ -7676,23 +7714,23 @@ "Nein" - + Uploading to QRZ.com Nach QRZ.com hochladen - + Cancel Abbrechen - - + + QLog Information QLog Information - + %n QSO(s) uploaded. %n QSO(s) hochgeladen. @@ -7700,17 +7738,17 @@ - + QLog Warning QLog Warnung - + Cannot upload the QSO(s): Kann QSO(s) nicht hochladen: - + No QSOs found to upload. Keine QSOs zum Hochladen gefunden. @@ -8607,22 +8645,22 @@ Rig - + No Rig Profile selected Kein Rig-Profil ausgewählt - + Initialization Error Initialisierungsfehler - + Internal Error Interner Fehler - + Cannot open Rig Kann Rig nicht öffnen @@ -8655,7 +8693,7 @@ - + PWR: %1W @@ -8663,22 +8701,22 @@ Rotator - + No Rotator Profile selected Kein Rotor-Profil ausgewählt - + Initialization Error Initialisierungsfehler - + Internal Error Interner Fehler - + Cannot open Rotator Kann Rotor nicht öffnen @@ -8768,20 +8806,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + Add Hinzufügen @@ -9054,20 +9092,20 @@ - - + + None - - + + Hardware - - + + Software @@ -9078,32 +9116,32 @@ - - + + No - - + + Even - - + + Odd - - + + Space - - + + Mark @@ -9312,8 +9350,8 @@ - - + + QRZ.com @@ -9328,12 +9366,12 @@ Verwendung einer internen TQSL - + Port where QLog listens an incoming traffic from WSJT-X Port, an dem QLog auf eingehenden Datenverkehr von WSJT-X wartet - + Raw UDP Forward UDP Rohdaten-Weiterleitung @@ -9427,7 +9465,7 @@ - + Serial Serial @@ -9621,106 +9659,106 @@ <b>Sicherheitshinweis:</b> QLog speichert alle Passwörter im Secure Storage. Leider verwendet ON4KST ein Protokoll, bei dem dieses Passwort über einen ungesicherten Kanal im Klartext gesendet wird.</p><p>Bitte seien Sie vorsichtig, wenn Sie Ihr Passwort für diesen Dienst wählen, da Ihr Passwort über einen ungesicherten Kanal im Klartext gesendet wird.</p> - + <p>List of IP addresses to which QLog forwards raw UDP WSJT-X packets.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Liste der IP-Adressen, an die QLog unbearbeitete UDP WSJT-X-Pakete weiterleitet.</p>Die IP-Adressen werden durch ein Leerzeichen getrennt und haben die Form IP:PORT - + Join Multicast Multicast verbinden - + Enable/Disable Multicast option for WSJTX Aktivieren/Deaktivieren der Multicast-Option für WSJTX - + Multicast Address Multicast Adresse - + Specify Multicast Address. <br>On some Linux systems it may be necessary to enable multicast on the loop-back network interface. Geben Sie die Multicast-Adresse an. <br>Auf einigen Linux-Systemen kann es erforderlich sein, Multicast auf der Loopback-Netzwerkschnittstelle zu aktivieren. - + TTL - + Time-To-Live determines the range<br> over which a multicast packet is propagated in your intranet. Time-To-Live bestimmt den Bereich<br>, über den ein Multicast-Paket in Ihrem Intranet verbreitet wird. - + Notifications Benachrichtigungen - + DX Spots - + <p> List of IP addresses to which QLog sends UDP notification packets with DX Cluster Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Liste der IP-Adressen, an die QLog UDP-Notification-Pakete mit DX Cluster Spots sendet.</p>Die IP-Adressen sind durch ein Leerzeichen getrennt und haben das Format IP:PORT - + QSO Changes QSO Änderungen - + <p> List of IP addresses to which QLog sends UDP notification packets about a new/updated/deleted QSO in the log.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Liste der IP-Adressen, an die QLog UDP-Benachrichtigungspakete über ein neues/aktualisiertes/gelöschtes QSO im Log sendet.</p>Die IP-Adressen sind durch ein Leerzeichen getrennt und haben das Format IP:PORT - + Wsjtx CQ Spots - + <p> List of IP addresses to which QLog sends UDP notification packets with WSJTX CQ Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Liste der IP-Adressen, an die QLog UDP-Benachrichtigungspakete mit WSJTX CQ Spots sendet.</p>Die IP-Adressen sind durch ein Leerzeichen getrennt und haben das Format IP:PORT - + Shortcuts Tastenkombinationen - + Spot Alerts - + <p> List of IP addresses to which QLog sends UDP notification packets about user Spot Alerts.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Liste der IP-Adressen, an die QLog UDP-Benachrichtigungspakete über User Spot Alerts sendet.</p>Die IP-Adressen sind durch ein Leerzeichen getrennt und haben das Format IP:PORT - + LogID - + <p>Assigned LogID to the current log.</p>The LogID is sent in the Network Nofitication messages as a unique instance identified.<p> The ID is generated automatically and cannot be changed</> <p>Zugeordnete LogID für das aktuelle Protokoll.</p>Die LogID wird in den Netzwerk-Notifizierungsmeldungen als eindeutige Instanzkennung gesendet.<p>Die ID wird automatisch generiert und kann nicht geändert werden</> - - - - - + + + + + ex. 192.168.1.1:1234 192.168.2.1:1234 @@ -9751,18 +9789,18 @@ - - + + Network Netzwerk - + Wsjtx Wsjtx - + Port @@ -9792,12 +9830,12 @@ Bänder - + Modes Betriebsarten - + DXCC @@ -9859,8 +9897,8 @@ - - + + HamQTH @@ -9884,151 +9922,151 @@ Passwort - - + + Name Name - + Report Bericht - - + + State Staat - + Start (MHz) Beginn (MHz) - + End (MHz) Ende (MHz) - + SAT Mode SAT Betriebsart - - - + + + Disabled Inaktiv - + Dummy - + Morse Over CAT CW-über-CAT - + WinKey v2 - + CWDaemon - + FLDigi - + Single Paddle - + IAMBIC A - + IAMBIC B - + Ultimate - + Press <b>Modify</b> to confirm the profile changes or <b>Cancel</b>. Drücken Sie <b>Ändern</b>, um die Profiländerungen zu bestätigen oder <b>Abbrechen</b>. - - - - - - - - - - + + + + + + + + + + Must not be empty Darf nicht leer sein - + members Mitglieder - + Required internet connection during application start Erfordert Internetverbindung beim Start der Anwendung - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + Modify Ändern - - + + Special - Omnirig Special - Omnirig - + Select File Datei auswählen @@ -10036,22 +10074,22 @@ ShortcutEditorModel - + Description Beschreibung - + Shortcut Tastenkombination - + Conflict with a built-in shortcut Konflikt mit einer eingebauten Tastenkombination - + Conflict with a user-defined shortcut Konflikt mit einer benutzerdefinierten Tastenkombination @@ -10352,17 +10390,17 @@ ToAllTableModel - + Time Zeit - + Spotter - + Message Nachricht @@ -10398,47 +10436,47 @@ WCYTableModel - + Time Zeit - + K - + expK - + A - + R - + SFI - + SA - + GMF - + Au @@ -10446,27 +10484,27 @@ WWVTableModel - + Time Zeit - + SFI - + A - + K - + Info @@ -10592,37 +10630,37 @@ WsjtxTableModel - + SNR SNR - + Callsign Rufzeichen - + Gridsquare Gitterfeld - + Distance Entfernung - + Last Activity Letzte Aktivität - + Last Message Letzte Nachricht - + Member Mitglied @@ -10663,32 +10701,32 @@ main - + Run with the specific namespace. Im spezifischen Namensraum ausführen. - + namespace Namensraum - + Translation file - absolute or relative path and QM file name. Übersetzungsdatei - Absoluter oder relativer Pfad und Name der QM-Datei. - + path/QM-filename path/QM-filename - + Set language. <code> example: 'en' or 'en_US'. Ignore environment setting. Sprache einstellen. Beispiel <code>: 'en' oder 'en_US'. Ignoriert Betriebssystemeinstellungen. - + code code diff --git a/i18n/qlog_es.qm b/i18n/qlog_es.qm index e8bd62a863494383f74fac97e75b5a1aa272fb87..a987165c1ad86b32302b7ac985ae8466e2ed689d 100644 GIT binary patch delta 11167 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 J-T0tA{|C~?*ed`4 delta 11074 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 diff --git a/i18n/qlog_es.ts b/i18n/qlog_es.ts index f69a1a06..9d7f85a9 100644 --- a/i18n/qlog_es.ts +++ b/i18n/qlog_es.ts @@ -189,17 +189,17 @@ Reglas - + Add Agregar - + Edit Editar - + Remove Quitar @@ -217,37 +217,37 @@ AlertTableModel - + Rule Name Nombre Regla - + Callsign Indicativo - + Frequency Frecuencia - + Mode Modo - + Updated Actualizado - + Last Update Última Actualización - + Last Comment Último Comentario @@ -375,131 +375,131 @@ Mostrar - + DXCC DXCC - + ITU ITU - + WAC WAC - + WAZ WAZ - + WAS WAS - + WPX WPX - + IOTA IOTA - + POTA Hunter Cazador de POTA Cazador de POTA - + POTA Activator Activador de POTA Activador de POTA - + SOTA Cumbres en el Aire SOTA - + WWFF Flora y Fauna Mundial WWFF - + Done Hecho Hecho - + North America América del Norte América del Norte - + South America América del Sur América del Sur - + Europe Europa Europa - + Africa África África - + Oceania Oceanía Oceanía - + Asia Asia - + Antarctica Antártida Antártida - + TOTAL Worked TOTAL Trabajado TOTAL Trabajado - + TOTAL Confirmed TOTAL Confirmado TOTAL Confirmado - + Confirmed Confirmado Confirmado - + Worked Trabajado Trabajado @@ -733,17 +733,17 @@ Borrar - + Rig must be connected La radio debe estar conectada - + Word Palabra - + Whole Todo @@ -841,27 +841,27 @@ CWKeyer - + No CW Keyer Profile selected No Hay Perfil de Manipulador Seleccionado - + Initialization Error Error al Inicializar - + Internal Error Error Interno - + Connection Error Error de Conexión - + Cannot open the Keyer connection No se puede conectar al Manipulador @@ -869,39 +869,39 @@ CWWinKey2 - + Connected device is not WinKey El dispositivo conectado no es Winkey - + Connected device is not WinKey v2 or newer El dispositivo conectado no es Winkey v2 o posterior - + Cannot send Text to Rig No se puede enviar el Texto a la Radio - - - + + + Keyer is not connected El manipulador no está conectado - + Communication Error Error de Comunicación - + Cannot set Keyer Speed No se puede establecer la velocidad del manipulador - + Cannot stop Text Sending No se puede detener el envío del Texto @@ -989,7 +989,7 @@ ClubLog - + Clublog Operation for Callsign %1 failed.<br>%2 La Operación de Clublog para el indicativo %1 ha fallado.<br>%2 @@ -2867,151 +2867,151 @@ Data - + New Entity Nueva Entidad - + New Band Nueva Banda - + New Mode Nuevo Modo - + New Band&Mode Nueva Banda y Modo - + New Slot Nuevo Slot - + Confirmed Confirmado - + Worked Trabajado - + Hz Hz - + kHz kHz - + GHz GHz - + MHz MHz + + + + + + + Yes + + - Yes - - - - - - - - No No - - + + Requested Solicitado - + Queued En Cola - - + + Invalid Inválido - + Bureau Bureau - + Direct Directa - + Electronic Electrónica - - - - - + + + + + Blank Vacío - + Modified Modificado - + Grayline Línea Gris - + Other Otro - + Short Path Paso Corto - + Long Path Paso Largo - + Not Heard No Escuchado - + Uncertain Dudoso @@ -3304,57 +3304,57 @@ DxTableModel - + Time Hora - + Callsign Indicativo - + Frequency Frecuencia - + Mode Modo - + Spotter Anunciante - + Comment Comentario - + Continent Continente - + Spotter Continent Continente del Anunciante - + Band Banda - + Member Miembro - + Country País @@ -3368,7 +3368,7 @@ - + Connect Conectar @@ -3398,152 +3398,177 @@ Consola - + + Full-text search + + + + + Search + + + + + Close Search + + + + Send DX Cluster Command Enviar comando de Cluster DX - + Filter... Filtrar... - + Filter DXC Filtrar Cluster DX - + Spot Last QSO Anun. Últ. QSO - + Send last QSO spot Anunciar el último QSO realizado - + Show HF Stats Mostrar Estadísticas de HF - + Show VHF Stats Mostrar Estadísticas de VHF - + Show WCY Mostrar WCY - + Show WWV Mostrar WWV - + Column Visibility... Visibilidad de Columnas... - + Which columns should be displayed Qué columnas deben mostrarse - + Connect on startup Conectar al inicio - + Automatic connection after start Conectar automáticamente después de iniciar - + Delete Server Borrar Servidor - + DXC - Delete Server Cluster DX - Eliminar Servidor - + Clear Password Borrar Contraseña - + Keep Spots Mantener Anuncios - + Spots are not cleared when connecting to a new DX Cluster. Los anuncios no se borran al conectarse a un nuevo clúster DX. - + Clear Borrar - + Clear all data Borrar todos los datos - + + Search... + + + + + DXC - Search + + + + Connecting... Conectando... - + DX Cluster is temporarily unavailable El Cluster DX no está disponible temporalmente - + DXC Server Error Error del Servidor del Cluster DX - + An invalid callsign Un indicativo inválido - + DX Cluster Password Contraseña del Cluster DX - + Security Notice Aviso de Seguridad - + The password can be sent via an unsecured channel La contraseña se puede enviar a través de un canal no seguro. - + Server Servidor - + Username Nombre de Usuario - + Disconnect Desconectar @@ -3574,7 +3599,7 @@ DxccTableWidget - + Mode Modo @@ -4064,23 +4089,23 @@ "No" - + Uploading to HRDLOG Subiendo a HRDLOG - + Cancel Cancelar - - + + QLog Information Información de QLog - + %n QSO(s) uploaded. %n QSO/s subido/s. @@ -4088,17 +4113,17 @@ - + QLog Warning Alerta de QLog - + Cannot upload the QSO(s): No se puede subir el/los QSO/s: - + No QSOs found to upload. No se encontraron QSOs para subir. @@ -4114,69 +4139,69 @@ HamlibRigDrv - + None Ninguno Ninguno - + CAT Sintonización asistida por ordenador CAT - + DTR Terminal de datos listo (DTR) es una señal de control en comunicaciones serie RS-232, transmitida desde un equipo terminal de datos (DTE), como una computadora, a un equipo de comunicaciones de datos (DCE), por ejemplo un interface, para indicar que el terminal está listo para comunicaciones y el interface puede iniciar un canal de comunicaciones. DTR - + RTS Control de Señal del Puerto Serie RTS - - + + Initialization Error Error al Inicializar - + Cannot set PTT Type No se puede configurar el tipo de PTT No se puede configurar el tipo de PTT - + Cannot set PTT Share No se puede configurar la acción del PTT No se puede configurar la acción del PTT - + Unsupported Rig Driver Controlador de Radio No Soportado - + Set Frequency Error Error al Establecer Frecuencia - + Set PTT Error Error al Establecer PTT - + Get Frequency Error Error al Obtener Frecuencia - + Get Mode Error Error al Obtener Modo @@ -4259,7 +4284,7 @@ - + The value is used when an input record does not contain the ADIF value El valor se utiliza cuando un registro de entrada no contiene el valor ADIF @@ -4280,68 +4305,68 @@ - + Comment Comentario - + &Import &Importar - + Select File Seleccionar Archivo - - + + The values below will be used when an input record does not contain the ADIF values Los valores siguientes se utilizarán cuando un registro de entrada no contenga los valores ADIF - + <p><b>In-Log QSO:</b></p><p> <p><b>QSO en Log:</b></p><p> - + <p><b>Importing:</b></p><p> <p><b>Importando:</b></p><p> - + Duplicate QSO QSO Duplicado - + <p>Do you want to import duplicate QSO?</p>%1 %2 <p>¿Quiere importar QSO duplicado?</p>%1 %2 - + Save to File Guardar al Archivo - + QLog Import Summary Resumen de Importación de QLog - + Import date Fecha de Importación - + Imported file Archivo Importado - + Imported: %n contact(s) Importado: %n contacto/s @@ -4349,7 +4374,7 @@ - + Warning(s): %n Alerta/s: %n @@ -4357,7 +4382,7 @@ - + Error(s): %n Error/s: %n @@ -4365,17 +4390,17 @@ - + Details Detalles - + Import Result Resultado de Importación - + Save Details... Guardar Detalles... @@ -4641,48 +4666,61 @@ LogFormat - + + + Cannot find My DXCC Entity Info + + + + A minimal set of fields not present (start_time, call, band, mode, station_callsign) Un conjunto mínimo de campos no presentes (hora_inicio, indicativo, banda, modo, indicativo de estación) - + Outside the selected Date Range Fuera del rango de fechas seleccionado - - + + Duplicate Duplicado - + Cannot find DXCC Entity Info No se puede encontrar la información de la entidad DXCC - - Cannot find own DXCC Entity Info - No se puede encontrar la información de la entidad DXCC propia + + DXCC Info is missing + + + + + + + no Station Callsign present + - + Cannot insert to database No se puede insertar en la base de datos - + Imported Importado - + Error Error - + Warning Alerta @@ -5564,38 +5602,38 @@ - + Band Banda - + Mode Modo - + Country País - + Club Club - + User Filter Filtro de Usuario - - + + Delete Eliminar @@ -5662,32 +5700,32 @@ Exportar los QSOs seleccionados - + Delete the selected contacts? ¿Eliminar los conactos seleccionados? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? - + Deleting QSOs Borrando QSOs - + Update Actualizar - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? Al actualizar, todas las filas seleccionadas se verán afectadas.<br>El valor actualmente editado en la columna se aplicará a todas las filas seleccionadas.<br><br>¿Quieres editarlas? - + Count: %n QSO: %n @@ -5695,23 +5733,23 @@ - + Downloading eQSL Image Descargando Imágen de eQSL - - + + Cancel Cancelar - + QLog Error Error de QLog - + eQSL Download Image failed: La descarga de imágen de eQSL ha fallado: @@ -6086,7 +6124,7 @@ No debe estar vacío - + Unsaved Sin Guardar @@ -6429,78 +6467,78 @@ Radio - PTT Enc./Apag. - + Not enabled for non-Fusion style No habilitado para estilos que no sean Fusion - + Press to tune the alert Presione para sintonizar la alerta - + Clublog Immediately Upload Error Error de carga inmediata de Clublog - - + + <b>Error Detail:</b> <b>Detalle del Error:</b> - + Classic Clásico - - - - - + + + + + QLog Warning Alerta de QLog - + LoTW is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> LoTW no está configurado apropiadamente.<p> Por favor usar <b>Ajustes</b> para configurarlo.</p> - + eQSL is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> eQSL no está configurado apropiadamente.<p> Por favor usar <b>Ajustes</b> para configurarlo.</p> - + Clublog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> Clubog no está configurado apropiadamente.<p> Por favor usar <b>Ajustes</b> para configurarlo.</p> - + HRDLog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> HRDLog no está configurado apropiadamente.<p> Por favor usar <b>Ajustes</b> para configurarlo.</p> - + QRZ.com is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> QRZ.com no está configurado apropiadamente.<p> Por favor usar <b>Ajustes</b> para configurarlo.</p> - + <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copy; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Based on Qt %2<br/>%3<br/>%4<br/>%5</p><p>Icon by <a href='http://www.iconshock.com'>Icon Shock</a><br />Satellite images by <a href='http://www.nasa.gov'>NASA</a><br />ZoneDetect by <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />TimeZone Database by <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a> <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copy; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Basado en Qt %2<br/>%3<br/>%4<br/>%5</p><p>Iconos por <a href='http://www.iconshock.com'>Icon Shock</a><br />Imágenes satelitales por <a href='http://www.nasa.gov'>NASA</a><br />Detección de zonas por <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />Base de datos de zonas horarias por <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a> - + About Acerca de - + N/A S/D @@ -6567,52 +6605,52 @@ Migration - + DXCC Entities Entidades DXCC - + Sats Info Informació de Satélites - + SOTA Summits Cumbres SOTA - + WWFF Records Registros WWFF - + IOTA Records Registros IOTA - + POTA Records Registros POTA - + Membership Directory Records Registros del Directorio de Miembros - + List of Values Lista de Valores - + Updating Actualizando - + Update Failed Actualización Fallida @@ -6645,320 +6683,320 @@ - + 80m - + RSTs RSTe - + RSTr RSTr - + 59 - + Mode Modo - + Save Guardar - + Lookup the call on the web. The query URL can be changed in Settings -> Callbook Consulta el indicativo en la web. La URL de consulta se puede cambiar en Ajustes ->Callbook - + Web Web - + Time On Hora Inicio - + Reset Reiniciar - + Date Fecha - + Duration Duración - + Info Información - + &Details &Detalles - + QSL Send Status Estado de envío de QSL - - + + Paper Papel - - - + + + <b>Yes</b> - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service<br/><b>No</b> - do not send an outgoing QSL card; do not upload the QSO to the online service<br/><b>Requested</b> - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service<br/><b>Queued</b> - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service<br/> <b>Sí</b>: se ha enviado una tarjeta QSL; el QSO ha sido cargado y aceptado por el servicio en línea<br/><b>No</b> - no envié una tarjeta QSL; no cargué el QSO al servicio en línea<br/><b>Solicitado</b> - la estación contactada ha solicitado una tarjeta QSL; la estación contactada ha solicitado que el QSO se cargue en el servicio en línea<br/><b>En cola</b> - se ha seleccionado una tarjeta QSL para enviar; Se ha seleccionado un QSO para subir al servicio online<br/> - + LoTW LoTW - + eQSL eQSL - + QSL Send via Enviar QSL vía - + QSL via QSL vía - + Propagation Mode Modo de Propagación - + D&XCC D&XCC - + M&y Station &Mi Estación - + Station Estación - + Rig Radio - + Antenna Antena - + Power Potencia - + Blank Vacío - + W W - + My &Notes Mis N&otas - + Member: Miembro: - - - + + + No No - - - + + + Yes - - - + + + Requested Solicitado - - - + + + Queued En Cola - - - + + + Ignored Ignorado - + Bureau Bureau - + Direct Directa - + Electronic Electrónica - + QLog Error Error de QLog - + Callbook login failed Error al iniciar sesión en el Callbook - + LP LP - + New Entity! Nueva Entidad! - + New Band! Nueva Banda! - + New Mode! Nuevo Modo! - + New Band & Mode! Nueva Banda y Modo! - + New Slot! Nuevo Slot! - + Worked Trabajado - + Confirmed Confirmado - + GE GE - + GM GM - + GA GA - + m - + Callbook search is inactive Búsqueda en Callbook desactivada - + Callbook search is active Búsqueda en Callbook activada - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) dos o cuatro locators adyacentes, cada uno de cuatro caracteres (ej. EN98,FM08,EM97,FM07) - + the contacted station's DARC DOK (District Location Code) (ex. A01) el DARC DOK (código de ubicación de distrito) de la estación contactada (ej. A01) - + World Wide Flora & Fauna World Wide Flora & Fauna - + Special Activity Group Grupo de Actividades Especiales - + Special Activity Group Information Información Grupo de Actividades Especiales @@ -7137,7 +7175,7 @@ QCoreApplication - + QLog Help Ayuda de QLog @@ -7145,123 +7183,123 @@ QMessageBox - - - + + + QLog Critical QLog Crítico - + Cannot save a password for %1 to the Credential Store No se puede guardar una contraseña para %1 en el almacén de credenciales - + Cannot get a password for %1 from the Credential Store No se puede obtener una contraseña para %1 del almacén de credenciales - - - - - + + + + + - - - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + QLog Warning Alerta de QLog - + Club List Update failed. Cannot remove old records Error al actualizar la lista de clubes. No se pueden eliminar registros antiguos - + Club List Update failed. Cannot plan new downloads Error al actualizar la lista de clubes. No se pueden planificar nuevas descargas - + Unexpected Club List download. Canceling next downloads Descarga inesperada de la lista de clubes. Cancelar próximas descargas - + Unexpected Club List content for Contenido inesperado de la lista de clubes para - + Network error. Cannot download Club List for Error de red. No se puede descargar la lista de clubes para - - - - - + + + + + - + - - + + QLog Error Error de QLog - + QLog is already running QLog ya se está ejecutando - + Could not connect to database. No se pudo conectar a la base de datos. - + Could not export a QLog database to ADIF as a backup.<p>Try to export your log to ADIF manually No se pudo exportar una base de datos QLog a ADIF como copia de seguridad.<p>Intente exportar su registro a ADIF manualmente - + Database migration failed. Error en la migración de la base de datos. - + Could not connect to database (2). No se pudo conectar a la base de datos (2). @@ -7296,33 +7334,33 @@ No se pueden actualizar las reglas de alerta - + DXC Server Name Error Error en el nombre del servidor del Cluster DX - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> La dirección del servidor del Cluster DX debe tener el formato<p><b>[nombre de usuario@]nombre de host:puerto</b> (ej. hamqth.com:7300)</p> - + DX Cluster Password Contraseña del Cluster DX - + Invalid Password Contraseña incorrecta - + DXC Server Connection Error Error en la conexión del servidor del Cluster DX - + Filename is empty El nombre del archivo está vacío @@ -7361,22 +7399,22 @@ El nombre de la disposición ya existe. - + <b>Rig Error:</b> <b>Error de la Radio:</b> - + <b>Rotator Error:</b> <b>Error del Rotor:</b> - + <b>CW Keyer Error:</b> <b>Error del Manipulador:</b> - + Your callsign is empty. Please, set your Station Profile Tu indicativo está vacío. Por favor, configure su Perfil de Estación @@ -7396,84 +7434,84 @@ No se puede actualizar el tipo de coincidencia del filtro de QSO - - - + + Please, define at least one Station Locations Profile Por favor, defina al menos un Perfil de Ubicaciones de Estaciones - + WSJTX Multicast is enabled but the Address is not a multicast address. WSJTX Multicast está habilitada pero la dirección no es una dirección de multidifusión. - + Rig port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device El puerto de la Radio debe ser un puerto COM válido.<br>Para Windows use COMxx, para sistemas operativos tipo Unix use una ruta al dispositivo - + Rig PTT port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device El puerto de control del PTT debe ser un puerto COM válido.<br>Para Windows utilice COMxx, para SO tipo unix utilice una ruta al dispositivo - + <b>TX Range</b>: Max Frequency must not be 0. <b>Rango TX</b>: la frecuencia máxima no debe ser 0. - + <b>TX Range</b>: Max Frequency must not be under Min Frequency. <b>Rango TX</b>: la frecuencia máxima no debe estar por debajo de la frecuencia mínima. - + Rotator port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device El puerto del Rotor debe ser un puerto COM válido.<br>Para Windows use COMxx, para sistemas operativos tipo Unix use una ruta al dispositivo - + CW Keyer port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device El puerto del Manipulador debe ser un puerto COM válido.<br>Para Windows use COMxx, para sistemas operativos tipo Unix use una ruta al dispositivo - + Cannot change the CW Keyer Model to <b>Morse over CAT</b><br>No Morse over CAT support for Rig(s) <b>%1</b> No se puede cambiar el modelo de Manipulador a <b>Morse sobre CAT</b><br>No se admite Morse sobre CAT para la/s Radio/s <b>%1</b> - + Cannot delete the CW Keyer Profile<br>The CW Key Profile is used by Rig(s): <b>%1</b> No se puede eliminar el Perfil del Manipulador<br>El Perfil del Manipulador es utilizado por la/s radio/s: <b>%1</b> - + Callsign has an invalid format El Indicativo tiene un formato no válido - + Gridsquare has an invalid format La cuadrícula no es válida en ese formato. El Locator tiene un formato no válido - + VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by ',') El Locator VUCC tiene un formato no válido (debe se 2 o 4 dígitos separadas por ',') - + Country must not be empty El País no debe estar vacío - + CQZ must not be empty La Zona CQ no debe estar vacía - + ITU must not be empty ITU no debe estar vacío @@ -7493,147 +7531,147 @@ - + Connection Refused Conexión Denegada - + Host closed the connection El host cerró la conexión - + Host not found Host no encontrado - + Timeout Se agotó el tiempo de espera - + Network Error Error de red - + Internal Error Error Interno - + Opening Database Abriendo Base de Datos - + Backuping Database Respaldando Base de Datos - + Migrating Database Migrando Base de Datos - + Starting Application Iniciando Aplicación - + My Rig Mi Radio - + Logging Station Callsign Indicativo de la Estación - + My Gridsquare Mi Locator - + My Name Mi Nombre - + My City Mi Ciudad - + My IOTA Mi IOTA - + My SOTA Mi SOTA - + My Special Interest Activity Mi Actividad de Interés Especial - + My Spec. Interes Activity Info Mi Info de Actividad de Interés Especial - + My VUCC Grids Mi Locator VUCC - + My WWFF Mi WWFF - + My POTA Ref Mi Ref POTA - + My ITU MI ITU - + My CQZ Mi Zona CQ - + My DXCC Mi DXCC - + Cannot connect to DXC Server <p>Reason <b>: No se puede conectar al servidor del Cluster DX <p>Razón <b>: - + <b>Imported</b>: %n contact(s) <b>Importado</b>: %n contacto/s @@ -7641,7 +7679,7 @@ - + <b>Warning(s)</b>: %n <b>Alerta/s</b>: %n @@ -7649,7 +7687,7 @@ - + <b>Error(s)</b>: %n <b>Error/es</b>: %n @@ -7713,23 +7751,23 @@ "No" - + Uploading to QRZ.com Subiendo a QRZ.com - + Cancel Cancelar - - + + QLog Information Información de QLog - + %n QSO(s) uploaded. %n QSO/s subido/s. @@ -7737,17 +7775,17 @@ - + QLog Warning Alerta de QLog - + Cannot upload the QSO(s): No se puede subir el/los QSO/s: - + No QSOs found to upload. No se encontraron QSOs para subir. @@ -8644,22 +8682,22 @@ Rig - + No Rig Profile selected No Hay Perfil de Radio Seleccionado - + Initialization Error Error al Inicializar - + Internal Error Error Interno - + Cannot open Rig No se puede abrir la Radio @@ -8692,7 +8730,7 @@ - + PWR: %1W @@ -8700,22 +8738,22 @@ Rotator - + No Rotator Profile selected No Hay Perfil de Rotor Seleccionado - + Initialization Error Error al Inicializar - + Internal Error Error Interno - + Cannot open Rotator No se puede abrir el Rotor @@ -8900,20 +8938,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + Add Agregar @@ -9513,14 +9551,14 @@ - + Serial Serie - - + + Network Red @@ -9571,8 +9609,8 @@ - - + + HamQTH @@ -9598,8 +9636,8 @@ - - + + QRZ.com @@ -9741,333 +9779,333 @@ Bandas - + Modes Modos - + DXCC - + Wsjtx - + Raw UDP Forward Reenvío UDP sin procesar - + <p>List of IP addresses to which QLog forwards raw UDP WSJT-X packets.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Lista de direcciones IP a las que QLog reenvía paquetes UDP WSJT-X sin procesar.</p>Las direcciones IP están separadas por un espacio y tienen el formato IP:PUERTO - - - - - + + + + + ex. 192.168.1.1:1234 192.168.2.1:1234 ej. 192.168.1.1:1234 192.168.2.1:1234 - + Port Puerto - + Port where QLog listens an incoming traffic from WSJT-X Puerto donde QLog escucha el tráfico entrante de WSJT-X - + Join Multicast Unirse a Multidifusión - + Enable/Disable Multicast option for WSJTX Activar/desactivar la opción de multidifusión para WSJTX - + Multicast Address Dirección de multidifusión - + Specify Multicast Address. <br>On some Linux systems it may be necessary to enable multicast on the loop-back network interface. Especifique la dirección de multidifusión. <br>En algunos sistemas Linux, puede ser necesario habilitar la multidifusión en la interfaz de red de bucle invertido. - + TTL TTL - + Time-To-Live determines the range<br> over which a multicast packet is propagated in your intranet. Time-To-Live determina el rango<br> sobre el cual se propaga un paquete de multidifusión en su intranet. - + Notifications Notificaciones - + LogID - + <p>Assigned LogID to the current log.</p>The LogID is sent in the Network Nofitication messages as a unique instance identified.<p> The ID is generated automatically and cannot be changed</> <p>LogID asignado al registro actual.</p>El LogID se envía en los mensajes de notificación de red como una instancia única identificada.<p>El ID se genera automáticamente y no se puede cambiar</> - + DX Spots Anuncios DX - + <p> List of IP addresses to which QLog sends UDP notification packets with DX Cluster Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p> Lista de direcciones IP a las que QLog envía paquetes de notificación UDP con anuncios de Cluster DX.</p> Las direcciones IP están separadas por un espacio y tienen la forma IP:PUERTO - + Spot Alerts Alertas de Anuncios - + <p> List of IP addresses to which QLog sends UDP notification packets about user Spot Alerts.</p>The IP addresses are separated by a space and have the form IP:PORT <p> Lista de direcciones IP a las que QLog envía paquetes de notificación UDP sobre Alertas de Anuncios de usuario.</p> Las direcciones IP están separadas por un espacio y tienen el formato IP:PUERTO - + QSO Changes Cambios de QSO - + <p> List of IP addresses to which QLog sends UDP notification packets about a new/updated/deleted QSO in the log.</p>The IP addresses are separated by a space and have the form IP:PORT <p> Lista de direcciones IP a las que QLog envía paquetes de notificación UDP sobre un QSO nuevo/actualizado/eliminado en el registro.</p>Las direcciones IP están separadas por un espacio y tienen el formato IP:PUERTO - + Wsjtx CQ Spots Anuncios CQ de Wsjtx - + <p> List of IP addresses to which QLog sends UDP notification packets with WSJTX CQ Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p> Lista de direcciones IP a las que QLog envía paquetes de notificación UDP con Anuncios de CQ de WSJTX.</p>Las direcciones IP están separadas por un espacio y tienen el formato IP:PUERTO - + Shortcuts Atajos del teclado - - + + Special - Omnirig Especial - Omnirig - - + + Name Nombre - + Report Informe - - + + State Estado - + Start (MHz) Inicio (MHz) - + End (MHz) Fin (MHz) - + SAT Mode Modo del Satélite - - - + + + Disabled Desactivado - - + + None Ninguno - - + + Hardware Hardware - - + + Software Software - - + + No No - - + + Even Par - - + + Odd Impar - - + + Mark Marca - - + + Space Espacio - + Dummy - + Morse Over CAT Morse Sobre CAT - + WinKey v2 - + CWDaemon - + FLDigi - + Single Paddle Pala Simple - + IAMBIC A - + IAMBIC B - + Ultimate - + Press <b>Modify</b> to confirm the profile changes or <b>Cancel</b>. Presione <b>Modificar</b> para confirmar los cambios de perfil o <b>Cancelar</b>. - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + Modify Modificar - - - - - - - - - - + + + + + + + + + + Must not be empty No debe estar vacío - + Select File Seleccionar Archivo - + members Miembros - + Required internet connection during application start Required internet connection during application start @@ -10075,22 +10113,22 @@ ShortcutEditorModel - + Description Descripción - + Shortcut Atajo - + Conflict with a built-in shortcut Conflicto con un atajo integrado - + Conflict with a user-defined shortcut Conflicto con un atajo definido por el usuario @@ -10391,17 +10429,17 @@ ToAllTableModel - + Time Hora - + Spotter Anunciante - + Message Mensaje @@ -10437,47 +10475,47 @@ WCYTableModel - + Time Hora - + K - + expK - + A - + R - + SFI - + SA - + GMF - + Au @@ -10485,27 +10523,27 @@ WWVTableModel - + Time Hora - + SFI - + A - + K - + Info Info @@ -10631,37 +10669,37 @@ WsjtxTableModel - + Callsign Indicativo - + Gridsquare Cuadrícula - + Distance Distancia - + SNR - + Last Activity Última Actividad - + Last Message Último Mensaje - + Member Miembro @@ -10702,32 +10740,32 @@ main - + Run with the specific namespace. - + namespace - + Translation file - absolute or relative path and QM file name. - + path/QM-filename - + Set language. <code> example: 'en' or 'en_US'. Ignore environment setting. - + code diff --git a/i18n/qlog_it.qm b/i18n/qlog_it.qm index fd4771b191d8319510539789fd42acfff9d1429f..041da4e83da9727528f0d59e47dd39d07ecb6258 100644 GIT binary patch delta 11165 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 IJO8KT|Lu|E4FCWD delta 11061 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 - + Add Aggiungi - + Edit Modifica - + Remove Rimuovi @@ -217,37 +217,37 @@ AlertTableModel - + Rule Name Nome della Regola - + Callsign Indicativo - + Frequency Frequenza - + Mode Modo - + Updated Aggiornato - + Last Update Último Aggiornamento - + Last Comment Último Commento @@ -363,117 +363,117 @@ Mostra - + DXCC DXCC - + ITU ITU - + WAC WAC - + WAZ WAZ - + WAS WAS - + WPX WPX - + IOTA IOTA - + POTA Hunter POTA Hunter - + POTA Activator POTA Activator - + SOTA SOTA - + WWFF WWFF - + Done Fatto - + North America Nord America - + South America South America - + Europe Europa - + Africa Africa - + Oceania Oceanía - + Asia Asia - + Antarctica Antartide - + TOTAL Worked TOTALE Lavorato - + TOTAL Confirmed TOTALE Confermato - + Confirmed Confermato - + Worked Lavorato @@ -706,17 +706,17 @@ Cancella - + Rig must be connected La radio deve essere connessa - + Word Parola - + Whole Tutto @@ -814,27 +814,27 @@ CWKeyer - + No CW Keyer Profile selected Nessun Profilo Keyer CW selezionato - + Initialization Error Errore di inizializzazione - + Internal Error Errore Interno - + Connection Error Errore di connessione - + Cannot open the Keyer connection Impossibile aprire la connessione Keyer @@ -842,39 +842,39 @@ CWWinKey2 - + Connected device is not WinKey Il dispositivo connesso non è Winkey - + Connected device is not WinKey v2 or newer Il dispositivo connesso non è Winkey v2 o successivo - + Cannot send Text to Rig Impossibile inviare Testo alla Radio - - - + + + Keyer is not connected Keyer non connesso - + Communication Error Errore di comunicazione - + Cannot set Keyer Speed Impossibile impostare velocità Keyer - + Cannot stop Text Sending Impossibile fermare invio Testo @@ -962,7 +962,7 @@ ClubLog - + Clublog Operation for Callsign %1 failed.<br>%2 Operazione Clublog per il nominativo %1 non riuscita.<br>%2 @@ -2839,151 +2839,151 @@ Data - + New Entity Nuova Entità - + New Band Nuova Banda - + New Mode Nuovo Modo - + New Band&Mode Nuovi Banda&Modo - + New Slot Nuovo Slot - + Confirmed Confermato - + Worked Lavorato - + Hz Hz - + kHz kHz - + GHz GHz - + MHz MHz + + + + + + + Yes + + - Yes - - - - - - - - No No - - + + Requested Richiesto - + Queued In coda - - + + Invalid non valido - + Bureau Bureau - + Direct Diretto - + Electronic Elettronica - - - - - + + + + + Blank Vuoto - + Modified Modificato - + Grayline Grayline - + Other Altro - + Short Path Short Path - + Long Path Long Path - + Not Heard Non ascoltato - + Uncertain Incerto @@ -3274,57 +3274,57 @@ DxTableModel - + Time Ora - + Callsign Indicativo - + Frequency Frequenza - + Mode Modo - + Spotter Spotter - + Comment Commento - + Continent Continente - + Spotter Continent Continente Spotter - + Band Banda - + Member Membro - + Country Nazione @@ -3338,7 +3338,7 @@ - + Connect Connette @@ -3368,153 +3368,178 @@ Console - + + Full-text search + + + + + Search + + + + + Close Search + + + + Send DX Cluster Command Invia comando DX Cluster - + Filter... Filtra... - + Filter DXC Filtro DXC - + Spot Last QSO Invia lo Spot dell'ultimo QSO salvato completabile con altre informazioni nella riga di invio comando al cluster Spot Ultimo QSO salvato - + Send last QSO spot Invia l'ultimo spot QSO - + Show HF Stats Mostra statistiche HF - + Show VHF Stats Mostra statistiche VHF - + Show WCY Mostra WCY - + Show WWV Mostra WWV - + Column Visibility... Visibilità della colonna... - + Which columns should be displayed Quali colonne devono essere visualizzate - + Connect on startup Connetti all'avvio - + Automatic connection after start Connessione automatica dopo l'avvio - + Delete Server Cancella Server - + DXC - Delete Server DXC - Elimina server - + Clear Password Cancella Password - + Keep Spots Mantieni Spots - + Spots are not cleared when connecting to a new DX Cluster. Gli spot non vengono cancellati quando ci si connette a un nuovo DX Cluster. - + Clear Cancella - + Clear all data Cancella Tutti i Dati - + + Search... + + + + + DXC - Search + + + + Connecting... Sta Connettendo... - + DX Cluster is temporarily unavailable DX Cluster è temporaneamente non disponibile - + DXC Server Error DXC Errore del server - + An invalid callsign Indicativo non valido - + DX Cluster Password DX Cluster Password - + Security Notice Avviso di sicurezza - + The password can be sent via an unsecured channel La password può essere inviata tramite un canale non protetto - + Server Server - + Username Nome utente - + Disconnect Disconnette @@ -3545,7 +3570,7 @@ DxccTableWidget - + Mode Modo @@ -4034,23 +4059,23 @@ "No" - + Uploading to HRDLOG Caricamento su HRDLOG - + Cancel Elimina - - + + QLog Information Informazioni QLog - + %n QSO(s) uploaded. %n QSO caricato. @@ -4058,17 +4083,17 @@ - + QLog Warning Avviso QLog - + Cannot upload the QSO(s): Impossibile caricare il/i QSO: - + No QSOs found to upload. Nessun QSO trovato da caricare. @@ -4084,63 +4109,63 @@ HamlibRigDrv - + None Nessuno - + CAT CAT - + DTR DTR - + RTS RTS - - + + Initialization Error Errore di inizializzazione - + Cannot set PTT Type Impossibile impostare Tipo PTT - + Cannot set PTT Share Impossibile impostare Condividi PTT - + Unsupported Rig Driver Driver della Radio non Supportato - + Set Frequency Error Errore impostazione fequenza - + Set PTT Error Errore impostazione PTT - + Get Frequency Error Errore di ricezione della frequenza - + Get Mode Error Errore di ricezione del modo @@ -4223,7 +4248,7 @@ - + The value is used when an input record does not contain the ADIF value Il valore viene utilizzato quando una registrazione inserita non contiene il valore ADIF @@ -4244,68 +4269,68 @@ - + Comment Commento - + &Import &Importa - + Select File Seleziona File - - + + The values below will be used when an input record does not contain the ADIF values I valori seguenti verranno utilizzati quando una registrazione inserita non contiene i valori ADIF - + <p><b>In-Log QSO:</b></p><p> <p><b>In-Log QSO:</b></p><p> - + <p><b>Importing:</b></p><p> <p><b>Importazione:</b></p><p> - + Duplicate QSO QSO duplicato - + <p>Do you want to import duplicate QSO?</p>%1 %2 <p>Vuoi importare QSO duplicati?</p>%1 %2 - + Save to File Salva sul file - + QLog Import Summary Riepilogo dell'importazione QLog - + Import date Data di importazione - + Imported file File importato - + Imported: %n contact(s) Importato: %n contatto @@ -4313,7 +4338,7 @@ - + Warning(s): %n Allarme: %n @@ -4321,7 +4346,7 @@ - + Error(s): %n Errore: %n @@ -4329,17 +4354,17 @@ - + Details Dettagli - + Import Result Risultato importazione - + Save Details... Salva dettagli... @@ -4605,48 +4630,61 @@ LogFormat - + + + Cannot find My DXCC Entity Info + + + + A minimal set of fields not present (start_time, call, band, mode, station_callsign) Un minimo set di campi non presenti (start_time, call, band, mode, station_callsign) - + Outside the selected Date Range Otre il range di Data selezionata - - + + Duplicate Duplicato - + Cannot find DXCC Entity Info Impossibile trovare le informazioni sull'entità DXCC - - Cannot find own DXCC Entity Info - Impossibile trovare le informazioni sulla propria entità DXCC + + DXCC Info is missing + + + + + + + no Station Callsign present + - + Cannot insert to database Impossibile inserire nel Database - + Imported Importato - + Error Errore - + Warning Attenzione @@ -5528,38 +5566,38 @@ - + Band Banda - + Mode Modo - + Country Nazione - + Club Club - + User Filter Filtro Utente - - + + Delete Elimina @@ -5625,32 +5663,32 @@ Esporta QSO selezionati - + Delete the selected contacts? Eliminare i contatti selezionati? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? L'<b>Invio immediato</b> di Clublog supporta solo l'eliminazione uno per uno<br><br>Vuoi continuare nonostante il fatto<br>che l'operazione DELETE non verrà inviata a Clublog? - + Deleting QSOs Elimina QSOs - + Update Aggiornare - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? L'aggiornamento avrà effetto su tutte le righe selezionate.<br>Il valore attualmente modificato nella colonna verrà applicato a tutte le righe selezionate.<br><br>Vuoi modificarle? - + Count: %n Conteggio: %n @@ -5658,23 +5696,23 @@ - + Downloading eQSL Image Download immagine da eQSL - - + + Cancel Elimina - + QLog Error Errore di QLog - + eQSL Download Image failed: Download immagine da eQSL fallito: @@ -6048,7 +6086,7 @@ Non deve essere vuoto - + Unsaved Non Salvato @@ -6391,78 +6429,78 @@ Radio - PTT On/Off - + Not enabled for non-Fusion style Non abilitato per stili diversi da Fusion - + Press to tune the alert Premi per sintonizzare l'allarme - + Clublog Immediately Upload Error Errore di caricamento immediato di Clublog - - + + <b>Error Detail:</b> <b>Dettagli errore:</b> - + Classic Classico - - - - - + + + + + QLog Warning Avviso QLog - + LoTW is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> LoTW non è configurato correttamente.<p> Utilizza la finestra di dialogo <b>Impostazioni</b> per configurarlo.</p> - + eQSL is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> eQSL non è configurato correttamente.<p> Utilizza la finestra di dialogo <b>Impostazioni</b> per configurarlo.</p> - + Clublog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> Clublog non è configurato correttamente.<p> Utilizza la finestra di dialogo <b>Impostazioni</b> per configurarlo.</p> - + HRDLog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> HRDLog non è configurato correttamente.<p> Utilizza la finestra di dialogo <b>Impostazioni</b> per configurarlo.</p> - + QRZ.com is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> QRZ.com non è configurato correttamente.<p> Utilizza la finestra di dialogo <b>Impostazioni</b> per configurarlo.</p> - + <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copy; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Based on Qt %2<br/>%3<br/>%4<br/>%5</p><p>Icon by <a href='http://www.iconshock.com'>Icon Shock</a><br />Satellite images by <a href='http://www.nasa.gov'>NASA</a><br />ZoneDetect by <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />TimeZone Database by <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a> <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copia; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Basato su Qt %2<br/>%3<br/>%4<br/>%5</p><p>Icona di <a href=' http://www.iconshock.com'>Icon Shock</a><br />Immagini satellitari di <a href='http://www.nasa.gov'>NASA</a><br />ZoneDetect di <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />Database TimeZone di <a href='https://github.com/evansiroky/timezone -boundary-builder'>Evan Siroky</a> - + About A proposito di - + N/A N/A @@ -6529,52 +6567,52 @@ Migration - + DXCC Entities Entità DXCC - + Sats Info Info Satelliti - + SOTA Summits SOTA Summits - + WWFF Records WWFF Records - + IOTA Records IOTA Records - + POTA Records POTA Records - + Membership Directory Records Registro dell'elenco dei membri - + List of Values Lista di valori - + Updating In aggiornamento - + Update Failed Aggiornamento fallito @@ -6607,320 +6645,320 @@ - + 80m - + RSTs RSTs - + RSTr RSTr - + 59 - + Mode Modo - + Save Salva - + Lookup the call on the web. The query URL can be changed in Settings -> Callbook Cerca il call sul web. L'URL della query può essere modificato in Impostazioni -> Rubrica - + Web Web - + Time On Inizio - + Reset Reset - + Date Data - + Duration Durata - + Info Info - + &Details &Dettagli - + QSL Send Status Stato invio QSL - - + + Paper Cartaceo - - - + + + <b>Yes</b> - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service<br/><b>No</b> - do not send an outgoing QSL card; do not upload the QSO to the online service<br/><b>Requested</b> - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service<br/><b>Queued</b> - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service<br/> <b>Sì</b> - è stata inviata una QSL in uscita; il QSO è stato caricato e accettato dal servizio online<br/><b>No</b> - non inviare una cartolina QSL in uscita; non caricare il QSO sul servizio online<br/><b>Richiesto</b> - la stazione contattata ha richiesto una QSL; la stazione contattata ha richiesto il caricamento del QSO sul servizio online<br/><b>Queued</b> - è stata selezionata una QSL in uscita da inviare; è stato selezionato un QSO da caricare sul servizio online<br/> - + LoTW LoTW - + eQSL eQSL - + QSL Send via Invia QSL vía - + QSL via QSL vía - + Propagation Mode Modo di Propagazione - + D&XCC D&XCC - + M&y Station M&ia Stazione - + Station Stazione - + Rig Radio - + Antenna Antenna - + Power Potenza - + Blank Vuoto - + W W - + My &Notes Le mie N&ote - + Member: Membro: - - - + + + No No - - - + + + Yes - - - + + + Requested Richiesto - - - + + + Queued In coda - - - + + + Ignored Ignorato - + Bureau Bureau - + Direct Diretto - + Electronic Elettronica - + QLog Error Errore di QLog - + Callbook login failed Accesso al Logbook non riuscito - + LP LP - + New Entity! Nuova Entità! - + New Band! Nuova Banda! - + New Mode! Nuovo Modo! - + New Band & Mode! Nuova Banda e Modo! - + New Slot! Nuovo Slot! - + Worked Lavorato - + Confirmed Confermato - + GE GE - + GM GM - + GA GA - + m - + Callbook search is inactive Ricerca sul Callbook inattiva - + Callbook search is active Ricerca sul Callbook attiva - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) due o quattro localizzatori di griglia Maidenhead adiacenti, ciascuno lungo quattro caratteri, (es. EN98,FM08,EM97,FM07) - + the contacted station's DARC DOK (District Location Code) (ex. A01) il DARC DOK (District Location Code) della stazione contattata (ex. A01) - + World Wide Flora & Fauna World Wide Flora & Fauna - + Special Activity Group Gruppo di Attività Speciali - + Special Activity Group Information Informazioni sul gruppo di attività speciali @@ -7099,7 +7137,7 @@ QCoreApplication - + QLog Help QLog Help @@ -7107,124 +7145,124 @@ QMessageBox - - - + + + QLog Critical QLog Crítico - + Cannot save a password for %1 to the Credential Store Impossibile salvare una password per %1 nell'archivio credenziali - + Cannot get a password for %1 from the Credential Store Impossibile ottenere una password per %1 dall'archivio credenziali - - - - - + + + + + - - - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + QLog Warning Avviso QLog - + Club List Update failed. Cannot remove old records 50 / 5.000 Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + Club List Update failed. Cannot plan new downloads Aggiornamento elenco club non riuscito. Impossibile pianificare nuovi download - + Unexpected Club List download. Canceling next downloads Download imprevisto della Club-List. Annullamento dei download successivi - + Unexpected Club List content for Contenuti imprevisti della Club-List per - + Network error. Cannot download Club List for Errore di rete. Impossibile scaricare l'elenco dei club per - - - - - + + + + + - + - - + + QLog Error Errore di QLog - + QLog is already running QLog è già in esecuzione - + Could not connect to database. Impossibile collegare il Database. - + Could not export a QLog database to ADIF as a backup.<p>Try to export your log to ADIF manually Impossibile esportare un database QLog in ADIF come backup.<p>Prova a esportare manualmente il tuo Log in ADIF - + Database migration failed. Errore nella Migrazione del database. - + Could not connect to database (2). Impossibile connettere il Database (2). @@ -7259,33 +7297,33 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi recordImpossibile aggiornare le Regole di allarme - + DXC Server Name Error Errore nel nome del server DXC - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> L'indirizzo del server DXC deve essere nel formato<p><b>[nomeutente@]nomehost:porta</b> (es. hamqth.com:7300)</p> - + DX Cluster Password DX Cluster Password - + Invalid Password Password non corretta - + DXC Server Connection Error Errore di connessione al server DXC - + Filename is empty Filename vuoto @@ -7324,22 +7362,22 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi recordIl nome del layout esiste già. - + <b>Rig Error:</b> <b>Errore della Radio:</b> - + <b>Rotator Error:</b> <b>Errore del rotore:</b> - + <b>CW Keyer Error:</b> <b>Errore Keyer CW:</b> - + Your callsign is empty. Please, set your Station Profile Il tuo nominativo è vuoto. Per favore, imposta il Profilo della tua Stazione @@ -7359,83 +7397,83 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi recordImpossibile aggiornare il tipo di corrispondenza del filtro QSO - - - + + Please, define at least one Station Locations Profile Per favore, definisci almeno un profilo di posizioni della stazione - + WSJTX Multicast is enabled but the Address is not a multicast address. WSJTX Multicast è abilitato ma l'indirizzo non è un indirizzo multicast. - + Rig port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device La porta della Radio deve essere una porta COM valida.<br>Per Windows utilizzare COMxx, per sistemi operativi di tipo Unix utilizzare un percorso per il dispositivo - + Rig PTT port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device La porta PTT della Radio deve essere una porta COM valida.<br>Per Windows utilizzare COMxx, per sistemi operativi di tipo Unix utilizzare un percorso al dispositivo - + <b>TX Range</b>: Max Frequency must not be 0. <b>Intervallo TX</b>: la frequenza massima non deve essere 0. - + <b>TX Range</b>: Max Frequency must not be under Min Frequency. <b>Intervallo TX</b>: la frequenza massima non deve essere inferiore alla frequenza minima. - + Rotator port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device La porta del rotore deve essere una porta COM valida.<br>Per Windows utilizzare COMxx, per sistemi operativi di tipo Unix utilizzare un percorso per il dispositivo - + CW Keyer port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device La porta del keyer CW deve essere una porta COM valida.<br>Per Windows utilizzare COMxx, per sistemi operativi di tipo Unix utilizzare un percorso per il dispositivo - + Cannot change the CW Keyer Model to <b>Morse over CAT</b><br>No Morse over CAT support for Rig(s) <b>%1</b> Impossibile modificare il modello CW Keyer in <b>Morse su CAT</b><br>Nessun supporto Morse su CAT per a Radio <b>%1</b> - + Cannot delete the CW Keyer Profile<br>The CW Key Profile is used by Rig(s): <b>%1</b> Impossibile eliminare il profilo CW Keyer<br>Il profilo CW Keyer è utilizzato da Radio: <b>%1</b> - + Callsign has an invalid format L'indicativo ha un formato non valido - + Gridsquare has an invalid format La Griglia ha un formato non valido - + VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by ',') Le griglie VUCC hanno un formato non valido (devono essere 2 o 4 Gridsquare separati da ',') - + Country must not be empty Nazione non deve essere vuoto - + CQZ must not be empty La CQ Zone non deve essere vuota - + ITU must not be empty ITU non deve essere vuoto @@ -7455,147 +7493,147 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + Connection Refused Connessione rifiutata - + Host closed the connection Host ha chiuso la connessione - + Host not found Host non trovato - + Timeout Timeout - + Network Error Errore di rete - + Internal Error Errore Interno - + Opening Database Apertura Database - + Backuping Database Backup del database - + Migrating Database Migrazione del database - + Starting Application Avvio applicazione - + My Rig Mia Radio - + Logging Station Callsign Indicativo della stazione - + My Gridsquare Mia Griglia - + My Name Mio nome - + My City Mia Città - + My IOTA Mio IOTA - + My SOTA Mio SOTA - + My Special Interest Activity Mie attività di interesse speciale - + My Spec. Interes Activity Info Informazioni sulle mie attività di interesse speciale - + My VUCC Grids Mia Griglia VUCC - + My WWFF Mio WWFF - + My POTA Ref Mio Ref POTA - + My ITU Mio ITU - + My CQZ Mia CQ Zone - + My DXCC Mio DXCC - + Cannot connect to DXC Server <p>Reason <b>: Impossibile connettersi al server DXC <p>Motivo <b>: - + <b>Imported</b>: %n contact(s) <b>Importato</b>: %n contatto @@ -7603,7 +7641,7 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + <b>Warning(s)</b>: %n <b>Allarme</b>: %n @@ -7611,7 +7649,7 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + <b>Error(s)</b>: %n <b>Errore</b>: %n @@ -7675,23 +7713,23 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record"No" - + Uploading to QRZ.com Carica su QRZ.com - + Cancel Cancella - - + + QLog Information Informazioni QLog - + %n QSO(s) uploaded. %n QSO caricato. @@ -7699,17 +7737,17 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + QLog Warning Avviso QLog - + Cannot upload the QSO(s): Impossibile caricare il/i QSO: - + No QSOs found to upload. Nessun QSO trovato da caricare. @@ -8606,22 +8644,22 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record Rig - + No Rig Profile selected Nessun Profilo Radio selezionato - + Initialization Error Errore di inizializzazione - + Internal Error Errore Interno - + Cannot open Rig Impossibile aprire Radio @@ -8654,7 +8692,7 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + PWR: %1W @@ -8662,22 +8700,22 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record Rotator - + No Rotator Profile selected Nessun Profilo Rotore selezionato - + Initialization Error Errore di inizializzazione - + Internal Error Errore Interno - + Cannot open Rotator Impossibile aprire Rotore @@ -8862,20 +8900,20 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - - - - - - - - - - - - - - + + + + + + + + + + + + + + Add Aggiungi @@ -9473,14 +9511,14 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + Serial Seriale - - + + Network Rete @@ -9531,8 +9569,8 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - - + + HamQTH @@ -9558,8 +9596,8 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - - + + QRZ.com @@ -9701,333 +9739,333 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi recordBande - + Modes Modi - + DXCC - + Wsjtx - + Raw UDP Forward Inoltro UDP non elaborato - + <p>List of IP addresses to which QLog forwards raw UDP WSJT-X packets.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Elenco di indirizzi IP a cui QLog inoltra i pacchetti UDP WSJT-X grezzi.</p>Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT - - - - - + + + + + ex. 192.168.1.1:1234 192.168.2.1:1234 - + Port Porta - + Port where QLog listens an incoming traffic from WSJT-X Porta dove QLog ascolta il traffico in entrata da WSJT-X - + Join Multicast Unisciti a Multicast - + Enable/Disable Multicast option for WSJTX Abilita/Disabilita opzione Multicast per WSJTX - + Multicast Address Indirizzo Multicast - + Specify Multicast Address. <br>On some Linux systems it may be necessary to enable multicast on the loop-back network interface. Specificare l'indirizzo multicast. <br>Su alcuni sistemi Linux potrebbe essere necessario abilitare il multicast sull'interfaccia di rete loopback. - + TTL TTL - + Time-To-Live determines the range<br> over which a multicast packet is propagated in your intranet. Time-To-Live determina l'intervallo<br> entro il quale un pacchetto multicast viene propagato nella tua Intranet. - + Notifications Notifiche - + LogID - + <p>Assigned LogID to the current log.</p>The LogID is sent in the Network Nofitication messages as a unique instance identified.<p> The ID is generated automatically and cannot be changed</> <p>LogID assegnato al registro corrente.</p>Il LogID viene inviato nei messaggi di notifica di rete come un'istanza univoca identificata.<p> L'ID viene generato automaticamente e non può essere modificato</> - + DX Spots DX Spots - + <p> List of IP addresses to which QLog sends UDP notification packets with DX Cluster Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Elenco degli indirizzi IP a cui QLog invia pacchetti di notifiche UDP con DX Cluster Spots.</p>Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT - + Spot Alerts Allarmi Spot - + <p> List of IP addresses to which QLog sends UDP notification packets about user Spot Alerts.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Elenco degli indirizzi IP a cui QLog invia pacchetti di notifiche UDP sugli Spot Alerts dell'utente.</p>Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT - + QSO Changes Modifiche al QSO - + <p> List of IP addresses to which QLog sends UDP notification packets about a new/updated/deleted QSO in the log.</p>The IP addresses are separated by a space and have the form IP:PORT <p> Elenco degli indirizzi IP a cui QLog invia pacchetti di notifica UDP relativi a un QSO nuovo/aggiornato/eliminato nel log.</p>Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT - + Wsjtx CQ Spots Wsjtx CQ Spots - + <p> List of IP addresses to which QLog sends UDP notification packets with WSJTX CQ Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p>Elenco degli indirizzi IP a cui QLog invia pacchetti di notifiche UDP con WSJTX CQ Spots.</p>Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT - + Shortcuts Scorciatoie - - + + Special - Omnirig Speciale - Omnirig - - + + Name Nome - + Report Report - - + + State Stato - + Start (MHz) Inizio (MHz) - + End (MHz) Fine (MHz) - + SAT Mode SAT Mode - - - + + + Disabled Disabilitato - - + + None Nessuno - - + + Hardware - - + + Software Software - - + + No No - - + + Even Pari - - + + Odd Dispari - - + + Mark Segna - - + + Space Spazio - + Dummy Fittizio - + Morse Over CAT Morse Over CAT - + WinKey v2 - + CWDaemon - + FLDigi - + Single Paddle Single Paddle - + IAMBIC A - + IAMBIC B - + Ultimate Definitivo - + Press <b>Modify</b> to confirm the profile changes or <b>Cancel</b>. Premi <b>Modifica</b> per confermare le modifiche al profilo o <b>Annulla</b>. - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + Modify Modifica - - - - - - - - - - + + + + + + + + + + Must not be empty Non deve essere vuoto - + Select File Seleziona File - + members Membri - + Required internet connection during application start Connessione Internet richiesta durante l'avvio dell'applicazione @@ -10035,22 +10073,22 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record ShortcutEditorModel - + Description Descrizione - + Shortcut Scorciatoia - + Conflict with a built-in shortcut Conflitto con una scorciatoia integrata - + Conflict with a user-defined shortcut Conflitto con una scorciatoia definita dall'utente @@ -10351,17 +10389,17 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record ToAllTableModel - + Time Ora - + Spotter Spotter - + Message Messaggio @@ -10397,47 +10435,47 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record WCYTableModel - + Time Ora - + K - + expK - + A - + R - + SFI - + SA - + GMF - + Au @@ -10445,27 +10483,27 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record WWVTableModel - + Time Ora - + SFI - + A - + K - + Info Info @@ -10591,37 +10629,37 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record WsjtxTableModel - + Callsign Indicativo - + Gridsquare Griglia - + Distance Distanza - + SNR - + Last Activity Ultima Attività - + Last Message Ultimo messaggio - + Member Membro @@ -10662,32 +10700,32 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record main - + Run with the specific namespace. Esegui con lo spazio dei nomi specifico. - + namespace spazio dei nomi - + Translation file - absolute or relative path and QM file name. File di traduzione: percorso assoluto o relativo e nome file QM. - + path/QM-filename percorso/nome file QM - + Set language. <code> example: 'en' or 'en_US'. Ignore environment setting. Imposta la lingua. <codice> esempio: 'en' o 'en_US'. Ignora l'impostazione dell'ambiente. - + code codice diff --git a/i18n/qlog_zh_CN.qm b/i18n/qlog_zh_CN.qm index 90572d8dc8544c0854fab81754242a5733911471..945f9174f2451b066af6fbde3d87715f1e7fae6a 100644 GIT binary patch delta 10836 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 Se`KqFPNxiIc|#S!E&dOT=lGQX delta 10850 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 Aa{vGU diff --git a/i18n/qlog_zh_CN.ts b/i18n/qlog_zh_CN.ts index 32769f93..22be6921 100644 --- a/i18n/qlog_zh_CN.ts +++ b/i18n/qlog_zh_CN.ts @@ -189,17 +189,17 @@ 规则 - + Add 添加 - + Edit 编辑 - + Remove 删除 @@ -217,37 +217,37 @@ AlertTableModel - + Rule Name 规则名 - + Callsign 呼号 - + Frequency 频率 - + Mode 模式 - + Updated 已更新 - + Last Update 最后更新 - + Last Comment 最后备注 @@ -363,117 +363,117 @@ - + DXCC DXCC - + ITU ITU - + WAC WAC - + WAZ WAZ - + WAS WAS - + WPX WPX - + IOTA IOTA - + POTA Hunter - + POTA Activator - + SOTA SOTA - + WWFF WWFF - + Done 完成 - + North America 北美 - + South America 南美 - + Europe 欧洲 - + Africa 非洲 - + Oceania 大洋洲 - + Asia 亚洲 - + Antarctica 南极洲 - + TOTAL Worked 全部已通联 - + TOTAL Confirmed 全部已确认 - + Confirmed 已确认 - + Worked 已通联 @@ -706,17 +706,17 @@ 清除 - + Rig must be connected 必须先连接设备 - + Word 单词 - + Whole 整句 @@ -814,27 +814,27 @@ CWKeyer - + No CW Keyer Profile selected 未选择 CW 电键配置文件 - + Initialization Error 初始化出错 - + Internal Error 内部错误 - + Connection Error 连接出错 - + Cannot open the Keyer connection 无法打开电键连接 @@ -842,39 +842,39 @@ CWWinKey2 - + Connected device is not WinKey 已连接的设备不是 WinKey - + Connected device is not WinKey v2 or newer 已连接的设备不是 WinKey v2 或者更新的版本 - + Cannot send Text to Rig 无法发送文字至设备 - - - + + + Keyer is not connected 电键未连接 - + Communication Error 通讯出错 - + Cannot set Keyer Speed 无法设置电键速度 - + Cannot stop Text Sending 无法停止文字发送 @@ -962,7 +962,7 @@ ClubLog - + Clublog Operation for Callsign %1 failed.<br>%2 呼号 %1 的 Clublog 操作失败。<br>%2 @@ -2838,151 +2838,151 @@ Data - + New Entity 新实体 - + New Band 新波段 - + New Mode 新模式 - + New Band&Mode 新波段模式(&M) - + New Slot 新组合 - + Confirmed 已确认 - + Worked 已通联 - + Hz Hz - + kHz kHz - + GHz GHz - + MHz MHz + + + + + + + Yes + + - Yes - - - - - - - - No - - + + Requested 已请求 - + Queued 排队中 - - + + Invalid 无效 - + Bureau 卡片局 - + Direct 直邮 - + Electronic 电子卡片 - - - - - + + + + + Blank 空白 - + Modified 已修改 - + Grayline 灰线 - + Other 其他 - + Short Path 短路径 - + Long Path 长路径 - + Not Heard 没听到过 - + Uncertain 不确定 @@ -3274,57 +3274,57 @@ DxTableModel - + Time 时间 - + Callsign 呼号 - + Frequency 频率 - + Mode 模式 - + Spotter 报告者 - + Comment 备注 - + Continent 大洲 - + Spotter Continent 报告者大洲 - + Band 波段 - + Member 成员 - + Country 国家/地区 @@ -3338,7 +3338,7 @@ - + Connect 连接 @@ -3368,152 +3368,177 @@ 控制台 - + + Full-text search + + + + + Search + + + + + Close Search + + + + Send DX Cluster Command 发送 DX 集群命令 - + Filter... 过滤器... - + Column Visibility... 列可见性... - + Connect on startup 启动时自动连接 - + Automatic connection after start 程序启动后自动连接服务器 - + Delete Server 删除服务器 - + DXC - Delete Server DXC - 删除服务器 - + Clear Password 清除密码 - + Keep Spots 保留报告 - + Spots are not cleared when connecting to a new DX Cluster. 连接至新的 DX 集群后,不清除旧的报告。 - + Clear 清除 - + Clear all data 清除所有数据 - + + Search... + + + + + DXC - Search + + + + Filter DXC DXC 过滤器 - + Spot Last QSO 报告最新的 QSO - + Send last QSO spot 发送最新的 QSO 报告 - + Show HF Stats 显示 HF 状态 - + Show VHF Stats 显示 VHF 状态 - + Show WCY 显示 WCY - + Show WWV 显示 WWV - + Which columns should be displayed 应该显示哪些列 - + Connecting... 正在连接... - + DX Cluster is temporarily unavailable DX 集群暂时不可用 - + DXC Server Error DXC 服务器出错 - + An invalid callsign 无效的呼号 - + DX Cluster Password DX 集群密码 - + Security Notice 安全注意 - + The password can be sent via an unsecured channel 密码可能通过不安全的通道发送 - + Server 服务器 - + Username 用户名 - + Disconnect 断开连接 @@ -3544,7 +3569,7 @@ DxccTableWidget - + Mode 模式 @@ -4032,40 +4057,40 @@ "否" - + Uploading to HRDLOG 上传至 HRDLOG - + Cancel 取消 - - + + QLog Information QLog 信息 - + %n QSO(s) uploaded. %n QSO(s) 已上传。 - + QLog Warning QLog告警 - + Cannot upload the QSO(s): 无法上传该 QSO(s): - + No QSOs found to upload. 没有找到可上传的 QSOs。 @@ -4081,63 +4106,63 @@ HamlibRigDrv - + None - + CAT - + DTR - + RTS - - + + Initialization Error 初始化出错 - + Cannot set PTT Type - + Cannot set PTT Share - + Unsupported Rig Driver 不支持的设备驱动 - + Set Frequency Error 设置频率出错 - + Set PTT Error 设置 PTT 出错 - + Get Frequency Error 获取频率出错 - + Get Mode Error 获取模式出错 @@ -4220,7 +4245,7 @@ - + The value is used when an input record does not contain the ADIF value 当输入记录不包含ADIF值时使用该值 @@ -4241,99 +4266,99 @@ - + Comment 备注 - + &Import 导入(&I) - + Select File 选择文件 - - + + The values below will be used when an input record does not contain the ADIF values 当输入记录不包含ADIF值时,将使用下面的值 - + <p><b>In-Log QSO:</b></p><p> <p><b>在日志 QSO:</b></p><p> - + <p><b>Importing:</b></p><p> <p><b>导入中:</b></p><p> - + Duplicate QSO 重复的 QSO - + <p>Do you want to import duplicate QSO?</p>%1 %2 <p>是否要导入重复的QSO?</p> %1 %2 - + Save to File 保存至文件 - + QLog Import Summary QLog 导入摘要 - + Import date 导入日期 - + Imported file 导入的文件 - + Imported: %n contact(s) 已导入: %n 通联记录 - + Warning(s): %n 告警: %n - + Error(s): %n 错误: %n - + Details 详情 - + Import Result 导入结果 - + Save Details... 保存详情... @@ -4599,48 +4624,61 @@ LogFormat - + + + Cannot find My DXCC Entity Info + + + + A minimal set of fields not present (start_time, call, band, mode, station_callsign) 需要提供最小字段集 (start_time, call, band, mode, station_callsign) - + Outside the selected Date Range 超出指定的日期范围 - - + + Duplicate 重复 - + Cannot find DXCC Entity Info 无法找到 DXCC 实体信息 - - Cannot find own DXCC Entity Info - 无法找到自己的 DXCC 实体信息 + + DXCC Info is missing + - + + + + no Station Callsign present + + + + Cannot insert to database 无法插入到数据库中 - + Imported 已导入 - + Error 错误 - + Warning 告警 @@ -5522,38 +5560,38 @@ - + Band 波段 - + Mode 模式 - + Country 国家/地区 - + Club 俱乐部 - + User Filter 用户过滤器 - - + + Delete 删除 @@ -5619,55 +5657,55 @@ - + Delete the selected contacts? 删除选中的联系人? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? - + Deleting QSOs 删除 QSO - + Update 更新 - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? 通过更新,所有选定的行都将受到影响。<br>当前在列中编辑的值将应用于所有选定的行。<br><br>您想要编辑他们吗? - + Count: %n 计数:%n - + Downloading eQSL Image 正在下载 eQSL 图片 - - + + Cancel 取消 - + QLog Error QLog 错误 - + eQSL Download Image failed: eQSL 图片下载失败: @@ -6040,7 +6078,7 @@ 不能为空 - + Unsaved 未保存 @@ -6383,78 +6421,78 @@ 设备 - PTT ON/OFF - + Not enabled for non-Fusion style 非融合样式不允许使用 - + Press to tune the alert 按下调节提醒 - + Clublog Immediately Upload Error Clublog 立即上传出错 - - + + <b>Error Detail:</b> <b>错误详情:</b> - + Classic 经典 - - - - - + + + + + QLog Warning QLog 告警 - + LoTW is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> LoTW 配置不正确。<p>请使用<b>设置</b>对话框进行配置。</p> - + eQSL is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> eQSL 配置不正确。<p>请使用<b>设置</b>对话框进行配置。</p> - + Clublog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> Clublog 配置不正确。<p>请使用<b>设置</b>对话框进行配置。</p> - + HRDLog is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> HRDLog 配置不正确。<p>请使用<b>设置</b>对话框进行配置。</p> - + QRZ.com is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p> QRZ.com 配置不正确。<p>请使用<b>设置</b>对话框进行配置。</p> - + <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copy; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Based on Qt %2<br/>%3<br/>%4<br/>%5</p><p>Icon by <a href='http://www.iconshock.com'>Icon Shock</a><br />Satellite images by <a href='http://www.nasa.gov'>NASA</a><br />ZoneDetect by <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />TimeZone Database by <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a> <h1>QLog %1</h1><p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>&copy; 2021-2024 Ladislav Foldyna OK1MLG</p><p>Based on Qt %2<br/>%3<br/>%4<br/>%5</p><p>Icon by <a href='http://www.iconshock.com'>Icon Shock</a><br />Satellite images by <a href='http://www.nasa.gov'>NASA</a><br />ZoneDetect by <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />TimeZone Database by <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a> - + About 关于 - + N/A N/A @@ -6521,52 +6559,52 @@ Migration - + DXCC Entities DXCC 实体 - + Sats Info 卫星信息 - + SOTA Summits SOTA 山峰 - + WWFF Records WWFF 记录 - + IOTA Records IOTA 记录 - + POTA Records POTA 记录 - + Membership Directory Records 会员名录记录 - + List of Values 值列表 - + Updating 更新 - + Update Failed 更新失败 @@ -6599,320 +6637,320 @@ MHz - + 80m 80m - + RSTs RST发 - + RSTr RST收 - + 59 59 - + Mode 模式 - + Lookup the call on the web. The query URL can be changed in Settings -> Callbook 在网络上查找呼号。查询 URL 可以在 <b>设置 -> 电台黄页</b> 中更改 - + Web 网站 - + Time On 开始时间 - + Date 日期 - + Save 保存 - + Duration 周期 - + Reset 重置 - + Info 信息 - + &Details 详情(&D) - + QSL Send Status QSL 发送状态 - - + + Paper 卡片 - - - + + + <b>Yes</b> - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service<br/><b>No</b> - do not send an outgoing QSL card; do not upload the QSO to the online service<br/><b>Requested</b> - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service<br/><b>Queued</b> - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service<br/> <b>是</b> -已发出 QSL 卡; QSO 已上传至在线服务<br/><b>否</b> -不发送 QSL 卡;<br/><b>已请求</b> -被联系站点已请求一张 QSL 卡; 被联系站点已请求将 QSO 上传到在线服务<br/><b>排队</b> 已选择要发送的 QSL 卡; QSO 已上传至网上服务<br/> - + LoTW LoTW - + eQSL eQSL - + QSL Send via QSL 发送通过 - + QSL via QSL 通过 - + Propagation Mode 传播模式 - + D&XCC D&XCC - + M&y Station 我的电台(&Y) - + Station 电台 - + Rig 设备 - + Antenna 天线 - + Power 功率 - + Blank 空白 - + W W - + My &Notes 我的笔记(&N) - + Member: 成员: - - - + + + No - - - + + + Yes - - - + + + Requested 已请求 - - - + + + Queued 排队中 - - - + + + Ignored 已忽视 - + Bureau 卡片局 - + Direct 直邮 - + Electronic 电子卡片 - + QLog Error QLog错误 - + Callbook login failed 电台黄页登陆失败 - + LP - + New Entity! 新实体! - + New Band! 新波段! - + New Mode! 新模式! - + New Band & Mode! 新波段与模式! - + New Slot! 新组合! - + Worked 已通联 - + Confirmed 已确认 - + GE GE - + GM GM - + GA GA - + m m - + Callbook search is active 电台黄页搜索可用 - + Callbook search is inactive 电台黄页搜索不可用 - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) 两个或四个相邻的梅登黑德网格定位器,每个四个字符长,(例如 EN98, FM08, EM97, FM07) - + the contacted station's DARC DOK (District Location Code) (ex. A01) 联络电台的DARC DOK (地区位置代码) (例如 A01) - + World Wide Flora & Fauna 世界动植物 (可选参数) - + Special Activity Group 特别活动或兴趣团体名称 - + Special Activity Group Information 特别活动或兴趣团体信息 @@ -7091,7 +7129,7 @@ QCoreApplication - + QLog Help QLog 帮助 @@ -7099,123 +7137,123 @@ QMessageBox - - - + + + QLog Critical Qlog 临界值 - + Cannot save a password for %1 to the Credential Store 无法将 %1 的密码保存到凭据数据库 - + Cannot get a password for %1 from the Credential Store 无法从凭据数据库获取 %1 密码 - - - - - + + + + + - - - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + QLog Warning QLog 告警 - + Club List Update failed. Cannot remove old records 俱乐部列表更新失败。无法删除旧记录 - + Club List Update failed. Cannot plan new downloads 俱乐部列表更新失败。无法规划新下载 - + Unexpected Club List download. Canceling next downloads 无法预料的俱乐部列表下载。取消下次下载 - + Unexpected Club List content for 未知的俱乐部列表内容 - + Network error. Cannot download Club List for 网络错误。无法下载俱乐部列表 - - - - - + + + + + - + - - + + QLog Error QLog 出错 - + QLog is already running 已经有 QLog 实例正在运行 - + Could not connect to database. 无法连接至数据库。 - + Could not export a QLog database to ADIF as a backup.<p>Try to export your log to ADIF manually 无法导出 QLog 数据库至 ADIF 备份。<p>请尝试手动导出您的日志至 ADIF - + Database migration failed. 数据库迁移失败。 - + Could not connect to database (2). 无法连接至数据库。 @@ -7250,33 +7288,33 @@ 无法更新告警规则 - + DXC Server Name Error DXC 服务器名称错误 - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> DXC 服务器地址格式必须为<p><b>[用户名@]主机名:端口</b> (例. hamqth.com:7300)</p> - + DX Cluster Password DX 集群密码 - + Invalid Password 无效的密码 - + DXC Server Connection Error DXC 服务器连接出错 - + Filename is empty 文件名为空 @@ -7314,22 +7352,22 @@ 布局名称已存在。 - + <b>Rig Error:</b> <b>设备出错:</b> - + <b>Rotator Error:</b> <b>旋转云台出错:</b> - + <b>CW Keyer Error:</b> <b>CW 键控器出错:</b> - + Your callsign is empty. Please, set your Station Profile 你的呼号为空。请先设置台站配置文件 @@ -7349,83 +7387,83 @@ 无法更新 QSO 过滤规则匹配类型 - - - + + Please, define at least one Station Locations Profile 请至少定义一个站点配置文件 - + WSJTX Multicast is enabled but the Address is not a multicast address. WSJTX 多播已启用,但地址不是多播地址。 - + Rig port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device 设备端口必须是一个有效的 COM 端口。<br>Windows 使用 COMxxx,对于unix-like OS 使用设备路径 - + Rig PTT port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device - + <b>TX Range</b>: Max Frequency must not be 0. <b>TX 范围</b>: 最大频率不能为 0。 - + <b>TX Range</b>: Max Frequency must not be under Min Frequency. <b>TX 范围</b>: 最大频率不能低于最小频率。 - + Rotator port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device 旋转云台端口必须是一个有效的 COM 端口。<br>对于Windows 使用 COMxxx,对于unix-like OS 使用设备路径 - + CW Keyer port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device CW 键控器端口必须是一个有效的 COM 端口。<br>对于Windows 使用 COMxxx,对于unix-like OS 使用设备路径 - + Cannot change the CW Keyer Model to <b>Morse over CAT</b><br>No Morse over CAT support for Rig(s) <b>%1</b> 无法将 CW 键控器模型改为 <b>Morse over CAT</b><br>设备 <b>%1</b>不支持Morse over CAT - + Cannot delete the CW Keyer Profile<br>The CW Key Profile is used by Rig(s): <b>%1</b> 无法删除 CW 键控器配置文件<br>本 CW 键控器配置文件正在被设备<b>%1</b>使用 - + Callsign has an invalid format 呼号格式无效 - + Gridsquare has an invalid format 网格坐标格式无效 - + VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by ',') VUCC 网格格式无效 (必须是 2 或 4 个被 ',' 分隔的网格坐标) - + Country must not be empty 国家/地区 不能为空 - + CQZ must not be empty CQ 分区不能为空 - + ITU must not be empty ITU 不能为空 @@ -7445,161 +7483,161 @@ - + Connection Refused 连接被拒绝 - + Host closed the connection 主机关闭连接 - + Host not found 找不到主机 - + Timeout 超时 - + Network Error 网络错误 - + Internal Error 内部错误 - + Opening Database 打开数据库 - + Backuping Database 备份数据库 - + Migrating Database 迁移数据库 - + Starting Application 启动应用程序 - + My Rig 我的设备 - + Logging Station Callsign 记录电台呼号 - + My Gridsquare 我的网格坐标 - + My Name 我的姓名 - + My City 我的城市 - + My IOTA 我的 IOTA - + My SOTA 我的 SOTA - + My Special Interest Activity 我的特殊兴趣活动 - + My Spec. Interes Activity Info 我的特殊兴趣活动信息 - + My VUCC Grids 我的 VUCC 网格 - + My WWFF 我的 WWFF - + My POTA Ref 我的 POTA 编号 - + My ITU 我的 ITU - + My CQZ 我的 CQ 分区 - + My DXCC 我的 DXCC - + Cannot connect to DXC Server <p>Reason <b>: 无法连接至 DXC 服务器 <p>原因 <b>: - + <b>Imported</b>: %n contact(s) <b>已导入</b>: %n 通联 - + <b>Warning(s)</b>: %n <b>告警</b>: %n - + <b>Error(s)</b>: %n <b>错误</b>: %n @@ -7662,40 +7700,40 @@ "否" - + Uploading to QRZ.com 上传至 QRZ.com - + Cancel 取消 - - + + QLog Information QLog 信息 - + %n QSO(s) uploaded. %n QSO(s) 已上传。 - + QLog Warning QLog 告警 - + Cannot upload the QSO(s): 无法上传该 QSO(s): - + No QSOs found to upload. 没有找到可上传的 QSOs。 @@ -8593,22 +8631,22 @@ Rig - + No Rig Profile selected 未选择设备配置文件 - + Initialization Error 初始化出错 - + Internal Error 内部错误 - + Cannot open Rig 无法打开设备 @@ -8641,7 +8679,7 @@ XIT: 0.00000 MHz - + PWR: %1W 功率: %1W @@ -8649,22 +8687,22 @@ Rotator - + No Rotator Profile selected 未选择旋转云台配置文件 - + Initialization Error 初始化出错 - + Internal Error 内部错误 - + Cannot open Rotator 无法打开云台 @@ -8849,20 +8887,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + Add 添加 @@ -9433,7 +9471,7 @@ QSO 将立即上传 - + Shortcuts 快捷键 @@ -9445,14 +9483,14 @@ - + Serial 串口 - - + + Network 网络 @@ -9528,8 +9566,8 @@ - - + + HamQTH HamQTH @@ -9555,8 +9593,8 @@ - - + + QRZ.com QRZ.com @@ -9693,328 +9731,328 @@ 波段 - + Modes 模式 - + DXCC DXCC - + Wsjtx Wsjtx - + Raw UDP Forward 原始UDP转发 - + <p>List of IP addresses to which QLog forwards raw UDP WSJT-X packets.</p>The IP addresses are separated by a space and have the form IP:PORT <p> QLog转发UDP WSJT-X原始报文的IP地址列表。</p> IP地址之间用空格分隔,格式为IP:PORT - - - - - + + + + + ex. 192.168.1.1:1234 192.168.2.1:1234 例. 192.168.1.1:1234 192.168.2.1:1234 - + Port 端口 - + Port where QLog listens an incoming traffic from WSJT-X QLog 监听来自 WSJT-X 的传入数据流的端口 - + Join Multicast 加入多播 - + Enable/Disable Multicast option for WSJTX 启用/禁用 WSJTX 的多播选项 - + Multicast Address 多播地址 - + Specify Multicast Address. <br>On some Linux systems it may be necessary to enable multicast on the loop-back network interface. 指定组播地址。<br>在某些Linux系统上,可能需要在环路网络接口上启用多播。 - + TTL TTL - + Time-To-Live determines the range<br> over which a multicast packet is propagated in your intranet. 生存时间 (Time-To-Live) 决定了组播数据包在内部网中传播的范围。 - + Notifications 通知 - + LogID 日志ID - + <p>Assigned LogID to the current log.</p>The LogID is sent in the Network Nofitication messages as a unique instance identified.<p> The ID is generated automatically and cannot be changed</> <p>为当前日志分配 LogID。</p> LogID作为唯一实例标识在网络通知消息中发送。<p>该ID为自动生成,不可手动修改</> - + DX Spots DX 报告 - + <p> List of IP addresses to which QLog sends UDP notification packets with DX Cluster Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p> QLog 发送 DX 集群报告 UDP 通知报文的 IP 地址列表。</p> IP 地址之间用空格分隔,格式为 IP:PORT - + Spot Alerts 报告预警 - + <p> List of IP addresses to which QLog sends UDP notification packets about user Spot Alerts.</p>The IP addresses are separated by a space and have the form IP:PORT <p> QLog 向用户发送 报告预警 UDP 报文的 IP 地址列表。</p> IP 地址之间用空格分隔,格式为 IP:PORT - + QSO Changes QSO 变更 - + <p> List of IP addresses to which QLog sends UDP notification packets about a new/updated/deleted QSO in the log.</p>The IP addresses are separated by a space and have the form IP:PORT <p>日志中 新增/更新/删 除QSO时,QLog 向其发送 UDP 通知报文的 IP 地址列表。</p> IP地址之间用空格分隔,格式为 IP:PORT - + Wsjtx CQ Spots WSJTX CQ 报告 - + <p> List of IP addresses to which QLog sends UDP notification packets with WSJTX CQ Spots.</p>The IP addresses are separated by a space and have the form IP:PORT <p> QLog 通过 WSJTX CQ 报告 发送 UDP 通知报文的 IP 地址列表。</p> IP地址之间用空格分隔,格式为 IP:PORT - - + + Special - Omnirig 特别的 - Ominirig - - + + Name 姓名 - + Report 报告 - - + + State 状态 - + Start (MHz) 起始(MHz) - + End (MHz) 结束(MHz) - + SAT Mode 卫星模式 - - - + + + Disabled 禁用 - - + + None - - + + Hardware 硬件 - - + + Software 软件 - - + + No - - + + Even 偶校验 - - + + Odd 奇校验 - - + + Mark 1校验 - - + + Space 0校验 - + Dummy 虚拟 - + Morse Over CAT Morse Over CAT - + WinKey v2 WinKey v2 - + CWDaemon CWDaemon - + FLDigi FLDigi - + Single Paddle 单桨电键 - + IAMBIC A IAMBIC A - + IAMBIC B IAMBIC B - + Ultimate Ultimate - + Press <b>Modify</b> to confirm the profile changes or <b>Cancel</b>. 按<b>修改</b>确认更改配置文件或按<b>取消</b>。 - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + Modify 修改 - - - - - - - - - - + + + + + + + + + + Must not be empty 不能为空 - + Select File 选择文件 - + members 成员 - + Required internet connection during application start 在应用程序启动时需要互联网连接 @@ -10022,22 +10060,22 @@ ShortcutEditorModel - + Description 描述 - + Shortcut 快捷键 - + Conflict with a built-in shortcut 与内置快捷键发生冲突 - + Conflict with a user-defined shortcut 与用户定义快捷键发生冲突 @@ -10338,17 +10376,17 @@ ToAllTableModel - + Time 时间 - + Spotter 报告者 - + Message 消息 @@ -10384,47 +10422,47 @@ WCYTableModel - + Time 时间 - + K K - + expK expK - + A A - + R R - + SFI SFI - + SA SA - + GMF GMF - + Au Au @@ -10432,27 +10470,27 @@ WWVTableModel - + Time 时间 - + SFI SFI - + A A - + K K - + Info 信息 @@ -10578,37 +10616,37 @@ WsjtxTableModel - + Callsign 呼号 - + Gridsquare 网格坐标 - + Distance 距离 - + SNR SNR - + Last Activity 前次活跃 - + Last Message 前次消息 - + Member 成员 @@ -10649,32 +10687,32 @@ main - + Run with the specific namespace. 使用特定的命名空间运行。 - + namespace 命名空间 - + Translation file - absolute or relative path and QM file name. 翻译文件 - 绝对或相对路径及 QM 文件名。 - + path/QM-filename 路径/QM-文件名 - + Set language. <code> example: 'en' or 'en_US'. Ignore environment setting. 设置语言。<code> 示例: 'en' 或 'en_US'。忽略环境设置。 - + code 代码 diff --git a/ui/DxWidget.ui b/ui/DxWidget.ui index 3f22b6e8..624fcd7d 100644 --- a/ui/DxWidget.ui +++ b/ui/DxWidget.ui @@ -635,7 +635,7 @@ DXC - Search - Ctrl+D + Ctrl+D Qt::ApplicationShortcut From 0663854be847689e0f3e245d9a19e8df6f5440a0 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Mon, 23 Sep 2024 16:03:51 +0200 Subject: [PATCH 37/74] NewContact: Function Renaming --- ui/MainWindow.cpp | 2 +- ui/NewContactWidget.cpp | 94 +++++++++++++++++++---------------------- ui/NewContactWidget.h | 17 ++++---- ui/NewContactWidget.ui | 12 +++--- ui/WsjtxWidget.cpp | 6 +-- ui/WsjtxWidget.h | 2 +- 6 files changed, 64 insertions(+), 69 deletions(-) diff --git a/ui/MainWindow.cpp b/ui/MainWindow.cpp index 08120a4b..d37c69af 100644 --- a/ui/MainWindow.cpp +++ b/ui/MainWindow.cpp @@ -241,7 +241,7 @@ MainWindow::MainWindow(QWidget* parent) : connect(ui->bandmapWidget, &BandmapWidget::tuneDx, ui->newContactWidget, &NewContactWidget::tuneDx); connect(ui->bandmapWidget, &BandmapWidget::nearestSpotFound, ui->newContactWidget, &NewContactWidget::nearestSpot); - connect(ui->wsjtxWidget, &WsjtxWidget::showDxDetails, ui->newContactWidget, &NewContactWidget::showDx); + connect(ui->wsjtxWidget, &WsjtxWidget::callsignSelected, ui->newContactWidget, &NewContactWidget::prepareWSJTXQSO); connect(ui->rigWidget, &RigWidget::rigProfileChanged, ui->newContactWidget, &NewContactWidget::refreshRigProfileCombo); diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index 3a3a7cac..371371bc 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -185,7 +185,7 @@ NewContactWidget::NewContactWidget(QWidget *parent) : /* CONNECTs */ /**************/ connect(&callbookManager, &CallbookManager::callsignResult, - this, &NewContactWidget::callsignResult); + this, &NewContactWidget::setCallbookFields); connect(&callbookManager, &CallbookManager::loginFailed, this, [this](const QString &callbookString) { @@ -195,7 +195,7 @@ NewContactWidget::NewContactWidget(QWidget *parent) : connect(contactTimer, &QTimer::timeout, this, &NewContactWidget::updateTimeOff); - connect(MembershipQE::instance(), &MembershipQE::clubStatusResult, this, &NewContactWidget::clubQueryResult); + connect(MembershipQE::instance(), &MembershipQE::clubStatusResult, this, &NewContactWidget::setMembershipList); /******************************/ /* CONNECTs DYNAMIC WIDGETS */ @@ -391,14 +391,14 @@ void NewContactWidget::readGlobalSettings() refreshAntProfileCombo(); // recalculate all stats - queryDxcc(ui->callsignEdit->text().toUpper()); + setDxccInfo(ui->callsignEdit->text().toUpper()); ui->freqRXEdit->loadBands(); ui->freqTXEdit->loadBands(); } /* function is called when an operator change Callsign Edit */ -void NewContactWidget::callsignChanged() +void NewContactWidget::handleCallsignFromUser() { FCT_IDENTIFICATION; @@ -439,16 +439,16 @@ void NewContactWidget::callsignChanged() } else { - queryDxcc(callsign); + setDxccInfo(callsign); if ( callsign.length() >= 3 ) - fillFieldsFromLastQSO(callsign); + useFieldsFromPrevQSO(callsign); } } /* function is called when Callsign Edit is finished - example pressed enter */ /* if callsign is entered then QLog call callbook query */ -void NewContactWidget::editCallsignFinished() +void NewContactWidget::finalizeCallsignEdit() { FCT_IDENTIFICATION; @@ -460,8 +460,7 @@ void NewContactWidget::editCallsignFinished() } } - -void NewContactWidget::setCurrentDxcc(const DxccEntity &curr) +void NewContactWidget::setDxccInfo(const DxccEntity &curr) { FCT_IDENTIFICATION; @@ -475,47 +474,35 @@ void NewContactWidget::setCurrentDxcc(const DxccEntity &curr) updateCoordinates(dxccEntity.latlon[0], dxccEntity.latlon[1], COORD_DXCC); ui->dxccTableWidget->setDxcc(dxccEntity.dxcc, BandPlan::freq2Band(ui->freqTXEdit->value())); uiDynamic->contEdit->setCurrentText(dxccEntity.cont); - + ui->flagView->setPixmap((!dxccEntity.flag.isEmpty() ) ? QPixmap(QString(":/flags/64/%1.png").arg(dxccEntity.flag)) + : QPixmap() ); updateDxccStatus(); - - if ( !dxccEntity.flag.isEmpty() ) - { - QPixmap flag(QString(":/flags/64/%1.png").arg(dxccEntity.flag)); - ui->flagView->setPixmap(flag); - } - else - ui->flagView->setPixmap(QPixmap()); } else { - ui->flagView->setPixmap(QPixmap()); - ui->dxccTableWidget->clear(); - ui->dxccStatus->clear(); - ui->distanceInfo->clear(); - dxDistance = qQNaN(); - ui->bearingInfo->clear(); - partnerTimeZone = QTimeZone(); - ui->partnerLocTimeInfo->clear(); ui->dxccInfo->setText(" "); uiDynamic->cqzEdit->clear(); uiDynamic->ituEdit->clear(); + clearCoordinates(); + ui->dxccTableWidget->clear(); uiDynamic->contEdit->setCurrentText(""); + ui->flagView->setPixmap(QPixmap()); + ui->dxccStatus->clear(); emit newTarget(qQNaN(), qQNaN()); } } -/* Obtain DXCC info from local database */ -void NewContactWidget::queryDxcc(const QString &callsign) +void NewContactWidget::setDxccInfo(const QString &callsign) { FCT_IDENTIFICATION; qCDebug(function_parameters) << callsign; - setCurrentDxcc(Data::instance()->lookupDxcc(callsign)); + setDxccInfo(Data::instance()->lookupDxcc(callsign)); } -void NewContactWidget::fillFieldsFromLastQSO(const QString &callsign) +void NewContactWidget::useFieldsFromPrevQSO(const QString &callsign) { FCT_IDENTIFICATION; @@ -577,7 +564,7 @@ void NewContactWidget::fillFieldsFromLastQSO(const QString &callsign) } /* function handles a response from Callbook classes */ -void NewContactWidget::callsignResult(const QMap& data) +void NewContactWidget::setCallbookFields(const QMap& data) { FCT_IDENTIFICATION; @@ -665,7 +652,7 @@ void NewContactWidget::callsignResult(const QMap& data) { qCDebug(runtime) << "Received different DXCC Info" << data.value("dxcc") << dxccEntity.dxcc; - setCurrentDxcc(Data::instance()->lookupDxccID(callbookDXCC)); + setDxccInfo(Data::instance()->lookupDxccID(callbookDXCC)); } } @@ -681,27 +668,23 @@ void NewContactWidget::callsignResult(const QMap& data) lastCallbookQueryData = QMap(data); } -void NewContactWidget::clubQueryResult(const QString &in_callsign, QMap data) +void NewContactWidget::setMembershipList(const QString &in_callsign, + QMap data) { FCT_IDENTIFICATION; if ( in_callsign != callsign ) - { - // do not need this result return; - } QString memberText; - QMapIterator clubs(data); - QPalette palette; - //"Hello World" while ( clubs.hasNext() ) { clubs.next(); - QColor color = Data::statusToColor(static_cast(clubs.value()), palette.color(QPalette::Text)); + const QColor &color = Data::statusToColor(static_cast(clubs.value()), palette.color(QPalette::Text)); + //"Hello World" memberText.append(QString("%2   ").arg(Data::colorToHTMLColor(color), clubs.key())); } ui->memberListLabel->setText(memberText); @@ -815,13 +798,15 @@ void NewContactWidget::__modeChanged() QStringListModel* model = dynamic_cast(ui->submodeEdit->model()); model->setStringList(submodeList); - if (!submodeList.isEmpty()) { + if (!submodeList.isEmpty()) + { submodeList.prepend(""); model->setStringList(submodeList); ui->submodeEdit->setVisible(true); ui->submodeEdit->setCurrentIndex(1); } - else { + else + { QStringList list; model->setStringList(list); ui->submodeEdit->setVisible(false); @@ -947,7 +932,7 @@ void NewContactWidget::gridChanged() if (!newGrid.isValid()) { coordPrec = COORD_NONE; - queryDxcc(ui->callsignEdit->text().toUpper()); + setDxccInfo(ui->callsignEdit->text().toUpper()); return; } @@ -1950,7 +1935,17 @@ void NewContactWidget::updateCoordinates(double lat, double lon, CoordPrecision emit newTarget(lat, lon); } +} + +void NewContactWidget::clearCoordinates() +{ + FCT_IDENTIFICATION; + ui->distanceInfo->clear(); + dxDistance = qQNaN(); + ui->bearingInfo->clear(); + partnerTimeZone = QTimeZone(); + ui->partnerLocTimeInfo->clear(); } void NewContactWidget::updateDxccStatus() @@ -2594,11 +2589,11 @@ void NewContactWidget::fillCallsignGrid(const QString &callsign, const QString & uiDynamic->gridEdit->setText(grid); } -void NewContactWidget::showDx(const QString &callsign, const QString &grid) +void NewContactWidget::prepareWSJTXQSO(const QString &callsign, const QString &grid) { FCT_IDENTIFICATION; - qCDebug(function_parameters)<rstRcvdEdit->setText(defaultReport); ui->rstRcvdEdit->setSelectionBackwardOffset(defaultReport.size() >= 3 ? 2 : 1 ); @@ -2860,7 +2854,7 @@ void NewContactWidget::stationProfileComboChanged(const QString &profileName) emit stationProfileChanged(); // recalculate all stats - queryDxcc(ui->callsignEdit->text().toUpper()); + setDxccInfo(ui->callsignEdit->text().toUpper()); } void NewContactWidget::rigProfileComboChanged(const QString &profileName) @@ -3206,8 +3200,8 @@ void NewContactWidget::changeCallsignManually(const QString &callsign, double fr QSOFreq = freq; // Important !!! - to prevent QSY Contact Reset when the frequency is set ui->callsignEdit->setText(callsign); ui->callsignEdit->end(false); - callsignChanged(); - editCallsignFinished(); + handleCallsignFromUser(); + finalizeCallsignEdit(); stopContactTimer(); } diff --git a/ui/NewContactWidget.h b/ui/NewContactWidget.h index 0717111e..3a8c237e 100644 --- a/ui/NewContactWidget.h +++ b/ui/NewContactWidget.h @@ -193,7 +193,7 @@ public slots: double frequency, const BandPlan::BandPlanMode mode); void fillCallsignGrid(const QString &callsign, const QString& grid); - void showDx(const QString &callsign, const QString &grid); + void prepareWSJTXQSO(const QString &callsign, const QString &grid); void resetContact(); void saveContact(); @@ -216,7 +216,7 @@ public slots: void setupCustomUi(); private slots: - void callsignChanged(); + void handleCallsignFromUser(); void frequencyTXChanged(); void frequencyRXChanged(); void changeMode(); @@ -226,9 +226,9 @@ private slots: void updateTimeOff(); void startContactTimer(); void stopContactTimer(); - void editCallsignFinished(); - void callsignResult(const QMap& data); - void clubQueryResult(const QString&, QMap); + void finalizeCallsignEdit(); + void setCallbookFields(const QMap& data); + void setMembershipList(const QString&, QMap); void propModeChanged(const QString&); void sotaChanged(const QString&); void sotaEditFinished(); @@ -248,9 +248,9 @@ private slots: void refreshSIGCompleter(); private: - void fillFieldsFromLastQSO(const QString &callsign); - void setCurrentDxcc(const DxccEntity &curr); - void queryDxcc(const QString &callsign); + void useFieldsFromPrevQSO(const QString &callsign); + void setDxccInfo(const DxccEntity &curr); + void setDxccInfo(const QString &callsign); void clearCallbookQueryFields(); void clearMemberQueryFields(); void readWidgetSettings(); @@ -260,6 +260,7 @@ private slots: void updateTXBand(double freq); void updateRXBand(double freq); void updateCoordinates(double lat, double lon, CoordPrecision prec); + void clearCoordinates(); void updateDxccStatus(); void updatePartnerLocTime(); void setDefaultReport(); diff --git a/ui/NewContactWidget.ui b/ui/NewContactWidget.ui index ba05b9f2..554cede2 100644 --- a/ui/NewContactWidget.ui +++ b/ui/NewContactWidget.ui @@ -7,7 +7,7 @@ 0 0 971 - 371 + 378 @@ -1683,7 +1683,7 @@ callsignEdit textChanged(QString) NewContactWidget - callsignChanged() + handleCallsignFromUser() 177 @@ -1731,7 +1731,7 @@ callsignEdit returnPressed() NewContactWidget - callsignChanged() + handleCallsignFromUser() 115 @@ -1763,7 +1763,7 @@ callsignEdit editingFinished() NewContactWidget - editCallsignFinished() + finalizeCallsignEdit() 67 @@ -1971,7 +1971,7 @@ saveContact() resetContact() - callsignChanged() + handleCallsignFromUser() gridChanged() stopContactTimer() frequencyTXChanged() @@ -1982,7 +1982,7 @@ updateTimeStop() subModeChanged() propModeChanged(QString) - editCallsignFinished() + finalizeCallsignEdit() freqTXOffsetChanged(double) stationProfileComboChanged(QString) sotaChanged(QString) diff --git a/ui/WsjtxWidget.cpp b/ui/WsjtxWidget.cpp index e956c50b..fd773e03 100644 --- a/ui/WsjtxWidget.cpp +++ b/ui/WsjtxWidget.cpp @@ -176,7 +176,7 @@ void WsjtxWidget::statusReceived(WsjtxStatus newStatus) if ( this->status.dx_call != newStatus.dx_call || this->status.dx_grid != newStatus.dx_grid ) { - emit showDxDetails(newStatus.dx_call, newStatus.dx_grid); + emit callsignSelected(newStatus.dx_call, newStatus.dx_grid); } if ( this->status.mode != newStatus.mode ) @@ -209,7 +209,7 @@ void WsjtxWidget::tableViewDoubleClicked(QModelIndex index) const QModelIndex &source_index = proxyModel->mapToSource(index); const WsjtxEntry &entry = wsjtxTableModel->getEntry(source_index); - emit showDxDetails(entry.callsign, entry.grid); + emit callsignSelected(entry.callsign, entry.grid); emit reply(entry.decode); } @@ -221,7 +221,7 @@ void WsjtxWidget::callsignClicked(QString callsign) if ( entry.callsign.isEmpty() ) return; - emit showDxDetails(callsign, entry.grid); + emit callsignSelected(callsign, entry.grid); emit reply(entry.decode); } diff --git a/ui/WsjtxWidget.h b/ui/WsjtxWidget.h index 4b4e7257..c8029908 100644 --- a/ui/WsjtxWidget.h +++ b/ui/WsjtxWidget.h @@ -32,7 +32,7 @@ private slots: void actionFilter(); signals: - void showDxDetails(QString callsign, QString grid); + void callsignSelected(QString callsign, QString grid); void reply(WsjtxDecode); void CQSpot(WsjtxEntry); void filteredCQSpot(WsjtxEntry); From 305c16ed06fce1dd5056eb400567e98415ce4c00 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Tue, 24 Sep 2024 14:00:30 +0200 Subject: [PATCH 38/74] NewContact: Rewrote method for getting information from the previous QSO The SQL statement was divided into the two simply queries --- ui/NewContactWidget.cpp | 149 ++++++++++++++++++++-------------------- ui/NewContactWidget.h | 6 +- 2 files changed, 79 insertions(+), 76 deletions(-) diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index 371371bc..22043757 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -253,57 +253,41 @@ NewContactWidget::NewContactWidget(QWidget *parent) : // SQL query returns two QSOs. The first one is the last QSO with Base Callsign // and the second one is the last QSO for the Callsign from a portable QTH. - isprevQSOQueryPrepared = prevQSOQuery.prepare(QLatin1String("SELECT callsign, " - " name_intl, " - " qth_intl, " - " gridsquare, " - " notes_intl, " - " email, " - " web , " - " darc_dok " - "FROM ( " - " SELECT " - " callsign, " - " name_intl, " - " qth_intl, " - " gridsquare, " - " notes_intl, " - " email, " - " web , " - " darc_dok " - " FROM contacts " - " WHERE callsign = :exactCallsign " - " ORDER BY start_time DESC " - " LIMIT 1 " - " ) " - "UNION ALL " - "SELECT callsign, " - " name_intl, " - " qth_intl, " - " gridsquare, " - " notes_intl, " - " email, " - " web , " - " darc_dok " - "FROM ( " - " SELECT " - " callsign, " - " name_intl, " - " qth_intl, " - " gridsquare, " - " notes_intl, " - " email, " - " web , " - " darc_dok " - " FROM contacts c, contacts_autovalue a " - " WHERE c.id = a.contactid " - " AND a.base_callsign = :partialCallsign " - " ORDER BY start_time DESC " - " LIMIT 1 " - " )")); - - if ( !isprevQSOQueryPrepared) - qWarning() << "Cannot prepare prevQSOquery statement"; + isPrevQSOExactMatchQuery = prevQSOExactMatchQuery.prepare(QLatin1String("SELECT " + " callsign, " + " name_intl, " + " qth_intl, " + " gridsquare, " + " notes_intl, " + " email, " + " web , " + " darc_dok " + "FROM contacts " + "WHERE callsign = :exactCallsign " + "ORDER BY start_time DESC " + "LIMIT 1 ")); + + if ( !isPrevQSOExactMatchQuery) + qWarning() << "Cannot prepare prevQSOExactMatchQuery statement"; + + isPrevQSOBaseCallMatchQuery = prevQSOBaseCallMatchQuery.prepare(QLatin1String("SELECT " + " callsign, " + " name_intl, " + " qth_intl, " + " gridsquare, " + " notes_intl, " + " email, " + " web , " + " darc_dok " + "FROM contacts c " + " INNER JOIN contacts_autovalue a ON c.id = a.contactid " + "WHERE a.base_callsign = :partialCallsign " + "ORDER BY start_time DESC " + "LIMIT 1")); + + if ( !isPrevQSOBaseCallMatchQuery) + qWarning() << "Cannot prepare prevQSOBaseCallMatchQuery statement"; + } void NewContactWidget::setComboBaseData(QComboBox *combo, const QString &data) @@ -508,7 +492,7 @@ void NewContactWidget::useFieldsFromPrevQSO(const QString &callsign) qCDebug(function_parameters) << callsign; - if ( !isprevQSOQueryPrepared ) + if ( !isPrevQSOExactMatchQuery || !isPrevQSOBaseCallMatchQuery) return; const Callsign enteredCallsign(callsign); @@ -521,45 +505,62 @@ void NewContactWidget::useFieldsFromPrevQSO(const QString &callsign) const QString &baseCallsign = enteredCallsign.getBase(); // search the base_callsign - prevQSOQuery.bindValue(":exactCallsign",baseCallsign ); - prevQSOQuery.bindValue(":partialCallsign", baseCallsign); + prevQSOExactMatchQuery.bindValue(":exactCallsign", baseCallsign); - if ( !prevQSOQuery.exec() ) + if ( !prevQSOExactMatchQuery.exec() ) { - qWarning() << "Cannot execute statement" << prevQSOQuery.lastError(); + qWarning() << "Cannot execute statement" << prevQSOExactMatchQuery.lastError(); emit filterCallsign(QString()); return; } - if ( prevQSOQuery.next() ) + if ( prevQSOExactMatchQuery.next() ) { - // SQL query returns two QSOs. The first one is the last QSO with Base Callsign - // and the second one is the last QSO for callsign, which was made from a portable QTH. - // The recognition is possible because the record where Callsign == Based Callsign - // is a QSO with the given Callsign from the base QTH. - // Otherwise, it's a QSO with a given Callsign from a portable QTH. - if ( prevQSOQuery.value("callsign").toString() == baseCallsign - && enteredCallsign.getHostPrefix().isEmpty() + // callsign match the base callsign - full info available + if ( enteredCallsign.getHostPrefix().isEmpty() && enteredCallsign.getSuffix().isEmpty() ) { // entered callsign is base callsign - no portable QTH. Get all fields from // previous QSO - uiDynamic->qthEdit->setText(prevQSOQuery.value("qth_intl").toString()); - uiDynamic->gridEdit->setText(prevQSOQuery.value("gridsquare").toString()); - uiDynamic->dokEdit->setText(prevQSOQuery.value("darc_dok").toString()); + uiDynamic->qthEdit->setText(prevQSOExactMatchQuery.value("qth_intl").toString()); + uiDynamic->gridEdit->setText(prevQSOExactMatchQuery.value("gridsquare").toString()); + uiDynamic->dokEdit->setText(prevQSOExactMatchQuery.value("darc_dok").toString()); } - uiDynamic->nameEdit->setText(prevQSOQuery.value("name_intl").toString()); - ui->noteEdit->insertPlainText(prevQSOQuery.value("notes_intl").toString()); - uiDynamic->emailEdit->setText(prevQSOQuery.value("email").toString()); - uiDynamic->urlEdit->setText(prevQSOQuery.value("web").toString()); + uiDynamic->nameEdit->setText(prevQSOExactMatchQuery.value("name_intl").toString()); + ui->noteEdit->insertPlainText(prevQSOExactMatchQuery.value("notes_intl").toString()); + uiDynamic->emailEdit->setText(prevQSOExactMatchQuery.value("email").toString()); + uiDynamic->urlEdit->setText(prevQSOExactMatchQuery.value("web").toString()); emit filterCallsign(baseCallsign); } else { - //callsign not found - qCDebug(runtime) << "Callsign not match in the Logbook"; - emit filterCallsign(QString()); + //exact match not found + prevQSOBaseCallMatchQuery.bindValue(":partialCallsign", baseCallsign); + + if ( !prevQSOBaseCallMatchQuery.exec() ) + { + qWarning() << "Cannot execute statement2" << prevQSOBaseCallMatchQuery.lastError(); + emit filterCallsign(QString()); + return; + } + + if ( prevQSOBaseCallMatchQuery.next() ) + { + // partial informaion available + uiDynamic->nameEdit->setText(prevQSOBaseCallMatchQuery.value("name_intl").toString()); + ui->noteEdit->insertPlainText(prevQSOBaseCallMatchQuery.value("notes_intl").toString()); + uiDynamic->emailEdit->setText(prevQSOBaseCallMatchQuery.value("email").toString()); + uiDynamic->urlEdit->setText(prevQSOBaseCallMatchQuery.value("web").toString()); + + emit filterCallsign(baseCallsign); + } + else + { + //callsign not found + qCDebug(runtime) << "Callsign not match in the Logbook"; + emit filterCallsign(QString()); + } } } diff --git a/ui/NewContactWidget.h b/ui/NewContactWidget.h index 3a8c237e..23a71e14 100644 --- a/ui/NewContactWidget.h +++ b/ui/NewContactWidget.h @@ -321,8 +321,10 @@ private slots: QSettings settings; Band bandTX; Band bandRX; - QSqlQuery prevQSOQuery; - bool isprevQSOQueryPrepared; + QSqlQuery prevQSOExactMatchQuery; + QSqlQuery prevQSOBaseCallMatchQuery; + bool isPrevQSOExactMatchQuery; + bool isPrevQSOBaseCallMatchQuery; }; #endif // QLOG_UI_NEWCONTACTWIDGET_H From de6f208a4d7a07c4ac02dbc3ebfd0631255b5d01 Mon Sep 17 00:00:00 2001 From: aa5sh <84428382+aa5sh@users.noreply.github.com> Date: Tue, 24 Sep 2024 07:41:39 -0500 Subject: [PATCH 39/74] UpdateRegEx I've noticed a few times if people put like CQ POTA the callsign shows up as that way in the WSJTX Widget and subsequently the Alerts Widget. This is a more detailed RegEx I found and tweaked to try and combat that. --- ui/WsjtxWidget.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/WsjtxWidget.cpp b/ui/WsjtxWidget.cpp index e956c50b..2b41832e 100644 --- a/ui/WsjtxWidget.cpp +++ b/ui/WsjtxWidget.cpp @@ -21,7 +21,7 @@ MODULE_IDENTIFICATION("qlog.ui.wsjtxswidget"); WsjtxWidget::WsjtxWidget(QWidget *parent) : QWidget(parent), ui(new Ui::WsjtxWidget), - cqRE("^CQ (DX |TEST |[A-Z]{0,2} )?([A-Z0-9\\/]+) ?([A-Z]{2}[0-9]{2})?.*") + cqRE("(^(?:(?P(?:CQ|DE|QRZ)(?:\\s?DX|\\s(?:[A-Z]{1,4}|\\d{3}))|[A-Z0-9\\/]+|\\.{3})\\s)(?:(?P[A-Z0-9\\/]+)(?:\\s(?P[-+A-Z0-9]+)(?:\\s(?P(?:OOO|(?!RR73)[A-R]{2}[0-9]{2})))?)?)?)") { FCT_IDENTIFICATION; @@ -64,8 +64,8 @@ void WsjtxWidget::decodeReceived(WsjtxDecode decode) WsjtxEntry entry; entry.decode = decode; - entry.callsign = match.captured(2); - entry.grid = match.captured(3); + entry.callsign = match.captured(3); + entry.grid = match.captured(4); entry.dxcc = Data::instance()->lookupDxcc(entry.callsign); entry.status = Data::instance()->dxccStatus(entry.dxcc.dxcc, currBand, BandPlan::MODE_GROUP_STRING_DIGITAL); entry.receivedTime = QDateTime::currentDateTimeUtc(); From 5bc289e031ee503244ce062654d6a97b9d1eeddb Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Tue, 24 Sep 2024 20:13:05 +0200 Subject: [PATCH 40/74] =?UTF-8?q?Fixed=20#470=20-=20Field=20values=20?= =?UTF-8?q?=E2=80=8B=E2=80=8Bfrom=20past=20QSOs=20are=20used=20incorrectly?= =?UTF-8?q?=20in=20case=20of=20WSJTX=20QSOs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/NewContactWidget.cpp | 31 +++++++++++++++++++++++++++---- ui/NewContactWidget.h | 3 ++- ui/WsjtxWidget.cpp | 2 +- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index 22043757..cb53ed38 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -264,6 +264,7 @@ NewContactWidget::NewContactWidget(QWidget *parent) : " darc_dok " "FROM contacts " "WHERE callsign = :exactCallsign " + " AND gridsquare LIKE :grid " "ORDER BY start_time DESC " "LIMIT 1 ")); @@ -486,7 +487,7 @@ void NewContactWidget::setDxccInfo(const QString &callsign) setDxccInfo(Data::instance()->lookupDxcc(callsign)); } -void NewContactWidget::useFieldsFromPrevQSO(const QString &callsign) +void NewContactWidget::useFieldsFromPrevQSO(const QString &callsign, const QString &grid) { FCT_IDENTIFICATION; @@ -506,6 +507,7 @@ void NewContactWidget::useFieldsFromPrevQSO(const QString &callsign) const QString &baseCallsign = enteredCallsign.getBase(); // search the base_callsign prevQSOExactMatchQuery.bindValue(":exactCallsign", baseCallsign); + prevQSOExactMatchQuery.bindValue(":grid", grid + "%"); if ( !prevQSOExactMatchQuery.exec() ) { @@ -2590,11 +2592,12 @@ void NewContactWidget::fillCallsignGrid(const QString &callsign, const QString & uiDynamic->gridEdit->setText(grid); } -void NewContactWidget::prepareWSJTXQSO(const QString &callsign, const QString &grid) +void NewContactWidget::prepareWSJTXQSO(const QString &receivedCallsign, + const QString &grid) { FCT_IDENTIFICATION; - qCDebug(function_parameters) << callsign << grid; + qCDebug(function_parameters) << receivedCallsign << grid; if ( isManualEnterMode ) { @@ -2603,8 +2606,28 @@ void NewContactWidget::prepareWSJTXQSO(const QString &callsign, const QString &g } resetContact(); - changeCallsignManually(callsign); + if ( receivedCallsign.isEmpty() ) + return; + + QSOFreq = ui->freqRXEdit->value(); // Important !!! - to prevent QSY Contact Reset when the frequency is set + callsign = receivedCallsign; + ui->callsignEdit->setText(receivedCallsign); uiDynamic->gridEdit->setText(grid); + setDxccInfo(receivedCallsign); + stopContactTimer(); + + // at the moment WSJTX sends several statuses about changing one callsign. + // In order to avoid multiple searches, we will search only when we have a grid - it was usually the last + // status message + // the current status message sequence is + // 1) prev Callsign empty grid + // 2) new Callsign empty grid + // 3) new Calllsign, new gris + if ( !grid.isEmpty() ) + { + useFieldsFromPrevQSO(callsign, grid); + finalizeCallsignEdit(); + } } void NewContactWidget::setDefaultReport() diff --git a/ui/NewContactWidget.h b/ui/NewContactWidget.h index 23a71e14..16ef21f3 100644 --- a/ui/NewContactWidget.h +++ b/ui/NewContactWidget.h @@ -248,7 +248,8 @@ private slots: void refreshSIGCompleter(); private: - void useFieldsFromPrevQSO(const QString &callsign); + void useFieldsFromPrevQSO(const QString &callsign, + const QString &grid = QString()); void setDxccInfo(const DxccEntity &curr); void setDxccInfo(const QString &callsign); void clearCallbookQueryFields(); diff --git a/ui/WsjtxWidget.cpp b/ui/WsjtxWidget.cpp index fd773e03..21e0b189 100644 --- a/ui/WsjtxWidget.cpp +++ b/ui/WsjtxWidget.cpp @@ -209,7 +209,7 @@ void WsjtxWidget::tableViewDoubleClicked(QModelIndex index) const QModelIndex &source_index = proxyModel->mapToSource(index); const WsjtxEntry &entry = wsjtxTableModel->getEntry(source_index); - emit callsignSelected(entry.callsign, entry.grid); + //emit callsignSelected(entry.callsign, entry.grid); // it is not needed to send this - Qlog receives the change via WSJTX emit reply(entry.decode); } From 874efcaee32be38e0486473e24e9443319694b8f Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Tue, 24 Sep 2024 20:15:32 +0200 Subject: [PATCH 41/74] Updated Changelog --- Changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog b/Changelog index d91cec04..e20fc991 100644 --- a/Changelog +++ b/Changelog @@ -12,6 +12,7 @@ TBC - 0.39.0 - Fixed ADIF import does not import records with old DXCC Entities (issue #459) - Fixed ADIF import incorrectly uses Station Profile parameters (issue #461) - Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464) +- Fixed Field values from past QSOs are used incorrectly in case of WSJTX QSOs (#issue 470) 2024/08/29 - 0.38.0 - [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu From 3e3b736d3e942641bc0978c33081be968e37cfaf Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Tue, 24 Sep 2024 20:36:56 +0200 Subject: [PATCH 42/74] Updated Changelog --- Changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog b/Changelog index e20fc991..acb8b912 100644 --- a/Changelog +++ b/Changelog @@ -6,6 +6,7 @@ TBC - 0.39.0 - [CHANGED] - Logbook page size - improved performance - [CHANGED] - Logbook - CTRL-A (Select All) is disabled - [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452) +- [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh) - Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) - Fixed Wrong import of ADIF file of another log program (issue #455) - Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458) From a4e9e715d70b5e1d658d25c4c227da21199b6593 Mon Sep 17 00:00:00 2001 From: aa5sh <84428382+aa5sh@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:41:05 +0200 Subject: [PATCH 43/74] Modified PR #463 - WJSTX: SOTA/POTA/WWFF/SIG are being added to the logged QSO --- Changelog | 1 + ui/NewContactWidget.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/Changelog b/Changelog index acb8b912..5de4347f 100644 --- a/Changelog +++ b/Changelog @@ -7,6 +7,7 @@ TBC - 0.39.0 - [CHANGED] - Logbook - CTRL-A (Select All) is disabled - [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452) - [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh) +- [CHANGED] - WJSTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh) - Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) - Fixed Wrong import of ADIF file of another log program (issue #455) - Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458) diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index cb53ed38..19f883f8 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -1755,6 +1755,26 @@ void NewContactWidget::saveExternalContact(QSqlRecord record) && !uiDynamic->stateEdit->text().isEmpty() ) record.setValue("state", uiDynamic->stateEdit->text()); + if ( record.value("pota_ref").toString().isEmpty() + && !uiDynamic->potaEdit->text().isEmpty()) + record.setValue("pota_ref", uiDynamic->potaEdit->text()); + + if ( record.value("sota_ref").toString().isEmpty() + && !uiDynamic->sotaEdit->text().isEmpty()) + record.setValue("sota_ref", uiDynamic->sotaEdit->text()); + + if ( record.value("sig_intl").toString().isEmpty() + && !uiDynamic->sigEdit->text().isEmpty()) + record.setValue("sig_intl", uiDynamic->sigEdit->text()); + + if ( record.value("sig_info_intl").toString().isEmpty() + && !uiDynamic->sigInfoEdit->text().isEmpty()) + record.setValue("sig_info_intl", uiDynamic->sigInfoEdit->text()); + + if ( record.value("wwff_ref").toString().isEmpty() + && !uiDynamic->wwffEdit->text().isEmpty()) + record.setValue("wwff_ref", uiDynamic->wwffEdit->text()); + // fix ITUz and CQz from callbook, if necessary if ( record.value("ituz").toString() != uiDynamic->ituEdit->text() ) record.setValue("ituz", uiDynamic->ituEdit->text()); From 01cc5423dd6bcd117ec3496cd82cee1730b07d57 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 25 Sep 2024 17:47:05 +0200 Subject: [PATCH 44/74] Fixed typo --- Changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 5de4347f..21d2a11d 100644 --- a/Changelog +++ b/Changelog @@ -7,7 +7,7 @@ TBC - 0.39.0 - [CHANGED] - Logbook - CTRL-A (Select All) is disabled - [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452) - [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh) -- [CHANGED] - WJSTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh) +- [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh) - Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) - Fixed Wrong import of ADIF file of another log program (issue #455) - Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458) From 6874ed939ab70e089eb1ddf59ef991424a5ae4d1 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Thu, 26 Sep 2024 16:47:21 +0200 Subject: [PATCH 45/74] Stats Widget: Performance tuning The widget is refreshed only in cases where it is necessary. This means only in the case of ADD/UPDATE/DELETE and updating of the Logbook Model. --- ui/LogbookWidget.cpp | 124 +++++++---------- ui/LogbookWidget.h | 24 ++-- ui/MainWindow.cpp | 4 +- ui/StatisticsWidget.cpp | 290 ++++++++++++++++------------------------ ui/StatisticsWidget.h | 17 ++- 5 files changed, 187 insertions(+), 272 deletions(-) diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index ef160a2a..cc828ff1 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -42,6 +42,7 @@ LogbookWidget::LogbookWidget(QWidget *parent) : model = new LogbookModel(this); connect(model, &LogbookModel::beforeUpdate, this, &LogbookWidget::handleBeforeUpdate); connect(model, &LogbookModel::beforeDelete, this, &LogbookWidget::handleBeforeDelete); + connect(ui->contactTable, &QTableQSOView::dataCommitted, this, [this](){emit logbookUpdated();}); ui->contactTable->setModel(model); @@ -177,9 +178,8 @@ LogbookWidget::LogbookWidget(QWidget *parent) : "FROM dxcc_entities WHERE id IN (SELECT DISTINCT dxcc FROM contacts) " "ORDER BY 2 COLLATE LOCALEAWARE ASC;", tr("Country"), this); while (countryModel->canFetchMore()) - { countryModel->fetchMore(); - } + ui->countryFilter->setModel(countryModel); ui->countryFilter->setModelColumn(1); ui->countryFilter->blockSignals(false); @@ -187,11 +187,11 @@ LogbookWidget::LogbookWidget(QWidget *parent) : refreshClubFilter(); ui->userFilter->blockSignals(true); - userFilterModel = new SqlListModel("SELECT filter_name FROM qso_filters ORDER BY filter_name", tr("User Filter"), this); + userFilterModel = new SqlListModel("SELECT filter_name " + "FROM qso_filters " + "ORDER BY filter_name", tr("User Filter"), this); while (userFilterModel->canFetchMore()) - { userFilterModel->fetchMore(); - } ui->userFilter->setModel(userFilterModel); ui->userFilter->blockSignals(false); @@ -225,22 +225,14 @@ void LogbookWidget::filterCountryBand(const QString &countryName, ui->clubFilter->blockSignals(true); if ( ! countryName.isEmpty() ) - { ui->countryFilter->setCurrentText(countryName); - } else - { ui->countryFilter->setCurrentIndex(0); - } if ( !band.isEmpty() ) - { ui->bandFilter->setCurrentText(band); - } else - { ui->bandFilter->setCurrentIndex(0); - } //user wants to see only selected band and country ui->userFilter->setCurrentIndex(0); //suppress user-defined filter @@ -313,13 +305,9 @@ void LogbookWidget::restoreBandFilter() ui->bandFilter->blockSignals(true); const QString &value = settings.value("logbook/filters/band").toString(); if ( !value.isEmpty() ) - { ui->bandFilter->setCurrentText(value); - } else - { ui->bandFilter->setCurrentIndex(0); - } colorsFilterWidget(ui->bandFilter); ui->bandFilter->blockSignals(false); @@ -350,13 +338,10 @@ void LogbookWidget::restoreModeFilter() ui->modeFilter->blockSignals(true); const QString &value = settings.value("logbook/filters/mode").toString(); if ( !value.isEmpty() ) - { ui->modeFilter->setCurrentText(value); - } else - { ui->modeFilter->setCurrentIndex(0); - } + colorsFilterWidget(ui->modeFilter); ui->modeFilter->blockSignals(false); } @@ -386,13 +371,9 @@ void LogbookWidget::restoreCountryFilter() ui->countryFilter->blockSignals(true); const QString &value = settings.value("logbook/filters/country").toString(); if ( !value.isEmpty() ) - { ui->countryFilter->setCurrentText(value); - } else - { ui->countryFilter->setCurrentIndex(0); - } colorsFilterWidget(ui->countryFilter); ui->countryFilter->blockSignals(false); @@ -423,13 +404,10 @@ void LogbookWidget::restoreUserFilter() ui->userFilter->blockSignals(true); const QString &value = settings.value("logbook/filters/user").toString(); if ( !value.isEmpty() ) - { ui->userFilter->setCurrentText(value); - } else - { ui->userFilter->setCurrentIndex(0); - } + colorsFilterWidget(ui->userFilter); ui->userFilter->blockSignals(false); } @@ -455,25 +433,37 @@ void LogbookWidget::refreshClubFilter() ui->clubFilter->blockSignals(false); } +void LogbookWidget::refreshUserFilter() +{ + FCT_IDENTIFICATION; + + /* Refresh dynamic User Filter selection combobox */ + /* block the signals !!! */ + ui->userFilter->blockSignals(true); + const QString &userFilterString = ui->userFilter->currentText(); + userFilterModel->refresh(); + ui->userFilter->setCurrentText(userFilterString); + ui->userFilter->blockSignals(false); + + filterTable(); +} + void LogbookWidget::saveClubFilter() { QSettings settings; settings.setValue("logbook/filters/member", ui->clubFilter->currentText()); } -void LogbookWidget::restoreclubFilter() +void LogbookWidget::restoreClubFilter() { QSettings settings; ui->clubFilter->blockSignals(true); const QString &value = settings.value("logbook/filters/member").toString(); if ( !value.isEmpty() ) - { ui->clubFilter->setCurrentText(value); - } else - { ui->clubFilter->setCurrentIndex(0); - } + colorsFilterWidget(ui->clubFilter); ui->clubFilter->blockSignals(false); } @@ -485,7 +475,7 @@ void LogbookWidget::restoreFilters() restoreModeFilter(); restoreBandFilter(); restoreCountryFilter(); - restoreclubFilter(); + restoreClubFilter(); restoreUserFilter(); externalFilter = QString(); filterTable(); @@ -541,13 +531,9 @@ void LogbookWidget::deleteContact() "that the DELETE operation will not be sent to Clublog?"), QMessageBox::Yes|QMessageBox::No); if ( reply != QMessageBox::Yes ) - { return; - } else - { blockClublogSignals = true; - } } std::sort(deletedRowIndexes.begin(), @@ -649,7 +635,7 @@ void LogbookWidget::displayedColumns() saveTableHeaderState(); } -void LogbookWidget::updateTable() +void LogbookWidget::reselectModel() { FCT_IDENTIFICATION; @@ -680,6 +666,25 @@ void LogbookWidget::updateTable() qsoCount = model->rowCount(); ui->filteredQSOsLabel->setText(tr("Count: %n", "", qsoCount)); +} + +void LogbookWidget::updateTable() +{ + FCT_IDENTIFICATION; + + reselectModel(); + + // it is called when QSO is inserted/updated/deleted + // therefore it is needed to refresh country select box + + /* Refresh country selection combobox */ + /* block the signals !!! */ + ui->countryFilter->blockSignals(true); + const QString &country = ui->countryFilter->currentText(); + countryModel->refresh(); + ui->countryFilter->setCurrentText(country); + ui->countryFilter->blockSignals(false); + emit logbookUpdated(); } @@ -839,9 +844,7 @@ void LogbookWidget::scrollToIndex(const QModelIndex &index, bool selectItem) if ( ui->contactTable->visualRect(index).isEmpty() ) { while ( model->canFetchMore() && ui->contactTable->visualRect(index).isEmpty() ) - { model->fetchMore(); - } if ( model->canFetchMore() ) model->fetchMore(); // one more fetch @@ -884,53 +887,27 @@ void LogbookWidget::filterTable() const QString &callsignFilterValue = ui->callsignFilter->text(); if ( !callsignFilterValue.isEmpty() ) - { filterString.append(QString("callsign LIKE '%%1%'").arg(callsignFilterValue.toUpper())); - } const QString &bandFilterValue = ui->bandFilter->currentText(); if ( ui->bandFilter->currentIndex() != 0 && !bandFilterValue.isEmpty()) - { filterString.append(QString("band = '%1'").arg(bandFilterValue)); - } const QString &modeFilterValue = ui->modeFilter->currentText(); if ( ui->modeFilter->currentIndex() != 0 && !modeFilterValue.isEmpty() ) - { filterString.append(QString("mode = '%1'").arg(modeFilterValue)); - } - - /* Refresh dynamic Country selection combobox */ - /* It is important to block its signals */ - ui->countryFilter->blockSignals(true); - const QString &country = ui->countryFilter->currentText(); - countryModel->refresh(); - ui->countryFilter->setCurrentText(country); - ui->countryFilter->blockSignals(false); int row = ui->countryFilter->currentIndex(); const QModelIndex &idx = ui->countryFilter->model()->index(row,0); - QVariant data = ui->countryFilter->model()->data(idx); + const QVariant &data = ui->countryFilter->model()->data(idx); if ( ui->countryFilter->currentIndex() != 0 ) - { filterString.append(QString("dxcc = '%1'").arg(data.toInt())); - } if ( ui->clubFilter->currentIndex() != 0 ) - { filterString.append(QString("id in (SELECT contactid FROM contact_clubs_view WHERE clubid = '%1')").arg(ui->clubFilter->currentText())); - } - - /* Refresh dynamic User Filter selection combobox */ - /* block the signals !!! */ - ui->userFilter->blockSignals(true); - const QString &userFilterString = ui->userFilter->currentText(); - userFilterModel->refresh(); - ui->userFilter->setCurrentText(userFilterString); - ui->userFilter->blockSignals(false); if ( ui->userFilter->currentIndex() != 0 ) { @@ -967,23 +944,20 @@ void LogbookWidget::filterTable() filterString.append(QString("( ") + userFilterQuery.value(0).toString() + ")"); } else - { qCDebug(runtime) << "User filter error - " << userFilterQuery.lastError().text(); - } } if ( !externalFilter.isEmpty() ) - { filterString.append(QString("( ") + externalFilter + ")"); - } model->setFilter(filterString.join(" AND ")); qCDebug(runtime) << model->query().lastQuery(); - updateTable(); + reselectModel(); } -LogbookWidget::~LogbookWidget() { +LogbookWidget::~LogbookWidget() +{ FCT_IDENTIFICATION; saveTableHeaderState(); diff --git a/ui/LogbookWidget.h b/ui/LogbookWidget.h index b7130f51..75bf26fd 100644 --- a/ui/LogbookWidget.h +++ b/ui/LogbookWidget.h @@ -42,21 +42,12 @@ public slots: void lookupSelectedCallsign(); void callsignFilterChanged(); void bandFilterChanged(); - void saveBandFilter(); - void restoreBandFilter(); void modeFilterChanged(); - void saveModeFilter(); - void restoreModeFilter(); void countryFilterChanged(); - void saveCountryFilter(); - void restoreCountryFilter(); void userFilterChanged(); - void saveUserFilter(); - void restoreUserFilter(); void clubFilterChanged(); void refreshClubFilter(); - void saveClubFilter(); - void restoreclubFilter(); + void refreshUserFilter(); void restoreFilters(); void updateTable(); void uploadClublog(); @@ -72,7 +63,6 @@ public slots: void focusSearchCallsign(); void reloadSetting(); void sendDXCSpot(); - void scrollToIndex(const QModelIndex& index, bool select = true); private: ClubLog* clublog; @@ -86,6 +76,18 @@ public slots: void colorsFilterWidget(QComboBox *widget); void filterTable(); + void saveBandFilter(); + void restoreBandFilter(); + void saveModeFilter(); + void restoreModeFilter(); + void saveCountryFilter(); + void restoreCountryFilter(); + void saveUserFilter(); + void restoreUserFilter(); + void saveClubFilter(); + void restoreClubFilter(); + void reselectModel(); + void scrollToIndex(const QModelIndex& index, bool select = true); }; /* https://forum.qt.io/topic/90403/show-tooltip-immediatly/7/ */ diff --git a/ui/MainWindow.cpp b/ui/MainWindow.cpp index d37c69af..f93af21d 100644 --- a/ui/MainWindow.cpp +++ b/ui/MainWindow.cpp @@ -198,7 +198,7 @@ MainWindow::MainWindow(QWidget* parent) : connect(this, &MainWindow::altBackslash, Rig::instance(), &Rig::setPTT); connect(this, &MainWindow::manualMode, ui->newContactWidget, &NewContactWidget::setManualMode); - connect(ui->logbookWidget, &LogbookWidget::logbookUpdated, stats, &StatisticsWidget::refreshGraph); + connect(ui->logbookWidget, &LogbookWidget::logbookUpdated, stats, &StatisticsWidget::refreshWidget); connect(ui->logbookWidget, &LogbookWidget::contactUpdated, &networknotification, &NetworkNotification::QSOUpdated); connect(ui->logbookWidget, &LogbookWidget::clublogContactUpdated, clublogRT, &ClubLog::updateQSOImmediately); connect(ui->logbookWidget, &LogbookWidget::contactDeleted, &networknotification, &NetworkNotification::QSODeleted); @@ -1214,7 +1214,7 @@ void MainWindow::QSOFilterSetting() QSOFilterDialog dialog(this); dialog.exec(); - ui->logbookWidget->updateTable(); + ui->logbookWidget->refreshUserFilter(); } void MainWindow::alertRuleSetting() diff --git a/ui/StatisticsWidget.cpp b/ui/StatisticsWidget.cpp index bc332aad..20da7e35 100644 --- a/ui/StatisticsWidget.cpp +++ b/ui/StatisticsWidget.cpp @@ -27,146 +27,66 @@ void StatisticsWidget::mainStatChanged(int idx) qCDebug(function_parameters) << idx; - ui->statTypeSecCombo->blockSignals(true); - - ui->statTypeSecCombo->clear(); - - switch ( idx ) - { - /* QSOs per */ - case 0: - { - ui->statTypeSecCombo->addItem(tr("Year")); - ui->statTypeSecCombo->addItem(tr("Month")); - ui->statTypeSecCombo->addItem(tr("Day in Week")); - ui->statTypeSecCombo->addItem(tr("Hour")); - ui->statTypeSecCombo->addItem(tr("Mode")); - ui->statTypeSecCombo->addItem(tr("Band")); - ui->statTypeSecCombo->addItem(tr("Continent")); - ui->statTypeSecCombo->addItem(tr("Propagation Mode")); - } - break; - - /* Percents */ - case 1: - { - ui->statTypeSecCombo->addItem(tr("Confirmed / Not Confirmed")); - } - break; - - /* TOP 10 */ - case 2: - { - ui->statTypeSecCombo->addItem(tr("Countries")); - ui->statTypeSecCombo->addItem(tr("Big Gridsquares")); - } - break; + setSubTypesCombo(idx); + refreshGraph(); +} - /* Histogram */ - case 3: - { - QString unit; - Gridsquare::distance2localeUnitDistance(0, unit); - ui->statTypeSecCombo->addItem(tr("Distance") + QString(" [%1]").arg(unit)); - } - break; - /* Show on Map */ - case 4: - { - ui->statTypeSecCombo->addItem(tr("QSOs")); - ui->statTypeSecCombo->addItem(tr("Confirmed/Worked Grids")); - ui->statTypeSecCombo->addItem(tr("ODX")); - } - break; - } - - if ( idx == 4 ) - { - ui->lotwCheckBox->setEnabled(true); - ui->eqslCheckBox->setEnabled(true); - ui->paperCheckBox->setEnabled(true); - } - else - { - ui->lotwCheckBox->setEnabled(false); - ui->eqslCheckBox->setEnabled(false); - ui->paperCheckBox->setEnabled(false); - } +void StatisticsWidget::refreshWidget() +{ + FCT_IDENTIFICATION; - ui->statTypeSecCombo->blockSignals(false); + if ( !isVisible() ) + return; - refreshGraph(); + refreshCombos(); + refreshGraph(); } void StatisticsWidget::refreshGraph() { FCT_IDENTIFICATION; + if ( !isVisible() ) + return; + QStringList genericFilter; genericFilter << " 1 = 1 "; //just initialization - use only in case of empty Options - refreshCallCombo(); - refreshRigCombo(); - refreshAntCombo(); - refreshBandCombo(); - refreshGridCombo(); - if ( ui->myCallCombo->currentIndex() != 0 ) - { genericFilter << " (station_callsign = '" + ui->myCallCombo->currentText() + "') "; - } if ( ui->myGridCombo->currentIndex() != 0 ) { if ( ui->myGridCombo->currentText().isEmpty() ) - { genericFilter << " (my_gridsquare is NULL) "; - } else - { genericFilter << " (my_gridsquare = '" + ui->myGridCombo->currentText() + "') "; - } } if ( ui->myRigCombo->currentIndex() != 0 ) { if ( ui->myRigCombo->currentText().isEmpty() ) - { genericFilter << " (my_rig is NULL) "; - } else - { genericFilter << " (my_rig = '" + ui->myRigCombo->currentText() + "') "; - } } if ( ui->myAntennaCombo->currentIndex() != 0 ) { if ( ui->myAntennaCombo->currentText().isEmpty() ) - { genericFilter << " (my_antenna is NULL) "; - } else - { genericFilter << " (my_antenna = '" + ui->myAntennaCombo->currentText() + "') "; - } } - if ( ui->bandCombo->currentIndex() != 0 ) - { - if ( ! ui->bandCombo->currentText().isEmpty() ) - { - genericFilter << " (band = '" + ui->bandCombo->currentText() + "') "; - } - } + if ( ui->bandCombo->currentIndex() != 0 && ! ui->bandCombo->currentText().isEmpty() ) + genericFilter << " (band = '" + ui->bandCombo->currentText() + "') "; if ( ui->useDateRangeCheckBox->isChecked() ) - { genericFilter << " (date(start_time) BETWEEN date('" + ui->startDateEdit->date().toString("yyyy-MM-dd") + " 00:00:00') AND date('" + ui->endDateEdit->date().toString("yyyy-MM-dd") + " 23:59:59') ) "; - } qCDebug(runtime) << "main " << ui->statTypeMainCombo->currentIndex() << " secondary " << ui->statTypeSecCombo->currentIndex(); @@ -373,25 +293,18 @@ void StatisticsWidget::refreshGraph() QStringList confirmed("1=2 "); if ( ui->eqslCheckBox->isChecked() ) - { confirmed << " eqsl_qsl_rcvd = 'Y' "; - } if ( ui->lotwCheckBox->isChecked() ) - { confirmed << " lotw_qsl_rcvd = 'Y' "; - } if ( ui->paperCheckBox->isChecked() ) - { confirmed << " qsl_rcvd = 'Y' "; - } QString innerCase = " CASE WHEN (" + confirmed.join("or") + ") THEN 1 ELSE 0 END "; - - QString stmtMyLocations = "SELECT DISTINCT my_gridsquare FROM contacts WHERE " + genericFilter.join(" AND "); QSqlQuery myLocations(stmtMyLocations); + qCDebug(runtime) << stmtMyLocations; drawMyLocationsOnMap(myLocations); @@ -477,22 +390,14 @@ void StatisticsWidget::changeTheme(int theme) QString themeJavaScript; if ( theme == 1 ) /* dark mode */ - { themeJavaScript = "map.getPanes().tilePane.style.webkitFilter=\"brightness(0.6) invert(1) contrast(3) hue-rotate(200deg) saturate(0.3) brightness(0.9)\";"; - } else - { themeJavaScript = "map.getPanes().tilePane.style.webkitFilter=\"\";"; - } if ( !isMainPageLoaded ) - { postponedScripts.append(themeJavaScript); - } else - { main_page->runJavaScript(themeJavaScript); - } } StatisticsWidget::StatisticsWidget(QWidget *parent) : @@ -507,21 +412,10 @@ StatisticsWidget::StatisticsWidget(QWidget *parent) : ui->setupUi(this); ui->myCallCombo->setModel(new QStringListModel(this)); - refreshCallCombo(); - ui->myGridCombo->setModel(new QStringListModel(this)); - refreshGridCombo(); - ui->myRigCombo->setModel(new QStringListModel(this)); - refreshRigCombo(); - ui->myRigCombo->setCurrentIndex(0); - ui->myAntennaCombo->setModel(new QStringListModel(this)); - refreshAntCombo(); - ui->myAntennaCombo->setCurrentIndex(0); - ui->bandCombo->setModel(new QStringListModel(this)); - refreshBandCombo(); ui->startDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY()); ui->startDateEdit->setDate(QDate::currentDate().addDays(DEFAULT_STAT_RANGE)); @@ -533,12 +427,10 @@ StatisticsWidget::StatisticsWidget(QWidget *parent) : main_page->setWebChannel(&channel); ui->mapView->setPage(main_page); + connect(ui->mapView, &QWebEngineView::loadFinished, this, &StatisticsWidget::mapLoaded); main_page->load(QUrl(QStringLiteral("qrc:/res/map/onlinemap.html"))); ui->mapView->setFocusPolicy(Qt::ClickFocus); - connect(ui->mapView, &QWebEngineView::loadFinished, this, &StatisticsWidget::mapLoaded); channel.registerObject("layerControlHandler", &layerControlHandler); - - mainStatChanged(0); } StatisticsWidget::~StatisticsWidget() @@ -548,6 +440,30 @@ StatisticsWidget::~StatisticsWidget() delete ui; } +bool StatisticsWidget::event(QEvent *event) +{ + if (event->type() == QEvent::Show) + { + // We will not use refreshWidget here, even though at first glance it appears + // to do the same thing. The difference is that we want class constructor to be as fast as possible. + // Therefore, in the constructor, we do not populate the combo boxes. As a result, they are empty + // when first displayed and need to be loaded and then combos for Rig, Ant, etc., can be set. + refreshCombos(); + ui->statTypeMainCombo->blockSignals(true); + ui->statTypeMainCombo->setCurrentIndex(0); + ui->statTypeMainCombo->blockSignals(false); + setSubTypesCombo(ui->statTypeMainCombo->currentIndex()); + ui->myRigCombo->blockSignals(true); + ui->myRigCombo->setCurrentIndex(0); + ui->myRigCombo->blockSignals(false); + ui->myAntennaCombo->blockSignals(true); + ui->myAntennaCombo->setCurrentIndex(0); + ui->myAntennaCombo->blockSignals(false); + refreshGraph(); + } + return QWidget::event(event); // Propagate the event further +} + void StatisticsWidget::drawBarGraphs(const QString &title, QSqlQuery &query) { FCT_IDENTIFICATION; @@ -561,9 +477,7 @@ void StatisticsWidget::drawBarGraphs(const QString &title, QSqlQuery &query) QValueAxis *axisY = new QValueAxis(); if ( chart != nullptr ) - { chart->deleteLater(); - } chart = new QChart(); @@ -604,10 +518,7 @@ void StatisticsWidget::drawPieGraph(const QString &title, QPieSeries *series) QChart *chart = ui->graphView->chart(); if ( chart != nullptr ) - { chart->deleteLater(); - } - chart = new QChart(); @@ -624,15 +535,15 @@ void StatisticsWidget::drawMyLocationsOnMap(QSqlQuery &query) { FCT_IDENTIFICATION; - - if ( query.lastQuery().isEmpty() ) return; + if ( query.lastQuery().isEmpty() ) + return; QList locations; while ( query.next() ) { - QString loc = query.value(0).toString(); - Gridsquare stationGrid(loc); + const QString &loc = query.value(0).toString(); + const Gridsquare stationGrid(loc); if ( stationGrid.isValid() ) { @@ -650,27 +561,23 @@ void StatisticsWidget::drawMyLocationsOnMap(QSqlQuery &query) qCDebug(runtime) << javaScript; if ( !isMainPageLoaded ) - { postponedScripts.append(javaScript); - } else - { main_page->runJavaScript(javaScript); - } } void StatisticsWidget::drawPointsOnMap(QSqlQuery &query) { FCT_IDENTIFICATION; - - if ( query.lastQuery().isEmpty() ) return; + if ( query.lastQuery().isEmpty() ) + return; QList stations; while ( query.next() ) { - Gridsquare stationGrid(query.value(1).toString()); + const Gridsquare stationGrid(query.value(1).toString()); if ( stationGrid.isValid() ) { @@ -691,13 +598,9 @@ void StatisticsWidget::drawPointsOnMap(QSqlQuery &query) qCDebug(runtime) << javaScript; if ( !isMainPageLoaded ) - { postponedScripts.append(javaScript); - } else - { main_page->runJavaScript(javaScript); - } } void StatisticsWidget::drawFilledGridsOnMap(QSqlQuery &query) @@ -713,13 +616,9 @@ void StatisticsWidget::drawFilledGridsOnMap(QSqlQuery &query) while ( query.next() ) { if ( query.value(2).toInt() > 0 && ! confirmedGrids.contains(query.value(1).toString()) ) - { confirmedGrids << QString("\"" + query.value(1).toString() + "\""); - } else - { workedGrids << QString("\"" + query.value(1).toString() + "\""); - } } QString javaScript = QString("grids_confirmed = [ %1 ]; " @@ -731,62 +630,99 @@ void StatisticsWidget::drawFilledGridsOnMap(QSqlQuery &query) qCDebug(runtime) << javaScript; if ( !isMainPageLoaded ) - { postponedScripts.append(javaScript); - } else - { main_page->runJavaScript(javaScript); - } } -void StatisticsWidget::refreshCallCombo() +void StatisticsWidget::refreshCombos() { FCT_IDENTIFICATION; - refreshCombo(ui->myCallCombo, "SELECT DISTINCT UPPER(station_callsign) FROM contacts ORDER BY station_callsign"); + refreshCombo(ui->myCallCombo, QLatin1String("SELECT DISTINCT UPPER(station_callsign) FROM contacts ORDER BY station_callsign")); + refreshCombo(ui->myRigCombo, QLatin1String("SELECT DISTINCT my_rig FROM contacts ORDER BY my_rig")); + refreshCombo(ui->myAntennaCombo, QLatin1String("SELECT DISTINCT my_antenna FROM contacts ORDER BY my_antenna")); + refreshCombo(ui->bandCombo, QLatin1String("SELECT DISTINCT band FROM contacts c, bands b WHERE c.band = b.name ORDER BY b.start_freq;")); + refreshCombo(ui->myGridCombo, QLatin1String("SELECT DISTINCT UPPER(my_gridsquare) FROM contacts ORDER BY my_gridsquare")); } -void StatisticsWidget::refreshRigCombo() +void StatisticsWidget::setSubTypesCombo(int mainTypeIdx) { FCT_IDENTIFICATION; - refreshCombo(ui->myRigCombo, "SELECT DISTINCT my_rig FROM contacts ORDER BY my_rig"); -} + ui->statTypeSecCombo->blockSignals(true); -void StatisticsWidget::refreshAntCombo() -{ - FCT_IDENTIFICATION; + ui->statTypeSecCombo->clear(); - refreshCombo(ui->myAntennaCombo, "SELECT DISTINCT my_antenna FROM contacts ORDER BY my_antenna"); -} + ui->lotwCheckBox->setEnabled(false); + ui->eqslCheckBox->setEnabled(false); + ui->paperCheckBox->setEnabled(false); -void StatisticsWidget::refreshBandCombo() -{ - FCT_IDENTIFICATION; + switch ( mainTypeIdx ) + { + /* QSOs per */ + case 0: + { + ui->statTypeSecCombo->addItem(tr("Year")); + ui->statTypeSecCombo->addItem(tr("Month")); + ui->statTypeSecCombo->addItem(tr("Day in Week")); + ui->statTypeSecCombo->addItem(tr("Hour")); + ui->statTypeSecCombo->addItem(tr("Mode")); + ui->statTypeSecCombo->addItem(tr("Band")); + ui->statTypeSecCombo->addItem(tr("Continent")); + ui->statTypeSecCombo->addItem(tr("Propagation Mode")); + } + break; - refreshCombo(ui->bandCombo, "SELECT DISTINCT band FROM contacts c, bands b WHERE c.band = b.name ORDER BY b.start_freq;"); -} + /* Percents */ + case 1: + { + ui->statTypeSecCombo->addItem(tr("Confirmed / Not Confirmed")); + } + break; -void StatisticsWidget::refreshGridCombo() -{ - FCT_IDENTIFICATION; + /* TOP 10 */ + case 2: + { + ui->statTypeSecCombo->addItem(tr("Countries")); + ui->statTypeSecCombo->addItem(tr("Big Gridsquares")); + } + break; + + /* Histogram */ + case 3: + { + QString unit; + Gridsquare::distance2localeUnitDistance(0, unit); + ui->statTypeSecCombo->addItem(tr("Distance") + QString(" [%1]").arg(unit)); + } + break; + + /* Show on Map */ + case 4: + { + ui->statTypeSecCombo->addItem(tr("QSOs")); + ui->statTypeSecCombo->addItem(tr("Confirmed/Worked Grids")); + ui->statTypeSecCombo->addItem(tr("ODX")); + ui->lotwCheckBox->setEnabled(true); + ui->eqslCheckBox->setEnabled(true); + ui->paperCheckBox->setEnabled(true); + } + break; + } - refreshCombo(ui->myGridCombo, "SELECT DISTINCT UPPER(my_gridsquare) FROM contacts ORDER BY my_gridsquare"); + ui->statTypeSecCombo->blockSignals(false); } -void StatisticsWidget::refreshCombo(QComboBox * combo, QString sqlQeury) +void StatisticsWidget::refreshCombo(QComboBox * combo, + const QString &sqlQeury) { FCT_IDENTIFICATION; QString currSelection = combo->currentText(); combo->blockSignals(true); - //combo->clear(); - combo->setModel(new SqlListModel(sqlQeury,tr("All"), this)); - combo->setCurrentText(currSelection); combo->blockSignals(false); - } diff --git a/ui/StatisticsWidget.h b/ui/StatisticsWidget.h index a7237876..99b591be 100644 --- a/ui/StatisticsWidget.h +++ b/ui/StatisticsWidget.h @@ -25,28 +25,31 @@ class StatisticsWidget : public QWidget public slots: void mainStatChanged(int); - void refreshGraph(); void dateRangeCheckBoxChanged(int); void mapLoaded(bool); void changeTheme(int); + void refreshWidget(); +private slots: + void refreshGraph(); public: explicit StatisticsWidget(QWidget *parent = nullptr); ~StatisticsWidget(); +protected: + bool event(QEvent *event) override; + private: + void drawBarGraphs(const QString &title, QSqlQuery &query); void drawPieGraph(const QString &title, QPieSeries* series); void drawMyLocationsOnMap(QSqlQuery &); void drawPointsOnMap(QSqlQuery&); void drawFilledGridsOnMap(QSqlQuery&); - void refreshCallCombo(); - void refreshRigCombo(); - void refreshAntCombo(); - void refreshBandCombo(); - void refreshGridCombo(); - void refreshCombo(QComboBox * combo, QString sqlQeury); + void refreshCombos(); + void setSubTypesCombo(int mainTypeIdx); + void refreshCombo(QComboBox * combo, const QString &sqlQeury); private: Ui::StatisticsWidget *ui; From 256c74c1ed5badce0773177c5d5cc4e9896f9caf Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 27 Sep 2024 08:15:42 +0200 Subject: [PATCH 46/74] Logbook: Fixed the filter color does not change when the item has been deleted --- ui/LogbookWidget.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index cc828ff1..c8416e23 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -431,6 +431,7 @@ void LogbookWidget::refreshClubFilter() ui->clubFilter->addItems(QStringList(tr("Club")) << MembershipQE::instance()->getEnabledClubLists()); ui->clubFilter->setCurrentText(member); ui->clubFilter->blockSignals(false); + colorsFilterWidget(ui->clubFilter); } void LogbookWidget::refreshUserFilter() @@ -444,6 +445,7 @@ void LogbookWidget::refreshUserFilter() userFilterModel->refresh(); ui->userFilter->setCurrentText(userFilterString); ui->userFilter->blockSignals(false); + colorsFilterWidget(ui->userFilter); filterTable(); } @@ -684,7 +686,7 @@ void LogbookWidget::updateTable() countryModel->refresh(); ui->countryFilter->setCurrentText(country); ui->countryFilter->blockSignals(false); - + colorsFilterWidget(ui->countryFilter); emit logbookUpdated(); } From 1f43dbeda04a7b9733eede5e0e2c3893bf091eab Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 27 Sep 2024 09:02:23 +0200 Subject: [PATCH 47/74] Stats: Added a confirmation dialog for displaying over 50k QSOs on the map --- Changelog | 1 + ui/StatisticsWidget.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/Changelog b/Changelog index 21d2a11d..3c182a29 100644 --- a/Changelog +++ b/Changelog @@ -8,6 +8,7 @@ TBC - 0.39.0 - [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452) - [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh) - [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh) +- [CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map - Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) - Fixed Wrong import of ADIF file of another log program (issue #455) - Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458) diff --git a/ui/StatisticsWidget.cpp b/ui/StatisticsWidget.cpp index 20da7e35..b3af98aa 100644 --- a/ui/StatisticsWidget.cpp +++ b/ui/StatisticsWidget.cpp @@ -575,12 +575,15 @@ void StatisticsWidget::drawPointsOnMap(QSqlQuery &query) QList stations; + qulonglong count = 0; + while ( query.next() ) { const Gridsquare stationGrid(query.value(1).toString()); if ( stationGrid.isValid() ) { + count++; double lat = stationGrid.getLatitude(); double lon = stationGrid.getLongitude(); stations.append(QString("[\"%1\", %2, %3, %4]").arg(query.value(0).toString()) @@ -590,6 +593,16 @@ void StatisticsWidget::drawPointsOnMap(QSqlQuery &query) } } + if ( count > 50000 ) + { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, tr("Statistics"), tr("Over 50000 QSOs. Display them?"), + QMessageBox::Yes|QMessageBox::No); + + if ( reply != QMessageBox::Yes ) + stations.clear(); + } + QString javaScript = QString("grids_confirmed = [];" "grids_worked = [];" "drawPoints([%1]);" From 6b64cdad66e74c98ba406dd93ed55317271f62ea Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 27 Sep 2024 09:51:36 +0200 Subject: [PATCH 48/74] NewContact: Starting QSO Timer when WSJTX Update Callsign Status is received It is possible to have a RIG connected and run WSJTX. To prevent a QSY wipe when WSJTX's Fake Split Mode is enabled, QLog starts the QSO Timer but only when the RIG is connected. --- Changelog | 1 + ui/NewContactWidget.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 3c182a29..e084151c 100644 --- a/Changelog +++ b/Changelog @@ -9,6 +9,7 @@ TBC - 0.39.0 - [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh) - [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh) - [CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map +- [CHANGED] - New Contact - Starting QSO Timer when Rig online and WSJTX Update Callsign Status is received - Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) - Fixed Wrong import of ADIF file of another log program (issue #455) - Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458) diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index 19f883f8..5ab69cc9 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -1708,6 +1708,8 @@ void NewContactWidget::saveExternalContact(QSqlRecord record) // based on the poll #420, QLog adds more information from callbook if ( savedCallsign == ui->callsignEdit->text() ) { + stopContactTimer(); + updateTime(); // information independent of QTH if ( record.value("name_intl").toString().isEmpty() && record.value("name").toString().isEmpty() @@ -2630,11 +2632,15 @@ void NewContactWidget::prepareWSJTXQSO(const QString &receivedCallsign, return; QSOFreq = ui->freqRXEdit->value(); // Important !!! - to prevent QSY Contact Reset when the frequency is set + // QSY Wipe disabling - It is possible to have a RIG connected and run WSJTX. + // To prevent the QSY Wipe when WSJTX's Fake Split Mode is enabled, QLog starts the QSO Timer. + if ( rigOnline ) + startContactTimer(); + callsign = receivedCallsign; ui->callsignEdit->setText(receivedCallsign); uiDynamic->gridEdit->setText(grid); setDxccInfo(receivedCallsign); - stopContactTimer(); // at the moment WSJTX sends several statuses about changing one callsign. // In order to avoid multiple searches, we will search only when we have a grid - it was usually the last From 56d78426c26716027a573d72a5b10d15abd88c19 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 27 Sep 2024 10:15:47 +0200 Subject: [PATCH 49/74] Fixed compilation issue under QT6.x --- ui/StatisticsWidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/StatisticsWidget.cpp b/ui/StatisticsWidget.cpp index b3af98aa..0d2f6bb0 100644 --- a/ui/StatisticsWidget.cpp +++ b/ui/StatisticsWidget.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "StatisticsWidget.h" #include "ui_StatisticsWidget.h" #include "core/debug.h" From b6f22cc948c27d01d1ca70f655e2a28da07e7410 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 27 Sep 2024 14:56:35 +0200 Subject: [PATCH 50/74] Alerts: Added Member Column --- Changelog | 1 + models/AlertTableModel.cpp | 4 +++- models/AlertTableModel.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index e084151c..fb220754 100644 --- a/Changelog +++ b/Changelog @@ -1,6 +1,7 @@ TBC - 0.39.0 - [NEW] - DXC - Added Full-text search - [NEW] - Select S in RST Edit when focused (issue #454) +- [NEW] - Alerts - Added Member Column - [CHANGED] - HamlibDrv - Added multiplatform reliable sleep - [CHANGED] - Changed Backup policy - [CHANGED] - Logbook page size - improved performance diff --git a/models/AlertTableModel.cpp b/models/AlertTableModel.cpp index 40b68939..991b5df8 100644 --- a/models/AlertTableModel.cpp +++ b/models/AlertTableModel.cpp @@ -13,7 +13,7 @@ int AlertTableModel::rowCount(const QModelIndex&) const int AlertTableModel::columnCount(const QModelIndex&) const { - return 7; + return 8; } QVariant AlertTableModel::data(const QModelIndex& index, int role) const @@ -31,6 +31,7 @@ QVariant AlertTableModel::data(const QModelIndex& index, int role) const case COLUMN_UPDATED: return selectedRecord.counter; case COLUMN_LAST_UPDATE: return selectedRecord.alert.dateTime.toString(locale.formatTimeLongWithoutTZ()); case COLUMN_LAST_COMMENT: return selectedRecord.alert.comment; + case COLUMN_MEMBER: return selectedRecord.alert.memberList2StringList().join(","); default: return QVariant(); } } @@ -65,6 +66,7 @@ QVariant AlertTableModel::headerData(int section, Qt::Orientation orientation, i case COLUMN_UPDATED: return tr("Updated"); case COLUMN_LAST_UPDATE: return tr("Last Update"); case COLUMN_LAST_COMMENT: return tr("Last Comment"); + case COLUMN_MEMBER: return tr("Member"); default: return QVariant(); } } diff --git a/models/AlertTableModel.h b/models/AlertTableModel.h index 9b677e66..bd1a505c 100644 --- a/models/AlertTableModel.h +++ b/models/AlertTableModel.h @@ -22,6 +22,7 @@ class AlertTableModel : public QAbstractTableModel COLUMN_UPDATED = 4, COLUMN_LAST_UPDATE = 5, COLUMN_LAST_COMMENT = 6, + COLUMN_MEMBER = 7, }; struct AlertTableRecord From 0bf2df5eaf0559dc8aa94beb16198ec9f2f2a2d3 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 27 Sep 2024 15:05:24 +0200 Subject: [PATCH 51/74] AlerRuleDetail: Minor Dialog Changes - Continent sections --- ui/AlertRuleDetail.ui | 85 ++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/ui/AlertRuleDetail.ui b/ui/AlertRuleDetail.ui index 69b90e26..ea0244d7 100644 --- a/ui/AlertRuleDetail.ui +++ b/ui/AlertRuleDetail.ui @@ -6,8 +6,8 @@ 0 0 - 357 - 620 + 511 + 680 @@ -317,31 +317,31 @@ - - + + - North America + South America - - + + - Africa + Antarctica - - + + - Antarctica + North America - - + + - South America + Oceania @@ -359,10 +359,10 @@ - - + + - Oceania + Africa @@ -424,70 +424,70 @@ - - + + - North America + Antarctica false - - + + - Africa + Asia false - - + + - Antarctica + Europe false - - + + - South America + Africa false - - + + - Asia + North America false - - + + - Europe + Oceania false - - + + - Oceania + South America false @@ -547,19 +547,20 @@ continent afcheckbox ascheckbox - nacheckbox - occheckbox ancheckbox eucheckbox + nacheckbox + occheckbox sacheckbox + memberGroupBox spotterCountryCombo continent_spotter afcheckbox_spotter ascheckbox_spotter - nacheckbox_spotter - occheckbox_spotter ancheckbox_spotter eucheckbox_spotter + nacheckbox_spotter + occheckbox_spotter sacheckbox_spotter From 147eb3f0f60cfe43fcfd003b0be39c235ae52924 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 11:27:52 +0200 Subject: [PATCH 52/74] Fixed #469 - Alerts Window displays OOB Spots --- Changelog | 1 + core/AlertEvaluator.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index fb220754..80c0f000 100644 --- a/Changelog +++ b/Changelog @@ -17,6 +17,7 @@ TBC - 0.39.0 - Fixed ADIF import does not import records with old DXCC Entities (issue #459) - Fixed ADIF import incorrectly uses Station Profile parameters (issue #461) - Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464) +- Fixed Alerts Window displays OOB Spots (issue #469) - Fixed Field values from past QSOs are used incorrectly in case of WSJTX QSOs (#issue 470) 2024/08/29 - 0.38.0 diff --git a/core/AlertEvaluator.cpp b/core/AlertEvaluator.cpp index 237d112c..abdf3714 100644 --- a/core/AlertEvaluator.cpp +++ b/core/AlertEvaluator.cpp @@ -344,7 +344,7 @@ bool AlertRule::match(const DxSpot &spot) const && (dxCountry == 0 || dxCountry == spot.dxcc.dxcc) && (spot.status & dxLogStatusMap) && (mode == "*" || mode.contains("|" + spot.modeGroupString)) - && (band == "*" || band.contains("|" + spot.band)) + && (band == "*" || (!spot.band.isEmpty() && band.contains("|" + spot.band))) && (spotterCountry == 0 || spotterCountry == spot.dxcc_spotter.dxcc ) && (dxContinent == "*" || dxContinent.contains("|" + spot.dxcc.cont)) && (spotterContinent == "*" || spotterContinent.contains("|" + spot.dxcc_spotter.cont)) From 08e548fe011b4a2ee6a6f6850dcba90ba79c6120 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 11:33:08 +0200 Subject: [PATCH 53/74] Fixed #469 - fixed all string value conditions --- core/AlertEvaluator.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/AlertEvaluator.cpp b/core/AlertEvaluator.cpp index abdf3714..70647fc1 100644 --- a/core/AlertEvaluator.cpp +++ b/core/AlertEvaluator.cpp @@ -343,11 +343,11 @@ bool AlertRule::match(const DxSpot &spot) const && (sourceMap & SpotAlert::DXSPOT) && (dxCountry == 0 || dxCountry == spot.dxcc.dxcc) && (spot.status & dxLogStatusMap) - && (mode == "*" || mode.contains("|" + spot.modeGroupString)) + && (mode == "*" || (!spot.modeGroupString.isEmpty() && mode.contains("|" + spot.modeGroupString))) && (band == "*" || (!spot.band.isEmpty() && band.contains("|" + spot.band))) && (spotterCountry == 0 || spotterCountry == spot.dxcc_spotter.dxcc ) - && (dxContinent == "*" || dxContinent.contains("|" + spot.dxcc.cont)) - && (spotterContinent == "*" || spotterContinent.contains("|" + spot.dxcc_spotter.cont)) + && (dxContinent == "*" || (!spot.dxcc.cont.isEmpty() && dxContinent.contains("|" + spot.dxcc.cont))) + && (spotterContinent == "*" || (!spot.dxcc_spotter.cont.isEmpty() && spotterContinent.contains("|" + spot.dxcc_spotter.cont))) && (dxMember == QStringList("*") || spot.memberList2Set().intersects(dxMemberSet)) ) { From aab726984ab3618a6507d5d8f74a3d228fc9e743 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 14:08:35 +0200 Subject: [PATCH 54/74] Reviewed usage of QVariant isNull Reviewed isNull based on commit 5128ce75b52cfe24b04c910736af9b309a3c036c --- core/MembershipQE.cpp | 28 ++++++++++++++-------------- core/main.cpp | 2 +- data/Data.cpp | 12 ++++++------ ui/AlertWidget.cpp | 6 +++--- ui/DxWidget.cpp | 25 +++++++++++++------------ ui/LogbookWidget.cpp | 6 +++--- ui/RigWidget.cpp | 2 +- ui/WsjtxWidget.cpp | 6 +++--- 8 files changed, 44 insertions(+), 43 deletions(-) diff --git a/core/MembershipQE.cpp b/core/MembershipQE.cpp index 01a58d05..521e6136 100644 --- a/core/MembershipQE.cpp +++ b/core/MembershipQE.cpp @@ -554,25 +554,25 @@ void ClubStatusQuery::getClubStatus(const QString &in_callsign, while ( ++records && query.next() ) { QString clubid = query.value(0).toString(); - QVariant band = query.value(1); - QVariant mode = query.value(2); + QString band = query.value(1).toString(); + QString mode = query.value(2).toString(); QVariant confirmed = query.value(3); - QVariant current_mode = query.value(4); + QString current_mode = query.value(4).toString(); qCDebug(runtime) << "Processing" << currentProcessedClub << clubid - << band.isNull() << band - << mode.isNull() << mode - << confirmed.isNull() << confirmed - << current_mode.isNull(); + << band.isEmpty() << band + << mode.isEmpty() << mode + << confirmed.toString().isEmpty() << confirmed + << current_mode.isEmpty(); // the select generates starting line for a new club // Changing the club if ( currentProcessedClub != clubid - && band.isNull() - && mode.isNull() - && confirmed.isNull() - && current_mode.isNull() ) + && band.isEmpty() + && mode.isEmpty() + && confirmed.toString().isEmpty() + && current_mode.isEmpty() ) { if ( !currentProcessedClub.isEmpty() ) { @@ -591,10 +591,10 @@ void ClubStatusQuery::getClubStatus(const QString &in_callsign, if ( currentProcessedClub == clubid ) { - if ( band.toString() == in_band ) + if ( band == in_band ) { bandMatched = true; - if ( mode.toString() == current_mode.toString() ) + if ( mode == current_mode ) { bandModeMatched = true; @@ -605,7 +605,7 @@ void ClubStatusQuery::getClubStatus(const QString &in_callsign, } } - if ( mode.toString() == current_mode.toString() ) + if ( mode == current_mode ) { modeMatched = true; } diff --git a/core/main.cpp b/core/main.cpp index 2114b254..29de409f 100644 --- a/core/main.cpp +++ b/core/main.cpp @@ -408,7 +408,7 @@ int main(int argc, char* argv[]) QString lang = parser.value(forceLanguage); app.setOrganizationName("hamradio"); - app.setApplicationName("QLog" + ((environment.isNull()) ? "" : environment.prepend("-"))); + app.setApplicationName("QLog" + ((environment.isEmpty()) ? "" : environment.prepend("-"))); /* If the Style parameter is not present then use a default - Fusion style */ if ( !stylePresent ) diff --git a/data/Data.cpp b/data/Data.cpp index 1a4c292f..4ab289b0 100644 --- a/data/Data.cpp +++ b/data/Data.cpp @@ -184,24 +184,24 @@ DxccStatus Data::dxccStatus(int dxcc, const QString &band, const QString &mode) if ( query.next() ) { - if ( query.value(0).isNull() ) + if ( query.value(0).toString().isEmpty() ) return DxccStatus::NewEntity; - if ( query.value(1).isNull() ) + if ( query.value(1).toString().isEmpty() ) { - if ( query.value(2).isNull() ) + if ( query.value(2).toString().isEmpty() ) return DxccStatus::NewBandMode; else return DxccStatus::NewBand; } - if ( query.value(2).isNull() ) + if ( query.value(2).toString().isEmpty() ) return DxccStatus::NewMode; - if ( query.value(3).isNull() ) + if ( query.value(3).toString().isEmpty() ) return DxccStatus::NewSlot; - if ( query.value(4).isNull() ) + if ( query.value(4).toString().isEmpty() ) return DxccStatus::Worked; else return DxccStatus::Confirmed; diff --git a/ui/AlertWidget.cpp b/ui/AlertWidget.cpp index 0690a625..fd45d811 100644 --- a/ui/AlertWidget.cpp +++ b/ui/AlertWidget.cpp @@ -131,11 +131,11 @@ void AlertWidget::restoreTableHeaderState() { FCT_IDENTIFICATION; - const QVariant &state = settings.value("alert/state"); + const QByteArray &state = settings.value("alert/state").toByteArray(); - if (!state.isNull()) + if (!state.isEmpty()) { - ui->alertTableView->horizontalHeader()->restoreState(state.toByteArray()); + ui->alertTableView->horizontalHeader()->restoreState(state); } } diff --git a/ui/DxWidget.cpp b/ui/DxWidget.cpp index 29594fb7..0f68bb02 100644 --- a/ui/DxWidget.cpp +++ b/ui/DxWidget.cpp @@ -793,31 +793,32 @@ void DxWidget::restoreWidgetSetting() FCT_IDENTIFICATION; QSettings settings; - QVariant state = settings.value("dxc/dxtablestate"); + QByteArray state = settings.value("dxc/dxtablestate").toByteArray(); - if (!state.isNull()) + if (!state.isEmpty()) { - ui->dxTable->horizontalHeader()->restoreState(state.toByteArray()); + ui->dxTable->horizontalHeader()->restoreState(state); } - state = settings.value("dxc/wcytablestate"); + state = settings.value("dxc/wcytablestate").toByteArray(); - if (!state.isNull()) + if (!state.isEmpty()) { - ui->wcyTable->horizontalHeader()->restoreState(state.toByteArray()); + ui->wcyTable->horizontalHeader()->restoreState(state); } - state = settings.value("dxc/wwvtablestate"); + state = settings.value("dxc/wwvtablestate").toByteArray(); - if (!state.isNull()) + if (!state.isEmpty()) { - ui->wwvTable->horizontalHeader()->restoreState(state.toByteArray()); + ui->wwvTable->horizontalHeader()->restoreState(state); } - state = settings.value("dxc/toalltablestate"); - if (!state.isNull()) + state = settings.value("dxc/toalltablestate").toByteArray(); + + if (!state.isEmpty()) { - ui->toAllTable->horizontalHeader()->restoreState(state.toByteArray()); + ui->toAllTable->horizontalHeader()->restoreState(state); } int fontsize = settings.value("dxc/consolefontsize", -1).toInt(); diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index c8416e23..d858e10a 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -139,9 +139,9 @@ LogbookWidget::LogbookWidget(QWidget *parent) : ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_UKSMG, new UnitFormatDelegate("", 0, 1, ui->contactTable)); QSettings settings; - QVariant logbookState = settings.value("logbook/state"); - if (!logbookState.isNull()) { - ui->contactTable->horizontalHeader()->restoreState(logbookState.toByteArray()); + const QByteArray &logbookState = settings.value("logbook/state").toByteArray(); + if (!logbookState.isEmpty()) { + ui->contactTable->horizontalHeader()->restoreState(logbookState); } else { /* Hide all */ diff --git a/ui/RigWidget.cpp b/ui/RigWidget.cpp index 5e754fdc..a5c6db59 100644 --- a/ui/RigWidget.cpp +++ b/ui/RigWidget.cpp @@ -197,7 +197,7 @@ void RigWidget::bandComboChanged(const QString &newBand) double newFreq = record.value("start_freq").toDouble(); - if ( ! record.value("last_seen_freq").isNull() ) + if ( ! record.value("last_seen_freq").toString().isEmpty() ) { newFreq = record.value("last_seen_freq").toDouble(); } diff --git a/ui/WsjtxWidget.cpp b/ui/WsjtxWidget.cpp index d730b027..3e98dc76 100644 --- a/ui/WsjtxWidget.cpp +++ b/ui/WsjtxWidget.cpp @@ -335,11 +335,11 @@ void WsjtxWidget::restoreTableHeaderState() FCT_IDENTIFICATION; QSettings settings; - QVariant state = settings.value("wsjtx/state"); + const QByteArray &state = settings.value("wsjtx/state").toByteArray(); - if (!state.isNull()) + if (!state.isEmpty()) { - ui->tableView->horizontalHeader()->restoreState(state.toByteArray()); + ui->tableView->horizontalHeader()->restoreState(state); } } From 6cbdd4431a7569615377065048df37863cf38177 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 15:40:23 +0200 Subject: [PATCH 55/74] Reviewed usage of QVariant isNull (2) --- ui/DxWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/DxWidget.cpp b/ui/DxWidget.cpp index 0f68bb02..18128456 100644 --- a/ui/DxWidget.cpp +++ b/ui/DxWidget.cpp @@ -1542,7 +1542,7 @@ void DxWidget::processDxSpot(const QString &spotter, DxSpot spot; - spot.time = (dateTime.isNull()) ? QDateTime::currentDateTime().toTimeSpec(Qt::UTC) + spot.time = (!dateTime.isValid()) ? QDateTime::currentDateTime().toTimeSpec(Qt::UTC) : dateTime; spot.callsign = call; spot.freq = freq.toDouble() / 1000; From 960abca66f1635c480913ec004fa1f426a0d1764 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 15:42:58 +0200 Subject: [PATCH 56/74] Fixed compilation warning of FCT_IDENTIFICATION --- core/debug.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/debug.h b/core/debug.h index 463498a6..03ab3656 100644 --- a/core/debug.h +++ b/core/debug.h @@ -11,8 +11,10 @@ Q_DECLARE_LOGGING_CATEGORY(logPlugin) static const QLoggingCategory function_parameters(m".function.parameters"); \ static const QLoggingCategory runtime(m".runtime"); \ -#define FCT_IDENTIFICATION QString logging_cat(mod_name); logging_cat.append(".function.entered"); \ - qCDebug(QLoggingCategory(logging_cat.toLatin1().constData()))<<"***" +#define FCT_IDENTIFICATION QString logging_cat(mod_name); \ + logging_cat.append(".function.entered"); \ + QByteArray logging_cat_latin1 = logging_cat.toLatin1(); \ + qCDebug(QLoggingCategory(logging_cat_latin1.constData()))<<"***" typedef enum debug_level { From 72ba14a8f277cb04677a08c34d9dc0692dec8f9c Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 15:49:40 +0200 Subject: [PATCH 57/74] Fixed compilation warning of FCT_IDENTIFICATION (2) --- core/debug.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/debug.h b/core/debug.h index 03ab3656..2b19fa38 100644 --- a/core/debug.h +++ b/core/debug.h @@ -14,7 +14,9 @@ Q_DECLARE_LOGGING_CATEGORY(logPlugin) #define FCT_IDENTIFICATION QString logging_cat(mod_name); \ logging_cat.append(".function.entered"); \ QByteArray logging_cat_latin1 = logging_cat.toLatin1(); \ - qCDebug(QLoggingCategory(logging_cat_latin1.constData()))<<"***" + const char* category_name = logging_cat_latin1.isEmpty() ? "default_category" : logging_cat_latin1.constData(); \ + QLoggingCategory log_category(category_name); \ + qCDebug(log_category)<<"***" typedef enum debug_level { From bd69a14c0b89e4e19b31bfb41169c7146cd19bca Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 15:54:44 +0200 Subject: [PATCH 58/74] ProfileManager: Removed FCT_IDENTIFICATION - not needed --- data/ProfileManager.h | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/data/ProfileManager.h b/data/ProfileManager.h index c2fe3172..51068f86 100644 --- a/data/ProfileManager.h +++ b/data/ProfileManager.h @@ -6,12 +6,8 @@ #include #include #include -#include "core/debug.h" #include -#define MOD_NAME "qlog.data.profilemanager" - - /* the header file contains function implementation because * https://stackoverflow.com/questions/8752837/undefined-reference-to-template-class-constructor */ @@ -98,9 +94,6 @@ class ProfileManagerSQL explicit ProfileManagerSQL(const QString &tableName) : tableName(tableName) { - QString logging_cat(MOD_NAME); logging_cat.append(".function.entered"); - qCDebug(QLoggingCategory(logging_cat.toLatin1().constData())); - QSqlQuery query(QString("SELECT profile_name FROM %1 WHERE IFNULL(selected, 0) = 1").arg(tableName)); currentProfile1 = query.first() ? query.value(0).toString() : QString(); @@ -111,9 +104,6 @@ class ProfileManagerSQL const T getCurProfile1() { - QString logging_cat(MOD_NAME); logging_cat.append(".function.entered"); - qCDebug(QLoggingCategory(logging_cat.toLatin1().constData())); - return ( ! currentProfile1.isEmpty() ) ? getProfile(currentProfile1) : T(); }; @@ -153,9 +143,6 @@ class ProfileManagerSQL void setCurProfile1(const QString &profileName) { - QString logging_cat(MOD_NAME); logging_cat.append(".function.entered"); - qCDebug(QLoggingCategory(logging_cat.toLatin1().constData())); - currProfMutex.lock(); __setCurProfile1(profileName); currProfMutex.unlock(); @@ -163,9 +150,6 @@ class ProfileManagerSQL void saveCurProfile1() { - QString logging_cat(MOD_NAME); logging_cat.append(".function.entered"); - qCDebug(QLoggingCategory(logging_cat.toLatin1().constData())); - currProfMutex.lock(); __setCurProfile1(currentProfile1); currProfMutex.unlock(); @@ -173,9 +157,6 @@ class ProfileManagerSQL const T getProfile(const QString &profileName) { - QString logging_cat(MOD_NAME); logging_cat.append(".function.entered"); - qCDebug(QLoggingCategory(logging_cat.toLatin1().constData())); - if ( profiles.contains(profileName) ) { profilesMutex.lock(); @@ -193,9 +174,6 @@ class ProfileManagerSQL void addProfile(const QString &profileName, T profile) { - QString logging_cat(MOD_NAME); logging_cat.append(".function.entered"); - qCDebug(QLoggingCategory(logging_cat.toLatin1().constData())); - profilesMutex.lock(); profiles.insert(profileName, QVariant::fromValue(profile)); profilesMutex.unlock(); @@ -203,9 +181,6 @@ class ProfileManagerSQL int removeProfile(const QString &profileName) { - QString logging_cat(MOD_NAME); logging_cat.append(".function.entered"); - qCDebug(QLoggingCategory(logging_cat.toLatin1().constData())); - currProfMutex.lock(); if ( currentProfile1 == profileName ) { @@ -222,9 +197,6 @@ class ProfileManagerSQL const QStringList profileNameList() { - QString logging_cat(MOD_NAME); logging_cat.append(".function.entered"); - qCDebug(QLoggingCategory(logging_cat.toLatin1().constData())); - profilesMutex.lock(); QStringList ret(profiles.keys()); profilesMutex.unlock(); From e4e350ae23b656cd508388b8369dde2b172a5e73 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 15:58:07 +0200 Subject: [PATCH 59/74] Added missing the Debug header file --- data/RotUsrButtonsProfile.cpp | 1 + rig/drivers/TCIRigDrv.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/data/RotUsrButtonsProfile.cpp b/data/RotUsrButtonsProfile.cpp index 0e6f9e1c..b384fa8d 100644 --- a/data/RotUsrButtonsProfile.cpp +++ b/data/RotUsrButtonsProfile.cpp @@ -2,6 +2,7 @@ #include #include "RotUsrButtonsProfile.h" +#include "core/debug.h" MODULE_IDENTIFICATION("qlog.data.rotusrbuttonsprofile"); diff --git a/rig/drivers/TCIRigDrv.cpp b/rig/drivers/TCIRigDrv.cpp index 818232d5..f2645f4a 100644 --- a/rig/drivers/TCIRigDrv.cpp +++ b/rig/drivers/TCIRigDrv.cpp @@ -5,6 +5,7 @@ #include "rig/macros.h" #include "data/Data.h" #include "data/BandPlan.h" +#include "core/debug.h" MODULE_IDENTIFICATION("qlog.rig.driver.tcidrv"); From 6b9dbaae66287a7daaafdb5172d48ce7a7203710 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 18:43:45 +0200 Subject: [PATCH 60/74] QT6: Removed the use of the qAsConst macro --- core/AlertEvaluator.cpp | 4 ++-- core/KSTChat.cpp | 18 +++++++++--------- core/MembershipQE.cpp | 2 +- core/Migration.cpp | 6 +++--- core/NetworkNotification.cpp | 4 ++-- core/PropConditions.cpp | 8 ++++---- core/Wsjtx.cpp | 4 ++-- core/main.cpp | 2 +- cwkey/drivers/CWFldigiKey.cpp | 2 +- data/AntProfile.cpp | 6 +++--- data/CWKeyProfile.cpp | 6 +++--- data/CWShortcutProfile.cpp | 6 +++--- data/DxSpot.h | 4 ++-- data/MainLayoutProfile.cpp | 6 +++--- data/RigProfile.cpp | 6 +++--- data/RotProfile.cpp | 6 +++--- data/RotUsrButtonsProfile.cpp | 6 +++--- data/SpotAlert.h | 2 +- data/WsjtxEntry.h | 4 ++-- logformat/CSVFormat.cpp | 8 ++++---- logformat/LogFormat.cpp | 2 +- ui/AlertRuleDetail.cpp | 4 ++-- ui/DxFilterDialog.cpp | 4 ++-- ui/DxWidget.cpp | 2 +- ui/FreqQSpinBox.cpp | 4 ++-- ui/KSTHighlightRuleDetail.cpp | 6 +++--- ui/LogbookWidget.cpp | 2 +- ui/MainLayoutEditor.cpp | 12 ++++++------ ui/MainLayoutEditor.h | 4 ++-- ui/NewContactWidget.cpp | 8 ++++---- ui/PaperQSLDialog.cpp | 4 ++-- ui/QSODetailDialog.cpp | 4 ++-- ui/QSOFilterDetail.cpp | 4 ++-- ui/SettingsDialog.cpp | 8 ++++---- ui/WsjtxFilterDialog.cpp | 4 ++-- 35 files changed, 91 insertions(+), 91 deletions(-) diff --git a/core/AlertEvaluator.cpp b/core/AlertEvaluator.cpp index 70647fc1..82d9642c 100644 --- a/core/AlertEvaluator.cpp +++ b/core/AlertEvaluator.cpp @@ -34,7 +34,7 @@ void AlertEvaluator::dxSpot(const DxSpot & spot) QStringList matchedRules; - for ( const AlertRule *rule : qAsConst(ruleList) ) + for ( const AlertRule *rule : static_cast&>(ruleList) ) { qCDebug(runtime) << "Processing " << *rule; @@ -75,7 +75,7 @@ void AlertEvaluator::WSJTXCQSpot(const WsjtxEntry &wsjtx) QStringList matchedRules; - for ( const AlertRule *rule : qAsConst(ruleList) ) + for ( const AlertRule *rule : static_cast&>(ruleList) ) { qCDebug(runtime) << "Processing " << *rule; if ( rule->match(wsjtx) ) diff --git a/core/KSTChat.cpp b/core/KSTChat.cpp index 21b7d747..47d41c26 100644 --- a/core/KSTChat.cpp +++ b/core/KSTChat.cpp @@ -75,7 +75,7 @@ KSTUsersInfo KSTChat::getUserInfo(const QString &username) const qCDebug(function_parameters) << username; - for ( const KSTUsersInfo &info : qAsConst(userList) ) + for ( const KSTUsersInfo &info : static_cast&>(userList) ) { if ( info.callsign == username ) return info; @@ -250,9 +250,9 @@ void KSTChat::receiveData() QRegularExpression chatCMDEndRE("([0-9]{4})Z " + userName.toUpper() + " " + QRegularExpression::escape(chatName) + " chat>(.*)"); QRegularExpressionMatch chatCMDEndMatch; - QStringList lines = joinLines(socket->readAll()); + const QStringList &lines = joinLines(socket->readAll()); - for (const QString &line : qAsConst(lines) ) + for (const QString &line : lines ) { qCDebug(runtime) << "Processing Line" << line << "CMD" << currCommand; // Skip empty lines @@ -461,7 +461,7 @@ void KSTChat::finalizeShowUsersCommand(const QStringList &buffer) userList.clear(); - for ( const QString &record : qAsConst(buffer) ) + for ( const QString &record : static_cast&>(buffer) ) { QRegularExpressionMatch match = recordRE.match(record); @@ -596,7 +596,7 @@ bool chatHighlightEvaluator::shouldHighlight(const KSTChatMsg &msg, { FCT_IDENTIFICATION; - for ( const chatHighlightRule *rule : qAsConst(ruleList) ) + for ( const chatHighlightRule *rule : static_cast&>(ruleList) ) { qCDebug(runtime) << "Processing " << rule->ruleName; if ( rule->match(roomIndex, msg) ) @@ -696,7 +696,7 @@ QByteArray chatHighlightRule::toJson() QJsonArray conditionsArray; - for ( const Condition &condition : qAsConst(conditions) ) + for ( const Condition &condition : static_cast&>(conditions) ) { QJsonObject conditionObject; @@ -733,8 +733,8 @@ void chatHighlightRule::fromJson(const QJsonDocument &ruleDefinition) enabled = ruleDefinition["enabled"].toBool(); ruleRoomIndex = ruleDefinition["roomId"].toInt(); interConditionOperand = static_cast(ruleDefinition["operand"].toInt()); - QJsonArray conditionArray = ruleDefinition["conditions"].toArray(); - for ( const QJsonValue &value : qAsConst(conditionArray) ) + const QJsonArray &conditionArray = ruleDefinition["conditions"].toArray(); + for ( const QJsonValue &value : conditionArray ) { QJsonObject obj = value.toObject(); Condition condition; @@ -779,7 +779,7 @@ bool chatHighlightRule::match(const int inRoomIndex, bool result = false; bool isFirstCondition = true; - for ( const Condition &condition : qAsConst(conditions) ) + for ( const Condition &condition : static_cast&>(conditions) ) { QString columnValue; diff --git a/core/MembershipQE.cpp b/core/MembershipQE.cpp index 521e6136..c87cd6e5 100644 --- a/core/MembershipQE.cpp +++ b/core/MembershipQE.cpp @@ -116,7 +116,7 @@ void MembershipQE::removeClubsFromEnabledClubLists(const QList& toRemoveClub: qAsConst(toRemove)) + for ( const QPair& toRemoveClub : toRemove ) { current.removeAll(toRemoveClub.first); } diff --git a/core/Migration.cpp b/core/Migration.cpp index 07afe9d6..3329c225 100644 --- a/core/Migration.cpp +++ b/core/Migration.cpp @@ -633,7 +633,7 @@ bool Migration::importQSLCards2DB() QString qslFolder = settings.value("paperqsl/qslfolder", QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)).toString(); QDir dir(qslFolder); - QFileInfoList file_list = dir.entryInfoList(QStringList("????????_*_*_qsl_*.*"), + const QFileInfoList &file_list = dir.entryInfoList(QStringList("????????_*_*_qsl_*.*"), QDir::Files, QDir::Name); if ( !insert.prepare("INSERT INTO contacts_qsl_cards (contactid, source, name, data) " @@ -643,7 +643,7 @@ bool Migration::importQSLCards2DB() return false; } - for ( auto &file : qAsConst(file_list) ) + for ( auto &file : file_list ) { qCDebug(runtime) << "Processing file" << file.fileName(); QRegularExpressionMatch match = re.match(file.fileName()); @@ -879,7 +879,7 @@ bool Migration::refreshUploadStatusTrigger() QStringList clublogSupportedColumns; - for ( const QString &clublogColumn : qAsConst(ClubLog::supportedDBFields) ) + for ( const QString &clublogColumn : static_cast(ClubLog::supportedDBFields) ) clublogSupportedColumns << QString("old.%1 != new.%2").arg(clublogColumn, clublogColumn); if ( !stmt.exec(QString("CREATE TRIGGER update_contacts_upload_status " diff --git a/core/NetworkNotification.cpp b/core/NetworkNotification.cpp index 1a6c4e36..a00c2008 100644 --- a/core/NetworkNotification.cpp +++ b/core/NetworkNotification.cpp @@ -225,9 +225,9 @@ void NetworkNotification::send(const QByteArray &data, const HostsPortString &de return; } - QList addrList = dests.getAddrList(); + const QList &addrList = dests.getAddrList(); - for ( const HostPortAddress &addr : qAsConst(addrList) ) + for ( const HostPortAddress &addr : addrList ) { QUdpSocket udpSocket; diff --git a/core/PropConditions.cpp b/core/PropConditions.cpp index b00c6d02..5b054720 100644 --- a/core/PropConditions.cpp +++ b/core/PropConditions.cpp @@ -140,8 +140,8 @@ void PropConditions::processReply(QNetworkReply* reply) double skipElement = 0.0; qCDebug(runtime) << "Aurora forecast Time:" << doc["Forecast Time"].toString(); - QJsonArray jsonArray = doc["coordinates"].toArray(); - for (const QJsonValue &value : qAsConst(jsonArray)) + const QJsonArray &jsonArray = doc["coordinates"].toArray(); + for (const QJsonValue &value : jsonArray) { QJsonArray obj = value.toArray(); if ( obj.size() == 3 ) @@ -166,8 +166,8 @@ void PropConditions::processReply(QNetworkReply* reply) { double skipElement = 0.0; - QJsonArray jsonArray = doc.array(); - for (const QJsonValue &value : qAsConst(jsonArray)) + const QJsonArray &jsonArray = doc.array(); + for (const QJsonValue &value : jsonArray) { QJsonObject obj = value.toObject(); QJsonObject station = obj["station"].toObject(); diff --git a/core/Wsjtx.cpp b/core/Wsjtx.cpp index bf53761f..75df1af7 100644 --- a/core/Wsjtx.cpp +++ b/core/Wsjtx.cpp @@ -106,9 +106,9 @@ void Wsjtx::forwardDatagram(const QNetworkDatagram &datagram) HostsPortString forwardAddresses(getConfigForwardAddresses()); - QList addrList = forwardAddresses.getAddrList(); + const QList &addrList = forwardAddresses.getAddrList(); - for ( const HostPortAddress &addr : qAsConst(addrList) ) + for ( const HostPortAddress &addr : addrList ) { QUdpSocket udpSocket; diff --git a/core/main.cpp b/core/main.cpp index 29de409f..9a2a778a 100644 --- a/core/main.cpp +++ b/core/main.cpp @@ -103,7 +103,7 @@ static void setupTranslator(QApplication* app, translationFolders << qApp->applicationDirPath() << QStandardPaths::standardLocations(QStandardPaths::AppLocalDataLocation); - for ( const QString& folder : qAsConst(translationFolders) ) + for ( const QString& folder : static_cast(translationFolders) ) { qCDebug(runtime) << "Looking for a translation in" << folder << QString("i18n%1qlog_%2").arg(QDir::separator(), localeLang); QTranslator* translator = new QTranslator(app); diff --git a/cwkey/drivers/CWFldigiKey.cpp b/cwkey/drivers/CWFldigiKey.cpp index 4b0f12c1..0b39fd37 100644 --- a/cwkey/drivers/CWFldigiKey.cpp +++ b/cwkey/drivers/CWFldigiKey.cpp @@ -265,7 +265,7 @@ bool CWFldigiKey::sendXMLRPCCall(const QString & methodName, { writer.writeStartElement("params"); - for( const QPair& param : qAsConst(*params) ) + for( const QPair& param : static_cast>&>(*params) ) { writer.writeStartElement("param"); writer.writeStartElement("value"); diff --git a/data/AntProfile.cpp b/data/AntProfile.cpp index 668b2e99..2e6fda84 100644 --- a/data/AntProfile.cpp +++ b/data/AntProfile.cpp @@ -79,10 +79,10 @@ void AntProfilesManager::save() if ( deleteQuery.exec() ) { - auto keys = profileNameList(); - for ( auto &key: qAsConst(keys) ) + const QStringList &keys = profileNameList(); + for ( auto &key: keys ) { - AntProfile antProfile = getProfile(key); + const AntProfile &antProfile = getProfile(key); insertQuery.bindValue(":profile_name", key); insertQuery.bindValue(":desc", antProfile.description); diff --git a/data/CWKeyProfile.cpp b/data/CWKeyProfile.cpp index 906f3a95..386be182 100644 --- a/data/CWKeyProfile.cpp +++ b/data/CWKeyProfile.cpp @@ -93,10 +93,10 @@ void CWKeyProfilesManager::save() if ( deleteQuery.exec() ) { - auto keys = profileNameList(); - for ( auto &key: qAsConst(keys) ) + const QStringList &keys = profileNameList(); + for ( auto &key: keys ) { - CWKeyProfile cwKeyProfile = getProfile(key); + const CWKeyProfile &cwKeyProfile = getProfile(key); insertQuery.bindValue(":profile_name", key); insertQuery.bindValue(":model", cwKeyProfile.model); diff --git a/data/CWShortcutProfile.cpp b/data/CWShortcutProfile.cpp index 1959e5c5..5dfedddd 100644 --- a/data/CWShortcutProfile.cpp +++ b/data/CWShortcutProfile.cpp @@ -106,10 +106,10 @@ void CWShortcutProfilesManager::save() if ( deleteQuery.exec() ) { - auto keys = profileNameList(); - for ( auto &key: qAsConst(keys) ) + const QStringList &keys = profileNameList(); + for ( auto &key: keys ) { - CWShortcutProfile cwShortcutProfile = getProfile(key); + const CWShortcutProfile &cwShortcutProfile = getProfile(key); insertQuery.bindValue(":profile_name", key); for ( int i = 0; i < cwShortcutProfile.shortDescs.size(); i++ ) diff --git a/data/DxSpot.h b/data/DxSpot.h index af6d21ba..df7c989b 100644 --- a/data/DxSpot.h +++ b/data/DxSpot.h @@ -25,7 +25,7 @@ class DxSpot QStringList memberList2StringList() const { QStringList ret; - for ( const ClubInfo &member : qAsConst(callsign_member) ) + for ( const ClubInfo &member : static_cast&>(callsign_member) ) { ret << member.getClubInfo(); } @@ -36,7 +36,7 @@ class DxSpot { QSet ret; - for ( const ClubInfo &member : qAsConst(callsign_member) ) + for ( const ClubInfo &member : static_cast&>(callsign_member) ) { ret << member.getClubInfo(); } diff --git a/data/MainLayoutProfile.cpp b/data/MainLayoutProfile.cpp index 1add29c4..ed4867dd 100644 --- a/data/MainLayoutProfile.cpp +++ b/data/MainLayoutProfile.cpp @@ -96,10 +96,10 @@ void MainLayoutProfilesManager::save() if ( deleteQuery.exec() ) { - auto keys = profileNameList(); - for ( auto &key: qAsConst(keys) ) + const QStringList &keys = profileNameList(); + for ( auto &key: keys ) { - MainLayoutProfile layoutProfile = getProfile(key); + const MainLayoutProfile &layoutProfile = getProfile(key); insertQuery.bindValue(":profile_name", key); insertQuery.bindValue(":row_A", toDBStringList(layoutProfile.rowA)); diff --git a/data/RigProfile.cpp b/data/RigProfile.cpp index a0e0751f..628b8aea 100644 --- a/data/RigProfile.cpp +++ b/data/RigProfile.cpp @@ -159,10 +159,10 @@ void RigProfilesManager::save() if ( deleteQuery.exec() ) { - auto keys = profileNameList(); - for ( auto &key: qAsConst(keys) ) + const QStringList &keys = profileNameList(); + for ( auto &key: keys ) { - RigProfile rigProfile = getProfile(key); + const RigProfile &rigProfile = getProfile(key); insertQuery.bindValue(":profile_name", key); insertQuery.bindValue(":model", rigProfile.model); diff --git a/data/RotProfile.cpp b/data/RotProfile.cpp index ad8f65a1..63a9d308 100644 --- a/data/RotProfile.cpp +++ b/data/RotProfile.cpp @@ -106,10 +106,10 @@ void RotProfilesManager::save() if ( deleteQuery.exec() ) { - auto keys = profileNameList(); - for ( auto &key: qAsConst(keys) ) + const QStringList &keys = profileNameList(); + for ( auto &key: keys ) { - RotProfile rigProfile = getProfile(key); + const RotProfile &rigProfile = getProfile(key); insertQuery.bindValue(":profile_name", key); insertQuery.bindValue(":model", rigProfile.model); diff --git a/data/RotUsrButtonsProfile.cpp b/data/RotUsrButtonsProfile.cpp index b384fa8d..724dffed 100644 --- a/data/RotUsrButtonsProfile.cpp +++ b/data/RotUsrButtonsProfile.cpp @@ -106,10 +106,10 @@ void RotUsrButtonsProfilesManager::save() if ( deleteQuery.exec() ) { - auto keys = profileNameList(); - for ( auto &key: qAsConst(keys) ) + const QStringList &keys = profileNameList(); + for ( auto &key: keys ) { - RotUsrButtonsProfile rotUsrButtonProfile = getProfile(key); + const RotUsrButtonsProfile &rotUsrButtonProfile = getProfile(key); insertQuery.bindValue(":profile_name", key); for ( int i = 0; i < rotUsrButtonProfile.shortDescs.size(); i++ ) diff --git a/data/SpotAlert.h b/data/SpotAlert.h index 34477a86..65075d65 100644 --- a/data/SpotAlert.h +++ b/data/SpotAlert.h @@ -36,7 +36,7 @@ struct SpotAlert QStringList memberList2StringList() const { QStringList ret; - for ( const ClubInfo &member : qAsConst(callsign_member) ) + for ( const ClubInfo &member : static_cast&>(callsign_member) ) { ret << member.getClubInfo(); } diff --git a/data/WsjtxEntry.h b/data/WsjtxEntry.h index c3c13d3f..0aeacdd6 100644 --- a/data/WsjtxEntry.h +++ b/data/WsjtxEntry.h @@ -23,7 +23,7 @@ struct WsjtxEntry { QStringList memberList2StringList() const { QStringList ret; - for ( const ClubInfo &member : qAsConst(callsign_member) ) + for ( const ClubInfo &member : static_cast&>(callsign_member) ) { ret << member.getClubInfo(); } @@ -34,7 +34,7 @@ struct WsjtxEntry { { QSet ret; - for ( const ClubInfo &member : qAsConst(callsign_member) ) + for ( const ClubInfo &member : static_cast&>(callsign_member) ) { ret << member.getClubInfo(); } diff --git a/logformat/CSVFormat.cpp b/logformat/CSVFormat.cpp index 3b86c163..bd3bc695 100644 --- a/logformat/CSVFormat.cpp +++ b/logformat/CSVFormat.cpp @@ -32,10 +32,10 @@ void CSVFormat::exportEnd() FCT_IDENTIFICATION; // Print Header - QMap sorts keys automatically - QList headerKeys(header.keys()); + const QList headerKeys(header.keys()); QStringList row; - for ( const QString& headerField : qAsConst(headerKeys) ) + for ( const QString& headerField : headerKeys ) { row << headerField; } @@ -43,11 +43,11 @@ void CSVFormat::exportEnd() stream << row.join(delimiter) << "\n"; // Normalize and print exported records - for ( const QHash &record : qAsConst(exportedRecords) ) + for ( const QHash &record : static_cast>&>(exportedRecords) ) { row.clear(); - for ( const QString& headerField : qAsConst(headerKeys) ) + for ( const QString& headerField : headerKeys ) { row << record.value(headerField); } diff --git a/logformat/LogFormat.cpp b/logformat/LogFormat.cpp index 0693b53b..1938ef6b 100644 --- a/logformat/LogFormat.cpp +++ b/logformat/LogFormat.cpp @@ -1031,7 +1031,7 @@ long LogFormat::runExport(const QList &selectedQSOs) if ( exportedFields.first() != "*" ) { - for ( const QString& fieldName : qAsConst(exportedFields) ) + for ( const QString& fieldName : static_cast(exportedFields) ) { contactRecord.append(qso.field(fieldName)); } diff --git a/ui/AlertRuleDetail.cpp b/ui/AlertRuleDetail.cpp index 773f1577..13d20ecb 100644 --- a/ui/AlertRuleDetail.cpp +++ b/ui/AlertRuleDetail.cpp @@ -232,7 +232,7 @@ void AlertRuleDetail::save() if ( ui->memberGroupBox->isChecked() ) { - for ( QCheckBox* item: qAsConst(memberListCheckBoxes) ) + for ( QCheckBox* item: static_cast&>(memberListCheckBoxes) ) { if ( item->isChecked() ) { @@ -674,7 +674,7 @@ void AlertRuleDetail::generateMembershipCheckboxes(const AlertRule * rule) { int elementIndex = 0; - for ( QCheckBox* item: qAsConst(memberListCheckBoxes) ) + for ( QCheckBox* item: static_cast&>(memberListCheckBoxes) ) { ui->dxMemberGrid->addWidget(item, elementIndex / 6, elementIndex % 6); elementIndex++; diff --git a/ui/DxFilterDialog.cpp b/ui/DxFilterDialog.cpp index fc7f2fca..56bbbe62 100644 --- a/ui/DxFilterDialog.cpp +++ b/ui/DxFilterDialog.cpp @@ -203,7 +203,7 @@ void DxFilterDialog::accept() { memberList.append("DUMMYCLUB"); - for ( QCheckBox* item: qAsConst(memberListCheckBoxes) ) + for ( QCheckBox* item: static_cast&>(memberListCheckBoxes) ) { if ( item->isChecked() ) { @@ -244,7 +244,7 @@ void DxFilterDialog::generateMembershipCheckboxes() { int elementIndex = 0; - for ( QCheckBox* item: qAsConst(memberListCheckBoxes) ) + for ( QCheckBox* item: static_cast&>(memberListCheckBoxes) ) { ui->dxMemberGrid->addWidget(item, elementIndex / 3, elementIndex % 3); elementIndex++; diff --git a/ui/DxWidget.cpp b/ui/DxWidget.cpp index 18128456..0b15b4e4 100644 --- a/ui/DxWidget.cpp +++ b/ui/DxWidget.cpp @@ -122,7 +122,7 @@ bool DxTableModel::addEntry(DxSpot entry, bool deduplicate, bool shouldInsert = true; if ( deduplicate ) { - for (const DxSpot &record : qAsConst(dxData)) + for (const DxSpot &record : static_cast&>(dxData)) { if ( record.time.secsTo(entry.time) > dedup_interval ) break; diff --git a/ui/FreqQSpinBox.cpp b/ui/FreqQSpinBox.cpp index 6a84bf2e..949eaa8a 100644 --- a/ui/FreqQSpinBox.cpp +++ b/ui/FreqQSpinBox.cpp @@ -50,7 +50,7 @@ void FreqQSpinBox::increaseByBand() if ( enabledBands.size() == 0 ) return; - for ( const Band &band : qAsConst(enabledBands) ) + for ( const Band &band : static_cast&>(enabledBands) ) { if ( band.start > value() ) { @@ -68,7 +68,7 @@ void FreqQSpinBox::decreaseByBand() double result = enabledBands.at(0).start; - for ( const Band &band : qAsConst(enabledBands) ) + for ( const Band &band : static_cast&>(enabledBands) ) { if ( band.start < value() ) result = band.start; diff --git a/ui/KSTHighlightRuleDetail.cpp b/ui/KSTHighlightRuleDetail.cpp index 69fbde7b..e2465d61 100644 --- a/ui/KSTHighlightRuleDetail.cpp +++ b/ui/KSTHighlightRuleDetail.cpp @@ -152,8 +152,8 @@ void KSTHighlightRuleDetail::save() rule.enabled = ui->enabledCheckbox->isChecked(); rule.interConditionOperand = static_cast(ui->matchCombo->currentIndex()); - QList conditionLayouts = ui->conditionsLayout->findChildren(); - for (auto &conditionLine: qAsConst(conditionLayouts) ) + const QList &conditionLayouts = ui->conditionsLayout->findChildren(); + for (auto &conditionLine: conditionLayouts ) { chatHighlightRule::Condition condition; for ( int i = 0; i < 3; i++ ) @@ -217,7 +217,7 @@ void KSTHighlightRuleDetail::loadRule(const QString &ruleName) ui->enabledCheckbox->setChecked(rule.enabled); ui->matchCombo->setCurrentIndex(rule.interConditionOperand); - for ( const chatHighlightRule::Condition &condition : qAsConst(rule.conditions)) + for ( const chatHighlightRule::Condition &condition : static_cast&>(rule.conditions)) { addCondition(condition.source, condition.operatorID, diff --git a/ui/LogbookWidget.cpp b/ui/LogbookWidget.cpp index d858e10a..66cd60b2 100644 --- a/ui/LogbookWidget.cpp +++ b/ui/LogbookWidget.cpp @@ -567,7 +567,7 @@ void LogbookWidget::deleteContact() int cnt = 0; - for ( const QModelIndex &index : qAsConst(deletedRowIndexes) ) + for ( const QModelIndex &index : static_cast(deletedRowIndexes) ) { cnt++; model->removeRow(index.row()); diff --git a/ui/MainLayoutEditor.cpp b/ui/MainLayoutEditor.cpp index 31922ba6..442bc5cf 100644 --- a/ui/MainLayoutEditor.cpp +++ b/ui/MainLayoutEditor.cpp @@ -369,7 +369,7 @@ QList MainLayoutEditor::getFieldIndexes(StringListModel *model) const QStringList &list = model->stringList(); QList ret; - for ( const QString &fieldName : qAsConst(list) ) + for ( const QString &fieldName : list ) { int index = dynamicWidgets->getIndex4FieldLabelName(fieldName); if ( index >= 0 ) @@ -383,35 +383,35 @@ void MainLayoutEditor::fillWidgets(const MainLayoutProfile &profile) { FCT_IDENTIFICATION; - for ( int fieldIndex : qAsConst(profile.rowA) ) + for ( int fieldIndex : static_cast&>(profile.rowA) ) { QString fieldName = dynamicWidgets->getFieldLabelName4Index(fieldIndex); qsoRowAFieldsModel->append(fieldName); availableFieldsModel->deleteItem(fieldName); } - for ( int fieldIndex : qAsConst(profile.rowB) ) + for ( int fieldIndex : static_cast&>(profile.rowB) ) { QString fieldName = dynamicWidgets->getFieldLabelName4Index(fieldIndex); qsoRowBFieldsModel->append(fieldName); availableFieldsModel->deleteItem(fieldName); } - for ( int fieldIndex : qAsConst(profile.detailColA) ) + for ( int fieldIndex : static_cast&>(profile.detailColA) ) { QString fieldName = dynamicWidgets->getFieldLabelName4Index(fieldIndex); detailColAFieldsModel->append(fieldName); availableFieldsModel->deleteItem(fieldName); } - for ( int fieldIndex : qAsConst(profile.detailColB) ) + for ( int fieldIndex : static_cast&>(profile.detailColB) ) { QString fieldName = dynamicWidgets->getFieldLabelName4Index(fieldIndex); detailColBFieldsModel->append(fieldName); availableFieldsModel->deleteItem(fieldName); } - for ( int fieldIndex : qAsConst(profile.detailColC) ) + for ( int fieldIndex : static_cast&>(profile.detailColC) ) { QString fieldName = dynamicWidgets->getFieldLabelName4Index(fieldIndex); detailColCFieldsModel->append(fieldName); diff --git a/ui/MainLayoutEditor.h b/ui/MainLayoutEditor.h index 496daa94..d307d339 100644 --- a/ui/MainLayoutEditor.h +++ b/ui/MainLayoutEditor.h @@ -32,13 +32,13 @@ class StringListModel : public QStringListModel void deleteItem(const QString &value) { - QModelIndexList itemIndexList = match(index(0,0), + const QModelIndexList &itemIndexList = match(index(0,0), Qt::DisplayRole, value, 1, Qt::MatchExactly); - for (const QModelIndex & itemIndex: qAsConst(itemIndexList)) + for ( const QModelIndex & itemIndex: itemIndexList ) { deleteItem(itemIndex); } diff --git a/ui/NewContactWidget.cpp b/ui/NewContactWidget.cpp index 5ab69cc9..45f2c212 100644 --- a/ui/NewContactWidget.cpp +++ b/ui/NewContactWidget.cpp @@ -2364,8 +2364,8 @@ void NewContactWidget::setupCustomUi() FCT_IDENTIFICATION; // Clear Custom Lines - QList customUiRows = ui->customLayout->findChildren(); - for ( auto &rowLayout : qAsConst(customUiRows) ) + const QList &customUiRows = ui->customLayout->findChildren(); + for ( auto &rowLayout : customUiRows ) { qCDebug(runtime) << "Removing objects from " << rowLayout->objectName(); @@ -2385,7 +2385,7 @@ void NewContactWidget::setupCustomUi() QList detailColumns; detailColumns << ui->detailColA << ui->detailColB << ui->detailColC; - for ( QFormLayout * layout : qAsConst(detailColumns) ) + for ( QFormLayout * layout : static_cast&>(detailColumns) ) { qCDebug(runtime) << "Removing" << layout->rowCount() <<"object(s) from" << layout->objectName(); @@ -3442,7 +3442,7 @@ QStringList NewContactDynamicWidgets::getAllFieldLabelNames() const QStringList ret; const QList &dynWidget = widgetMapping.values(); - for (const DynamicWidget &widget : qAsConst(dynWidget)) + for (const DynamicWidget &widget : dynWidget) { ret << widget.fieldLabelName; } diff --git a/ui/PaperQSLDialog.cpp b/ui/PaperQSLDialog.cpp index 3c52c970..4a9ff9f2 100644 --- a/ui/PaperQSLDialog.cpp +++ b/ui/PaperQSLDialog.cpp @@ -90,9 +90,9 @@ void PaperQSLDialog::showAvailableFiles() { FCT_IDENTIFICATION; - QStringList files = qsl->getAvailableQSLNames(dialogQSORecord, QSLObject::QSLFILE); + const QStringList &files = qsl->getAvailableQSLNames(dialogQSORecord, QSLObject::QSLFILE); - for ( auto &file : qAsConst(files) ) + for ( auto &file : files ) { addFileToDialog(file); } diff --git a/ui/QSODetailDialog.cpp b/ui/QSODetailDialog.cpp index 847a996c..1a21a54b 100644 --- a/ui/QSODetailDialog.cpp +++ b/ui/QSODetailDialog.cpp @@ -845,9 +845,9 @@ bool QSODetailDialog::doValidation() bool allValid = true; - QList list = findChildren(); + const QList &list = findChildren(); - for ( QLabel *label : qAsConst(list) ) + for ( QLabel *label : list ) { if ( label ) label->setToolTip(QString()); } diff --git a/ui/QSOFilterDetail.cpp b/ui/QSOFilterDetail.cpp index ebff4465..93b52436 100644 --- a/ui/QSOFilterDetail.cpp +++ b/ui/QSOFilterDetail.cpp @@ -511,9 +511,9 @@ void QSOFilterDetail::save() { if ( deleteFilterStmt.exec() ) { - QList conditionLayouts = ui->conditionsLayout->findChildren(); + const QList &conditionLayouts = ui->conditionsLayout->findChildren(); - for (auto &condition: qAsConst(conditionLayouts) ) + for (auto &condition: conditionLayouts ) { int fieldNameIdx = 0; int conditionIdx = 0; diff --git a/ui/SettingsDialog.cpp b/ui/SettingsDialog.cpp index ba3e31f1..884a9cdd 100644 --- a/ui/SettingsDialog.cpp +++ b/ui/SettingsDialog.cpp @@ -1237,10 +1237,10 @@ void SettingsDialog::delCWKeyProfile() { QStringList dependentRigs; QString removedCWProfile = ui->cwProfilesListView->model()->data(index).toString(); - QStringList availableRigProfileNames = rigProfManager->profileNameList(); + const QStringList &availableRigProfileNames = rigProfManager->profileNameList(); /* needed to verify whether removed Key is not used in Rig Profile as an assigned Key*/ - for ( const QString &rigProfileName : qAsConst(availableRigProfileNames) ) + for ( const QString &rigProfileName : availableRigProfileNames ) { qCDebug(runtime) << "Checking Rig Profile" << rigProfileName; RigProfile testedRig = rigProfManager->getProfile(rigProfileName); @@ -2406,7 +2406,7 @@ void SettingsDialog::writeSettings() { QStringList enabledLists; - for ( QCheckBox* item: qAsConst(memberListCheckBoxes) ) + for ( QCheckBox* item: static_cast&>(memberListCheckBoxes) ) { if ( item->isChecked() ) { @@ -2646,7 +2646,7 @@ void SettingsDialog::generateMembershipCheckboxes() { int elementIndex = 0; - for ( QCheckBox* item: qAsConst(memberListCheckBoxes) ) + for ( QCheckBox* item: static_cast&>(memberListCheckBoxes) ) { ui->clubListGrig->addWidget(item, elementIndex / 6, elementIndex % 6); elementIndex++; diff --git a/ui/WsjtxFilterDialog.cpp b/ui/WsjtxFilterDialog.cpp index 4bb80555..9760638d 100644 --- a/ui/WsjtxFilterDialog.cpp +++ b/ui/WsjtxFilterDialog.cpp @@ -114,7 +114,7 @@ void WsjtxFilterDialog::accept() { memberList.append("DUMMYCLUB"); - for ( QCheckBox* item: qAsConst(memberListCheckBoxes) ) + for ( QCheckBox* item: static_cast&>(memberListCheckBoxes) ) { if ( item->isChecked() ) { @@ -155,7 +155,7 @@ void WsjtxFilterDialog::generateMembershipCheckboxes() { int elementIndex = 0; - for ( QCheckBox* item: qAsConst(memberListCheckBoxes) ) + for ( QCheckBox* item: static_cast&>(memberListCheckBoxes) ) { ui->dxMemberGrid->addWidget(item, elementIndex / 3, elementIndex % 3); elementIndex++; From a2903f64cf88b8006c26c2143948bded921b211d Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sun, 29 Sep 2024 19:12:26 +0200 Subject: [PATCH 61/74] QT6: Removed the use of the fromUtf18 - ushort --- core/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/main.cpp b/core/main.cpp index 9a2a778a..e5f46d0a 100644 --- a/core/main.cpp +++ b/core/main.cpp @@ -219,8 +219,8 @@ static bool createSQLFunctions() SQLITE_UTF16, nullptr, [](void *, int ll, const void * l, int rl, const void * r) { - const QString &left = QString::fromUtf16((const ushort *)l, ll/2); - const QString &right = QString::fromUtf16((const ushort *)r, rl/2); + const QString &left = QString::fromUtf16(reinterpret_cast(l), ll/2); + const QString &right = QString::fromUtf16(reinterpret_cast(r), rl/2); return QString::localeAwareCompare(left, right); // controlled by LC_COLLATE }); } From 8d4e44a8ca977280166774d425f12a6acd89fa06 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Mon, 30 Sep 2024 09:09:25 +0200 Subject: [PATCH 62/74] Fixed warning QSqlDatabase requires a QCoreApplication under QT6.7 --- core/MembershipQE.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/MembershipQE.cpp b/core/MembershipQE.cpp index c87cd6e5..7f2163b1 100644 --- a/core/MembershipQE.cpp +++ b/core/MembershipQE.cpp @@ -484,11 +484,6 @@ ClubStatusQuery::ClubStatusQuery(QObject *parent) : ClubStatusQuery::~ClubStatusQuery() { FCT_IDENTIFICATION; - { - qCDebug(runtime) << "Closing connection to DB"; - QSqlDatabase db1 = QSqlDatabase::database(dbConnectionName); - db1.close(); - } QSqlDatabase::removeDatabase(dbConnectionName); } From e1c8b8325cf4d0f7a8ccfa6c581428c823b81bc7 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Mon, 30 Sep 2024 09:25:37 +0200 Subject: [PATCH 63/74] Fixed warning QSqlDatabase requires a QCoreApplication under QT6.7 (2) --- core/MembershipQE.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/MembershipQE.cpp b/core/MembershipQE.cpp index 7f2163b1..c7adf5ac 100644 --- a/core/MembershipQE.cpp +++ b/core/MembershipQE.cpp @@ -484,8 +484,6 @@ ClubStatusQuery::ClubStatusQuery(QObject *parent) : ClubStatusQuery::~ClubStatusQuery() { FCT_IDENTIFICATION; - - QSqlDatabase::removeDatabase(dbConnectionName); } void ClubStatusQuery::getClubStatus(const QString &in_callsign, From c69ad477ab39f2056b46a47d6dc37219b8f280c5 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Mon, 30 Sep 2024 15:01:01 +0200 Subject: [PATCH 64/74] DXC: Full-text Search searches only in visible columns --- models/SearchFilterProxyModel.cpp | 9 +++++++++ models/SearchFilterProxyModel.h | 2 ++ ui/DxWidget.cpp | 17 +++++++++++++++++ ui/DxWidget.h | 1 + 4 files changed, 29 insertions(+) diff --git a/models/SearchFilterProxyModel.cpp b/models/SearchFilterProxyModel.cpp index a549780a..e7d46866 100644 --- a/models/SearchFilterProxyModel.cpp +++ b/models/SearchFilterProxyModel.cpp @@ -10,11 +10,20 @@ void SearchFilterProxyModel::setSearchString(const QString &searchString) invalidateFilter(); } +void SearchFilterProxyModel::setSearchSkippedCols(const QVector &columns) +{ + searchSkippedCols = columns; + invalidateFilter(); +} + bool SearchFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { // full-text search for ( int col = 0; col < sourceModel()->columnCount(); ++col ) { + if (searchSkippedCols.contains(col) ) + continue; + QModelIndex index = sourceModel()->index(source_row, col, source_parent); QString data = index.data(Qt::DisplayRole).toString(); diff --git a/models/SearchFilterProxyModel.h b/models/SearchFilterProxyModel.h index a211c2f4..9cf93922 100644 --- a/models/SearchFilterProxyModel.h +++ b/models/SearchFilterProxyModel.h @@ -10,12 +10,14 @@ class SearchFilterProxyModel : public QSortFilterProxyModel public: SearchFilterProxyModel(QObject* parent = nullptr); void setSearchString(const QString& searchString); + void setSearchSkippedCols(const QVector &columns); protected: bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; private: QString searchString; + QVector searchSkippedCols; }; #endif // QLOG_MODELS_SEARCHFILTERPROXYMODEL_H diff --git a/ui/DxWidget.cpp b/ui/DxWidget.cpp index 0b15b4e4..5f3daf65 100644 --- a/ui/DxWidget.cpp +++ b/ui/DxWidget.cpp @@ -481,6 +481,7 @@ DxWidget::DxWidget(QWidget *parent) : ui->actionConnectOnStartup->setChecked(getAutoconnectServer()); ui->actionKeepSpots->setChecked(getKeepQSOs()); + dxTableProxyModel->setSearchSkippedCols(dxcListHiddenCols()); } void DxWidget::toggleConnect() @@ -1473,6 +1474,8 @@ void DxWidget::displayedColumns() ColumnSettingSimpleDialog dialog(view); dialog.exec(); saveWidgetSetting(); + if ( view == ui->dxTable ) + dxTableProxyModel->setSearchSkippedCols(dxcListHiddenCols()); } } @@ -1581,6 +1584,20 @@ void DxWidget::processDxSpot(const QString &spotter, } } +QVector DxWidget::dxcListHiddenCols() const +{ + QVector ret; + ret.reserve(dxTableModel->columnCount()); + + for ( int i = 0; i < dxTableModel->columnCount(); ++i ) + { + if (ui->dxTable->isColumnHidden(i)) + ret.append(i); + } + + return ret; +} + BandPlan::BandPlanMode DxWidget::modeGroupFromComment(const QString &comment) const { FCT_IDENTIFICATION; diff --git a/ui/DxWidget.h b/ui/DxWidget.h index 2d58649d..93f9926d 100644 --- a/ui/DxWidget.h +++ b/ui/DxWidget.h @@ -227,6 +227,7 @@ private slots: const QString &comment, const QDateTime &dateTime = QDateTime()); + QVector dxcListHiddenCols() const; BandPlan::BandPlanMode modeGroupFromComment(const QString &comment) const; }; From a2a099fcb0439180a0cd564281c4d1b56c9a6378 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Mon, 30 Sep 2024 17:00:16 +0200 Subject: [PATCH 65/74] DXC: Added the DX Cluster Commnad line placeholder --- ui/DxWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/DxWidget.cpp b/ui/DxWidget.cpp index 5f3daf65..6ca31eac 100644 --- a/ui/DxWidget.cpp +++ b/ui/DxWidget.cpp @@ -1189,7 +1189,7 @@ void DxWidget::connected() ui->commandEdit->setEnabled(true); ui->connectButton->setEnabled(true); ui->connectButton->setText(tr("Disconnect")); - ui->commandEdit->setPlaceholderText(""); + ui->commandEdit->setPlaceholderText(tr("DX Cluster Command")); ui->serverSelect->setStyleSheet("QComboBox {color: green}"); connectionState = CONNECTED; saveDXCServers(); From 1ba7c7d244ebaa57d8bb2d2aa7bea2fc5ba35275 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Tue, 1 Oct 2024 14:14:42 +0200 Subject: [PATCH 66/74] HamlibDrv: Error handling unification --- rig/drivers/HamlibRigDrv.cpp | 114 ++++++++++++----------------------- rig/drivers/HamlibRigDrv.h | 5 +- 2 files changed, 42 insertions(+), 77 deletions(-) diff --git a/rig/drivers/HamlibRigDrv.cpp b/rig/drivers/HamlibRigDrv.cpp index a2dbc3f9..0bbbcefd 100644 --- a/rig/drivers/HamlibRigDrv.cpp +++ b/rig/drivers/HamlibRigDrv.cpp @@ -215,8 +215,7 @@ bool HamlibRigDrv::open() if ( status != RIG_OK ) { - lastErrorText = hamlibErrorString(status); - qCDebug(runtime) << "Rig Open Error" << lastErrorText; + errorHandler(status, tr("Rig Open Error"), false); return false; } else @@ -310,12 +309,8 @@ void HamlibRigDrv::setFrequency(double newFreq) int status = rig_set_freq(rig, RIG_VFO_CURR, newFreq); if ( status != RIG_OK ) - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Set Freq error" << lastErrorText; - emit errorOccured(tr("Set Frequency Error"), - lastErrorText); - } + errorHandler(status, tr("Set Frequency Error")); + commandSleep(); } @@ -358,11 +353,7 @@ void HamlibRigDrv::__setMode(rmode_t newModeID) int status = rig_set_mode(rig, RIG_VFO_CURR, newModeID, RIG_PASSBAND_NOCHANGE); if ( status != RIG_OK ) - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Set KeySpeed error" << lastErrorText; - //emit errorOccured(lastErrorText); - } + errorHandler(status, tr("Set Mode Error"), false); commandSleep(); } } @@ -387,12 +378,7 @@ void HamlibRigDrv::setPTT(bool newPTTState) int status = rig_set_ptt(rig, RIG_VFO_CURR, (newPTTState ? RIG_PTT_ON : RIG_PTT_OFF)); if ( status != RIG_OK ) - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Set PTT error" << lastErrorText; - emit errorOccured(tr("Set PTT Error"), - lastErrorText); - } + errorHandler(status, tr("Set PTT Error")); // wait a moment because Rigs are slow and they are not possible to set and get // mode so quickly @@ -459,11 +445,8 @@ void HamlibRigDrv::sendMorse(const QString &text) int status = rig_send_morse(rig, RIG_VFO_CURR, text.toLocal8Bit().constData()); if ( status != RIG_OK ) - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Cannot sent Morse" << lastErrorText; - //emit errorOccured(lastErrorText); - } + errorHandler(status, tr("Cannot sent Morse"), false); + commandSleep(); } @@ -483,11 +466,7 @@ void HamlibRigDrv::stopMorse() int status = rig_stop_morse(rig, RIG_VFO_CURR); if ( status != RIG_OK ) - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Cannot Stop Morse" << lastErrorText; - //emit errorOccured(lastErrorText); - } + errorHandler(status, tr("Cannot stop Morse"), false); #endif commandSleep(); } @@ -589,10 +568,7 @@ void HamlibRigDrv::checkPTTChange() } } else - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get PTT error" << lastErrorText; - } + errorHandler(status, tr("Get PTT Error"), false); } else { @@ -632,10 +608,7 @@ bool HamlibRigDrv::checkFreqChange() } else { - lastErrorText = hamlibErrorString(status); - emit errorOccured(tr("Get Frequency Error"), - lastErrorText); - qCWarning(runtime) << "Get Freq error" << lastErrorText; + errorHandler(status, tr("Get Frequency Error")); return false; } } @@ -689,10 +662,7 @@ bool HamlibRigDrv::checkModeChange() } else { - lastErrorText = hamlibErrorString(status); - emit errorOccured(tr("Get Mode Error"), - lastErrorText); - qCWarning(runtime) << "Get Mode error" << lastErrorText; + errorHandler(status, tr("Get Mode Error")); return false; } } @@ -735,10 +705,7 @@ void HamlibRigDrv::checkVFOChange() } } else - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get VFO error" << lastErrorText; - } + errorHandler(status, tr("Get VFO Error"), false); } else { @@ -783,16 +750,10 @@ void HamlibRigDrv::checkPWRChange() } } else - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get PWR power2mw error" << lastErrorText; - } + errorHandler(status, tr("Get PWR (power2mw) Error"), false); } else - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get PWR error" << lastErrorText; - } + errorHandler(status, tr("Get PWR Error"), false); } else { @@ -828,8 +789,7 @@ void HamlibRigDrv::checkRITChange() if ( status != RIG_OK ) { rit = s_Hz(0); - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get RIT error" << lastErrorText; + errorHandler(status, tr("Get RIT Error"), false); } } else @@ -857,10 +817,7 @@ void HamlibRigDrv::checkRITChange() } } else - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get RIT Function error" << lastErrorText; - } + errorHandler(status, tr("Get RIT Function Error"), false); } else { @@ -896,8 +853,7 @@ void HamlibRigDrv::checkXITChange() if ( status != RIG_OK ) { xit = s_Hz(0); - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get XIT error" << lastErrorText; + errorHandler(status, tr("Get XIT Error"), false); } } else @@ -925,10 +881,7 @@ void HamlibRigDrv::checkXITChange() } } else - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get XIT Function error" << lastErrorText; - } + errorHandler(status, tr("Get XIT Function Error"), false); } else { @@ -965,10 +918,7 @@ void HamlibRigDrv::checkKeySpeedChange() } } else - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get KeySpeed error" << lastErrorText; - } + errorHandler(status, tr("Get KeySpeed Error"), false); } else { @@ -1014,11 +964,7 @@ void HamlibRigDrv::__setKeySpeed(qint16 wpm) int status = rig_set_level(rig, RIG_VFO_CURR, RIG_LEVEL_KEYSPD, hamlibWPM); if ( status != RIG_OK ) - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Set KeySpeed error" << lastErrorText; - //emit errorOccured(lastErrorText); - } + errorHandler(status, tr("et KeySpeed Error"), false); commandSleep(); } @@ -1030,6 +976,22 @@ void HamlibRigDrv::commandSleep() QThread::msleep(200); } +void HamlibRigDrv::errorHandler(int errorStatus, + const QString &errorName, + bool emitError) +{ + FCT_IDENTIFICATION; + + QStringList detailLines; + lastErrorText = hamlibErrorString(errorStatus, detailLines); + qCWarning(runtime) << "Rig Error:" + << errorName + << detailLines; + + if ( emitError ) + emit errorOccured(errorName, lastErrorText); +} + const QString HamlibRigDrv::getModeNormalizedText(const rmode_t mode, QString &submode) const { @@ -1113,15 +1075,15 @@ serial_parity_e HamlibRigDrv::stringToHamlibParity(const QString &in_parity) return RIG_PARITY_NONE; } -QString HamlibRigDrv::hamlibErrorString(int errorCode) +QString HamlibRigDrv::hamlibErrorString(int errorCode, QStringList &errorList) { FCT_IDENTIFICATION; qCDebug(function_parameters) << errorCode; static QRegularExpression re("[\r\n]"); + errorList = QString(rigerror(errorCode)).split(re); - const QStringList &errorList = QString(rigerror(errorCode)).split(re); QString ret; if ( errorList.size() >= 1 ) diff --git a/rig/drivers/HamlibRigDrv.h b/rig/drivers/HamlibRigDrv.h index 91fccf91..06cd9029 100644 --- a/rig/drivers/HamlibRigDrv.h +++ b/rig/drivers/HamlibRigDrv.h @@ -61,6 +61,9 @@ private slots: void __setKeySpeed(qint16 wpm); void __setMode(rmode_t newModeID); void commandSleep(); + void errorHandler(int errorStatus, + const QString &errorName, + bool emitError = true); const QString getModeNormalizedText(const rmode_t mode, QString &submode) const; @@ -68,7 +71,7 @@ private slots: const QString hamlibVFO2String(const vfo_t vfo) const; serial_handshake_e stringToHamlibFlowControl(const QString &in_flowcontrol); serial_parity_e stringToHamlibParity(const QString &in_parity); - QString hamlibErrorString(int); + QString hamlibErrorString(int, QStringList &); RIG* rig; QTimer timer; From 30a1f977bce642483d60253bd4373af414d52ac0 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Wed, 2 Oct 2024 12:32:11 +0200 Subject: [PATCH 67/74] Fixing #472 - HamlibDrv: Added a postponed handling for Rig soft errors In some cases, the rig may be busy, which can lead to an error message and a disconnect event. However, this does not mean that communication has stopped. This commit implements postponed error handling with a delay of 15 seconds. If the same error does not occur during this time and there is a successful operation for this type of error, then the error message is not sent to the operator. Currently, error handling is performed this way only for 'Get Freq' and 'Get Mode'. QLog also recognizes two types of errors: hard and soft. The hard error is reported immediately. The soft error is postponed. --- rig/drivers/HamlibRigDrv.cpp | 185 +++++++++++++++++------------------ rig/drivers/HamlibRigDrv.h | 13 ++- 2 files changed, 97 insertions(+), 101 deletions(-) diff --git a/rig/drivers/HamlibRigDrv.cpp b/rig/drivers/HamlibRigDrv.cpp index 0bbbcefd..9e7404b4 100644 --- a/rig/drivers/HamlibRigDrv.cpp +++ b/rig/drivers/HamlibRigDrv.cpp @@ -128,6 +128,9 @@ HamlibRigDrv::HamlibRigDrv(const RigProfile &profile, } rig_set_debug(RIG_DEBUG_BUG); + + connect(&errorTimer, &QTimer::timeout, + this, &HamlibRigDrv::checkErrorCounter); } HamlibRigDrv::~HamlibRigDrv() @@ -213,15 +216,10 @@ bool HamlibRigDrv::open() int status = rig_open(rig); - if ( status != RIG_OK ) - { - errorHandler(status, tr("Rig Open Error"), false); + if ( !isRigRespOK(status, tr("Rig Open Error"), false) ) return false; - } - else - { - qCDebug(runtime) << "Rig Open - OK"; - } + + qCDebug(runtime) << "Rig Open - OK"; opened = true; currRIT = MHz(rigProfile.ritOffset); @@ -307,9 +305,7 @@ void HamlibRigDrv::setFrequency(double newFreq) } int status = rig_set_freq(rig, RIG_VFO_CURR, newFreq); - - if ( status != RIG_OK ) - errorHandler(status, tr("Set Frequency Error")); + isRigRespOK(status, tr("Set Frequency Error"), false); commandSleep(); } @@ -351,9 +347,7 @@ void HamlibRigDrv::__setMode(rmode_t newModeID) && newModeID != currModeId ) { int status = rig_set_mode(rig, RIG_VFO_CURR, newModeID, RIG_PASSBAND_NOCHANGE); - - if ( status != RIG_OK ) - errorHandler(status, tr("Set Mode Error"), false); + isRigRespOK(status, tr("Set Mode Error"), false); commandSleep(); } } @@ -376,9 +370,7 @@ void HamlibRigDrv::setPTT(bool newPTTState) } int status = rig_set_ptt(rig, RIG_VFO_CURR, (newPTTState ? RIG_PTT_ON : RIG_PTT_OFF)); - - if ( status != RIG_OK ) - errorHandler(status, tr("Set PTT Error")); + isRigRespOK(status, tr("Set PTT Error"), false); // wait a moment because Rigs are slow and they are not possible to set and get // mode so quickly @@ -443,9 +435,7 @@ void HamlibRigDrv::sendMorse(const QString &text) } int status = rig_send_morse(rig, RIG_VFO_CURR, text.toLocal8Bit().constData()); - - if ( status != RIG_OK ) - errorHandler(status, tr("Cannot sent Morse"), false); + isRigRespOK(status, tr("Cannot sent Morse"), false); commandSleep(); } @@ -464,9 +454,7 @@ void HamlibRigDrv::stopMorse() #if (HAMLIBVERSION_MAJOR >= 4) int status = rig_stop_morse(rig, RIG_VFO_CURR); - - if ( status != RIG_OK ) - errorHandler(status, tr("Cannot stop Morse"), false); + isRigRespOK(status, tr("Cannot stop Morse"), false); #endif commandSleep(); } @@ -485,6 +473,7 @@ void HamlibRigDrv::stopTimers() FCT_IDENTIFICATION; timer.stop(); + errorTimer.stop(); } void HamlibRigDrv::sendDXSpot(const DxSpot &) @@ -534,6 +523,21 @@ void HamlibRigDrv::checkRigStateChange() drvLock.unlock(); } +void HamlibRigDrv::checkErrorCounter() +{ + FCT_IDENTIFICATION; + + if ( postponedErrors.isEmpty() ) + return; + + qCDebug(runtime) << postponedErrors; + + // emit only one error + auto it = postponedErrors.constBegin(); + emit errorOccured(it.key(), it.value()); + postponedErrors.clear(); +} + void HamlibRigDrv::checkPTTChange() { FCT_IDENTIFICATION; @@ -553,7 +557,7 @@ void HamlibRigDrv::checkPTTChange() ptt_t pttHamlib; int status = rig_get_ptt(rig, RIG_VFO_CURR, &pttHamlib); - if ( status == RIG_OK ) + if ( isRigRespOK(status, tr("Get PTT Error"), false) ) { bool ptt = ( pttHamlib == RIG_PTT_OFF ) ? false : true; @@ -567,13 +571,9 @@ void HamlibRigDrv::checkPTTChange() emit pttChanged(currPTT); } } - else - errorHandler(status, tr("Get PTT Error"), false); } else - { qCDebug(runtime) << "Get PTT is disabled"; - } } bool HamlibRigDrv::checkFreqChange() @@ -592,7 +592,7 @@ bool HamlibRigDrv::checkFreqChange() freq_t vfo_freq; int status = rig_get_freq(rig, RIG_VFO_CURR, &vfo_freq); - if ( status == RIG_OK ) + if ( isRigRespOK(status, tr("Get Frequency Error")) ) { qCDebug(runtime) << "Rig Freq: "<< QSTRING_FREQ(Hz2MHz(vfo_freq)); qCDebug(runtime) << "Object Freq: "<< QSTRING_FREQ(Hz2MHz(currFreq)); @@ -607,15 +607,11 @@ bool HamlibRigDrv::checkFreqChange() } } else - { - errorHandler(status, tr("Get Frequency Error")); return false; - } } else - { qCDebug(runtime) << "Get Freq is disabled"; - } + return true; } @@ -637,7 +633,7 @@ bool HamlibRigDrv::checkModeChange() int status = rig_get_mode(rig, RIG_VFO_CURR, &curr_modeId, &pbwidth); - if ( status == RIG_OK ) + if ( isRigRespOK(status, tr("Get Mode Error")) ) { qCDebug(runtime) << "Rig Mode: "<< curr_modeId << "Rig Filter: "<< pbwidth; qCDebug(runtime) << "Object Mode: "<< currModeId << "Object Filter:" << currPBWidth; @@ -661,15 +657,11 @@ bool HamlibRigDrv::checkModeChange() } } else - { - errorHandler(status, tr("Get Mode Error")); return false; - } } else - { qCDebug(runtime) << "Get Mode is disabled"; - } + return true; } @@ -690,7 +682,7 @@ void HamlibRigDrv::checkVFOChange() int status = rig_get_vfo(rig, &curr_vfo); - if ( status == RIG_OK ) + if ( isRigRespOK(status, tr("Get VFO Error"), false) ) { qCDebug(runtime) << "Rig VFO: "<< curr_vfo; qCDebug(runtime) << "Object VFO: "<< currVFO; @@ -704,13 +696,9 @@ void HamlibRigDrv::checkVFOChange() emit vfoChanged(rawVFOText); } } - else - errorHandler(status, tr("Get VFO Error"), false); } else - { qCDebug(runtime) << "Get VFO is disabled"; - } } void HamlibRigDrv::checkPWRChange() @@ -732,11 +720,11 @@ void HamlibRigDrv::checkPWRChange() int status = rig_get_level(rig, RIG_VFO_CURR, RIG_LEVEL_RFPOWER, &rigPowerLevel); - if ( status == RIG_OK ) + if ( isRigRespOK(status, tr("Get PWR Error"), false) ) { status = rig_power2mW(rig, &rigPower, rigPowerLevel.f, currFreq, currModeId); - if ( status == RIG_OK ) + if ( isRigRespOK(status, tr("Get PWR (power2mw) Error"), false) ) { qCDebug(runtime) << "Rig PWR: "<< rigPower; qCDebug(runtime) << "Object PWR: "<< currPWR; @@ -749,16 +737,10 @@ void HamlibRigDrv::checkPWRChange() emit powerChanged(mW2W(currPWR)); } } - else - errorHandler(status, tr("Get PWR (power2mw) Error"), false); - } - else - errorHandler(status, tr("Get PWR Error"), false); + } } else - { qCDebug(runtime) << "Get PWR is disabled"; - } } void HamlibRigDrv::checkRITChange() @@ -780,17 +762,14 @@ void HamlibRigDrv::checkRITChange() int status = rig_get_func(rig, RIG_VFO_CURR, RIG_FUNC_RIT, &ritStatus); - if ( status == RIG_OK ) + if ( isRigRespOK(status, tr("Get RIT Function Error"), false) ) { if ( ritStatus ) { /* RIT is on */ status = rig_get_rit(rig, RIG_VFO_CURR, &rit); - if ( status != RIG_OK ) - { + if ( !isRigRespOK(status, tr("Get RIT Error"), false) ) rit = s_Hz(0); - errorHandler(status, tr("Get RIT Error"), false); - } } else { @@ -816,13 +795,9 @@ void HamlibRigDrv::checkRITChange() Hz2MHz(getXITFreq())); } } - else - errorHandler(status, tr("Get RIT Function Error"), false); } else - { qCDebug(runtime) << "Get RIT is disabled"; - } } void HamlibRigDrv::checkXITChange() @@ -844,17 +819,14 @@ void HamlibRigDrv::checkXITChange() int status = rig_get_func(rig, RIG_VFO_CURR, RIG_FUNC_XIT, &xitStatus); - if ( status == RIG_OK ) + if ( isRigRespOK(status, tr("Get XIT Function Error"), false) ) { if ( xitStatus ) { /* XIT is on */ status = rig_get_xit(rig, RIG_VFO_CURR, &xit); - if ( status != RIG_OK ) - { + if ( !isRigRespOK(status, tr("Get XIT Error"), false) ) xit = s_Hz(0); - errorHandler(status, tr("Get XIT Error"), false); - } } else { @@ -880,13 +852,9 @@ void HamlibRigDrv::checkXITChange() Hz2MHz(getXITFreq())); } } - else - errorHandler(status, tr("Get XIT Function Error"), false); } else - { qCDebug(runtime) << "Get XIT is disabled"; - } } void HamlibRigDrv::checkKeySpeedChange() @@ -906,7 +874,7 @@ void HamlibRigDrv::checkKeySpeedChange() int status = rig_get_level(rig, RIG_VFO_CURR, RIG_LEVEL_KEYSPD, &rigKeySpeed); - if ( status == RIG_OK ) + if ( isRigRespOK(status, tr("Get KeySpeed Error"), false) ) { qCDebug(runtime) << "RIG Key Speed: "<< rigKeySpeed.i; qCDebug(runtime) << "Object Key Speed: "<< keySpeed; @@ -917,13 +885,9 @@ void HamlibRigDrv::checkKeySpeedChange() emit keySpeedChanged(keySpeed); } } - else - errorHandler(status, tr("Get KeySpeed Error"), false); } else - { qCDebug(runtime) << "Get KeySpeed is disabled"; - } } double HamlibRigDrv::getRITFreq() @@ -962,9 +926,7 @@ void HamlibRigDrv::__setKeySpeed(qint16 wpm) value_t hamlibWPM; hamlibWPM.i = wpm; int status = rig_set_level(rig, RIG_VFO_CURR, RIG_LEVEL_KEYSPD, hamlibWPM); - - if ( status != RIG_OK ) - errorHandler(status, tr("et KeySpeed Error"), false); + isRigRespOK(status, tr("Set KeySpeed Error"), false); commandSleep(); } @@ -976,20 +938,46 @@ void HamlibRigDrv::commandSleep() QThread::msleep(200); } -void HamlibRigDrv::errorHandler(int errorStatus, - const QString &errorName, +bool HamlibRigDrv::isRigRespOK(int errorStatus, + const QString errorName, bool emitError) { FCT_IDENTIFICATION; - QStringList detailLines; - lastErrorText = hamlibErrorString(errorStatus, detailLines); - qCWarning(runtime) << "Rig Error:" - << errorName - << detailLines; + qCDebug(function_parameters) << errorStatus << errorName << emitError; + + if ( errorStatus == RIG_OK ) + { + if ( emitError ) + postponedErrors.remove(errorName); + return true; + } + + lastErrorText = hamlibErrorString(errorStatus); if ( emitError ) - emit errorOccured(errorName, lastErrorText); + { + qCDebug(runtime) << "Emit Error detected"; + + if ( !RIG_IS_SOFT_ERRCODE(-errorStatus) ) + { + // hard error, emit error now + qCDebug(runtime) << "Hard Error"; + emit errorOccured(errorName, lastErrorText); + } + else + { + // soft error + postponedErrors[errorName] = lastErrorText; + + if ( !errorTimer.isActive() ) + { + qCDebug(runtime) << "Starting Error Timer"; + errorTimer.start(15 * 1000); //15s + } + } + } + return false; } const QString HamlibRigDrv::getModeNormalizedText(const rmode_t mode, @@ -1075,23 +1063,28 @@ serial_parity_e HamlibRigDrv::stringToHamlibParity(const QString &in_parity) return RIG_PARITY_NONE; } -QString HamlibRigDrv::hamlibErrorString(int errorCode, QStringList &errorList) +QString HamlibRigDrv::hamlibErrorString(int errorCode) { FCT_IDENTIFICATION; qCDebug(function_parameters) << errorCode; - static QRegularExpression re("[\r\n]"); - errorList = QString(rigerror(errorCode)).split(re); - QString ret; + QString detail(rigerror(errorCode)); + +#if ( HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 5 ) + // The rigerror has different behavior since 4.5. It contains the stack trace in the first part + // Need to use rigerror2 + ret = QString(rigerror2(errorCode)); +#else + static QRegularExpression re("[\r\n]"); + QStringList errorList = detail.split(re); if ( errorList.size() >= 1 ) - { ret = errorList.at(0); - } - - qCDebug(runtime) << ret; +#endif + qWarning() << "Detail" << detail; + qCWarning(runtime) << ret; return ret; } diff --git a/rig/drivers/HamlibRigDrv.h b/rig/drivers/HamlibRigDrv.h index 06cd9029..c99898c4 100644 --- a/rig/drivers/HamlibRigDrv.h +++ b/rig/drivers/HamlibRigDrv.h @@ -36,8 +36,10 @@ class HamlibRigDrv : public GenericRigDrv private slots: void checkRigStateChange(); + void checkErrorCounter(); private: + #if ( HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 6 ) static int addRig(rig_caps *caps, void* data); #else @@ -61,9 +63,9 @@ private slots: void __setKeySpeed(qint16 wpm); void __setMode(rmode_t newModeID); void commandSleep(); - void errorHandler(int errorStatus, - const QString &errorName, - bool emitError = true); + bool isRigRespOK(int errorStatus, + const QString errorName, + bool emitError = true); const QString getModeNormalizedText(const rmode_t mode, QString &submode) const; @@ -71,10 +73,11 @@ private slots: const QString hamlibVFO2String(const vfo_t vfo) const; serial_handshake_e stringToHamlibFlowControl(const QString &in_flowcontrol); serial_parity_e stringToHamlibParity(const QString &in_parity); - QString hamlibErrorString(int, QStringList &); + QString hamlibErrorString(int); RIG* rig; QTimer timer; + QTimer errorTimer; bool forceSendState; bool currPTT; @@ -88,7 +91,7 @@ private slots: unsigned int keySpeed; bool morseOverCatSupported; QMutex drvLock; - + QHashpostponedErrors; }; #endif // RIG_DRIVERS_HAMLIBRIGDRV_H From 98254932ba8978a5f22d64135a1340acac0bf75a Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 4 Oct 2024 10:24:40 +0200 Subject: [PATCH 68/74] Updated Changedlog --- Changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog b/Changelog index 80c0f000..785783f5 100644 --- a/Changelog +++ b/Changelog @@ -11,6 +11,7 @@ TBC - 0.39.0 - [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh) - [CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map - [CHANGED] - New Contact - Starting QSO Timer when Rig online and WSJTX Update Callsign Status is received +- [CHANGED] - Added a postponed handling for Rig soft errors (issue #472) - Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) - Fixed Wrong import of ADIF file of another log program (issue #455) - Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458) From 61790e93e23e219490cc650813e7d10ea433411f Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 4 Oct 2024 10:26:49 +0200 Subject: [PATCH 69/74] HamlibDrv Rot: Added multiplatform reliable sleep --- Changelog | 2 +- rotator/drivers/HamlibRotDrv.cpp | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Changelog b/Changelog index 785783f5..e52cce09 100644 --- a/Changelog +++ b/Changelog @@ -2,7 +2,7 @@ TBC - 0.39.0 - [NEW] - DXC - Added Full-text search - [NEW] - Select S in RST Edit when focused (issue #454) - [NEW] - Alerts - Added Member Column -- [CHANGED] - HamlibDrv - Added multiplatform reliable sleep +- [CHANGED] - HamlibDrv Rig/Rot- Added multiplatform reliable sleep - [CHANGED] - Changed Backup policy - [CHANGED] - Logbook page size - improved performance - [CHANGED] - Logbook - CTRL-A (Select All) is disabled diff --git a/rotator/drivers/HamlibRotDrv.cpp b/rotator/drivers/HamlibRotDrv.cpp index a8e42343..9dc755ea 100644 --- a/rotator/drivers/HamlibRotDrv.cpp +++ b/rotator/drivers/HamlibRotDrv.cpp @@ -401,11 +401,9 @@ QString HamlibRotDrv::hamlibErrorString(int errorCode) void HamlibRotDrv::commandSleep() { -#ifdef Q_OS_WIN - Sleep(100); -#else - usleep(100000); -#endif + FCT_IDENTIFICATION; + + QThread::msleep(100); } #undef MUTEXLOCKER From 6949330f91270cc5fcd759129bb131f78c5de18d Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 4 Oct 2024 11:09:22 +0200 Subject: [PATCH 70/74] HamlibDrv: Added a postponed handling for Rot soft errors the same change as in the case of the commit 30a1f977bce642483d60253bd4373af414d52ac0 --- rotator/drivers/HamlibRotDrv.cpp | 108 ++++++++++++++++++++++--------- rotator/drivers/HamlibRotDrv.h | 6 ++ 2 files changed, 82 insertions(+), 32 deletions(-) diff --git a/rotator/drivers/HamlibRotDrv.cpp b/rotator/drivers/HamlibRotDrv.cpp index 9dc755ea..b3310624 100644 --- a/rotator/drivers/HamlibRotDrv.cpp +++ b/rotator/drivers/HamlibRotDrv.cpp @@ -84,6 +84,10 @@ HamlibRotDrv::HamlibRotDrv(const RotProfile &profile, } rig_set_debug(RIG_DEBUG_BUG); + + connect(&errorTimer, &QTimer::timeout, + this, &HamlibRotDrv::checkErrorCounter); + } HamlibRotDrv::~HamlibRotDrv() @@ -147,16 +151,10 @@ bool HamlibRotDrv::open() int status = rot_open(rot); - if ( status != RIG_OK ) - { - lastErrorText = hamlibErrorString(status); - qCDebug(runtime) << "Rot Open Error" << lastErrorText; + if ( !isRotRespOK(status, tr("Rot Open Error"), false) ) return false; - } - else - { - qCDebug(runtime) << "Rot Open - OK"; - } + + qCDebug(runtime) << "Rot Open - OK"; opened = true; @@ -243,13 +241,7 @@ void HamlibRotDrv::setPosition(double in_azimuth, double in_elevation) static_cast(newAzimuth), static_cast(newElevation)); - if ( status != RIG_OK ) - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Set Az/El error" << lastErrorText; - emit errorOccured(tr("Set Possition Error"), - lastErrorText); - } + isRotRespOK(status, tr("Set Possition Error"), false); // wait a moment because Rotators are slow and they are not possible to set and get // mode so quickly (get mode is called in the main thread's update() function @@ -261,6 +253,7 @@ void HamlibRotDrv::stopTimers() FCT_IDENTIFICATION; timer.stop(); + errorTimer.stop(); } void HamlibRotDrv::checkRotStateChange() @@ -284,6 +277,21 @@ void HamlibRotDrv::checkRotStateChange() drvLock.unlock(); } +void HamlibRotDrv::checkErrorCounter() +{ + FCT_IDENTIFICATION; + + if ( postponedErrors.isEmpty() ) + return; + + qCDebug(runtime) << postponedErrors; + + // emit only one error + auto it = postponedErrors.constBegin(); + emit errorOccured(it.key(), it.value()); + postponedErrors.clear(); +} + void HamlibRotDrv::checkChanges() { FCT_IDENTIFICATION; @@ -307,7 +315,7 @@ void HamlibRotDrv::checkAzEl() elevation_t el; int status = rot_get_position(rot, &az, &el); - if ( status == RIG_OK ) + if ( isRotRespOK(status, tr("Get Possition Error")) ) { double newAzimuth = az; double newElevation = el; @@ -328,18 +336,49 @@ void HamlibRotDrv::checkAzEl() emit positioningChanged(azimuth, elevation); } } - else - { - lastErrorText = hamlibErrorString(status); - qCWarning(runtime) << "Get AZ/EL error" << lastErrorText; - emit errorOccured(tr("Get Possition Error"), - lastErrorText); - } } else - { qCDebug(runtime) << "Get POSITION is disabled"; +} + +bool HamlibRotDrv::isRotRespOK(int errorStatus, const QString errorName, bool emitError) +{ + FCT_IDENTIFICATION; + + qCDebug(function_parameters) << errorStatus << errorName << emitError; + + if ( errorStatus == RIG_OK ) // there are no special codes for ROT, use RIG codes + { + if ( emitError ) + postponedErrors.remove(errorName); + return true; } + + lastErrorText = hamlibErrorString(errorStatus); + + if ( emitError ) + { + qCDebug(runtime) << "Emit Error detected"; + + if ( !RIG_IS_SOFT_ERRCODE(-errorStatus) ) + { + // hard error, emit error now + qCDebug(runtime) << "Hard Error"; + emit errorOccured(errorName, lastErrorText); + } + else + { + // soft error + postponedErrors[errorName] = lastErrorText; + + if ( !errorTimer.isActive() ) + { + qCDebug(runtime) << "Starting Error Timer"; + errorTimer.start(15 * 1000); //15s + } + } + } + return false; } serial_handshake_e HamlibRotDrv::stringToHamlibFlowControl(const QString &in_flowcontrol) @@ -384,17 +423,22 @@ QString HamlibRotDrv::hamlibErrorString(int errorCode) qCDebug(function_parameters) << errorCode; - static QRegularExpression re("[\r\n]"); - - const QStringList &errorList = QString(rigerror(errorCode)).split(re); QString ret; + QString detail(rigerror(errorCode)); + +#if ( HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 5 ) + // The rigerror has different behavior since 4.5. It contains the stack trace in the first part + // Need to use rigerror2 + ret = QString(rigerror2(errorCode)); +#else + static QRegularExpression re("[\r\n]"); + QStringList errorList = detail.split(re); if ( errorList.size() >= 1 ) - { ret = errorList.at(0); - } - - qCDebug(runtime) << ret; +#endif + qWarning() << "Detail" << detail; + qCWarning(runtime) << ret; return ret; } diff --git a/rotator/drivers/HamlibRotDrv.h b/rotator/drivers/HamlibRotDrv.h index bf702ea0..b274c9b9 100644 --- a/rotator/drivers/HamlibRotDrv.h +++ b/rotator/drivers/HamlibRotDrv.h @@ -24,12 +24,16 @@ class HamlibRotDrv : public GenericRotDrv private slots: void checkRotStateChange(); + void checkErrorCounter(); private: static int addRig(const struct rot_caps* caps, void* data); void checkChanges(); void checkAzEl(); + bool isRotRespOK(int errorStatus, + const QString errorName, + bool emitError = true); serial_handshake_e stringToHamlibFlowControl(const QString &in_flowcontrol); serial_parity_e stringToHamlibParity(const QString &in_parity); @@ -38,9 +42,11 @@ private slots: ROT* rot; QTimer timer; + QTimer errorTimer; QMutex drvLock; bool forceSendState; + QHashpostponedErrors; }; #endif // QLOG_ROTATOR_DRIVERS_HAMLIBROTDRV_H From 0b2993f47d32cdc91c789d9997bb36518af5f45e Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Fri, 4 Oct 2024 19:28:14 +0200 Subject: [PATCH 71/74] Fixed compilation issue - missing RIG_IS_SOFT_ERRCODE under Ubuntu 20.04 --- rig/drivers/HamlibRigDrv.cpp | 7 +++++++ rotator/drivers/HamlibRotDrv.cpp | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/rig/drivers/HamlibRigDrv.cpp b/rig/drivers/HamlibRigDrv.cpp index 9e7404b4..99883e5a 100644 --- a/rig/drivers/HamlibRigDrv.cpp +++ b/rig/drivers/HamlibRigDrv.cpp @@ -10,6 +10,13 @@ #define HAMLIB_FILPATHLEN FILPATHLEN #endif +#ifndef RIG_IS_SOFT_ERRCODE +#define RIG_IS_SOFT_ERRCODE(errcode) (errcode == RIG_EINVAL || errcode == RIG_ENIMPL || errcode == RIG_ERJCTED \ + || errcode == RIG_ETRUNC || errcode == RIG_ENAVAIL || errcode == RIG_ENTARGET \ + || errcode == RIG_EVFO || errcode == RIG_EDOM) + +#endif + // macro introduced hamlib 4.6 #ifndef PTTPORT #define PTTPORT(r) (&r->state.pttport) diff --git a/rotator/drivers/HamlibRotDrv.cpp b/rotator/drivers/HamlibRotDrv.cpp index b3310624..2b215cb3 100644 --- a/rotator/drivers/HamlibRotDrv.cpp +++ b/rotator/drivers/HamlibRotDrv.cpp @@ -19,6 +19,13 @@ #define HAMLIB_FILPATHLEN FILPATHLEN #endif +#ifndef RIG_IS_SOFT_ERRCODE +#define RIG_IS_SOFT_ERRCODE(errcode) (errcode == RIG_EINVAL || errcode == RIG_ENIMPL || errcode == RIG_ERJCTED \ + || errcode == RIG_ETRUNC || errcode == RIG_ENAVAIL || errcode == RIG_ENTARGET \ + || errcode == RIG_EVFO || errcode == RIG_EDOM) + +#endif + #define POOL_INTERVAL 500 MODULE_IDENTIFICATION("qlog.rotator.driver.hamlibdrv"); From 8516385b026f27764a05a98954fe587cc029d3b5 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sat, 5 Oct 2024 12:02:04 +0200 Subject: [PATCH 72/74] Updated CZ/DE/ES/IT translations - helping AI --- i18n/qlog_cs.qm | Bin 183189 -> 183854 bytes i18n/qlog_cs.ts | 378 +++++++++++++++++++++++++++---------------- i18n/qlog_de.qm | Bin 192198 -> 192919 bytes i18n/qlog_de.ts | 378 +++++++++++++++++++++++++++---------------- i18n/qlog_es.qm | Bin 195227 -> 196579 bytes i18n/qlog_es.ts | 394 ++++++++++++++++++++++++++++----------------- i18n/qlog_it.qm | Bin 195707 -> 197107 bytes i18n/qlog_it.ts | 392 +++++++++++++++++++++++++++----------------- i18n/qlog_zh_CN.qm | Bin 145724 -> 145778 bytes i18n/qlog_zh_CN.ts | 367 +++++++++++++++++++++++++---------------- 10 files changed, 1204 insertions(+), 705 deletions(-) diff --git a/i18n/qlog_cs.qm b/i18n/qlog_cs.qm index 2abb38057d31498798022a133bf5fa82b1bcc8d4..9aa25e063a13ea4ce6d9bad845c2f9912d820664 100644 GIT binary patch delta 16169 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 delta 15781 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 - - + + North America Severní Amerika - - + + Africa Afrika - - + + Antarctica Antarktida - - + + South America Jižní Amerika - + Asia Asie - + Europe Evropa - - + + Oceania Oceánie @@ -217,40 +217,45 @@ AlertTableModel - + Rule Name Pravidlo - + Callsign Značka - + Frequency Frekvence - + Mode Druh provozu - + Updated Aktualizací - + Last Update Poslední - + Last Comment Zpráva + + + Member + Člen + AlertWidget @@ -3340,7 +3345,7 @@ - + Connect Připojit @@ -3495,55 +3500,60 @@ Filtr DXC - + Connecting... Připojování... - + DX Cluster is temporarily unavailable DX Cluster je dočasně nedostupný - + DXC Server Error Chyba DXC Serveru - + An invalid callsign Nesprávná značka - + DX Cluster Password DX Cluster Heslo - + Security Notice Bezpečnostní upozornění - + The password can be sent via an unsecured channel Heslo může být posláno přes nezabezpečený kanál - + Server Server - + Username Uživatelské jméno - + Disconnect Odpojit + + + DX Cluster Command + Příkaz DX Clusteru + DxccTableModel @@ -4112,87 +4122,173 @@ HamlibRigDrv - + None Žádné - + CAT CAT - + DTR DTR - + RTS RTS - - + + Initialization Error Chyba inicializace - + Cannot set PTT Type Nelze nastavit PTT Typ - + Cannot set PTT Share Nelze nastavit PTT Sdílení - + Unsupported Rig Driver Nepodporovaný ovladač - + + Rig Open Error + Spojení nelze navázat + + + Set Frequency Error Chyba v nastavení frekvence - + + Set Mode Error + Chyba nastavení režimu + + + Set PTT Error Chyba v získaní stavu PTT - + + Cannot sent Morse + This cannot be displayed + + + + + Cannot stop Morse + This cannot be displayed + + + + + Get PTT Error + This cannot be displayed + + + + Get Frequency Error Chyba v získání frekvence - + Get Mode Error Chyba v získání druhu provozu + + + Get VFO Error + Chyba v získání VFO + + + + Get PWR Error + This cannot be displayed + + + + + Get PWR (power2mw) Error + This cannot be displayed + + + + + Get RIT Function Error + This cannot be displayed + + + + + Get RIT Error + This cannot be displayed + + + + + Get XIT Function Error + This cannot be displayed + + + + + Get XIT Error + This cannot be displayed + + + + + Get KeySpeed Error + This cannot be displayed + + + + + Set KeySpeed Error + This cannot be displayed + + HamlibRotDrv - - + + Initialization Error Chyba inicializace - + Unsupported Rotator Driver Nepodporovaný ovladač - + + Rot Open Error + Spojení nelze navázat + + + Set Possition Error Chyba v nastavení pozice - + Get Possition Error Chyba v získání pozice @@ -5573,38 +5669,38 @@ - + Band Pásmo - + Mode Druh provozu - + Country Země - + Club Klub - + User Filter Uživatelský filtr - - + + Delete Vymazat @@ -5670,32 +5766,32 @@ Logbook - Odeslat DX Spot - + Delete the selected contacts? Vymazat vybraný kontakt? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? Clublog <b>Okamžité odeslání</b> podporuje pouze mazání po jednom záznamu<br><br>Chcete pokračovat navzdory skutečnosti,<br>že operace DELETE nebude odeslána do Clublogu? - + Deleting QSOs Mazání QSO - + Update Aktualizace - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? Aktualizací budou ovlivněny všechny vybrané řádky<br>Aktuálněupravená hodnota ve sloupci se použije na všechny vybrané řádky.<br>Chcete je upravit? - + Count: %n Anzahl: %n @@ -5705,23 +5801,23 @@ - + Downloading eQSL Image Stahování eQSL obrázku - - + + Cancel Zrušit - + QLog Error Chyba QLog - + eQSL Download Image failed: Stažení eQSL obrázku selhalo: @@ -6715,7 +6811,7 @@ Člen: - + World Wide Flora & Fauna World Wide Flora & Fauna @@ -6783,7 +6879,7 @@ Stanice - + the contacted station's DARC DOK (District Location Code) (ex. A01) DARC DOK (kód uzemí) (např A01) @@ -6888,87 +6984,87 @@ Selhalo přihlášení do Callbooku - + LP LP - + New Entity! Nová země! - + New Band! Nové pásmo! - + New Mode! Nový druh provozu! - + New Band & Mode! Nové pásmo & druh! - + New Slot! Nový slot! - + Worked Pracováno - + Confirmed Potvrzeno - + GE GE - + GM GM - + GA GA - + m m - + Callbook search is active Hledání v Callbooku je aktivní - + Callbook search is inactive Hledání v Callbooku není aktivní - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) dva nebo čtyři sousední lokátory, každý o délce čtyř znaků (např. EN98,FM08,EM97,FM07) - + Special Activity Group - + Special Activity Group Information @@ -7241,7 +7337,7 @@ - + @@ -7276,32 +7372,32 @@ Nelze se připojit k databázi (2). - + DXC Server Name Error Chyba jména DXC Serveru - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> Adresa DXC Serveru musí být ve formátu <p><b>[uživatel@]hostname:port</b> (např. hamqth.com:7300)</p> - + DX Cluster Password DX Cluster heslo - + Invalid Password Nesprávné heslo - + DXC Server Connection Error Chyba připojení k DXC serveru - + Your callsign is empty. Please, set your Station Profile Vaše značka není vyplněna. Prosím, nastavte Profil Stanice @@ -7491,49 +7587,49 @@ QObject - + Cannot connect to DXC Server <p>Reason <b>: Nelse se připojit k DXC serveru <p>Důvod <b>: - - + + Connection Refused Spojení odmítnuto - - + + Host closed the connection Server uzavřel spojení - - + + Host not found Server nenalezen - - + + Timeout Timeout - - + + Network Error Chyba sítě - - + + Internal Error Interní Chyba @@ -10129,6 +10225,7 @@ StatisticsWidget + Statistics Statistiky @@ -10224,132 +10321,137 @@ - + Band Pásmo - + Year rok - + Month měsíc - + Day in Week den v týdnu - + Hour hodinu - + Mode druh provozu - + Continent kontinent - + Propagation Mode podmínky šíření - + Confirmed / Not Confirmed Potvrzeno / Nepotvrzeno - + Countries Země - + Big Gridsquares Velké čtverce - + Distance Vzdálenost - + QSOs QSO - + Confirmed/Worked Grids Potvrzené / Pracováno Lokátory - + ODX ODX - + Sun Ned - + Mon Pon - + Tue Út - + Wed Stř - + Thu Čtvr - + Fri Pát - + Sat Sob - + Not specified Neurčeno - + Confirmed Potvrzeno - + Not Confirmed Nepotvrzeno - + + Over 50000 QSOs. Display them? + Přes 50000 QSO. Zobrazit je? + + + All Vše @@ -10357,37 +10459,37 @@ TCIRigDrv - + Rig 0 Rig 0 - + Rig 1 Rig 1 - + Rig 2 Rig 2 - + Rig 3 Rig 3 - + Error Occured Nastala chyba - + Rig status changed Změna stavu Rigu - + Rig is not connected Rig není připojen diff --git a/i18n/qlog_de.qm b/i18n/qlog_de.qm index 033f4c4592844e8ed40a2fbae2b9cff5b9bef55d..5a96d010b7abf341b8936ea4d96a93cbdd3034f0 100644 GIT binary patch delta 16132 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 delta 15825 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%0D+dP7!={3w; zD;^HUZ>70bLKwdLt8K2GIuf5)&5+4b-Lwwf{bCbCbVb=cUX4Bsx z+*=-)?Qj9FvB2Eg0FShGkHU57X2-J7iIY#vj#(lWjk=q=Oo$_PYL(g9H=8)?XLinq zIW1I~UC<@xK}*d21SBj!ZO!f#;i%MK&F)Wdoxh`b*eZzZtdDuPHyqj~2XmkcIwg^| z<`7@}4WMP)6LZM$s#qG?U=G>kMSR76^VkX@#L|bEW9C9;aof#HE~4S^Xofkid0l+% zYHMEM+!Jd?j^-pb0%jIvPQ4RM>`JIP&Fa$wDw)%p1);{fYEJ)?gidIldBb{pG#oO` zJH|v1Z?M^XR7$~LR9MVM-3P(`(Kontinent - - + + North America Nordamerika - - + + Africa Afrika - - + + Antarctica Antarktis - - + + South America Südamerika - + Asia Asien - + Europe Europa - - + + Oceania Ozeanien @@ -217,40 +217,45 @@ AlertTableModel - + Rule Name Regelname - + Callsign Rufzeichen - + Frequency Frequenz - + Mode Betriebsart - + Updated Aktualisiert - + Last Update Letzte Aktualisierung - + Last Comment Letzter Kommentar + + + Member + Mitglied + AlertWidget @@ -3489,60 +3494,65 @@ - + Connect Verbinden - + Connecting... Verbinden... - + DX Cluster is temporarily unavailable DX-Cluster vorübergehend nicht erreichbar - + DXC Server Error DXC-Serverfehler - + An invalid callsign Ungültiges Rufzeichen - + DX Cluster Password DX Cluster Passwort - + Security Notice Sicherheitshinweis - + The password can be sent via an unsecured channel Das Passwort kann über einen ungesicherten Kanal gesendet werden - + Server Server - + Username Benutzername - + Disconnect Trennen + + + DX Cluster Command + DX-Cluster Kommando + DxccTableModel @@ -4109,87 +4119,173 @@ HamlibRigDrv - + None - + CAT CAT - + DTR DTR - + RTS RTS - - + + Initialization Error Initialisierungsfehler - + Cannot set PTT Type PTT-Typ kann nicht eingestellt werden - + Cannot set PTT Share PTT-Share kann nicht eingestellt werden - + Unsupported Rig Driver Nicht unterstützter Rig-Treiber - + + Rig Open Error + Verbindung fehlgeschlagen + + + Set Frequency Error Fehler bei der Frequenzeinstellung - + + Set Mode Error + Fehler bei der Moduseinstellung + + + Set PTT Error Fehler beim Auslösen der PTT - + + Cannot sent Morse + This cannot be displayed + + + + + Cannot stop Morse + This cannot be displayed + + + + + Get PTT Error + This cannot be displayed + + + + Get Frequency Error Fehler bei der Frequenzabfrage - + Get Mode Error Fehler bei der Mode-Abfrage + + + Get VFO Error + Fehler beim Abrufen des VFO + + + + Get PWR Error + This cannot be displayed + + + + + Get PWR (power2mw) Error + This cannot be displayed + + + + + Get RIT Function Error + This cannot be displayed + + + + + Get RIT Error + This cannot be displayed + + + + + Get XIT Function Error + This cannot be displayed + + + + + Get XIT Error + This cannot be displayed + + + + + Get KeySpeed Error + This cannot be displayed + + + + + Set KeySpeed Error + This cannot be displayed + + HamlibRotDrv - - + + Initialization Error Initialisierungsfehler - + Unsupported Rotator Driver Nicht unterstützter Rotor-Treiber - + + Rot Open Error + Verbindung fehlgeschlagen + + + Set Possition Error Fehler beim Einstellen der Position - + Get Possition Error Fehler beim Abrufen der Position @@ -5567,20 +5663,20 @@ - + Club - + User Filter Benutzer-Filter - - + + Delete Löschen @@ -5647,50 +5743,50 @@ - + Country Land - + Band Band - + Mode Betriebsart - + Delete the selected contacts? Die ausgewählten Kontakte löschen? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? Clublog <b>Sofort Upload</b> unterstützt nur das Löschen eines Datensatzes nach dem anderen.<br><br>Möchten Sie fortfahren, obwohl<br>der DELETE-Vorgang nicht an Clublog gesendet wird? - + Deleting QSOs QSOs Löschen - + Update Aktualisieren - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? Durch die Aktualisierung werden alle ausgewählten Zeilen beeinflusst.<br>Der aktuell bearbeitete Wert in der Spalte wird auf alle ausgewählten Zeilen angewendet.<br>Möchten Sie fortfahren? - + Count: %n Anzahl: %n @@ -5698,23 +5794,23 @@ - + Downloading eQSL Image eQSL-Bild herunterladen - - + + Cancel Abbrechen - + QLog Error QLog Fehler - + eQSL Download Image failed: eQSL-Bild download fehlgeschlagen: @@ -6682,7 +6778,7 @@ &Details - + the contacted station's DARC DOK (District Location Code) (ex. A01) DARC-DOK (Ortsverbandkenner) der kontaktierten Station (z.B. A01) @@ -6712,7 +6808,7 @@ Dauer - + World Wide Flora & Fauna @@ -6880,87 +6976,87 @@ Callbook-Anmeldung fehlgeschlagen - + LP LP - + New Entity! Neuer Eintrag! - + New Band! Neues Band! - + New Mode! Neue Betriebsart! - + New Band & Mode! Neues Band & Betriebsart! - + New Slot! Neuer Slot! - + Worked Gearbeitet - + Confirmed Bestätigt - + GE GA - + GM GM - + GA GT - + m - + Callbook search is active Callbook-Suche ist aktiv - + Callbook search is inactive Callbook-Suche ist inaktiv - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) zwei oder vier nebeneinander liegende, jeweils vier Zeichen lange Gitterfelder (z. B. EN98,FM08,EM97,FM07) - + Special Activity Group Spezielle Aktivitätsgruppe - + Special Activity Group Information @@ -7155,7 +7251,7 @@ - + @@ -7268,32 +7364,32 @@ Netzwerkfehler. Clubliste kann nicht heruntergeladen werden für - + DXC Server Name Error DXC Server Namensfehler - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> Format der DXC-Server-Adresse <p><b>[benutzername@]hostname:Port</b> (z. B. hamqth.com:7300)</p> - + DX Cluster Password DX Cluster Passwort - + Invalid Password Falsches Passwort - + DXC Server Connection Error DXC Server Verbindungsfehler - + Your callsign is empty. Please, set your Station Profile Ihr Rufzeichen ist nicht angegeben. Bitte richten Sie Ihr Stationsprofil ein @@ -7482,49 +7578,49 @@ QObject - + Cannot connect to DXC Server <p>Reason <b>: Kann keine Verbindung zum DXC Server herstellen <p>Ursache <b>: - - + + Connection Refused Verbindung abgelehnt - - + + Host closed the connection Der Host hat die Verbindung beendet - - + + Host not found Host nicht gefunden - - + + Timeout Zeitüberschreitung - - + + Network Error Netzwerkfehler - - + + Internal Error Interner Fehler @@ -10116,6 +10212,7 @@ StatisticsWidget + Statistics Statistik @@ -10211,132 +10308,137 @@ - + Band Band - + Year Jahr - + Month Monat - + Day in Week Wochentag - + Hour Stunde - + Mode Betriebsart - + Continent Kontinent - + Propagation Mode Ausbreitungsmodus - + Confirmed / Not Confirmed Bestätigt / nicht Bestätigt - + Countries Länder - + Big Gridsquares Grossfelder - + Distance Entfernung - + QSOs - + Confirmed/Worked Grids Bestätigte / gearbeitete Gitterfelder - + ODX ODX - + Sun Son - + Mon Mon - + Tue Die - + Wed Mit - + Thu Don - + Fri Fre - + Sat Sa - + Not specified Nicht angegeben - + Confirmed Bestätigt - + Not Confirmed Nicht Bestätigt - + + Over 50000 QSOs. Display them? + Über 50000 QSOs. Anzeigen? + + + All Alle @@ -10344,37 +10446,37 @@ TCIRigDrv - + Rig 0 Rig 0 - + Rig 1 Rig 1 - + Rig 2 Rig 2 - + Rig 3 Rig 3 - + Error Occured Fahler - + Rig status changed Rig-Status geändert - + Rig is not connected Rig nicht verbunden diff --git a/i18n/qlog_es.qm b/i18n/qlog_es.qm index a987165c1ad86b32302b7ac985ae8466e2ed689d..2b0ae720c5e63714d760df101b172cbc035a7d96 100644 GIT binary patch delta 16944 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 OPkEJn2TJ%8+y4V2KT?SR delta 16124 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 NziRKV^Om2o`9GN5kHY`} diff --git a/i18n/qlog_es.ts b/i18n/qlog_es.ts index 9d7f85a9..bb9f1d84 100644 --- a/i18n/qlog_es.ts +++ b/i18n/qlog_es.ts @@ -108,44 +108,44 @@ Continente - - + + North America Norteamérica - - + + Africa África - - + + Antarctica Antártida - - + + South America Sudamérica - + Asia Asia - + Europe Europa - - + + Oceania Oceanía @@ -217,40 +217,45 @@ AlertTableModel - + Rule Name Nombre Regla - + Callsign Indicativo - + Frequency Frecuencia - + Mode Modo - + Updated Actualizado - + Last Update Última Actualización - + Last Comment Último Comentario + + + Member + Miembro + AlertWidget @@ -3368,7 +3373,7 @@ - + Connect Conectar @@ -3400,17 +3405,17 @@ Full-text search - + Búsqueda de texto completo Search - + Búsqueda Close Search - + Cerrar búsqueda @@ -3515,63 +3520,68 @@ Search... - + Búsqueda... DXC - Search - + DXC - Búsqueda - + Connecting... Conectando... - + DX Cluster is temporarily unavailable El Cluster DX no está disponible temporalmente - + DXC Server Error Error del Servidor del Cluster DX - + An invalid callsign Un indicativo inválido - + DX Cluster Password Contraseña del Cluster DX - + Security Notice Aviso de Seguridad - + The password can be sent via an unsecured channel - La contraseña se puede enviar a través de un canal no seguro. + La contraseña se puede enviar a través de un canal no seguro - + Server Servidor - + Username Nombre de Usuario - + Disconnect Desconectar + + + DX Cluster Command + Comando de DX Cluster + DxccTableModel @@ -4139,93 +4149,179 @@ HamlibRigDrv - + None Ninguno Ninguno - + CAT Sintonización asistida por ordenador CAT - + DTR Terminal de datos listo (DTR) es una señal de control en comunicaciones serie RS-232, transmitida desde un equipo terminal de datos (DTE), como una computadora, a un equipo de comunicaciones de datos (DCE), por ejemplo un interface, para indicar que el terminal está listo para comunicaciones y el interface puede iniciar un canal de comunicaciones. DTR - + RTS Control de Señal del Puerto Serie RTS - - + + Initialization Error Error al Inicializar - + Cannot set PTT Type No se puede configurar el tipo de PTT No se puede configurar el tipo de PTT - + Cannot set PTT Share No se puede configurar la acción del PTT No se puede configurar la acción del PTT - + Unsupported Rig Driver Controlador de Radio No Soportado - + + Rig Open Error + Conexión fallida + + + Set Frequency Error Error al Establecer Frecuencia - + + Set Mode Error + Error al establecer el modo + + + Set PTT Error Error al Establecer PTT - + + Cannot sent Morse + This cannot be displayed + + + + + Cannot stop Morse + This cannot be displayed + + + + + Get PTT Error + This cannot be displayed + + + + Get Frequency Error Error al Obtener Frecuencia - + Get Mode Error Error al Obtener Modo + + + Get VFO Error + Error al obtener el VFO + + + + Get PWR Error + This cannot be displayed + + + + + Get PWR (power2mw) Error + This cannot be displayed + + + + + Get RIT Function Error + This cannot be displayed + + + + + Get RIT Error + This cannot be displayed + + + + + Get XIT Function Error + This cannot be displayed + + + + + Get XIT Error + This cannot be displayed + + + + + Get KeySpeed Error + This cannot be displayed + + + + + Set KeySpeed Error + This cannot be displayed + + HamlibRotDrv - - + + Initialization Error Error al Inicializar - + Unsupported Rotator Driver Controlador de Rotor No Soportado - + + Rot Open Error + Conexión fallida + + + Set Possition Error Error al Establecer Posición - + Get Possition Error Error al Obtener Posición @@ -4669,7 +4765,7 @@ Cannot find My DXCC Entity Info - + No se puede encontrar la información de mi entidad DXCC @@ -4695,7 +4791,7 @@ DXCC Info is missing - + La información DXCC falta @@ -5602,38 +5698,38 @@ - + Band Banda - + Mode Modo - + Country País - + Club Club - + User Filter Filtro de Usuario - - + + Delete Eliminar @@ -5700,32 +5796,32 @@ Exportar los QSOs seleccionados - + Delete the selected contacts? ¿Eliminar los conactos seleccionados? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? - + Deleting QSOs Borrando QSOs - + Update Actualizar - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? Al actualizar, todas las filas seleccionadas se verán afectadas.<br>El valor actualmente editado en la columna se aplicará a todas las filas seleccionadas.<br><br>¿Quieres editarlas? - + Count: %n QSO: %n @@ -5733,23 +5829,23 @@ - + Downloading eQSL Image Descargando Imágen de eQSL - - + + Cancel Cancelar - + QLog Error Error de QLog - + eQSL Download Image failed: La descarga de imágen de eQSL ha fallado: @@ -6906,97 +7002,97 @@ Error al iniciar sesión en el Callbook - + LP LP - + New Entity! Nueva Entidad! - + New Band! Nueva Banda! - + New Mode! Nuevo Modo! - + New Band & Mode! Nueva Banda y Modo! - + New Slot! Nuevo Slot! - + Worked Trabajado - + Confirmed Confirmado - + GE GE - + GM GM - + GA GA - + m - + Callbook search is inactive Búsqueda en Callbook desactivada - + Callbook search is active Búsqueda en Callbook activada - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) dos o cuatro locators adyacentes, cada uno de cuatro caracteres (ej. EN98,FM08,EM97,FM07) - + the contacted station's DARC DOK (District Location Code) (ex. A01) el DARC DOK (código de ubicación de distrito) de la estación contactada (ej. A01) - + World Wide Flora & Fauna World Wide Flora & Fauna - + Special Activity Group Grupo de Actividades Especiales - + Special Activity Group Information Información Grupo de Actividades Especiales @@ -7269,7 +7365,7 @@ - + @@ -7334,27 +7430,27 @@ No se pueden actualizar las reglas de alerta - + DXC Server Name Error Error en el nombre del servidor del Cluster DX - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> La dirección del servidor del Cluster DX debe tener el formato<p><b>[nombre de usuario@]nombre de host:puerto</b> (ej. hamqth.com:7300)</p> - + DX Cluster Password Contraseña del Cluster DX - + Invalid Password Contraseña incorrecta - + DXC Server Connection Error Error en la conexión del servidor del Cluster DX @@ -7414,7 +7510,7 @@ <b>Error del Manipulador:</b> - + Your callsign is empty. Please, set your Station Profile Tu indicativo está vacío. Por favor, configure su Perfil de Estación @@ -7530,43 +7626,43 @@ - - + + Connection Refused Conexión Denegada - - + + Host closed the connection El host cerró la conexión - - + + Host not found Host no encontrado - - + + Timeout Se agotó el tiempo de espera - - + + Network Error Error de red - - + + Internal Error Error Interno @@ -7666,7 +7762,7 @@ Mi DXCC - + Cannot connect to DXC Server <p>Reason <b>: No se puede conectar al servidor del Cluster DX <p>Razón <b>: @@ -10155,6 +10251,7 @@ StatisticsWidget + Statistics Estadísticas @@ -10220,7 +10317,7 @@ - + Band Banda @@ -10255,127 +10352,132 @@ - + Year Año - + Month Mes - + Day in Week Día de la Semana - + Hour Hora - + Mode Modo - + Continent Continente - + Propagation Mode Modo de Propagación - + Confirmed / Not Confirmed Confirmado / No Confirmado - + Countries Paises - + Big Gridsquares Grandes cuadrículas - + Distance Distancia - + QSOs QSOs - + Confirmed/Worked Grids Locators Confirmados/Trabajados - + ODX ODX - + Sun Dom - + Mon Lun - + Tue Mar - + Wed Mie - + Thu Jue - + Fri Vie - + Sat Sáb - + Not specified No Especificado - + Confirmed Confirmado - + Not Confirmed No Confirmado - + + Over 50000 QSOs. Display them? + Más de 50.000 QSO. ¿Mostrarlo? + + + All Todos @@ -10383,37 +10485,37 @@ TCIRigDrv - + Rig 0 Radio 0 - + Rig 1 Radio 1 - + Rig 2 Radio 2 - + Rig 3 Radio 3 - + Error Occured Ha ocurrido un error - + Rig status changed El estado de la radio ha cambiado - + Rig is not connected Radio no conectada diff --git a/i18n/qlog_it.qm b/i18n/qlog_it.qm index 041da4e83da9727528f0d59e47dd39d07ecb6258..a4c1dbe83a32228257e1b5b969c61a8cd60ca239 100644 GIT binary patch delta 16942 zcmZ{r1y~i^yZ_&{_RQY1+d{vZM%CxXAo8=GO{}4C~KZqexSuesL)hryJB@((3=kLKj#8p+nNYD?QLfmEuI1LZ@ z8=OJJauk~OD_nsG3k!&|>>ccw9MrNXHkkGI?B6a3PMZH(ZFH_X0C; zTqKjnO#w4;d{ZWmTMK3p*)f?s?lhQ=kBOvz7QZh{14yxPNmZi}k}w6;Z8Z;yWf2)%JnxD-+elR93}QdRayCiO3Iw zJBJIbd|!>oANuk12)LR^!UL^5_**738f5a;hZXk2OZs0SX0t{nR}Cj>Uk~yvA&dOs zT%_{F`*t#!1~(wpBZ#F>v*5!l;_D&5&X94L5Sh%WwoLBONZ}}dqAm@I z?4c`GdV0xZDHs5b`J_Y;4_J&B0D0oSQ2INb;D^H(yttF6KrkX^T<(2cJ|-Jzr}FeBYJ5HD)0a7TUcDzTRRWpcM; z3R9a9^?>;v=n3v4_SXsUD>1Jag{fwRmW>tU58MrA6rMtSiz}E)Jo6p6oOl*w9Wj)+ zC$!tjoYx?fXvuu=0M7paekQ)vfv9IFQH9eU0^ z-vp0A{(J3-dT%GzrkTP#IF#OnI1w`HTTHZkl1#Q)kjb0i4f;hB(~Kb+jwxThggB<0 zWtCU>Ws*$p-+YrSHQsv1 zL}FiyN#*Ab>&Pcncd&yKsU}z%PpXq(KnMvlec|C6%Vd>mDQr7TCRbfixTXRLv);o| zH32R7V5+Trv0{--zSEI}Ie6twRDRPYe7#GCLd^SGRMkfc4KAoL9Iww zng9hIE z;2h%PEzTtRts&CaR9I$%!aNMf`u)C@GFk0Jg&orsu0AJ|J1$i?VXeXqg(S9b3=zGO z$&45Xj+uu+CU)&G0Vn)VZ zCvo5bV!O|iIH(b^rVl_5qMJ-6YnB2cJa0Zo;!t?h#N8y0K@^=b88HdU*W#MO4Mv$3 z?rQx(0X&naaD%r@?z)A<3DEit!)5Y%9Z5`qD9Trn$^Kd_lQ*zcIClhzsRFUtxbE+V z#OL^tm|a3_V>=QT<35{8WO9#zB<4c<8{)cUF|hyg{v_tX1!qB)+c0&TN6X{|)f5)R zDBKZ3V$ofqxe+Apjwjaoj!f?9rf>;Fb{cNn1}_4#HhP)7v4g^83rT#ELga{<`iW?} z^**T+Ef`6oy`)})MBzvtsn<@#4Pq7Ui&uDNhfLOHfWpo0GI>*1g)90f+}4)V=aG69 zrIVooYSDbY4>1CfkV3m_qF^I}EYGN^a{<{+UOKjk`DIgX0-n9}1ybOnf9wU?Krz;#XTPAPC6i%v2fk!(KAFQUpckub)Kd58VU&QRI zP{%nFk$cXdjyVH}mD^6868jMKnM$3WVZePosdJZBMBOe?=gF60|8_ytIcWpYfOZrV ze46;WKNK8*pcMInf~UjYqwiAi`sQFe>QaL5W8P9og)qeLauo6%$3rv}+Tj5)r}yAP zV$S_2wC81HKvyX=5!N-dC5291K@?Y!LhnK;qt{aCLx^JLbP9{uM;1Qe3O*pt3w{dM zwUEgt>M1OGJ@Jj@DJ&I^Bmq1I>qwYMVP}pI8B-NjIz?f>aXdPox(+Uer<+V&OUo0@ zze(MarxA^7PTi*C=j93&?&C6<=Qt}ZNT(mlU+~(V3iBRQw=K9}Nnh&r#g9llqp;iy zg&U%%du%^=w5`;A*b!pus>|dqF$$AEQuo=(L=!pn*o4Zb-f`-263V&Z9`*PRrQY@$ zY)EWdDrmun?PKLHc)lG7m%8n+!tGmR^86ss1Lr-K$@7yyPhxOT;RA8~j`9>9+lJV% zHz3R~&Iy@Z7s$2%nH=mrE`q|3V1~5{nQ0V7#AFbkUrZ5}7?=Z6wTK~wL=IsTF$U(d zYa>M!(R@(U^80iuip z6kVD@OnZd}B|+Pd#mQv7@+lVP%bOgg!Pa2Z=5G)))#eW+aOlFT^EAHDn|Rd$G->QA z;<>Subkqr%l}Jg)oQPeXWTB~+!_dljN=b!QhkMdY*FxfbuF~wGa4ZMCX-^&(Y2J4&Qn&+@HVFfF5Gefw9Lk&k%E}aoJQm92vBi|zWGeA}{Y3zH_`UF zcZi)HLwg3iA=XJtd*hB`1}D?$s+Wm9Nu{$_FyJ-wW%6C|bh+bFV*5;Vv*IISOBd43 zr)!AKY^Kn%r!n0==RjQ0(4)7Qn$gYa)xoQ%?V8f(V(3Ci9r`}V7DYuq{p{D2=-*Vv zrb7ffHZaxd5yZ70nD})IvGG1k(+O|x*qCW<3?kaTj%i;!CDyYlGgSLXyj4GDD0D+A z-h-71fRbM6!paw&F()V+S-Nr|A3ZHY{0q|`yjeaWj&&=5S?ktBJ4X5eXY!Tc7mv?xU*hi z(})kI)i# zwqa9sxY79rEVcU|Vh?Rt_8RC$lTU2*zvqZ0Phx9Ral_WJY+Wr!VnbfAjcq%l*)f%E zdWI-iFO%i9bR^o@m~BqReL@r2=DaJ!{wdE2c3V7&dTeHUztkjFID;Kq4;fax#V+Td ztlIv9-Slfnl#`Q(cV!%}P z{V=ScQGNEaNjf-P;Y(Zg`&A^-w0rE|kn+T84&++PK@(BqU0iGB;ROos2gqdIaRR<) zuQR#sPy+FUzqr8%Z?@|nUcqY@W^M$xQAH8!;>s(I*C2>J<(2w~L`lzhWj#D=+ap&vqtg_q;qzOF=ObDHLE#^1+|W5Ig+K!sD065jA&JSaM6@qXsfrFMEYo z3l+X=%o94RkUW0m340*Ae1VVVeTZ6==cDaEBUb#YP#+?b8C?1Np$}0h?c=$-Ly$9; z=gW5BI?G7D++zdrzb$@zoi%eA?#uIamr%PE^X*pIwT|G0A&rSGGw>qsc!H+!9VxAd zwNK-_ra@GLLXetdrtCpP&QKd$pY$z94%4L*qTSMXCm zN)QbP@^j@UW*1eplDfn`eo|F?o<@ARv#O@U zZsH?fsGN49tFg*MRd)c+dlRl|l>7pnjbv4m(96hj>!?~xLllf%4k88&&QP_Oa|bOK zA64r%e#F8qs@j^I5fcuoe0HKMmh7VPc@Jgw?4$CX<_`OBKU3xV2PZT$tJ+P%n-AHp z@{fu_9q>cdz7e8WL(wvSoMb3h zNQr9x5Gdn_>Z%1xabKU!s)aXPh|l;(mDQ*WT>WKLR!dmb+@-1<%Yi7=a??~fAa^8H z?!!-r&lOd<&!-`}4OOjeaDdpQimHtbLWo|iS8YTH;Pua`^6a35g-o^WuV~_n%B!{= z#LU>7SMB$0P3&k}RdK2gO1n@dcZ>#$iCV1#9}-`2R#g%-mG~NemE}}<8&p15RHw4= zKz&=8eEV9}nIM$O=`~d6t=X+`MdA85nS9TB)$Js_`6sjLjs)$$v0e4FD`H4vZ`C_p z0rBY3sxN~o5pVNA_4_q`K4_Srn*A6Bjhmp_0_8MJR9LB;MG(vwdF?NPs6t2bdX%7^ zJQc3AvS8;6M^P`6IM@zKwX9IKkg?kGRoI=yJFhI;0swSnEf`=C}*pwjfx|wb%&Vexo7S zI9TW%e3Dp0TVcSC1&DSFgs6R?#K*)6vEk>5My(WL|Au*QYbcDgw;}p231gPwLFMiX zlm5o}R9B&Kr@|FZGWm{m!lZvhl=qJnuInn3yDU{`**rk7oVbfHnj|EnfZ%q^6b|+l zl4qBN@>CL%=lc>(m@Fi(K;K@B6OvCBUNnVT{5>J%Nev?3mqKbo%ut|* zkeUhW$Xq0orF9YJ&ct=5nZnJSvclT;$OY?q2^-G8B3}2ju<>(e;)f0idG*%7W%p9JYrjk$>nm(6_W=dT zC}HbVOLwAQ?S*ZLFpqAw!nQf9@!)+j+42W6dG(*dHnin<+&iH#7fMz)QQ@;dp%9re zbFoqQtfEl(sFaxN9EH#J3q=BQ%2p4AqV~~9MD8nm?jRHmfmOvM2t}3@T;TRuD6;bT zF`?-67bFaq6}}uG>^hx~KJ5Wv-@p#UGZKYEzhIWReHE_TB$MyHB^=Y(5IgQC9DfSO zQfMojSk?zg=M~}flbh&{Ulz_}Mxz}crO^CA;hLU;#rgxj%S*V>0{ysy2H`>%)cK=^ z2^X$khO#_TXp^ZhYr4XfPBPhYT!-`c&aOh~FgLW*ZwRIPp=39g2&K>N!+%5ymue#X zu3Rl#vMOWhb>W|M%=m+mGFehA`j7a64}TzBef@-3{aA(1LxpP{p#xK^3D;7fG`&X& z_pG^Gt+~RpS~HOyXUOCuZVJ!#;^%#z3D2&6M=BOCJWnWv^3D)mVa4ajz9TXZWJYD4iUQha z^f5^ka~=?z9wzE$zzU)(iiVt%L<0??@d^gUw~1xWjv(4_Pb@1{z>>~EvFxR>M0P1+ z#n~{ofiuJ^JqwBZwH2#e9zcBFG_k4$GiEs=iPZ{K#G@{YwI-}1)@`*|XWx6oYj3gc z8aSlO6~%hj1ftk3qUTLiwTlOdO;%4QnzB=DR_8i8nciZ{W~i10vqIe~h3iCxd9!5l z-Tf3Ea28v>g;I`46aT6l1p80Q6aV__4;lgo#a8Zck-JO8HdP?QKaa(>uPR`jCrtFS zYX3wpv7J9I9C=g>w5|!&xu)>x9Wf9~H>{qm!e{TqK&*7om&P)g+Yp7%(`52Zc4DXI z(22jFiCx!uTA(E7#coSxp|d$c?Dnb{KE8|?E(xdu?uotLdE(8>iT%Dp8E5_!2LvJ& zTllXS>5XzbFH4N<26H_WCq|ABCiZEZ7<~yh9=A-4`HbuAw~K=+Tt)^oLL6j+u-mRB zm;~+?2eogA&ZsC3nr}gdlXO8G{3;y#oF$ZNy>ck;nhlU5vB2LM&vcm_QK4 z$UfqjI=*Pv6^Y~aOYrGi#0jNg#B22uCw43)TJT()n70PiaiL7s>nr#f$1i2F-frSl z$4(f~Dsk49qr``v7w1?`7oyWKL!1M$^_OLG*LLEZd$3=xMq+Ba67&J=6(0H`lj&b6 zG`T6<{YNHm-A-Yfjbf^`=R0eLm^ODZ@ez7)VNKjemmx0P{x7ksiQ>Wo=+f=U5G{+k z9zoyFU0gKRj(9c~7pFk`#dL*b_bS{_PbS|xR9rk04TYkaVr~btR@^U%xdFJ|Fh$Ir z38hVr6LbGY_iNs1F*g@Vxl=7JvEFa;Q*l{lXJP>-#pOp!ze2QyOa#*BfCT zb9RUuVv&a1S?j!GD_hl%XRq!tF}ibUsqq@ z&TMhpBu?ZuTFkdDmF}4<7R4j~_j40>IJQRfxU;zLL}PTh+Kc1(^Bzx;{>9=7AQQuP2p2PChPxEq2*&k`2%0QLOdCZ^my?X@pQ2Ohf^e;&3%Z4 z$s6KL??1#QxQaJ#JELhdQ@pz#O7yY6_*nXiq%vB3JgqFs_T}P}1<)m%MhYudQ@Fgd z!j1nZ+}A=T%j+f6!uO?#->W$wt`AaJ?4t1gH<_$Q8HI0Ji@#&{5?ke{mYPA<886jk zYE~gSK3pd2y~UZGO8#_ z^=eL3=ZV@c+JYM|@1kxu5?b7`ojUMLJc7exb;mo^&@x%C?i`a3kM~L4`B*u`h){Ro$b~C*lJ<)jcdN zT!^`6t9w}aVu`xPHB429qw0u>AJJ}0lga-IR7adEPvreU9q}8rU{a8}w=EJDqpwVs zR8!q&sxy{akE#3Jf*+}vrtXgwb#|@2I=VF+nAc62e9ljGw2vRLmKD_T&!IDZSJak- z`iIfe{iGiK5T0xQ9rYL;rcNr9$y@GGkKGxL^!m7Zf?7pX_PxR{aWZ*cUG<~@BN`N~ z6uv8w$*1>IPwMy@9&@{Ta<3Iwq{>rIo(QgAB$L-oQ>TX*Q24a9s2ARa)>f{k&YluU zbn%^f(Ptmj<-gR6cNySnAFEdkdQ5zMiF*B(J;c5=Rj)6AuFN^AE?9;0`)pJ1ybT#Y zKC0exxfIFjX7#>)ICd>oUpw;#`9oLrZMy{sv-i~ZOdW`sUDXd7P9whmiu#d#0ewn5sfFDFZb&m(V$>Jxo){h-$cNp~kiZ!Dmajrh4ao#Kl{hx&s~%y{@5Ya4DLY zrCg%M9VGC z7M9)Pz-4YITBmA)w*5h!P*u}q?mNs#IZX)P4$m2@3G22Q>Gvv4k6;WuXsRasD$K7( zxTa^RHUGC%()4;Yn&`q?h3{|6i13{&mK@;l-t*-o1 zq2m&T^`~j#8+a2>udGR2`xw2XX`1ovx^dbU?J`!b&)9DmRp^0Y-Z9Hl9? zq!Z2Cs5x1TH~#rdbL#GAG{xI z;6-A?LN&kQi{bmnN$Lp5c*j4I=3x@CldUE5S(NiLjz|@-+|F&+NtI%j5|+%Q%HEBL zR~#nU&PIvX>bX><01hdpK&oo_bqAe}<&wizJ7g{@$@xZW`1%~FPD(y%KYyvtTz9PH ztdm@vKO$SLFS%;LVR2GDr)}tHBue#9SkD_THTdfd@xAM$22W1HQwB-ye%P8Z_m|{8 z0}iL*BB@at)|R6GNFIwjBcC{-a8s0Iv3|jp{gA)lHXjuZY_70iio$*8B+u{#Xwd{p zjb*-;n)m6CZuv5)MPUxiX}Z)h?HrD;NZvt3$f7GqZAL?6-qWOZ@1_zH_DdbUBZ$pX zOM$WQH@>^1z-8r$*2Y=n4}4d#)G-9w-DR8=Y2TkcTh1<$WW0!v*il{A(_rjF(7-@V$B$nZPr12L_#DiR< z2~S`RmYSu~?)-c z;DOMI8Lqf-GiQZIT@_x>R`{@1X9Q(8%LqOD2fK55P^)QBSmXhb zZps-Vr5}ZIw(Bcp&xL5lE|*qJbVMbzQ`&eA=2&l{wDGbZ;{Wt_(#D66&=M7;JhuR1 zpKnTe;}@WIYb0&1c!#+6L}~Nvg~Y%}8B)>b`Na0N zly>~{oY>hW(%u-jT+I_{Zz?jT0R_^&4@kw9yqC!~ESJgM>PbfiV6~g2tED5erV<65 zm5$u|jn)WBB|Anz$<9m1(;#D)AnBwF?B4mjbTaThem-A1)pix^`l57d7v8Xa4e7$N zd&JBCBV9PTjda4rGMWHM7!NdtHKToR%DRLx8-UD6K1YnXRXD!>m=4}^R%W$@ML%X)|z`Y#J;Ze z+AW2zDkCDj_uGQKVVFqiR)z(~|LF|^lw&o8wuoKm^F5N|h z^IWaV0u?qWeb&0}K0@SjO54B=Gg{wP+aMqZ&uwneHhEiuM&e;@3#Z}eY?`!x)q=8Q zG}N}aioV{8vfB3UNF3HI*LEm_4MllT+77=OVO1t#G2D(XrsT1u!4u$f%#fQJGD0E;0km;-f3eCkSw;n zsg2#~O^occgXch0bL(oSjKYnF+i7Q5wiA1qp`CG|1EOeO?aaDu(7+g{ojG%DU$iUKQ1-ryv?~ewzbNRScIEOy;#EAgtCw*2>JaUkSU8v^9v_7VicI|))a2yY{>pVunYHn*c9q>R#G)!A)zY;TXQoFMh+U-0-yXTOAWVC`z zw(X0;f>4<}KVQ4A_61_24r&j*T8aAqPfzX9{Rp?oUfL6Paic|<+LJzr=X(ywIK8R(tcG@2`J`$z1(EeetcXg?br*Wd^OlSPHl-QX zST*0Ob2{)D%WDU8&boLsE*k6VY=G`ebko(-3+N5i(KU2|m4#*MJS{gohz}a5Yv!Je zAdx4NS+?t1gg9ca?h>6>Jlg0nm33YVuz7U&ew|l3{6y1e-Cw2*tcD+w$>(|LysO)x zCwxQU)=XWiHLZy4`l4&oB^K-a4|Q!DgW-v~fH}w&v#TlmZLhP0SvMZ}_SAL#bpWpR zh_1&JKdf|Q>mo+ML&fCjdN)SNH8DZgzkW29Xw|y@KRt;GX6XhLVkU-u)J4KdC?!%C zd1N(wd`(?cOX$d^6$;<4k;!aDnY?m!g#`z7QL%Wz(DxQy)S0eGp<3&r-n$T=`%@RK z?TTR2Ko=eO2$@SWgF{eDpwy#>9YFIRQ3qwSFchU;RNm0~I*bweCsw#lMy zXwU1INkL&=C7G<+H-+t;W%A0`6vkK*bVFyQ6RA7vhL=Iw?Xp5QIuS`{>-D-Zd(wzB zl@;bam&vz3)LHIe3OzpPrd@~Ctofmvz3UyZ%$d5mGodrXXXr9!!w+=z)nyNWi(Qta zTj6QKqL!y_rQhz7blC*z16a@Rddht@lK z>z~pfLLk1 zUa$`EZJ10pqFApEIggc=fA#vx7T9Y>qTcZSJ2sgN(;KlbgBgy<uU_=6}?i zMOed@&H8e^FAz6W(wA@72dP(q!lVDqhr8rs7O__0+r#>bdk+zvb=Oy(8HwEQtlsu^ z2ckNi^)))etml8#*RZU+0-tT8ueqx{YBV3c%k>bVmuK}ZH_E}WOwiZ!fLT?$sIPb8 z5b^1=^={U>zrzW=TNAY3X13Ee8E_Aa(5d=nuc2&>x9hzQ&L{4AN8i@EraYlo??1{l`S;z`Ec1Uyo3JS8J*N*ZCamKReeTW?zQq`ee|c?Z$^C8}!j* ziN(w}n2)?i>h;7>X3ut{&xHn?CSQq`9W+#d2$_FRgWdTLSW*o%I95RoxOBh4c|1gv zw%t(sVjyvcQ-(T8@GA>?8S1V=b-n+E!PR3G%6EH1J^u;Bs?;^qPwfx;@AS#wz8cA3 z%Q=RIU%?g?4Ndr3n9Dpv)7DU$go5Aa&9r39y2Jhe)1R*lC zO2Ktr8HTpa5j#fTHu$zcpTNJX!S^nd_xxFde;TN&tj8M@EBgBdt%2p_c+j;4+w zJoOQ=xHLo0l2ydl4L9_v-;}sdhM~{PhbUb38=`m(49IARa>p*4D&s-yvZ->}5M$|R ziycjK4Y7M+Zb5SmgJ(ZN&u4{U?3nMUZY_qf-*JI%i(%{!DCxq9hKXK}u_^tcVdC?) z$Qw2qlJ3G2<`)@~=Q?2@;4;IsUHEz08^iS8>BPsT8D{3a!EZiQHOxA6301MZVRmsE z{K^AEsusGXlMEL5LtZEO3ub>p;ffrY+WR@7Rcf(%K zI2m$cG3B4U3^}`YAgvBIEPjc2o@OyDpMD4Rdq2a5(U{`sa)wPkq1_iMfOw+|y}@*F ztzlCX98}NhhAk@>5|uw>DAYmw>u)v`)yE99i81Wz7KOE;R)#%q|rN!@VjW(WZ|w zJZ^w2x!VH6lXIcys1_NXJVky#=#Am~5j^Owz2QgKh8Wm%!>_{nSoF#@{Of)N_P?Z@ zk-vI?xPQ^8%DaS(MBQZaHtt4Y(-C4}<&2_LDSNjvYF1{2^$4W~p(kI~>LFB89g$$Yj008I!CXRQvD7S;3VoSkKQk zD$8NjjHyduW;%c4yndc2$155ap0~jaL>My|VnWNaGP&Dpg{ixYOI&k^%r%XxhE738 z^R01p5z^~b{~Fhh#{gg6Fy;qC6c?L=5J5n+v1mDTVrZ;!-^EaLTJIT;q@w>v39XGs zPawf)H3%$#2xc3PzJhu5dtoejb{Mr_E#tAdP^!Mnc)H{d@zh?%GnMBfl^Slm@NY+W z!~|n$%UGh?`;3=9#St|xR(QOo!bc@CS?_3t@4gwYK8QkbJI#38l6e3-9@ZLfA2DI& zGuimC!6)n`X>NR39u>^_-o}>`W)bU>W_)9HBpHW|@75(Ee&-uM6d(&`EsY<|c!9|^ zOgya|@`nB_U^+rvj4N3nuY9{D#z6CU4o+q}u?`S-plyzZ|i|Cc|Vg#D(I) z$4zBhVygaaVJc@VB;GK{RQWWN<;``IyzR!Ri^%#?a?k|%!-)Cx*+ZY{_8m6`>)nGO4OzlpEL5WwIf}J5M^(=+u$61sQ z8!~0`y+2G{qwvlVnXI4Lls|nT5}1Le9WSBvYqh50$_USvDyCw)&#?c>Gfihszaw65 zrRhp6Mt*O->24|>)S|%jAh#FM>HDU~6Q`nu5^s855!&wj#`KC!BX(nw=}oQcP{xm@ z&wd!dj%lXvMJY(R@=U*+A<8c9rr*y!(cG?MrjdAHryFMVHt5p11!nC6_?2y5GA(So zlUdhs52Dpxvn~(x)tdD^ky6{ zA7rkv8fF)~*X*=r9`VCh%ylQ-#V@6XnCp#wgM1*u+z{vUy1wQ{1~{gTbro*5H#aE@ zoxqzmSuJ8wtG~I`uvF~#ePeDPzKyuKhq-<6LpUgvxx-lt>@Ysp+)+S%Aw4k%+rVRK zx|o9>;KKf;=H81Sv&+fmKHcEi3fh<>JD^1~-`gA;-VIweZOyTLY_W86&m6lo431~F zd2oeTVq3z^(`i{sArP4Xx8*5(n8_}`oqj}9L4|F*8nKuubOx*L9`GAy7d~l5U zKyX*Qd9wNFHHacI%zWywhS)$m^O>U}vg+RE^Vy{c+d1Zoj(FhgE9UF>x}b&A*nIsL zlH8XDv*q!iPsCP6n62avea(*t!;u_rpz!QsnXJ2De!B7;@k33`&#PI>^kwGfy`h91 zB4lzq5A&BANaKroo4-}S{St%CKdzdwd&Vyo+bIUA&@~pwjp|DHKx+KsZgn+)xlKU> z?<>0WAunnaylwBh+M^oz&>)JX(G-RM9cUE(kECcYlKTJWYJ<VZof z@T>O@`1Sbz=Tm%p_&C)6pQl`X+n)ux|KC$_X@C4nz?0(fzxAn+@+d|iDUG&%^PeG? zX*YW4(E16{;}RU=m0{O&kW}U_g|Mvn+D*pcG zGOco%o10rfY$Di0C-wio3PgP!?=`rVSgKb;y<5 zX9d(@hAf*C@E!koiYXLN=`=hldM6%pnf=cr?EZg`7@lB#MAoD_tolxs3!7JyjY=<# zw9V26vSxbg{13yZz%15?Rm`dy#k6L7pZ;-ixNcxB2Bb;SESWE~vD zs-mf76~9#h6rF*3L393BUKJpGABPTc1BW}r#ybp)jgOCwi^=NSk=e{JbYwdX9r^Pd zXKxC^lq6tIabIdo?*IMQfx4iz8U)c`hO^#(~ZGgrdlnC6Qg0 zpY5@i<&k}R?ElZ5`9H7M^Lo!rb7#(c&v!q^r$vUJ|LNmvTROidqUOXt-ImE+4}q@D@IKL>9hxP#1<6}C5sl;n|fZ4=0d4aj$Jn%S}4qEWAq!b+dA*wo> zNGwNeb2qRa@j5Y}1M#{TsW^Zr`HD=oy|qkU=b6G;7??PPxP4`XSyjN9#JgIb2S(Wv zX=)RD2}x`A5#K$Y$Z(Cg%YGt@^d+3T=o!O%|N0~n3BW^L_P6E zmxd^OvzMqh=DYL>h`~!X3iE5pWZKO#xpPN_!!hr@ZxJhRy$}5JlE|$Y=C_b6^1-D@ z<-(ggGMTVaCf_;?3?)`kEt8Kd0v8iqZUEjR-n}hRpH9T8pOwigeF8DJ&%Z(kXF`8A zC`?TQt&*-t)UOJ3Wj9g($;4Ltf#~|j5Kk#bff{ClbBf1ZEJ=>ZmZ=4!ljQ{XLo7zN^9| z`-q0Xd=Gnr$B1?44t^u%_*mhRr3x*n%jE;!q=aZ_6!8qaaA+Lygb;8m2&wpm5pOwL z;hHfZlqg9H=HvcluC) z^MAMt(TM%ToU;|CVXj8x;6{jkWC79E-ZEJ_eu#748eb3)OiX}CCqd*}#}bFgSpo)a z<%h2_xy%2E5AP2ph6RD#bu@AL{u7v<3h-$@R$~57zPZ)k+V$Zg+bstds#~S z;9Ph}XHxZSMZAYSsRmoQiBxl}EF;x4U8fdF<0RVcbRBC(3jzlKq%}j zH-+y?$s+s@3Ru;dWY&fxtmh7R5XiffDeOK{;gQ)S+&M)&^aTke7_j-BOjf6{OkQ)2 z!U=fZb0}%|XcAt)B$EnAc=;Lj4!(wD1D28S^)$@>vW0~Ipn(6oPoi)YuGcJ+XWb-G znokr|1H_AhdXU%{S{?F`#J2GD<$5VR{81*W+gaftrf~CknY>m-h10()O!-BkQxl>I z6Tw*Mmt`}FJz)yEGKJ-)Da>4~@W?5dtUg|Z`b9TO}#nXe9A@6jA+) zB>qISMJA-4Wx+^Vv?X;a=JI$7sdvsLs_dZfNP@x(w`4Ns`wG)DWb!u3{XF@$a=yDG zsjnjS%8Dg}6O?-8WHL-eHdJmam5+QvG-Df8tdT>^<2Ti)`;_R7p6XhxA#>Ijvf~qp zVza2xuUuk>?@;5oQeu^=Qj@EYK;8BVXUCE~?45nQK=!a>HvS>mm$f1mW}v1mT!;|W%6=! z6#9=-4T=mbI5Zs>^(SxJk#;C;Bqvu5ZA{Z#z*_WYW^Xw?>G-FChtB^ ziPa4SpMiJDd)Q5QHc#@lCZ=I(@?NwJ9`7-EKY~&QPbTkYn2M#IO zOA0IGD9mU51Ab7J>&)rJq-zK{bVw|Kz?J_5RY>vKg(E{!{Q6%H$I1` zt_}IkfcYFePkzV?NSh#&>3b^d=qi&p@1QV#G5H;Vjx1BtFbTR4>rKOgis2!XX!sO? zc$IE6+_D};$7`7^t{e@IOd;CPj7CIaK#6zAGUBTpT;h82- zkoz#$P56cBW*< zMZ^zvrA_YFh%FUpTiIKpEG?xBb%&W++EL1KX!ph^l-RNS?o5Y@qbomwroa!f&9~e(J`)ww6XbIh~ zQbKHlk?y}pCAKJAp(S@OJ-AYr*xv^7?<7_TLx8d{;9=Eo9Uk?=nM93*v)| zSvhwo=d}y0+-Xeh!mg}gn^|OGS6rBVjb~6o9c%Sw2hsYStj$peBozHw`!D5*rWl!1 zb10eX3D)}uw0h2W=3C&3Xx5(%3BE;i!I$~f=|l8s7aP_eQ&as18}1WL%s7jUG$7Ub zo52F|7C|XJ*yPXfCoW^y6k!3e8Ex5=yg{)4ULROEOM%FJS@>ivqTLF%NQVbq_F!>? z{}6k)f~`-5F0`4zQvO~cHt#Fj8HWdUb6{x=ZHbKyWV>8E;Gp`m-7gXK8k!ZWGnFq4$rek^Q;+e#%j^LKo#p`iU#5-OdPu#(ecTul~h);9ZoDgF6 zJ9*#vK2WwG?$sSye6fgofAl8i6U%+SZ6`LM2OrXVHF57feCYFVq8qdMh=Z_(o;CT% z<&fZkt9+~@%+@EFhkhwX?07hzwsj)+Ip1%cvQCy8JjV-p`i5wp+hrQDtuy(-sIJ6%=y_f=rY6*h=UIctr!aoF zvNuYnC;Yg!7NLaU#}{y7v%B(hItP^28~KIM6S#jozwo0FQLh!hGV>DB?!)}b+61Du ziTs*_8B;lh7dNPgPF^N2?wo@G-j?_cuV%zo-Q{;{BiC!{%kM5gGTJngmn`!q_D?#0 zc^8R==UM*pGpxbl!~eZBk=TgO{Nrkfvdo5mT7WrkyM_N(v<(B;tYV`tpmZxxRe3(2 zn9y1#Zy%(pS%xZmZB13JLVIHGCa7w?NxH<@5KgOi$82bjx-t%iF3R(bi;>se1gu-yN2!ddYLuG_N*$pJI|T=}C{s0IJS6zpQ#EnBB^!yFt!jz~98bb2)s)9zR6kXO zHS4t-riw<%O*2H*(t%K_m*J||NGO%pN>%)LDB+|Rs#TluK-UP>>U&MlD;l6$*QOkC z>aSYo3@eJMs!GZaB9`+XpI;489J3u_(t?KKzs_3u|Q~iE}zmID#sFsx?4NntPd!dwu zUJ9%HBM4>;+;);6s?cz}y+}~cUxX=mD%kXZU#L~vBG|mfi<b!j z#t1E23_|*xAUK`4L44&8p;K4*`j~Bki(3vFjuAqyS6RgMFNEHf$Hb*HVc@CZM8|Uk zpKc{6LNf&4y$DWmj|AV}==ZfcFO2X!PpnyjF#6ys1hrv8&@pe~Q!Gz~kfB$JriKY2 zD`D3A4hmE1R7Rq)L71@xFEaTF^H$;qWUtV;P~q0MGI{nEVc!2lNXB2`_A4^ET~&qY zeuAaw5z$>k;+H72;Y$LhiqXxV5l~wLvo3@(aT9rTCr6OIUdU;kxf~VbwV3gj+GyV)JpoFe1VtSD{QXz3_9R0>?}NtqVtPPUTK-I^8<1{yBs0oY8ml{J%n9fJcu97 z6Ed5n5_7$!Fvn3Q4>~UFtMCy8hqJJ6(O{zg?g?45Ac;ZGgsj*Uym+xpmOKo!pz%S3U z!jdE*cRZ|WY!@Ln3isPjR9MT@v_leKyFI-w1jCOmFLh~_&sdh5? z0SDn)N3`3H2*S02DB~wQ7p~pC30>JMSmcAs0m_ASo(i|UmB}{d$mIL`3&j&!pk1CK z6d#9@-9080zkGrMqPcLR{xigkiNX!5GREx?{+9@mKaQ8l<~)_j#}5;3zj+P`Jylq8 zNx0JwIuQBXBHW3B(u{Bx9$Ry_`fA~2L$t?D@I5kX|*Ay!!iGaEBdtT8Nyc(evB z3NyWB@|+;=8EGg-9$d{N*q@i zVYYiNxPZ7z8*!XlYutBL92bv7W^Nxbv@8*3`BMyiGl+P;QJioUX}Z%jabo3L#QK+t z(+N`$c3Yg$*aFu(+ak_9F2RR466X~A5U+PjoZGLMXw?C6Ze}W~-5WC5kjdZ|teWX$ zvLR{WBHR90GpZ%V>^(z#oSPVXF$ax{fihW2f0?}D2{HCD%++zX7}pCrrLCjzL}f9~ zf(uNVFJEA~lL~VqWb#fY6n3^1-Pt^NEj-5?9y9gLG@e)%*VvyZ%vJolnFL zn#2u*P7~{xA#PZ1gO2JPabpy;T})J1K3ZY=SDE}^kZ4KngBD4%eqypaeyFV|CNG7S zMmmYfE78ST)4+t zYSC59wyt>QWs14ekluGo6A#*ULl4-}OFUN84&AB>;&JO2#(xzHhi4Eq$Q938muC7@ z70Bf=EE-6fN6ts$NdLH4_Dl6bK|fP?8RUQT{Se73iEzsny~ zy(!}T2X^TFF!513bjR}co>(e6gOF&lPU1rf}C*g-3?U zWNEi#@9fA46u zbB`y)Mn-{f#Ul$qd*uJN5jzU`j=qyrEv5=w(1O&7O$4@$|kK8Oq5*eXB z7J&0c&gwgt-l9;bqkdqs3Sn}W`mw1GG5vA%)7H_%^De7P>P$zg_PoM6^`C318rxt=rMaehA%acDKuv9r0OD+r#(wluRL7F0<&9u;xjt$fzCDA7OxHMl z{X%?gc}>@acaihe)^sz^LK?qIVU>EC?)jJkug99cPm$ua*sSqbht+aRXn&2zmKJC* z{L&1_`U8=bY6dQUPwa85#*6QV%Y3Tw@!f;QUh};w((rMu!Rz29&97;Y zT)c~<_OoD)_YaUX&lV6nb67H8M!mkMlT-=I<-BrTsp{CxL@p#%>(YjJ`R7vgWvJmg zjh1R0fI}KPPpbLrAsQH=Qr&$v$apSGcK5mwi>M$qj><+~puE(0c`Gc%)RmgpeS&NM zCNijW*OdLV%)QnZO2F*{70eW z3y~}xbCO_A^CjnmE4Z*l>M|e~KK-H8J={8Hf23aT7ZGCvq(0vfy`n5q-w-&Q9+6Vt zEftA&I?3b*j!ON!pxpyqB+u!aiSNH54Kc#pMt76^3K>egaSH!dmWGY`j)l#GQb0Le zw>@N$4|r<66tED=7F#9-Puq^w>z7jS${eIt#ZvH=21uPMNWl+|6SXRm$;5}!m~oLr zE$d5TE_oAu&6dW#g5#OlQ5xrY8{ztc!tPzAun2#mPN52)Iml#X$E695aNSKTv!n@r zCy6Z>E=}GaOT3L<;clH2vGpU?^*%_mJ3-`ptTcOiAkjplH2a!~xchc#&U09Ujk`2| z5tPa8ykzl$3*YP~S(fDE{Ff9NR2M0khqP$2^?ZaB73>7penpBpfcHTsmNdn4E$!ba z2dCW?-ae%8Nne?4&^m?x=E&qbRnn5Tudrs^Us`H;hCaY3DP~9@vgp%NEW?~G)Jn0z z)?Bfj6#EZ)M`81%751&s!1$`rn4_>~piB#Gvy~5c_H8L1HBDSI`M)-T7D zM1)G)=GvmtSt#wg0yAv%McQ=}K`1gr+V!ji>GpgnvxPf+yN{GPdled^zob1?9%5FbESj-dqu2hpLBFAT&-%P zbTkerl7BPl*hi#Zn~ut4snuojCaKct(S_JdVv$bAEP@2qNv9wG1}{j32dBdR-K28~ znA-+L()lK^_j+#9`Myuk5%H5Qxa@#ACrcOd@PWNwOV_qon@8pW(zWwh#0~GHYxn99 z{rM|B=?LHb$x(Xx0v@fQxAdxuE%9ju(!W2UYy(88tZG#(GSybtp^w5d{S-dkCX)?* zr7)_C!W$Naum4D&DFr24k@VXV)C!A3wWU7|P7o`dD*b&s1{u*?tqMCLSXQ)5zI(M+ zFhOLE&S{N#=doABPHSod$8}HAnuoVWBXX*?T)&sZ_qu4StAnuDD@Z0&g)8jyP9{IH zS!mSrfJ>R!H0MJN82AOqde$8g_~b#eRw~lU{kd|rfj?* zLpx~qO(jMdX&@Q#_4*L&x(JqaciVjCpZ44?E-Ze{`V5vxa>Ll$pHMDzVkajy+l`clReQOSa z(jINfCXO|p5^ZV-9Ep3ROy1_EcBePAe9RN=&e4_NANFX|9Hzkhe6_pt9f(Cg*XGpO z4oM_x4;4eH?K*0YoD`7%*LWx&u*^vc_g<38Gc&Zu8eKza=A=DYh9CZTqdjvRVKq|J z7CplGh5+q(SA^}n2QvA3ckTHza7-SK+VekQ?^|AKFE=`aTF_s6?RPk_+B3D+57!{R z?S=OG*UeZPs;j-}J{9&q`ycJS8;E}4SGD(@3b4m(iMF%^%6O5q@3tb1ZXKh2cf|oO z9;f}V-jmp%X4=oqexi@}OZz!B5n=nU_UnMRuU~iX`HhGTEG_x{hA9a3o`Oou;81K6;g|(<lnDRO zzNN0SX$^YGUNU)1j;>2>8+6B06z;33>uO0wHJUR?*L`3J%xI6!r5!lbRp%ayoG@{X z!vEIme60I}df4d({mRFhZYSN4g*{QYq~C2I|#ugT^HQ91PKaPxGz!{yfYZf>w|T{d(rdx=&1_{ zheusus|(pu3`sWEjkkr_F1)G>8+I3x6fDZY?k6%?wJ8c+H_POe1}Yr=Mi&;7NTl}A zO)7`<+OCE!d=`>R=X$ys*rr9AY6>$C$mDzO>nsl;!ItB7(RX1r+otK3<-NxyRi<0M z6go2=y_03|1A{Ck-TKjRtsB1UwzV~(Klews-S$0k?LJ+4mI=GoxJ(|Or`vTE2}#2Y z-JU40=1<-J*RT%%ZMxjFd8lw=b$Ra4mEQYxhkHV&I!@CatL=&cW|Z#uPH=s5nJoFT zOkU%d?qm|C#6~x#f+P%}AL0Zk;XXpx@E)x0v))mIXLA7n6JGZ1V z!mEd_XjWH@JWE%!u8{bo>ADN^@kNOmg&*T|7ZyO7-|1ztcP(^RPDde~Pt#qUk%RVp zU72iry6)lmiCF(XnxQL6gx1>}(!B`B7jG$$$!%Kc{%se4Dz~HV-;el$J}q_ccBK-l zwL$lOG`@6L4c!No2THd!x}WVoU_H-O_ebZ9Ien{ed!e4U!Us)q)T^w|O`9Z>w{+F3 zB5>Ymh+cJeHSGVz7rjtDpV(!4yT>*q3An6qB(brnk{Gxhpvu-7%Ndc%kBM4s*S z#-&K5v_3Lp{g3DcWJSVKmtzQTxW#5M8yioN`?*gQ|+>FWxg+?L6F>wp%2 zVy`>us~kNEhciH5ZD}BU^*Vj^2Yt|BsHU&i4|W|lSzj;h7JPP^zJ6XslwwAGlY155 zP&VkBIl!E1CF`3NokR;qrEg)a>-!|=TR5Vtw&;Z3ar9%9cB0s_pC!E=`Dds|{%iK*)9-QV1Ra@p&>x~_sFa?yKvp#YivMDG)fATqP3-skuLVyp7? zgC;E^UZ=O-Z%--OYt8i|mVJgR-k={DZi`@ZOCOY!jqdmp{g}qriN&7OkLiUV6;rAo z*B<)^Iz;Qk;*pxg73n8zm`r@%)6=!D`iJ{rrFi*zqt? zztFWlHXL~CqfDshtE|y4+kix+*D8H%gD9e7-}S4%w?j)NTffHV50oxezwTfQqR)r) z>sxmrHn*ZaY2IL@<16(^4`KIHTj`UvZHYJ0>ytM@cV^zP=(l$Zg2RZB$u7*(@AwBV z>K3a{E5b-e_0#Vz50U=S%Vat`{q8yS;UQP)Gd&Sh)V~$hJS~&g?5c2lU4{GX73R6< zGyMd3z_0o}Rc9i09MJC@0VO(7s9f`x{5`fD$PiEfV3-?z?f^RxQLI_O3-lT7w>fK1+{ zg2Ha$`p12HqqA~d|11nsZCO1||GG<0M6urbPqUx{J7(yAm7u(?nyde7cLk1Pj6qy~ z6CP`VL4&p$ANSLs4~`%fs5O{Re?aCl(opWme)x^~hRTlL5O!k>H86wB<)*>r>PM`I zh8k>Zpv2qYXt0}&DN2}YXmq_V@mj8i#tSMV{;z6iu-}35`Ea12slyJ~^(#ZO-gA&f z?=Uov8wG98H?&GY?&l;JT7LuEtu#3Dov@N2hW6c{Gpj{I`#XpY0m}^?o-`olcGb}7 zlMV6t+YMbj$HFgMFm#Q=@7kLTE*%gvruZ6qbVMJZcO65IN1rX&=Tm0rod7LXHB#uX zLnc!nHn?4s(46LmzH?xXJhuy{lw>IuDJsU`C* z_W!Ro#GJf=s<)~kP79^dNeVNSb5^sve9ksikjZP3A>I{<#WDv&d>&k{Uyfmw$`!75 zuVM8fNND3Og=uYN@|<|Xnr?V;a*)EbBQkkzErVrEI!2b9WRRKmT_(@_QX7pz@r zSbrFHdTx^;DFmW^mt#oEJBT#8hGFAt#P5VYhOLVqqAa&JWQ0Ss0kMYN!=Tky9KZx{ zE|>@w8g>W4G5NhP?A^YasNyn1jt)xSq@l%-+ZMVKX)uq`hNEm6 z79i#rjs|T*EqDn;Utpvj#EV9{gDGH)A-@b?9COZa+5vvTx1yog^AxeI`G&_eK4E3_ zfuXeJ6I>r=cz(qjol=Y8`3t1;L1PWyPvbrJEb9$F2DOIPdm4V_G{@@I7{lLIw}`Kg zHS)5jh<1IAs>~bM_Y*FYJ7*Y$-KU8Sh&75lxd-RMe+d~I>ora+8V7>V2tssigmm4 zMtN0h>>6X-W|)_*w{b;4TST|V#?@CVLjpI9YZzjIQ!km^evHDUt&N+SCSh^8%(x?L zAsUs3jVZavrnk&A?wpMQzVJ3?dtxfC4FRp|e?1=>bGJe%!W@jpu6v_}I@EYN4lkOn zGoC3zLeaGicmPw7VLVd?>j=m(7QQ@%?)Q7++2v3w|BJ?pg@1@Ixn;amEgr7?rSaO| ze(;1{jK$6&M2!|3Z+xCe)M2^8!tM&6mVlOt#D+YSFR-#H#@kPWP{sZ+K3JO%`>tbr zaM}b({4_pm`5B!HmGO1Osl+b)&-i*y3>Fgg#<#B_(p4Re@6%=>Y|k-%JOG{eeZ~06 zj1QRi+Qbto5WPHS5{9c#yc$iSerKBWlecSU>Ym&Vt(OfZm#A8>nsO#fuM0lV;xLn^9p*|M zqp+fj!i)f!{NP8^K$&?&J_v-=VO!wf*QmvjJO$%&GU``WEkvB1C zWou2*KMr6wYl$hw6IxxPz!cXT_8d^twDvmIctR6Qn}RZsdij{PTYYWJ4h|9ARO$9bzh*x5! zOBdf0H`O%V3c<)9o-;j)!;2i7nVu#OC%QnU(z%P!c26+9sse4d%QKa+Xkxd%n%*|N zOMGdV=}S)xAp4K$du|l*G&|ETJ4~hL57X~gZPB#eW~M24pQVqtS)B!Cx}Y;_SHZFD z&QZ8$lUdjA2%=P5vo6!hNV9$zQmN{#6xx<5Y<|&P;STDDc{|OOHsDJ``kJfZ-vCg< zw`SSloQ_v``>#yaFj(QB2Qn?}**E!s?;K#Zc?^f+kz=kC4@VPt$Xq9J8vbckA9KB= zQP=~vOeWh=WUiM2v-6BLH%MJU{Mco){k%u8?~CSU5pR(P+%UJs{oL-jxs3siDdV%k z%vWZ|^3aJ(S!Tx+5sOs|%v~qM!Tzt0HMy$ znmsGSV`&DOJ+Zx-Mr|~Y*nla!zRm3K3(vN{u{p30S~9VR%ppU4vBlEK9O7RcOEQ1W zA^UtVur}tgYXX#`BEw*^!vMuJj zj|XB0!(VghxX;8k-H^#^-Z7Vk!hxLdP diff --git a/i18n/qlog_it.ts b/i18n/qlog_it.ts index ea4869ae..0b406554 100644 --- a/i18n/qlog_it.ts +++ b/i18n/qlog_it.ts @@ -108,44 +108,44 @@ Continente - - + + North America Nord America - - + + Africa Africa - - + + Antarctica Antartide - - + + South America Sud America - + Asia Asia - + Europe Europa - - + + Oceania Oceanía @@ -217,40 +217,45 @@ AlertTableModel - + Rule Name Nome della Regola - + Callsign Indicativo - + Frequency Frequenza - + Mode Modo - + Updated Aggiornato - + Last Update Último Aggiornamento - + Last Comment Último Commento + + + Member + Membro + AlertWidget @@ -3338,7 +3343,7 @@ - + Connect Connette @@ -3370,17 +3375,17 @@ Full-text search - + Ricerca a testo completo Search - + Ricerca Close Search - + Chiudi ricerca @@ -3486,63 +3491,68 @@ Search... - + Ricerca... DXC - Search - + DXC - Ricerca - + Connecting... Sta Connettendo... - + DX Cluster is temporarily unavailable DX Cluster è temporaneamente non disponibile - + DXC Server Error DXC Errore del server - + An invalid callsign Indicativo non valido - + DX Cluster Password DX Cluster Password - + Security Notice Avviso di sicurezza - + The password can be sent via an unsecured channel La password può essere inviata tramite un canale non protetto - + Server Server - + Username Nome utente - + Disconnect Disconnette + + + DX Cluster Command + Comando del DX Cluster + DxccTableModel @@ -4109,87 +4119,173 @@ HamlibRigDrv - + None Nessuno - + CAT CAT - + DTR DTR - + RTS RTS - - + + Initialization Error Errore di inizializzazione - + Cannot set PTT Type Impossibile impostare Tipo PTT - + Cannot set PTT Share Impossibile impostare Condividi PTT - + Unsupported Rig Driver Driver della Radio non Supportato - + + Rig Open Error + Connessione fallita + + + Set Frequency Error Errore impostazione fequenza - + + Set Mode Error + Errore nella impostazione della modalità + + + Set PTT Error Errore impostazione PTT - + + Cannot sent Morse + This cannot be displayed + + + + + Cannot stop Morse + This cannot be displayed + + + + + Get PTT Error + This cannot be displayed + + + + Get Frequency Error Errore di ricezione della frequenza - + Get Mode Error Errore di ricezione del modo + + + Get VFO Error + Errore nel recupero del VFO + + + + Get PWR Error + This cannot be displayed + + + + + Get PWR (power2mw) Error + This cannot be displayed + + + + + Get RIT Function Error + This cannot be displayed + + + + + Get RIT Error + This cannot be displayed + + + + + Get XIT Function Error + This cannot be displayed + + + + + Get XIT Error + This cannot be displayed + + + + + Get KeySpeed Error + This cannot be displayed + + + + + Set KeySpeed Error + This cannot be displayed + + HamlibRotDrv - - + + Initialization Error Errore di inizializzazione - + Unsupported Rotator Driver Driver del rotore non supportato - + + Rot Open Error + Connessione fallita + + + Set Possition Error Errore di impostazione della posizione - + Get Possition Error Errore di ricezione della posizione @@ -4633,7 +4729,7 @@ Cannot find My DXCC Entity Info - + Impossibile trovare le informazioni sulla mia entità DXCC @@ -4659,7 +4755,7 @@ DXCC Info is missing - + Le informazioni DXCC mancano @@ -5566,38 +5662,38 @@ - + Band Banda - + Mode Modo - + Country Nazione - + Club Club - + User Filter Filtro Utente - - + + Delete Elimina @@ -5663,32 +5759,32 @@ Esporta QSO selezionati - + Delete the selected contacts? Eliminare i contatti selezionati? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? L'<b>Invio immediato</b> di Clublog supporta solo l'eliminazione uno per uno<br><br>Vuoi continuare nonostante il fatto<br>che l'operazione DELETE non verrà inviata a Clublog? - + Deleting QSOs Elimina QSOs - + Update Aggiornare - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? L'aggiornamento avrà effetto su tutte le righe selezionate.<br>Il valore attualmente modificato nella colonna verrà applicato a tutte le righe selezionate.<br><br>Vuoi modificarle? - + Count: %n Conteggio: %n @@ -5696,23 +5792,23 @@ - + Downloading eQSL Image Download immagine da eQSL - - + + Cancel Elimina - + QLog Error Errore di QLog - + eQSL Download Image failed: Download immagine da eQSL fallito: @@ -6868,97 +6964,97 @@ Accesso al Logbook non riuscito - + LP LP - + New Entity! Nuova Entità! - + New Band! Nuova Banda! - + New Mode! Nuovo Modo! - + New Band & Mode! Nuova Banda e Modo! - + New Slot! Nuovo Slot! - + Worked Lavorato - + Confirmed Confermato - + GE GE - + GM GM - + GA GA - + m - + Callbook search is inactive Ricerca sul Callbook inattiva - + Callbook search is active Ricerca sul Callbook attiva - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) due o quattro localizzatori di griglia Maidenhead adiacenti, ciascuno lungo quattro caratteri, (es. EN98,FM08,EM97,FM07) - + the contacted station's DARC DOK (District Location Code) (ex. A01) il DARC DOK (District Location Code) della stazione contattata (ex. A01) - + World Wide Flora & Fauna World Wide Flora & Fauna - + Special Activity Group Gruppo di Attività Speciali - + Special Activity Group Information Informazioni sul gruppo di attività speciali @@ -7232,7 +7328,7 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + @@ -7297,27 +7393,27 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi recordImpossibile aggiornare le Regole di allarme - + DXC Server Name Error Errore nel nome del server DXC - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> L'indirizzo del server DXC deve essere nel formato<p><b>[nomeutente@]nomehost:porta</b> (es. hamqth.com:7300)</p> - + DX Cluster Password DX Cluster Password - + Invalid Password Password non corretta - + DXC Server Connection Error Errore di connessione al server DXC @@ -7377,7 +7473,7 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record<b>Errore Keyer CW:</b> - + Your callsign is empty. Please, set your Station Profile Il tuo nominativo è vuoto. Per favore, imposta il Profilo della tua Stazione @@ -7492,43 +7588,43 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - - + + Connection Refused Connessione rifiutata - - + + Host closed the connection Host ha chiuso la connessione - - + + Host not found Host non trovato - - + + Timeout Timeout - - + + Network Error Errore di rete - - + + Internal Error Errore Interno @@ -7628,7 +7724,7 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi recordMio DXCC - + Cannot connect to DXC Server <p>Reason <b>: Impossibile connettersi al server DXC <p>Motivo <b>: @@ -10115,6 +10211,7 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi recordStatisticsWidget + Statistics Statistiche @@ -10180,7 +10277,7 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + Band Banda @@ -10215,127 +10312,132 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record - + Year Anno - + Month Mese - + Day in Week Giorno della settimana - + Hour Ora - + Mode Modo - + Continent Continente - + Propagation Mode Modo di Propagazione - + Confirmed / Not Confirmed Confermato / Non Confermato - + Countries Nazioni - + Big Gridsquares Grandi quadrati della griglia - + Distance Distanza - + QSOs QSOs - + Confirmed/Worked Grids Griglia Confermata/Lavorata - + ODX ODX - + Sun Dom - + Mon Lun - + Tue Mar - + Wed Mer - + Thu Gio - + Fri Ven - + Sat Sab - + Not specified Non specificato - + Confirmed Confermato - + Not Confirmed Non confermato - + + Over 50000 QSOs. Display them? + Oltre 50000 QSO. Visualizzarli? + + + All Tutti @@ -10343,37 +10445,37 @@ Aggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record TCIRigDrv - + Rig 0 Radio 0 - + Rig 1 Radio 1 - + Rig 2 Radio 2 - + Rig 3 Radio 3 - + Error Occured C'è stato un'errore - + Rig status changed Stato della Radio cambiato - + Rig is not connected Radio non connessa diff --git a/i18n/qlog_zh_CN.qm b/i18n/qlog_zh_CN.qm index 945f9174f2451b066af6fbde3d87715f1e7fae6a..0b1985e0644bd2b09f029c8eba718223b55806ba 100644 GIT binary patch delta 15852 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大洲 - - + + North America 北美洲 - - + + Africa 非洲 - - + + Antarctica 南极洲 - - + + South America 南美洲 - + Asia 亚洲 - + Europe 欧洲 - - + + Oceania 大洋洲 @@ -217,40 +217,45 @@ AlertTableModel - + Rule Name 规则名 - + Callsign 呼号 - + Frequency 频率 - + Mode 模式 - + Updated 已更新 - + Last Update 最后更新 - + Last Comment 最后备注 + + + Member + 成员 + AlertWidget @@ -3338,7 +3343,7 @@ - + Connect 连接 @@ -3493,55 +3498,60 @@ 应该显示哪些列 - + Connecting... 正在连接... - + DX Cluster is temporarily unavailable DX 集群暂时不可用 - + DXC Server Error DXC 服务器出错 - + An invalid callsign 无效的呼号 - + DX Cluster Password DX 集群密码 - + Security Notice 安全注意 - + The password can be sent via an unsecured channel 密码可能通过不安全的通道发送 - + Server 服务器 - + Username 用户名 - + Disconnect 断开连接 + + + DX Cluster Command + + DxccTableModel @@ -4106,87 +4116,162 @@ HamlibRigDrv - + None - + CAT - + DTR - + RTS - - + + Initialization Error 初始化出错 - + Cannot set PTT Type - + Cannot set PTT Share - + Unsupported Rig Driver 不支持的设备驱动 - + + Rig Open Error + + + + Set Frequency Error 设置频率出错 - + + Set Mode Error + + + + Set PTT Error 设置 PTT 出错 - + + Cannot sent Morse + + + + + Cannot stop Morse + + + + + Get PTT Error + + + + Get Frequency Error 获取频率出错 - + Get Mode Error 获取模式出错 + + + Get VFO Error + + + + + Get PWR Error + + + + + Get PWR (power2mw) Error + + + + + Get RIT Function Error + + + + + Get RIT Error + + + + + Get XIT Function Error + + + + + Get XIT Error + + + + + Get KeySpeed Error + + + + + Set KeySpeed Error + + HamlibRotDrv - - + + Initialization Error 初始化出错 - + Unsupported Rotator Driver 不支持的云台驱动 - + + Rot Open Error + + + + Set Possition Error 设置方位出错 - + Get Possition Error 获取方位出错 @@ -5560,38 +5645,38 @@ - + Band 波段 - + Mode 模式 - + Country 国家/地区 - + Club 俱乐部 - + User Filter 用户过滤器 - - + + Delete 删除 @@ -5657,55 +5742,55 @@ - + Delete the selected contacts? 删除选中的联系人? - + Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>Do you want to continue despite the fact<br>that the DELETE operation will not be sent to Clublog? - + Deleting QSOs 删除 QSO - + Update 更新 - + By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them? 通过更新,所有选定的行都将受到影响。<br>当前在列中编辑的值将应用于所有选定的行。<br><br>您想要编辑他们吗? - + Count: %n 计数:%n - + Downloading eQSL Image 正在下载 eQSL 图片 - - + + Cancel 取消 - + QLog Error QLog 错误 - + eQSL Download Image failed: eQSL 图片下载失败: @@ -6860,97 +6945,97 @@ 电台黄页登陆失败 - + LP - + New Entity! 新实体! - + New Band! 新波段! - + New Mode! 新模式! - + New Band & Mode! 新波段与模式! - + New Slot! 新组合! - + Worked 已通联 - + Confirmed 已确认 - + GE GE - + GM GM - + GA GA - + m m - + Callbook search is active 电台黄页搜索可用 - + Callbook search is inactive 电台黄页搜索不可用 - + two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07) 两个或四个相邻的梅登黑德网格定位器,每个四个字符长,(例如 EN98, FM08, EM97, FM07) - + the contacted station's DARC DOK (District Location Code) (ex. A01) 联络电台的DARC DOK (地区位置代码) (例如 A01) - + World Wide Flora & Fauna 世界动植物 (可选参数) - + Special Activity Group 特别活动或兴趣团体名称 - + Special Activity Group Information 特别活动或兴趣团体信息 @@ -7223,7 +7308,7 @@ - + @@ -7288,27 +7373,27 @@ 无法更新告警规则 - + DXC Server Name Error DXC 服务器名称错误 - + DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p> DXC 服务器地址格式必须为<p><b>[用户名@]主机名:端口</b> (例. hamqth.com:7300)</p> - + DX Cluster Password DX 集群密码 - + Invalid Password 无效的密码 - + DXC Server Connection Error DXC 服务器连接出错 @@ -7367,7 +7452,7 @@ <b>CW 键控器出错:</b> - + Your callsign is empty. Please, set your Station Profile 你的呼号为空。请先设置台站配置文件 @@ -7482,43 +7567,43 @@ - - + + Connection Refused 连接被拒绝 - - + + Host closed the connection 主机关闭连接 - - + + Host not found 找不到主机 - - + + Timeout 超时 - - + + Network Error 网络错误 - - + + Internal Error 内部错误 @@ -7618,7 +7703,7 @@ 我的 DXCC - + Cannot connect to DXC Server <p>Reason <b>: 无法连接至 DXC 服务器 <p>原因 <b>: @@ -10102,6 +10187,7 @@ StatisticsWidget + Statistics 统计分析 @@ -10167,7 +10253,7 @@ - + Band 波段 @@ -10202,127 +10288,132 @@ about:blank - + Year - + Month - + Day in Week 星期几 - + Hour 小时 - + Mode 模式 - + Continent 大洲 - + Propagation Mode 传播模式 - + Confirmed / Not Confirmed 已确认/未确认 - + Countries 国家/地区 - + Big Gridsquares 大网格坐标 - + Distance 距离 - + QSOs QSO - + Confirmed/Worked Grids 确认/已通联 网格 - + ODX ODX - + Sun 星期日 - + Mon 星期一 - + Tue 星期二 - + Wed 星期三 - + Thu 星期四 - + Fri 星期五 - + Sat 星期六 - + Not specified 未指定 - + Confirmed 已确认 - + Not Confirmed 未确认 - + + Over 50000 QSOs. Display them? + + + + All 全部 @@ -10330,37 +10421,37 @@ TCIRigDrv - + Rig 0 设备 0 - + Rig 1 设备 1 - + Rig 2 设备 2 - + Rig 3 设备 3 - + Error Occured 发生错误 - + Rig status changed 设备状态已更改 - + Rig is not connected 设备未连接 From e43444027aaca9cd3b19114d01bc3e10c073d6a9 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sat, 5 Oct 2024 13:28:30 +0200 Subject: [PATCH 73/74] DXC: Changed Full-text search close icon - not displayed under Windows --- ui/DxWidget.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/DxWidget.ui b/ui/DxWidget.ui index 624fcd7d..abdc7ec6 100644 --- a/ui/DxWidget.ui +++ b/ui/DxWidget.ui @@ -255,8 +255,8 @@ - - .. + + :/icons/cancel-24px.svg:/icons/cancel-24px.svg true From eb4cf376ecc2ccc26be8830bd9886dda88010b74 Mon Sep 17 00:00:00 2001 From: Ladislav Foldyna Date: Sat, 5 Oct 2024 13:34:19 +0200 Subject: [PATCH 74/74] Preparation for release 0.39.0 --- Changelog | 2 +- QLog.pro | 2 +- debian/changelog | 25 +++++++++++++++++ installer/config/config.xml | 2 +- .../packages/de.dl2ic.qlog/meta/package.xml | 4 +-- res/io.github.foldynl.QLog.metainfo.xml | 27 +++++++++++++++++++ rpm_spec/qlog.spec | 23 ++++++++++++++++ 7 files changed, 80 insertions(+), 5 deletions(-) diff --git a/Changelog b/Changelog index e52cce09..47c15f2e 100644 --- a/Changelog +++ b/Changelog @@ -1,4 +1,4 @@ -TBC - 0.39.0 +2024/10/05 - 0.39.0 - [NEW] - DXC - Added Full-text search - [NEW] - Select S in RST Edit when focused (issue #454) - [NEW] - Alerts - Added Member Column diff --git a/QLog.pro b/QLog.pro index aba89815..6e6caedd 100644 --- a/QLog.pro +++ b/QLog.pro @@ -10,7 +10,7 @@ greaterThan(QT_MAJOR_VERSION, 5): QT += widgets TARGET = qlog TEMPLATE = app -VERSION = 0.39.0dev +VERSION = 0.39.0 DEFINES += VERSION=\\\"$$VERSION\\\" diff --git a/debian/changelog b/debian/changelog index 4a71b2c8..c5dc28c2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,28 @@ +qlog (0.39.0-1) UNRELEASED; urgency=low + * [NEW] - DXC - Added Full-text search + * [NEW] - Select S in RST Edit when focused (issue #454) + * [NEW] - Alerts - Added Member Column + * [CHANGED] - HamlibDrv Rig/Rot- Added multiplatform reliable sleep + * [CHANGED] - Changed Backup policy + * [CHANGED] - Logbook page size - improved performance + * [CHANGED] - Logbook - CTRL-A (Select All) is disabled + * [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452) + * [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh) + * [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh) + * [CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map + * [CHANGED] - New Contact - Starting QSO Timer when Rig online and WSJTX Update Callsign Status is received + * [CHANGED] - Added a postponed handling for Rig soft errors (issue #472) + * Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) + * Fixed Wrong import of ADIF file of another log program (issue #455) + * Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458) + * Fixed ADIF import does not import records with old DXCC Entities (issue #459) + * Fixed ADIF import incorrectly uses Station Profile parameters (issue #461) + * Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464) + * Fixed Alerts Window displays OOB Spots (issue #469) + * Fixed Field values from past QSOs are used incorrectly in case of WSJTX QSOs (#issue 470) + + -- foldynl Sat, 5 Oct 2024 13:33:52 +0200 + qlog (0.38.0-1) UNRELEASED; urgency=low * [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu * [NEW] - DX Filter - Added Dedup Time/Freq difference setting (@aa5sh) diff --git a/installer/config/config.xml b/installer/config/config.xml index a3c67372..19e7cb11 100644 --- a/installer/config/config.xml +++ b/installer/config/config.xml @@ -1,7 +1,7 @@ QLog - 0.38.0 + 0.39.0 QLog OK1MLG QLog diff --git a/installer/packages/de.dl2ic.qlog/meta/package.xml b/installer/packages/de.dl2ic.qlog/meta/package.xml index 56760841..c00cf7b5 100644 --- a/installer/packages/de.dl2ic.qlog/meta/package.xml +++ b/installer/packages/de.dl2ic.qlog/meta/package.xml @@ -2,8 +2,8 @@ QLog The QLog main application. - 0.38.0-1 - 2024-08-29 + 0.39.0-1 + 2024-10-05 true true diff --git a/res/io.github.foldynl.QLog.metainfo.xml b/res/io.github.foldynl.QLog.metainfo.xml index a82ac9c3..8dff595c 100644 --- a/res/io.github.foldynl.QLog.metainfo.xml +++ b/res/io.github.foldynl.QLog.metainfo.xml @@ -47,6 +47,33 @@ https://github.com/foldynl/QLog https://github.com/foldynl/QLog/blob/master/CONTRIBUTING.md + + +
      +
    • [NEW] - DXC - Added Full-text search
    • +
    • [NEW] - Select S in RST Edit when focused (issue #454)
    • +
    • [NEW] - Alerts - Added Member Column
    • +
    • [CHANGED] - HamlibDrv Rig/Rot- Added multiplatform reliable sleep
    • +
    • [CHANGED] - Changed Backup policy
    • +
    • [CHANGED] - Logbook page size - improved performance
    • +
    • [CHANGED] - Logbook - CTRL-A (Select All) is disabled
    • +
    • [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452)
    • +
    • [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh)
    • +
    • [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh)
    • +
    • [CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map
    • +
    • [CHANGED] - New Contact - Starting QSO Timer when Rig online and WSJTX Update Callsign Status is received
    • +
    • [CHANGED] - Added a postponed handling for Rig soft errors (issue #472)
    • +
    • Fixed WSJT-X does not emit band change if rig is disconnected (issue #447)
    • +
    • Fixed Wrong import of ADIF file of another log program (issue #455)
    • +
    • Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458)
    • +
    • Fixed ADIF import does not import records with old DXCC Entities (issue #459)
    • +
    • Fixed ADIF import incorrectly uses Station Profile parameters (issue #461)
    • +
    • Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464)
    • +
    • Fixed Alerts Window displays OOB Spots (issue #469)
    • +
    • Fixed Field values from past QSOs are used incorrectly in case of WSJTX QSOs (#issue 470)
    • +
    +
    +
      diff --git a/rpm_spec/qlog.spec b/rpm_spec/qlog.spec index fdd4fe1d..106e5e13 100644 --- a/rpm_spec/qlog.spec +++ b/rpm_spec/qlog.spec @@ -42,6 +42,29 @@ INSTALL_ROOT=%{buildroot} make -f Makefile install %{_metainfodir}/* %changelog +* Sat Oct 5 2024 Ladislav Foldyna - 0.39.0-1 +- [NEW] - DXC - Added Full-text search +- [NEW] - Select S in RST Edit when focused (issue #454) +- [NEW] - Alerts - Added Member Column +- [CHANGED] - HamlibDrv Rig/Rot- Added multiplatform reliable sleep +- [CHANGED] - Changed Backup policy +- [CHANGED] - Logbook page size - improved performance +- [CHANGED] - Logbook - CTRL-A (Select All) is disabled +- [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452) +- [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh) +- [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh) +- [CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map +- [CHANGED] - New Contact - Starting QSO Timer when Rig online and WSJTX Update Callsign Status is received +- [CHANGED] - Added a postponed handling for Rig soft errors (issue #472) +- Fixed WSJT-X does not emit band change if rig is disconnected (issue #447) +- Fixed Wrong import of ADIF file of another log program (issue #455) +- Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458) +- Fixed ADIF import does not import records with old DXCC Entities (issue #459) +- Fixed ADIF import incorrectly uses Station Profile parameters (issue #461) +- Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464) +- Fixed Alerts Window displays OOB Spots (issue #469) +- Fixed Field values from past QSOs are used incorrectly in case of WSJTX QSOs (#issue 470) + * Thu Aug 29 2024 Ladislav Foldyna - 0.38.0-1 - [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu - [NEW] - DX Filter - Added Dedup Time/Freq difference setting (@aa5sh)